simple resueltos pronóstico pronostico promedio ponderado móvil movil ejercicios concepto centrado r moving-average r-faq

resueltos - pronostico promedio movil ponderado excel



Cálculo de promedio móvil (8)

De hecho, RcppRoll es muy bueno.

Debe corregirse el código publicado por 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 here .

Una tercera forma, mejorando 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,i.e., res[c(-3,-4,...)] } }

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?


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.


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)}


Para complementar la respuesta de y ;

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)


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 here .

De lo contrario, este (más lento) bucle debería hacer el truco.

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


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

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


todas las opciones enumeradas aquí son promedios móviles causales. si se requiere una versión no causal, entonces la señal del paquete tiene algunas opciones.


  • Rolling Means / Maximums / Medians en el paquete del zoo (rollmean)
  • MovingAverages en TTR
  • ma en forecast