24  Análisis de series de tiempo

Autores/as

Carrasco Escobar, Gabriel

Quispe Quispe, Jesus

24.1 General

Los análisis de series de tiempo:

  • Se utilizan para pronosticar los datos futuros utilizando los datos históricos disponibles (de la misma variable de interés).

  • Evalúan la autocorrelación de las observaciones en el tiempo.

  • Permiten descomponer los patrones de las series de tiempo (i.e. tendencias, estacionalidad, periodicidad).

  • Tipicamente son denotadas de la siguiente forma :

\[ y_{1},y_{2},...,y_{t} \]

  • En general, para caracterizar correctamente una serie de tiempo los estadisticos tales como la media y Covarianza(y por lo tanto la varianza) de la serie son clave, puesto que reflejan la tendencia y aucorrelacion de una serie

24.1.1 Tendencia

La tendencia de una serie temporal se refiere a la dirección general o patrónen los datos a lo largo del intervalo de tiempo analizado. Asi representa el componente de la serie que muestra el desarrollo de la serie excluyendo variaciones a corto plazo debidos a factores como por ejemplo los cíclicos.

24.1.2 Autocorrelación

La autocorrelación (AC) representa el grado de similitud entre una serie de tiempo dada y una versión rezagada (lag) de sí misma en intervalos de tiempo sucesivos.

La AC ayuda a estudiar cómo se relaciona cada observación de una serie temporal con su pasado reciente. Los procesos con una mayor autocorrelación son más predecibles.

24.2 Terminología

Serie de tiempo: Una secuencia de datos de una variable ordenada cronologicamente en intervalos de tiempo generalmente igualmente espaciados .

Procesos estocásticos:

  • Estacionarios (Atributos constantes en el tiempo)

  • No estacionarios (Atributos no constantes en el tiempo)

Modelos básicos de series de tiempo:

  • Ruido blanco o White Noise (WN)

  • Paseo aleatorio o Random Walk (RW)

  • Autoregresivo o Auto-regressive (AR)

  • Media movil o Moving Average (MA)

24.3 Paquetes y data

Los paquetes y conjuntos de datos a ser utilizados en esta sección son:

library(tidyverse)
library(lubridate)
library(zoo)
library(forecast)

dt_ts <- read_csv("data/dt_ts.csv") %>%
  mutate(date = ymd(date)) 

Exploraremos las siguientes series de tiempo:

24.4 Procesos Estacionarios

24.4.1 Ruido blanco o White Noise (WN)

El ruido blanco es el ejemplo más simple de un proceso estocastico estacionario, el cual se caracteriza como ruido porque no tiene ningun patron, solo variacion aleatoria.

Un proceso de WN posee:

  • Una media fija y constante

  • Una varianza fija y constante

  • Ausencia correlación en el tiempo

Por ejemplo, al revisar estas series de tiempo observamos:

  1. No hay patrón ni autocorrelación de los datos a lo largo del tiempo.

  2. La serie se ha desplazado hacia arriba (media más grande), pero todavía no hay un patrón en los datos.

  3. La serie tiene más variabilidad vertical (varianza más grande), aún sin patrón en los datos.

  4. Media más grande y varianza más grande, todavía sin patrón en los datos.

Por otro lado, en estas series de tiempo observamos:

  1. Tendencia creciente en el tiempo, media no constante en el tiempo.

  2. Patrón periódico claro con duración de ciclo fijo (cada 12 observaciones), media no constante en el tiempo.

  3. Mayor volatilidad(varianza) en el lado derecho que en el lado izquierdo. La varianza aumenta con el tiempo (la varianza es funcion del tiempo), no es constante.

  4. Media y varianza constantes, sin patrón en el tiempo (correlación). Esta serie de tiempo corresponde a un proceso de WN.

Graficaremos nuestra serie de tiempo wn

dt_ts %>%
  ggplot(aes(x = date, y = wn)) +
  geom_line() +
  theme_bw()

Podemos ajustar el formato de fechas usando scale_x_date y agregar una línea de tendencia usando geom_smooth.

dt_ts %>%
  ggplot(aes(x = date, y = wn)) +
  geom_line() +
  scale_x_date(date_breaks = "4 months", 
               date_labels = "%d-%b") +
  geom_smooth() +
  theme_bw()

24.4.1.1 Formulación

\[ \epsilon_{i} \sim N(0,\sigma^2) \]

Donde :

\(E[\epsilon_{t}] = 0\) , representa la media constante

\(V(\epsilon_{t}) = \sigma^2\), representa la varianza constante

24.5 Procesos No Estacionarios

24.5.1 Paseo aleatorio o Random Walk (RW)

Un paseo aleatorio o Random Walk (RW) es el ejemplo más simple de un proceso no-estacionario.

Un proceso de RW:

  • No tiene media ni varianza dependiente del tiempo (es constante a traves de toda la serie temporal).
  • Tiene una fuerte dependencia en el tiempo.
  • Sus cambios o incrementos son ruido blanco (WN).

En estas series de tiempo observamos:

  1. Las observaciones vecinas son similares. Las tendencias cortas al alza y a la baja parecen aleatorias.

  2. Similar al caso A

  3. Comienza en cero y tiene tendencia general a disminuir.

  4. Comienza en cero y tiene tendencia general a aumentar.

Graficaremos nuestra serie de tiempo rw

dt_ts %>%
  ggplot(aes(x = date, y = rw)) +
  geom_line() +
  geom_smooth() +
  theme_bw()

24.5.1.1 Formulación

\[ Today = Yesterday + Noise \tag{24.1}\]

\[ \textrm{Y}_{t} = \textrm{Y}_{t-1} + \epsilon_{t} \tag{24.2}\]

\[ \epsilon_{i} \sim N(0,\sigma^2) \tag{24.3}\]

Aproximación WN

\[ \textrm{Y}_{t} - \textrm{Y}_{t-1} = \epsilon_{t} \tag{24.4}\]

\[ Today - Yesterday = Noise \tag{24.5}\]

Por lo tanto, si hacemos la operación diff() (restar la observación actual con la observación anterior o tambien llamado rezago) nuestra serie temporal que tiene un patrón RW tendrá un patrón WN.

diff(RW) es un ejemplo de un proceso estacionario.

Para obtener parsimonia en un modelo de series de tiempo, a menudo se asume alguna forma de invariancia distribucional en el tiempo (o estacionariedad).

  • Los modelos estacionarios son parsimoniosos.

  • Los procesos estacionarios tienen estabilidad distribucional en el tiempo

¿Por qué? Un proceso estacionario se puede modelar con menos parámetros y muchos de los modelos de series temporales basan sus propiedades en diversos supuestos entre los cuales usualmente se encuentra el de estacionariedad.

Podemos calcular la diferenciación de nuestra serie de tiempo rw.

  dt_ts %>%
  mutate(rw_d = rw - lag(rw)) %>%
  ggplot(aes(x = date, y = rw_d)) +
  geom_line() +
  geom_smooth() +
  theme_bw()

24.5.2 Modelo autorregresivo (AR)

El modelo autorregresivo representa una regresión o predicción del valor actual que se genera en función de los valores anteriores de esa misma serie temporal.

Dado que el valor actual se basa en los valores anteriores cercanos, el valor no cambia instantáneamente. Por ejemplo, la temperatura corporal no sube y baja rápidamente. Cambia constantemente y las medidas son cercanas entre sí.

24.5.2.1 Formulación

\[ (Today - Mean) = Slope * (Yesterday - Mean) + Noise \tag{24.6}\]

\[ \textrm{Y}_{t} - \mu = \phi (\textrm{Y}_{t-1} - \mu) + \epsilon_{t} \tag{24.7}\]

\[ \epsilon_{i} \sim N(0,\sigma^2) \tag{24.8}\]

Aproximación WN

Si la pendiente es 0

\[ \textrm{Y}_{t} - \mu = \epsilon_{t} \tag{24.9}\]

\[ (Today - Mean) = Noise \tag{24.10}\]

Aproximación RW

Si la media es 0 y la pendiente \(\phi = 1\)

\[ \textrm{Y}_{t} = \textrm{Y}_{t-1} + \epsilon_{t} \tag{24.11}\]

\[ Today = Yesterday + Noise \tag{24.12}\]

Graficaremos nuestra serie de tiempo ar

dt_ts %>%
  ggplot(aes(x = date, y = ar)) +
  geom_line() +
  geom_smooth()+
  theme_bw()

24.5.3 Modelo de media móvil (MA)

El modelo de media móvil genera los valores actuales en función de los errores de los pronósticos anteriores en lugar de utilizar los valores anteriores como AR. Los errores pasados se analizan para producir el valor actual.

24.5.3.1 Formulación

\[ (Today - Mean) = Slope * (Yesterday's \;Noise) + Noise \tag{24.13}\]

\[ \textrm{Y}_{t} - \mu = \phi (\epsilon_{t-1}) + \epsilon_{t} \tag{24.14}\]

\[ \epsilon_{i} \sim N(0,\sigma^2) \tag{24.15}\]

Aproximación WN

Si la pendiente es 0

\[ \textrm{Y}_{t} - \mu = \epsilon_{t} \tag{24.16}\]

\[ (Today - Mean) = Noise \tag{24.17}\]

Graficaremos nuestra serie de tiempo ma

dt_ts %>%
  ggplot(aes(x = date, y = ma)) +
  geom_line() +
  geom_smooth() +
  theme_bw()

24.6 Modelos acoplados

24.6.1 Modelos ARMA

Es posible combinar las propiedades de los modelos AR y MA cuando la serie de tiempo es estacionaria.

El modelo ARMA predice los valores futuros basándose tanto en los valores anteriores como en los errores. Por lo tanto, ARMA suele tener un mejor rendimiento que los modelos AR y MA por separado.

24.6.1.1 Formulacion

\[ (Today - Mean) = Slope_1 * (Yesterday - Mean) + Slope_2 * (Yesterday's \;Noise)+ Noise \tag{24.18}\]

\[ \textrm{Y}_{t} - \mu = \phi (\textrm{Y}_{t-1} - \mu) + \theta (\epsilon_{t-1}) + \epsilon_{t} \tag{24.19}\]

\[ \epsilon_{i} \sim N(0,\sigma^2) \tag{24.20}\]

Graficaremos nuestra serie de tiempo arma

dt_ts %>%
  ggplot(aes(x = date, y = arma)) +
  geom_line() +
  geom_smooth() +
  theme_bw()

24.6.2 Función de autocorrelación (ACF)

Una de las formas de evaluación del mejor modelo para las series temporales es a través de sus funciones de autocorrelación.

La función de autocorrelación (ACF) es la correlación entre la observación actual y la observación en un rezago (lag) determinado.

El ACF en lag-0 siempre es 1.

Cada figura de ACF incluye un par de líneas discontinuas horizontales azules que representan intervalos de confianza del 95 % de los rezagos (lag) centrados en cero.

Estos se utilizan para determinar la importancia estadística de una estimación de autocorrelación individual en un retraso dado frente a un valor nulo de cero.

Por ejemplo, en las siguientes series temporales observamos:

x) muestra una fuerte persistencia, lo que significa que el valor actual es muy cercano a los que lo preceden.

y) muestra un patrón periódico con una duración de ciclo de aproximadamente cuatro observaciones, lo que significa que el valor actual está relativamente cerca de la observación cuatro anterior.

z) no muestra ningún patrón claro.

Al explorar los ACF de las series temporales observamos:

El ACF de x muestra grandes correlaciones positivas para varios rezagos que decaen rápidamente hacia cero.

El ACF de y muestra correlaciones positivas grandes en rezagos que son múltiplos de cuatro, aunque también decaen hacia cero a medida que aumenta el múltiplo de retraso.

El ACF de z es cercano a cero en todos los rezagos. Parece que la serie z no está linealmente relacionada con su pasado, al menos hasta el desfase 20.

24.6.2.1 Formato de datos de series de tiempo

Hasta ahora hemos realizado solo la exploración gráfica de nuestras series de tiempo. Para realizar los siguientes análisis debemos poner en formato zoo (para observaciones ordenadas) a nuestros datos con el paquete zoo.

library(zoo)

dt_zoo <- dt_ts %>%
  read.csv.zoo()

wn <- dt_zoo[,"wn"]
rw <- dt_zoo[,"rw"]
ar <- dt_zoo[,"ar"]
ma <- dt_zoo[,"ma"]
arma <- dt_zoo[,"arma"]

Podemos hacer algunos gráficos exploratorios con el paquete zoo.

autoplot(arma) + theme_bw()

autoplot(dt_zoo) + theme_bw()

24.6.2.2 ACF en R

Con nuestros datos en formato haremos el cálculo de la función de autocorrelación (ACF) con el paquete forecast.

24.6.3 Función de autocorrelación parcial (PACF)

La función de autocorrelación parcial (PACF) es la correlación entre la observación actual y la observación en un rezago (lag) determinado, retirando el efecto de los rezagos precedentes.

24.6.3.1 PACF en R

Podemos hacer el cálculo de la función de autocorrelación arcial (PACF) con el paquete forecast.

24.6.4 Metodologia Box-Jenkins: Definición de modelos

Para la definicion correcta de un modelo ARMA, Box-Jenkins plantearon una metodologia de modelamiento (Box y Jenkins 1976) en 3 etapas :

  1. Identificacion del modelo
  2. Estimacion del modelo
  3. Validacion del modelo

24.6.4.1 Identificacion del modelo

Deacuerdo a Box-jenkins podemos utilizar la ACF y PACF para identificar la correcta parametrización del modelo de nuestra serie de tiempo.

Ahora que conocemos las funciones ggAcf y ggPacf del paquete forecast, podemos utilizar de forma simplificada el comando ggtsdisplay para hacer la exploración completa.

Observamos que esta serie de tiempo parece requerir la parametrizacion de un modelo AR(2) y MA(2).

24.6.4.2 Estimacion del modelo

Una vez identificado visualmente nuestro modelo, procedemos a estimar la espeficacion del modelo ARMA que indico el paso anterior. Para ello usaremos la función Arima del paquete forecast para estimar el modelo con los términos definidos con el ACF y PACF.

Arima(arma, order = c(2, 0, 2))
Series: arma 
ARIMA(2,0,2) with non-zero mean 

Coefficients:
         ar1      ar2     ma1     ma2     mean
      1.5357  -0.8162  0.0712  0.8544  42.6088
s.e.  0.0423   0.0418  0.0357  0.0497   2.5757

sigma^2 = 29.03:  log likelihood = -621.94
AIC=1255.89   AICc=1256.32   BIC=1275.68

24.6.4.3 Validacion del modelo

Por ultimo, en la etapas de la metodologia Box-Jenkins, pasamos a la validación estadística. Asi debemos asegurarnos que los residuales sigan un proceso WN. De lo contrario, no hemos encontrado el mejor modelo.

Esta evaluación se hace mediante los siguientes criterios:

  1. Gráfico de residuales estandarizados (no patrones o periodicidad)

  2. ACF de residuales (no lags significativos)

  3. Q-Q plot de residuales estandarizados (inspeccionar normalidad)

  4. Q-statistics p-value [or plot] (mayoría de lags por encima de umbral de sig.)

  5. Testear el estadistico de Ljung-Box(Ljung y Box 1978), el cual prueba la Hipotesis de que los datos no presentan autocorrelacion serial

Compararemos los resultados de Arima(arma, order = c(2, 0, 2)) frente a un modelo que no tiene una especificación correcta.

Arima(arma, order = c(0, 0, 1))
Series: arma 
ARIMA(0,0,1) with non-zero mean 

Coefficients:
         ma1     mean
      0.9114  42.0357
s.e.  0.0247   2.2049

sigma^2 = 270.1:  log likelihood = -843.55
AIC=1693.11   AICc=1693.23   BIC=1703

Finalmente, podemos revisar los residuales con la función checkresiduals.

Arima(arma, order = c(2, 0, 2)) %>%
  checkresiduals() 


    Ljung-Box test

data:  Residuals from ARIMA(2,0,2) with non-zero mean
Q* = 6.6095, df = 6, p-value = 0.3585

Model df: 4.   Total lags used: 10

No observamos ningún patron alarmante en los residuales del modelo, asi mismo el test de Ljung-Box muestra un p-valor > 0.05 indicando que no se puede rechazar la hipotesis de no autocorrelacion serial .

El paquete forecast ofrece una función para automatizar este proceso.

Series: arma 
ARIMA(2,0,3) with non-zero mean 

Coefficients:
         ar1      ar2     ma1     ma2     ma3     mean
      1.4947  -0.7834  0.1888  0.8580  0.1246  42.5873
s.e.  0.0556   0.0527  0.0886  0.0536  0.0824   2.8048

sigma^2 = 28.87:  log likelihood = -620.84
AIC=1255.67   AICc=1256.25   BIC=1278.76


    Ljung-Box test

data:  Residuals from ARIMA(2,0,3) with non-zero mean
Q* = 4.9023, df = 5, p-value = 0.4279

Model df: 5.   Total lags used: 10

En caso el modelo propuesto no cumpla la etapa de validacion, se repite nuevamente la secuencia de etapas de la metodologia Box-Jenkins antes señalada hasta obtener una especificación correcta, de encontrarse varias se eligira aquel modelo ARMA que tenga el mejor ajuste en base a criterios de información tales como AIC o BIC.

24.6.5 Modelos ARIMA

Cuando la serie de tiempo es no-estacionaria (vida real) es necesario transformar la serie de datos usando la diferenciación \((X_t – X_{t-1})\).

Una serie temporal exhibe un comportamiento ARIMA si los datos diferenciados tienen un comportamiento ARMA.

La diferencia entre ARMA y ARIMA es la parte de integración. La I (integración) representa el número de veces que se necesita diferenciar a la serie temporal para que esta se torne estacionaria.

Los modelos ARIMA se utilizan ampliamente para el análisis de series de tiempo de la vida real, ya que la mayoría de los datos de series de tiempo no son estacionarios y necesitan diferenciación.

24.6.5.1 Caso Temperatura Global

En primer lugar, empezaremos graficando la serie de tiempo; asi como, las funciones de autocorrelacion y autocorrelacion parcial.

globtemp <- read_csv("data/globtemp.csv") %>%
  read.csv.zoo()

globtemp %>%
  ggtsdisplay()

Esta serie de tiempo es claramente no estacionaria.. Por ello, exploraremos diferenciar la serie de tiempo.

globtemp <- read_csv("data/globtemp.csv") %>%
            read.csv.zoo()

globtemp %>%
  diff() %>%
  ggtsdisplay()   

Como se observa hecha la diferenciacion la serie en variaciones obtiene un comportamiento similar a WN.

Después de inspeccionar el ACF y PACF de la serie de datos diferenciada (diff) de globtemp, se puede afirmar que:

  1. Tanto el ACF como el PACF se están reduciendo, lo que implica un modelo ARIMA(1,1,1).

  2. El ACF se corta en el rezago 2 y el PACF se está reduciendo, lo que implica un modelo ARIMA(0,1,2).

  3. El ACF se está reduciendo y el PACF se corta en el rezago 3, lo que implica un modelo ARIMA(3,1,0). Aunque este modelo puede ajustarse razonablemente bien, es el peor de los tres porque utiliza demasiados parámetros para autocorrelaciones tan pequeñas.

  4. Los graficos descriptivos indicarian que el proceso que se esta modelando es integrado de orden 1 \(I(1)\)

Comparamos la estimación de los 3 modelos:

library(broom)
library(purrr)

fit_1 <- Arima(globtemp, order = c(1, 1, 1))
fit_2 <- Arima(globtemp, order = c(0, 1, 2))
fit_3 <- Arima(globtemp, order = c(3, 1, 0))

list(fit_1, fit_2, fit_3) %>%
  map_df(glance, .id = "model")
# A tibble: 3 × 6
  model sigma logLik   AIC   BIC  nobs
  <chr> <dbl>  <dbl> <dbl> <dbl> <int>
1 1     0.103   118. -229. -221.   136
2 2     0.102   118. -230. -222.   136
3 3     0.101   120. -231. -219.   136

A juzgar por AIC y BIC, el modelo ARIMA(0,1,2) funciona mejor que los otros modelos en los datos de temperatura global(globtemp).

Una vez determinado el modelo de serie de tiempo más adecuado, se procede a utilizarlo para realizar tareas como la predicción de los valores futuros de la serie de tiempo. Para esto usaremos la función forecast y especificaremos el horizonte de predicción (en 35 periodos).

fit_2 %>%
  forecast(h = 35) %>%
  autoplot() +
  theme_bw()

Asimismo tambien podemos calibrar el modelo de forma automática para buscar un mejor modelo para la predicción.

fit_auto <- auto.arima(globtemp)

fit_auto %>%
  forecast(h = 35) %>%
  autoplot() +
  theme_bw()