आर में एक स्लाइडिंग विंडो का मतलब


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
आप को देखा है यह ?
जेएम

क्या आप इस "स्लाइड" विचार पर कुछ पृष्ठभूमि दे सकते हैं?
शेन

@ जेएम - मैं नहीं था! धन्यवाद! मैं यह देखने वाला हूं कि यह कैसे काम करता है।
टी-बर्न्स

@ शने - हाँ! मुझे खेद है कि यह स्पष्ट नहीं था। स्लाइड उन पदों / सूचकांकों की संख्या है जिन्हें आप औसत की अगली विंडो की गणना शुरू करने के लिए स्थानांतरित करते हैं। तो अंतिम की समाप्ति के बाद शुरू होने वाली अगली विंडो के बजाय जब स्लाइड आपके विंडो के आकार से छोटी होती है तो कुछ ओवरलैप होते हैं। यह विचार डेटा बिंदुओं को थोड़ा सुचारू करने के लिए है।
टी-बर्न्स

धन्यवाद, मेरा भी यही सवाल था। अब, मैंने इसे "रोलप्ली" फ़ंक्शन को उपयोगी पाया।
9

जवाबों:


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

BTW, मैंने एक बार " क्वांटाइल लोज़
Tal Galili

x<-c(x,0)उत्तर के अंतिम तत्व को प्राप्त करने के लिए आप x के अंत में 0 जोड़ सकते हैं ।

1
@mbq; यह एक मजबूत धारणा बना रहा है कि अवलोकन 0 है। मैं इस बिंदु पर विचार कर रहा था और टी-बर्न्स एक ही धारणा बना रहा है (एक अप्राप्य 0)। मैं NA के साथ पैड करना और na.rm = TRUEतर्क में पास होना पसंद करूंगा mean। उत्तर वही नहीं होगा जो ओपी ने अनुरोध किया था, लेकिन यह अधिक उपयोगी है। मैं इसे शामिल करने के लिए अपने उत्तर को संपादित करूँगा।
मोनिका को बहाल करें - जी सिम्पसन

@ucfagls फिर भी यह बदलना आसान है और जैसा कि आपने कहा कि यह धारणा ओपी द्वारा बनाई गई थी। दूसरी ओर, मैं और भी अधिक प्रतिबंधक हो जाऊंगा और अंतिम औसत निकाल दिया।

धन्यवाद! विशेष रूप से शून्य मान के रूप में अंतिम मूल्य पर ध्यान देने के लिए, मैंने ऐसा नहीं माना था। मैं निश्चित रूप से उस आखिरी खिड़की की परवाह करता हूँ !!
टी-बर्न्स 15

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। हालांकि, यह काफी दिलचस्प लग रहा है। क्या आप अपने विचार की व्याख्या कर सकते हैं, क्योंकि मुझे यह नहीं मिला।
हेनरिक

1
@ हेनरिक मैं अक्सर इस ट्रिक का उपयोग करता हूं, फिर भी उपयोगकर्ता 1414 का कोड ओपी द्वारा इरादा के अनुसार स्लाइड 1 के साथ इस रोल को वापस करता है, 2 नहीं। की जाँच करें (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(हम 0-गद्दी शुरुआत में कटौती करनी और फिर भी तत्वों का चयन करें।

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 डी matrices के लिए काम करता है? जैसे की? यदि खिड़की का आकार एक उदाहरण के रूप में 3 * 3 है
मोना जलाल

यह केवल एक ही दिशा है
रॉकसाइंस

3

आर में shabbychef का जवाब :

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
धन्यवाद, लेकिन MATLAB मुक्त नहीं है !!
टी-बर्न्स

@ टी-बर्न्स: ऑक्टेव मुक्त है, हालांकि; यह भी आर मतलब के काफी करीब है कि इस कोड का अनुवाद आसानी से किया जा सकता है। वास्तव में, @mbq ने ऐसा किया ..
shabbychef

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)]होगा।
कोटा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.