Estoy tratando de usar R para calcular el promedio móvil sobre una serie de valores en una matriz. Sin embargo, la búsqueda normal de la lista de correo R no ha sido muy útil. Parece que no hay una función incorporada en R que me permita calcular promedios móviles. ¿Algún paquete proporciona uno? ¿O necesito escribir el mío?
r
moving-average
r-faq
Jared
fuente
fuente
forecast::ma
y contiene todo el vecindario, no está bien.O simplemente puede calcularlo usando filtro, aquí está la función que uso:
Si usa
dplyr
, tenga cuidado de especificarstats::filter
en la función anterior.fuente
stats::filter
sides = 2
es equivalente a align = "center" para el zoo :: rollmean o RcppRoll :: roll_mean.sides = 1
es equivalente a la alineación "correcta". ¿No veo una manera de hacer la alineación "izquierda" o calcular con datos "parciales" (2 o más valores)?El uso
cumsum
debe ser suficiente y eficiente. Suponiendo que tiene un vector x y desea una suma de n númerosComo se señaló en los comentarios de @mzuther, esto supone que no hay NA en los datos. lidiar con ellos requeriría dividir cada ventana por el número de valores que no son NA. Aquí hay una forma de hacerlo, incorporando el comentario de @Ricardo Cruz:
Esto todavía tiene el problema de que si todos los valores en la ventana son NA, habrá un error de división por cero.
fuente
cumsum(c(1:3,NA,1:3))
cx <- c(0, cumsum(ifelse(is.na(x), 0, x)))
.En data.table 1.12.0 nueva
frollmean
función se ha añadido para calcular rápida y exacta rodar media cuidadosamente el manejoNA
,NaN
y+Inf
,-Inf
valores.Como no hay un ejemplo reproducible en la pregunta, no hay mucho más que abordar aquí.
Puede encontrar más información sobre
?frollmean
en el manual, también disponible en línea en?frollmean
.Ejemplos del manual a continuación:
fuente
El
caTools
paquete tiene una velocidad de desplazamiento muy rápida / min / max / sd y algunas otras funciones. Solo he trabajado conrunmean
yrunsd
son los más rápidos de los otros paquetes mencionados hasta la fecha.fuente
Puede usar
RcppRoll
para promedios móviles muy rápidos escritos en C ++. Solo llama a laroll_mean
función. Los documentos se pueden encontrar aquí .De lo contrario, este bucle for (más lento) debería ser el truco:
fuente
res = arr
. Luego hay un ciclo que itera comenzando enn
o, el decimoquinto elemento, hasta el final de la matriz. eso significa que el primer subconjunto del que toma la media es elarr[1:15]
que llena el lugarres[15]
. Ahora, prefiero establecer enres = rep(NA, length(arr))
lugar deres = arr
que cada elemento seares[1:14]
igual a NA en lugar de un número, donde no podríamos tomar un promedio completo de 15 elementos.De hecho
RcppRoll
es muy bueno.El código publicado por cantdutchthis debe corregirse en la cuarta línea para que se fije la ventana:
Otra forma, que se ocupa de missings, se da aquí .
Una tercera forma, mejorar el código cantdutchthis para calcular promedios parciales o no, sigue:
fuente
Para complementar la respuesta de cantdutchthis y Rodrigo Remedio ;
fuente
Aquí hay un código de ejemplo que muestra cómo calcular un promedio móvil centrado y un promedio móvil final utilizando la
rollmean
función del paquete del zoológico .fuente
Aunque es un poco lento, también puede usar zoo :: rollapply para realizar cálculos en matrices.
donde x es el conjunto de datos, FUN = mean es la función; También puede cambiarlo a min, max, sd, etc. y el ancho es la ventana móvil.
fuente
set.seed(123); x <- rnorm(1000); system.time(apply(embed(x, 5), 1, mean)); library(zoo); system.time(rollapply(x, 5, mean))
En mi máquina es tan rápido que devuelve un tiempo de 0 segundos.Se puede usar el
runner
paquete para mover funciones. En este caso lamean_run
función. El problemacummean
es que no manejaNA
valores, peromean_run
sí.runner
El paquete también admite series temporales irregulares y las ventanas pueden depender de la fecha:También se pueden especificar otras opciones como
lag
, y rodar soloat
índices específicos. Más en la documentación del paquete y la función .fuente
El paquete deslizante se puede utilizar para esto. Tiene una interfaz que ha sido diseñada específicamente para sentirse similar a ronronear. Acepta cualquier función arbitraria y puede devolver cualquier tipo de salida. Los marcos de datos incluso se repiten en fila. El sitio pkgdown está aquí .
La sobrecarga de los controles deslizantes y data.table
frollapply()
debe ser bastante baja (mucho más rápido que el zoológico).frollapply()
Parece ser un poco más rápido para este ejemplo simple aquí, pero tenga en cuenta que solo se necesita una entrada numérica, y la salida debe ser un valor numérico escalar. Las funciones del control deslizante son completamente genéricas y puede devolver cualquier tipo de datos.fuente
fuente