আর মধ্যে একটি স্লাইডিং উইন্ডো এর গড়


19

আমার কাছে মানগুলির একটি ভেক্টর রয়েছে যা আমি একটি ছোট স্লাইড বরাবর উইন্ডোতে গড় প্রতিবেদন করতে চাই।

উদাহরণস্বরূপ, নিম্নলিখিত মানগুলির একটি ভেক্টরের জন্য:

4, 5, 7, 3, 9, 8

3 এর একটি উইন্ডো আকার এবং 2 এর স্লাইড নিম্নলিখিতটি করবে:

(4+5+7)/3 = 5.33
(7+3+9)/3 = 6.33
(9+8)/3 = 5.67

এবং এই মানগুলির একটি ভেক্টর ফিরিয়ে দিন:

5.33, 6.33, 5.67

এমন কোনও সাধারণ কাজ আছে যা আমার জন্য এটি করবে? যদি এটি উইন্ডো সূচকগুলিও ফেরত দেয় তবে এটি একটি অতিরিক্ত বোনাস হবে। এই উদাহরণে এটি 1,3,5 হবে


4
আপনি দেখেছ এই ?
জেএম

আপনি কি এই "স্লাইড" ধারণার কিছু পটভূমি দিতে পারেন?
শান

@ জেএম - আমি না! ধন্যবাদ! আমি এটি কিভাবে কাজ করে তা দেখতে চলেছি।
টি বার্নস

@ শানে - হ্যাঁ! আমি দুঃখিত যে এটি পরিষ্কার ছিল না। স্লাইডটি আপনি পজিশন / সূচকগুলির সংখ্যা যা আপনি পরবর্তী পরবর্তী উইন্ডোটির গণনা শুরু করতে চলেছেন। আপনার উইন্ডো আকারের চেয়ে স্লাইড যখন ছোট হয় তখন শেষের পরে শুরু হওয়া পরবর্তী উইন্ডোটির চেয়ে কিছুটা ওভারল্যাপ হয়। ধারণাটি হ'ল ডেটা পয়েন্টগুলি কিছুটা মসৃণ করা।
টি বার্নস

ধন্যবাদ, আমারও একই প্রশ্ন ছিল। এখন, আমি এটি "রোলপ্লাই" ফাংশনটি দরকারী বলে মনে করেছি।
দেবদূত

উত্তর:


24

rollapplyপ্যাকেজ চিড়িয়াখানায় ফাংশন আপনাকে ঘনিষ্ঠ করে তুলেছে:

> require(zoo)
> TS <- zoo(c(4, 5, 7, 3, 9, 8))
> rollapply(TS, width = 3, by = 2, FUN = mean, align = "left")
       1        3 
5.333333 6.333333

এটি কেবল আপনার জন্য সর্বশেষ মান গণনা করবে না কারণ এতে 3 টি পর্যবেক্ষণ নেই। আপনার বাস্তব সমস্যার জন্য এটি কি যথেষ্ট হবে? এছাড়াও, নোট করুন যে প্রত্যাবর্তিত অবজেক্টের namesপ্রত্যাবর্তিত ভেক্টরের হিসাবে আপনি চান সূচকগুলি রয়েছে ।

আপনার উদাহরণটি এমন একটি ধারণা তৈরি করছে যে শেষ উইন্ডোতে একটি অনাবৃত 0 আছে। এটি NAঅনুপস্থিত তথ্য উপস্থাপন করতে এবং হারিয়ে meanযাওয়া মানগুলি পরিচালনা করতে বলার সাথে প্যাড করা আরও দরকারী বা বাস্তববাদী হতে পারে । এই ক্ষেত্রে আমাদের চূড়ান্ত উইন্ডোড মান হিসাবে (8 + 9) / 2 থাকবে।

> TS <- zoo(c(4, 5, 7, 3, 9, 8, NA))
> rollapply(TS, width = 3, by = 2, FUN = mean, na.rm = TRUE, align = "left")
       1        3        5 
5.333333 6.333333 8.500000

বিটিডাব্লু, আমি একবার "কোয়ান্টাইল লয়েস
তাল

x<-c(x,0)উত্তরের শেষ উপাদানটি পেতে আপনি x ( ) এর শেষে একটি 0 যুক্ত করতে পারেন ।

1
@mbq; এটি একটি দৃ ass় ধারণা অনুমান করছে যে পর্যবেক্ষণটি 0 হয় I আমি এই পয়েন্টটি টিপছিলাম এবং টি-বার্নস একই ধারণা গ্রহণ করছে (একটি অবরুদ্ধ 0)। আমি সম্ভবত এনএ দিয়ে প্যাড করতে পছন্দ করব এবং na.rm = TRUEযুক্তিতে পাস করব mean। ওপি যা অনুরোধ করেছে উত্তরটি এর মতো হবে না তবে এটি আরও কার্যকর বলে মনে হচ্ছে। এটি অন্তর্ভুক্ত করার জন্য আমি আমার উত্তর সম্পাদনা করব।
মনিকা পুনরায় ইনস্টল করুন - জি সিম্পসন

@ucfagls তবুও এটি পরিবর্তন করা সহজ এবং আপনি যেমন বলেছিলেন যে অনুমানটি ওপি করেছিল। অন্যদিকে, আমি আরও নিয়ন্ত্রিত হয়ে সর্বশেষ গড়টি সরিয়ে ফেলব।

ধন্যবাদ! বিশেষত শেষ মানটি শূন্য ধারণা হিসাবে চিহ্নিত করার জন্য, আমি এটি বিবেচনা করি নি। আমি অবশ্যই শেষ উইন্ডো সম্পর্কে যত্নশীল !!
টি বার্নস

12

রোলাপ্প্লি একটি ছোট ডেটাসেটের সাহায্যে দুর্দান্ত কাজ করে। তবে আপনি যদি কয়েক মিলিয়ন সারি (জিনোমিক্স) নিয়ে কাজ করছেন তবে এটি বেশ ধীর।

নিম্নলিখিত ফাংশন সুপার দ্রুত।

data <- c(runif(100000, min=0, max=.1),runif(100000, min=.05, max=.1),runif(10000, min=.05, max=1), runif(100000, min=0, max=.2))

slideFunct <- function(data, window, step){
  total <- length(data)
  spots <- seq(from=1, to=(total-window), by=step)
  result <- vector(length = length(spots))
  for(i in 1:length(spots)){
    result[i] <- mean(data[spots[i]:(spots[i]+window)])
  }
  return(result)
}

http://coleoguy.blogspot.com/2014/04/sliding-window-analysis.html


বেশ সহায়ক। তবে সচেতন থাকুন, উইন্ডো = 3 টি 4 (!) মানের গড় ফিরে আসবে, যদি না আপনি একটি -1(সীমাতে) এবং একটি +1(লুপটিতে) যোগ করেন।
বার্নিনলিও

5

এই সাধারণ কোডের লাইনটি কাজটি করে:

((c(x,0,0) + c(0,x,0) + c(0,0,x))/3)[3:(length(x)-1)]

xপ্রশ্নে ভেক্টর যদি হয়।


এটি প্রশ্নকারী যা চেয়েছিল তা ফিরে আসে না, তবে 5.33 5.00 6.33। তবে এটি বেশ আকর্ষণীয় দেখায়। আপনি কি আপনার ধারণাটি ব্যাখ্যা করতে পারেন, কারণ আমি এটি পাই না।
হেনরিক 18

1
@ হেনরিক আমি এই কৌশলটি ঘন ঘন ব্যবহার করি, তবুও ব্যবহারকারীর ১৪১৪ এর কোড ওপির উদ্দেশ্য অনুসারে 2 টি নয়, স্লাইড 1 দিয়ে এই রোলটি ফিরিয়ে দেয়। (c(0,0,x)+c(0,x,0)+c(x,0,0))/3আমার অর্থ (এবং এটি কীভাবে কাজ করে) তা পরীক্ষা করে দেখুন। সঠিক সূত্রটি (c(0,0,x)+c(0,x,0)+c(x,0,0))[1:(length(x)-3)*2+1]/3

4
library(zoo)
x=c(4, 5, 7, 3, 9, 8)
rollmean(x,3)

অথবা

library(TTR)
x=c(4, 5, 7, 3, 9, 8)
SMA(x,3)

এটি কি 2 ডি ম্যাট্রিকের জন্য কাজ করে? যেভাবে? উদাহরণ হিসাবে উইন্ডোর আকার 3 * 3 হয়
মোনা জালাল

এটি কেবল এক দিক
রকসায়েন্স

3

আর-এ শ্যাবিচেফের উত্তর :

slideMean<-function(x,windowsize=3,slide=2){
 idx1<-seq(1,length(x),by=slide);
 idx1+windowsize->idx2;
 idx2[idx2>(length(x)+1)]<-length(x)+1;
 c(0,cumsum(x))->cx;
 return((cx[idx2]-cx[idx1])/windowsize);
}

সম্পাদনা করুন: সূচক আপনি যা খুঁজছেন ঠিক হয় idx1... এই ফাংশন সহজেই এছাড়াও ফিরতে পরিবর্তন করা যাবে, কিন্তু এটা প্রায় সমান ফাস্ট তাদের আর একটা কলের মাধ্যমে পুনঃ হয় seq(1,length(x),by=slide)


অনুবাদ করার জন্য ধন্যবাদ। আমি অনুভব করেছি এটি একটি সহজ অনুশীলন হবে, এবং আমি এটি থেকে কিছু আর শিখেছি
shabbychef

আমার আপডেট হওয়া উত্তরটি fromo::running_meanআমার প্যাকেজ প্যাকেজের রক্তস্রাব প্রান্ত সংস্করণ থেকে ব্যবহৃত ।
shabbychef

3

আপনি ম্যাটলব এবং হাঁসগুলিতে সহজেই এটি করতে পারেন যখন আপনি আমাকে নীচে নামিয়েছেন:

%given vector x, windowsize, slide 
idx1 = 1:slide:numel(x);
idx2 = min(numel(x) + 1,idx1 + windowsize);  %sic on +1 here and no -1;
cx = [0;cumsum(x(:))];  %pad out a zero, perform a cumulative sum;
rv = (cx(idx2) - cx(idx1)) / windowsize; %tada! the answer!

পার্শ্ব প্রতিক্রিয়া হিসাবে, idx1যোগফলের উপাদানটির সূচক। আমি নিশ্চিত এই সহজে আর অনুবাদ করা পাবেনা আমি বাগ্ধারা first:skip:lastমতলব মধ্যে অ্যারে প্রথম দেয়, প্রথম + + লাফালাফি, প্রথম + + 2skip ..., প্রথম + N লাফালাফি, যেখানে অ্যারের মধ্যে শেষ উপাদান চেয়ে বড় হয় last

সম্পাদনা : আমি গড় অংশ বাদ দিয়েছি (ভাগ করে windowsize)।


+1

1
এই মার্গ ... মন্তব্য বাক্স এই কোডের জন্য খুব সংকীর্ণ, তাই আমি একটি নতুন উত্তর পোস্ট করেছি।

1
ধন্যবাদ, তবে ম্যাটল্যাব বিনামূল্যে নয় !!
টি বার্নস

@ টি-বার্নস: তবে অক্টাভ বিনামূল্যে; আর আর মতলবের কাছে এতটা কাছে যে এই কোডটি সহজেই অনুবাদ করা যায়। আসলে, এমএমকিউ এটি করেছে ..
শাব্বিচেফ

1

এটি আপনাকে উইন্ডোটির অর্থ এবং উইন্ডোর প্রথম মানের সূচী পাবেন:

#The data
x <- c(4, 5, 7, 3, 9, 8)

#Set window size and slide
win.size <- 3
slide <- 2

#Set up the table of results
results <- data.frame(index = numeric(), win.mean = numeric())

#i indexes the first value of the window (the sill?)
i <- 1
#j indexes the row of the results to be added next
j <- 1
while(i < length(x)) {
    #This mean preserves the denominator of 3
    win.mean <- sum(x[i:(i+2)], na.rm = TRUE)/win.size
    #Insert the results
    results[j, ] <- c(i, win.mean)
    #Increment the indices for the next pass
    i <- i + slide
    j <- j + 1
    }

বিভিন্ন ক্যাভেট প্রযোজ্য: এটি আপনার নমুনা ডেটা ব্যতীত অন্য কোনওটির জন্য পরীক্ষা করেনি; আমি বিশ্বাস করি যে আপনার যদি প্রচুর মূল্যবোধ থাকে তবে এই জাতীয় ডেটা ফ্রেমে সংযোজন করা সত্যিই ধীর হতে পারে (কারণ এটি প্রতিবার ডেটা ফ্রেমটি অনুলিপি করবে); ইত্যাদি। তবে এটি যা আপনি চেয়েছিলেন তা উত্পাদন করে।


কোন মন্তব্য না করে দয়া করে ডাউনভোট করবেন না। আমি কী জানি কী ভুল আছে?
ম্যাট পার্কার

এটি আমি ছিলাম না, তবে এটি ধীর (তবে এর চেয়ে ধীরে ধীরে নয় rollapply)।

2
আমিও ছিলাম না, তবে নিজের দ্বারা উল্লিখিত হিসাবে, ফলাফল অবজেক্টের প্রাক-বরাদ্দ গতি ইস্যুতে সহায়তা করবে। একটি কৌশল, যদি আপনি না জানেন, বা এটি নির্ধারণ করা ক্লান্তিকর / কঠিন, আপনার প্রয়োজনীয় ফলাফলের আকারটি প্রয়োজনীয়। যুক্তিসঙ্গত কিছু বরাদ্দ করুন, সম্ভবত এনএ সহ প্রাক-ফিলিং। তারপরে আপনার লুপটি পূরণ করুন, তবে একটি চেক যুক্ত করুন যে আপনি যদি পূর্বনির্ধারিত অবজেক্টের সীমাতে পৌঁছাচ্ছেন তবে অন্য একটি বড় অংশ বরাদ্দ করুন এবং ভরাট চালিয়ে যান।
মনিকা পুনরায় ইনস্টল করুন - জি সিম্পসন

1
@mbq; ফলাফলের গতি, যদিও গুরুত্বপূর্ণ, কেবল তা বিবেচনা নয়। কাস্টম সমাধানগুলিতে সমস্ত সূচী ইত্যাদি পরিচালনা করার পরিবর্তে, এক-লিনিয়ার যা rollapplyবোঝার পক্ষে এবং উদ্দেশ্যটি গ্রেপ করা সহজ। এছাড়াও, rollapplyসম্ভবত আমি এক বিকেলে রান্না করতে পারি এমন কিছুর চেয়ে আরও অনেকগুলি আইবোলগুলি এর কোডটি চেক করেছে। ভিন্ন ভিন্ন মানুষ ভিন্ন ভিন্ন জিনিস এর জন্য উপযোগী.
মনিকা পুনরায় ইনস্টল করুন - জি সিম্পসন

1
পরিবর্তন [i:(i+2)]করার জন্য [i:(i+win.size-1)]কোড আরও সাধারণ করতে হবে, আমি মনে করি।
জোটা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.