Cálculo de promedio móvil

Intento usar R para calcular el promedio móvil sobre una serie de valores en una matriz. La búsqueda normal de la lista de correo R no ha sido muy útil. No parece haber una función incorporada en R que me permita calcular promedios móviles. ¿Alguno paquete proporciona uno? ¿O necesito escribir el mío?

  • Rolling Means / Maximums / Medians en el paquete del zoológico (rollmean)
  • MovingAverages en TTR
  • ma en previsión

O simplemente puede calcularlo usando el filtro, esta es la función que uso:

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

Usar cumsum debería ser suficiente y eficiente. Suponiendo que tienes un vector x y quieres una sum continua de n números

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

Puede usar RcppRoll para promedios móviles muy rápidos escritos en C ++. Simplemente llame a la función roll_mean . Los documentos se pueden encontrar aquí .

De lo contrario, este ciclo (más lento) for debería hacer el truco:

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

El paquete caTools tiene una media / min / max / sd de rodadura muy rápida y algunas otras funciones. Solo he trabajado con runmean y runsd y son los más rápidos de los otros paquetes mencionados hasta la fecha.

De hecho, RcppRoll es muy bueno.

Debe corregirse el código publicado por cantdutchthis debe corregirse en la cuarta línea de la ventana:

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

Otra forma, que maneja las pérdidas, se da aquí .

Una tercera forma, mejorando cantdutchthis código para calcular medias parciales o no, sigue:

  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,...)] } } 

Para complementar la respuesta de cantdutchthis y 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) 
Intereting Posts