2009-04-13 22 views
136

की गणना करना मैं मैट्रिक्स में मानों की एक श्रृंखला पर चलती औसत की गणना करने के लिए आर का उपयोग करने की कोशिश कर रहा हूं। हालांकि सामान्य आर मेलिंग सूची खोज बहुत उपयोगी नहीं रही है। आर में built-in function प्रतीत नहीं होता है, मुझे चलती औसत की गणना करने की अनुमति होगी। क्या कोई पैकेज एक प्रदान करता है? या मुझे अपना खुद लिखने की ज़रूरत है?चलती औसत

उत्तर

104
  • रोलिंग मतलब/अधिकतम/Medians zoo पैकेज में (rollmean) में
  • MovingAverages TTR
  • forecast
169

या आप बस फिल्टर का उपयोग कर यह गणना कर सकते हैं में मा, यहाँ समारोह मैं है उपयोग:

ma <- function(x,n=5){filter(x,rep(1/n,n), sides=2)}

+39

मुझे यह इंगित करना चाहिए कि "पक्ष = 2" कई लोगों के उपयोग मामलों में एक महत्वपूर्ण विकल्प हो सकता है, जिन्हें वे अनदेखा नहीं करना चाहते हैं। यदि आप अपने चलती औसत में केवल पिछली जानकारी चाहते हैं, तो आपको पक्ष = 1 का उपयोग करना चाहिए। – evanrsparks

+28

कुछ साल बाद लेकिन dplyr में अब एक फ़िल्टर फ़ंक्शन है, यदि आपके पास इस पैकेज को लोड किया गया है तो 'आँकड़े :: फ़िल्टर' – blmoore

+0

' पक्ष = 2' चिड़ियाघर :: रोलमेन या आरसीपीआर रोल :: रोल_मेन के लिए संरेखण = "केंद्र" के बराबर है । 'पक्ष = 1'" दाएं "संरेखण के बराबर है।मुझे "बाएं" संरेखण करने या "आंशिक" डेटा (2 या अधिक मानों) के साथ गणना करने का कोई तरीका नहीं दिख रहा है? –

2

caTools पैकेज में तेजी से रोलिंग मतलब/न्यूनतम/अधिकतम/एसडी और कुछ अन्य कार्य हैं। मैंने केवल runmean और runsd के साथ काम किया है और वे आज तक बताए गए किसी भी अन्य पैकेज का सबसे तेज़ हैं।

1

यहां सूचीबद्ध सभी विकल्प कारणों से चल रहे औसत हैं। यदि एक गैर कारण संस्करण आवश्यक है, तो पैकेज सिग्नल में कुछ विकल्प हैं।

+0

सिर्फ एक पैकेज का नाम देने में बहुत मददगार नहीं है - कम से कम फ़ंक्शन नाम दें ... –

7

आप सी ++ में लिखे गए बहुत तेज़ी से चलने वाले औसत के लिए RcppRoll का उपयोग कर सकते हैं। बस roll_mean फ़ंक्शन पर कॉल करें। डॉक्स here पाया जा सकता है।

अन्य वाइस, लूप के लिए यह (धीमा) चाल करना चाहिए।

ma <- function(arr, n=15){ 
    res = arr 
    for(i in n:length(arr)){ 
    res[i] = mean(arr[(i-n):i]) 
    } 
    res 
} 
+1

क्या आप कृपया विवरण में मुझे समझा सकते हैं, यह एल्गोरिदम कैसे काम करता है? क्योंकि मैं –

21

cumsum का उपयोग पर्याप्त और कुशल होना चाहिए। मान लें कि आप एक वेक्टर एक्स है और आप n संख्या

cx <- c(0,cumsum(x)) 
rsum <- (cx[(n+1):length(cx)] - cx[1:(length(cx) - n)])/n 
+6

विचार को समझ नहीं पा रहा हूं इस समाधान के लिए एक नकारात्मक पक्ष यह है कि यह मिसालों को संभाल नहीं सकता है: 'cumsum (c (1: 3, NA, 1: 3)) ' – Jthorpe

3

के चल रहे योग तथ्य RcppRoll में चाहते हैं बहुत अच्छा है।

कोड cantdutchthis द्वारा पोस्ट की खिड़की को चौथी लाइन में सही किया जाना चाहिए जा तय:

ma <- function(arr, n=15){ 
    res = arr 
    for(i in n:length(arr)){ 
    res[i] = mean(arr[(i-n+1):i]) 
    } 
    res 
} 

एक और तरीका है, जो missings संभालती है, here दिया जाता है।

एक तीसरा रास्ता, आंशिक औसत या नहीं की गणना करने के cantdutchthis कोड में सुधार, इस प्रकार है:

ma <- function(x, n=2,parcial=TRUE){ 
    res = x #set the first values 

    if (parcial==TRUE){ 
    for(i in 1:length(x)){ 
     t<-max(i-n+1,1) 
     res[i] = mean(x[t:i]) 
    } 
    res 

    }else{ 
    for(i in 1:length(x)){ 
     t<-max(i-n+1,1) 
     res[i] = mean(x[t:i]) 
    } 
    res[-c(seq(1,n-1,1))] #remove the n-1 first,i.e., res[c(-3,-4,...)] 
    } 
} 
2

आदेश cantdutchthis और Rodrigo Remedio के जवाब के पूरक करने के लिए;

moving_fun <- function(x, w, FUN, ...) { 
    # x: a double vector 
    # w: the length of the window, i.e., the section of the vector selected to apply FUN 
    # FUN: a function that takes a vector and return a summarize value, e.g., mean, sum, etc. 
    # Given a double type vector apply a FUN over a moving window from left to the right, 
    # when a window boundary is not a legal section, i.e. lower_bound and i (upper bound) 
    # are not contained in the length of the vector, return a NA_real_ 
    if (w < 1) { 
    stop("The length of the window 'w' must be greater than 0") 
    } 
    output <- x 
    for (i in 1:length(x)) { 
    # plus 1 because the index is inclusive with the upper_bound 'i' 
    lower_bound <- i - w + 1 
    if (lower_bound < 1) { 
     output[i] <- NA_real_ 
    } else { 
     output[i] <- FUN(x[lower_bound:i, ...]) 
    } 
    } 
    output 
} 

# example 
v <- seq(1:10) 

# compute a MA(2) 
moving_fun(v, 2, mean) 

# compute moving sum of two periods 
moving_fun(v, 2, sum) 
संबंधित मुद्दे