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::may 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::filteren la función anterior.fuente
stats::filtersides = 2es equivalente a align = "center" para el zoo :: rollmean o RcppRoll :: roll_mean.sides = 1es 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
cumsumdebe 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
frollmeanfunción se ha añadido para calcular rápida y exacta rodar media cuidadosamente el manejoNA,NaNy+Inf,-Infvalores.Como no hay un ejemplo reproducible en la pregunta, no hay mucho más que abordar aquí.
Puede encontrar más información sobre
?frollmeanen el manual, también disponible en línea en?frollmean.Ejemplos del manual a continuación:
fuente
El
caToolspaquete tiene una velocidad de desplazamiento muy rápida / min / max / sd y algunas otras funciones. Solo he trabajado conrunmeanyrunsdson los más rápidos de los otros paquetes mencionados hasta la fecha.fuente
Puede usar
RcppRollpara promedios móviles muy rápidos escritos en C ++. Solo llama a laroll_meanfunció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 enno, 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 = arrque 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
RcppRolles 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
rollmeanfunció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
runnerpaquete para mover funciones. En este caso lamean_runfunción. El problemacummeanes que no manejaNAvalores, peromean_runsí.runnerEl 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