Problema
¿Cómo podemos calcular la media móvil en R? Es decir, calcular la media aritmética de n datos anteriores. En el siguiente ejemplo, la media de los 4 datos anteriores. En el primer cálculo la media de los 4 primeros términos: del 1 al 4. En el segundo del 2 al 5, y así sucesivamente.
num media_movil
1 1 NA
2 2 NA
3 3 NA
4 4 2.5
5 5 3.5
6 6 4.5
Solución
Muestro dos alternativas, con los paquetes zoo y RcppRoll, con sintáxis casi idéntica. En ambas utilizo dplyr para crear la nueva columna con la función mutate.
- Alternativa 1: zoo Con el argumento k (4 en este ejemplo) suministramos un número entero que indica el intervalo de la media móvil.
library(zoo)
library(dplyr)
df <- data.frame(num = 1:20)
df %>% mutate(media_movil = rollmean(num, k = 4 , fill = NA, align = "right"))
library(RcppRoll)
df %>% mutate(media_movil = roll_mean(num, n = 4, fill = NA, align = "right"))
Resultados
num media_movil
1 1 NA
2 2 NA
3 3 NA
4 4 2.5
5 5 3.5
6 6 4.5
7 7 5.5
8 8 6.5
9 9 7.5
10 10 8.5
11 11 9.5
12 12 10.5
13 13 11.5
14 14 12.5
15 15 13.5
16 16 14.5
17 17 15.5
18 18 16.5
19 19 17.5
20 20 18.5
Referencias
- Media móvil
- stackoverflow
- ?rollmean
- ?roll_mean