Obtener la media móvil en R

Publicado el 10 marzo 2021 por Daniel Rodríguez @analyticslane

La media móvil es una herramienta que se utiliza habitualmente en análisis de series temporales para eliminar las fluctuaciones a corto plazo. Lo que facilita la observación de las tendencias a largo plazo de la serie. Existen diferentes métodos para calcular la media móvil, siendo el más empleado es media móvil simple (Moving Average), en la que se utilizan la media aritmética de n datos. Otro método también utilizado de forma habitual es la media móvil ponderada (Weighted Moving Average), en el que se utiliza la media de n datos ponderados en base a un criterio definido previamente. Un caso particular de esta última es la media móvil exponencial (Exponential Moving Average) la cual es una media móvil ponderada exponencialmente. Veamos a continuación diferentes formas de obtener la media móvil en R.

La función filter() del paquete stats

Una de las formas más sencillas para obtener la media móvil en R es utilizar la función filter(). Función que aplica un filtro a cada uno de los elementos de la serie. Esto es, calcula el producto de los elementos alrededor de este por un filtro y los suma. Así, para obtener una media móvil simple solamente es necesario definir un filtro donde todos los elementos sean 1/n, siendo n el tamaño del filtro.

La función filter() tiene una propiedad llamada sides mediante la que se indica en qué posición se sitúan los valores obtenidos. Estos pueden ser en el centro del filtro, sides igual a 2, o desplazados en la posición final del filtro, valor sides igual a 1. El valor por defecto de esta propiedad es 2, por lo que es necesario indicar el valor 1 para obtener la serie desplazada.

Así se puede calcular una media móvil simple o ponderada tal como se muestra en el siguiente código.

x <- c(1, 1, 3, 2, 5, 6)

# Media móvil simple
n <- 3
filter(x, rep(1 / n, n), sides = 1)

# Media móvil ponderada
filter(x, c(0.25, 0.5, 0,25), sides = 1)

En donde se ha creado el filtro para la media móvil simple con la función rep() y la ponderada con un vector definido manualmente.

La función rollmean() del paquete zoo

Un método alternativo para obtener la media móvil simple es la función rollmean() del paquete zoo. Función con la que es posible obtener las medias, máximos, medianas y sumas de observaciones ordenadas.

El primer parámetro de esta función es la serie de datos y el segundo el tamaño de la venta. Por defecto ignora los elementos para los que no se puede calcular los valores, pero con la propiedad fill se puede indicar el valor que se puede asignar a estos. Otra propiedad interesante es align, con la que se puede seleccionar cómo se alinean los datos, a la izquierda, derecha o centro. Así para obtener la media móvil simple se puede usar el siguiente código.

x <- c(1, 1, 3, 2, 5, 6)

# Media móvil simple
rollmean(x, 3, fill = NA,  align = "right")

Conclusiones

En esta entrada se ha visto cómo se puede utilizar las funciones filter() y rollmean() para obtener las medias móviles en R. Ambos métodos permiten obtener de una forma fácil análisis que son muy útiles en múltiples aplicaciones.

Imagen de Antonio López en Pixabay