Calcolo della media mobile

Sto cercando di usare R per calcolare la media mobile su una serie di valori in una matrice. La normale ricerca nella mailing list di R non è stata tuttavia molto utile. Non sembra esserci una funzione incorporata in R mi consentirà di calcolare le medie mobili. Qualche pacchetto ne fornisce uno? O devo scrivere il mio?

  • Rolling Means / Maximums / Medians nel pacchetto zoo (rollmean)
  • MovingAverages in TTR
  • ma in previsione

Oppure puoi semplicemente calcolarlo usando il filtro, ecco la funzione che uso:

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

Usare cumsum dovrebbe essere sufficiente ed efficiente. Supponendo che tu abbia un vettore x e vuoi una sum di numeri n

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

È ansible utilizzare RcppRoll per medie mobili molto veloci scritte in C ++. Basta chiamare la funzione roll_mean . I documenti possono essere trovati qui .

Altrimenti, questo ciclo (più lento) dovrebbe fare il trucco:

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

Il pacchetto caTools ha una rotazione media molto veloce / min / max / sd e poche altre funzioni. Ho lavorato solo con runmean e runsd e sono il più veloce tra tutti gli altri pacchetti menzionati fino ad oggi.

In effetti RcppRoll è molto buono.

Il codice pubblicato da cantdutch deve essere corretto nella quarta riga della finestra da correggere:

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

Un altro modo, che gestisce le missioni, è dato qui .

Un terzo modo, migliorando il codice cantdutchthis per calcolare medie parziali o no, segue:

  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,ie, res[c(-3,-4,...)] } } 

Per completare la risposta di cantdutchthis e Rodrigo Remedio ;

 moving_fun <- function(x, w, FUN, ...) { # x: a double vector # w: the length of the window, ie, the section of the vector selected to apply FUN # FUN: a function that takes a vector and return a summarize value, eg, 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, ie 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)