summary(cars)
## speed dist
## Min. : 4.0 Min. : 2.00
## 1st Qu.:12.0 1st Qu.: 26.00
## Median :15.0 Median : 36.00
## Mean :15.4 Mean : 42.98
## 3rd Qu.:19.0 3rd Qu.: 56.00
## Max. :25.0 Max. :120.00
library(fpp2)
## Warning in register(): Can't find generic `scale_type` in package ggplot2 to
## register S3 method.
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
## -- Attaching packages ---------------------------------------------- fpp2 2.4 --
## v ggplot2 3.3.5 v fma 2.4
## v forecast 8.16 v expsmooth 2.3
##
library(seasonal)
##Componentes de series de tiempo
Los datos de series temporales pueden exhibir una variedad de patrones y, a menudo, es útil dividir una serie temporal en varios componentes, cada uno de los cuales representa una categoría de patrón subyacente.
6.1 Componentes de series de tiempo Si asumimos una descomposición aditiva, entonces podemos escribir yt=St+Tt+Rt, donde:yt son los datos, St es el componente estacional, Tt es el componente tendencia-ciclo, y Rt es el componente restante, todo en el período t.
Alternativamente, una descomposición multiplicativa se escribiría como yt=St* Tt * Rt
La descomposición aditiva es la más adecuada si la magnitud de las fluctuaciones estacionales, o la variación en torno a la tendencia-ciclo, no varía con el nivel de la serie temporal. Cuando la variación en el patrón estacional, o la variación alrededor del ciclo de tendencia, parece ser proporcional al nivel de la serie temporal, entonces es más apropiada una descomposición multiplicativa. Las descomposiciones multiplicativas son comunes con las series temporales económicas.
El método clásico de descomposición de series de tiempo se originó en la década de 1920 y fue ampliamente utilizado hasta la década de 1950. Todavía constituye la base de muchos métodos de descomposición de series temporales, por lo que es importante entender cómo funciona. El primer paso en una descomposición clásica es usar un método de promedio móvil para estimar el ciclo de tendencia, por lo que comenzamos analizando los promedios móviles.
Suavizado de la media móvil: donde metro=2k+1. Es decir, la estimación de la tendencia-ciclo en el momento t se obtiene promediando los valores de la serie temporal dentro de kperiodos de t. También es probable que las observaciones que están cercanas en el tiempo tengan un valor cercano. Por lo tanto, el promedio elimina parte de la aleatoriedad en los datos, dejando un componente suave de ciclo de tendencia. Llamamos a esto un metro-MA , lo que significa un promedio móvil de orden metro.
autoplot(elecsales) + xlab("Year") + ylab("GWh") +
ggtitle("Annual electricity sales: South Australia")
ma(elecsales, 5)
## Time Series:
## Start = 1989
## End = 2008
## Frequency = 1
## [1] NA NA 2381.530 2424.556 2463.758 2552.598 2627.700 2750.622
## [9] 2858.348 3014.704 3077.300 3144.520 3188.700 3202.320 3216.940 3307.296
## [17] 3398.754 3485.434 NA NA
Muestra el volumen de electricidad vendido a clientes residenciales en el sur de Australia cada año desde 1989 hasta 2008 (se excluyeron las ventas de agua caliente). Además de ello no hay valores ni para los primeros dos años ni para los dos últimos años, porque no tenemos dos observaciones en cada lado. Más adelante utilizaremos métodos más sofisticados de estimación de tendencia-ciclo que permiten estimaciones cercanas a los puntos finales.
autoplot(elecsales, series="Data") +
autolayer(ma(elecsales,5), series="5-MA") +
xlab("Year") + ylab("GWh") +
ggtitle("Annual electricity sales: South Australia") +
scale_colour_manual(values=c("Data"="grey50","5-MA"="red"),
breaks=c("Data","5-MA"))
## Warning: Removed 4 row(s) containing missing values (geom_path).
Observe que el ciclo de tendencia (en rojo) es más suave que los datos originales y captura el movimiento principal de la serie temporal sin todas las fluctuaciones menores. El orden de la media móvil determina la suavidad de la estimación del ciclo de tendencia. En general, un pedido más grande significa una curva más suave. Los promedios móviles simples como estos suelen ser de un orden impar (por ejemplo, 3, 5, 7, etc.). Esto es para que sean simétricos: en una media móvil de orden metro=2k+1, la observación del medio, y k se promedian las observaciones de ambos lados. Pero si metro fuera par, dejaría de ser simétrico.
Medias móviles de medias móviles Es posible aplicar una media móvil a una media móvil. Una razón para hacer esto es hacer que un promedio móvil de orden par sea simétrico.
Por ejemplo, podríamos tomar un promedio móvil de orden 4 y luego aplicar otro promedio móvil de orden 2 a los resultados. En la siguiente tabla, esto se ha hecho para los primeros años de los datos trimestrales de producción de cerveza de Australia.
beer2 <- window(ausbeer,start=1992)
ma4 <- ma(beer2, order=4, centre=FALSE)
ma2x4 <- ma(beer2, order=4, centre=TRUE)
Ahora es un promedio ponderado de las observaciones que es simétrica. De forma predeterminada, la ma()función en R devolverá un promedio móvil centrado para órdenes pares (a menos que center=FALSEse especifique). En general, una MA de orden par debe ir seguida de una MA de orden par para que sea simétrica. De manera similar, un MA de orden impar debe ser seguido por un MA de orden impar.
Estimación de la tendencia-ciclo con datos estacionales
El uso más común de los promedios móviles centrados es para estimar el ciclo de tendencia a partir de datos estacionales. Cuando se aplica a datos trimestrales, cada trimestre del año tiene el mismo peso que el primero y el último término se aplican al mismo trimestre en años consecutivos. Otras opciones para el orden de la MM generalmente darán como resultado que las estimaciones del ciclo de tendencia se vean contaminadas por la estacionalidad de los
autoplot(elecequip, series="Data") +
autolayer(ma(elecequip, 12), series="12-MA") +
xlab("Year") + ylab("New orders index") +
ggtitle("Electrical equipment manufacturing (Euro area)") +
scale_colour_manual(values=c("Data"="grey","12-MA"="red"),
breaks=c("Data","12-MA"))
## Warning: Removed 12 row(s) containing missing values (geom_path).
Comentarios sobre la descomposición clásica - La estimación de la tendencia-ciclo no está disponible para las primeras y últimas observaciones. - La estimación de tendencia-ciclo tiende a suavizar en exceso las subidas y bajadas rápidas de los datos (como se ve en el ejemplo anterior). - Los métodos de descomposición clásicos suponen que el componente estacional se repite de año en año. Para muchas series, esta es una suposición razonable, pero para algunas series más largas no lo es. - Ocasionalmente, los valores de la serie temporal en un pequeño número de períodos pueden ser particularmente inusuales.
6.4 Descomposición Este método se basa en la descomposición clásica, pero incluye muchos pasos y características adicionales para superar los inconvenientes de la descomposición clásica que se discutieron en la sección anterior. En particular, las estimaciones de ciclo de tendencia están disponibles para todas las observaciones, incluidos los puntos finales, y se permite que el componente estacional varíe lentamente con el tiempo. X11 también tiene algunos métodos sofisticados para manejar la variación del día de negociación, los efectos de vacaciones y los efectos de predictores conocidos. Maneja tanto la descomposición aditiva como la multiplicativa. El proceso es totalmente automático y tiende a ser muy robusto frente a valores atípicos y cambios de nivel en la serie temporal.
library(seasonal)
elecequip %>% seas(x11="") -> fit
autoplot(fit) +
ggtitle("X11 decomposition of electrical equipment index")
autoplot(elecequip, series="Data") +
autolayer(trendcycle(fit), series="Trend") +
autolayer(seasadj(fit), series="Seasonally Adjusted") +
xlab("Year") + ylab("New orders index") +
ggtitle("Electrical equipment manufacturing (Euro area)") +
scale_colour_manual(values=c("gray","blue","red"),
breaks=c("Data","Seasonally Adjusted","Trend"))
Dada la salida de la seas()función, seasonal()extraerá el componente estacional, trendcycle()extraerá el componente de ciclo de tendencia, remainder()extraerá el componente restante y seasadj()calculará la serie temporal ajustada estacionalmente. Puede ser útil utilizar parcelas estacionales y parcelas de subseries estacionales del componente estacional.
“SEATS” significa “Extracción estacional en series temporales ARIMA”. Este procedimiento fue desarrollado en el Banco de España y ahora es ampliamente utilizado por agencias gubernamentales de todo el mundo. El procedimiento funciona sólo con datos trimestrales y mensuales. Por lo tanto, la estacionalidad de otros tipos, como los datos diarios, los datos por hora o los datos semanales, requieren un enfoque alternativo.
library(seasonal)
elecequip %>% seas() %>%
autoplot() +
ggtitle("SEATS decomposition of electrical equipment index")
STL es un método versátil y robusto para descomponer series de tiempo. STL es un acrónimo de “Descomposición estacional y de tendencia usando Loess”, mientras que Loess es un método para estimar relaciones no lineales.
A diferencia de SEATS y X11, STL manejará cualquier tipo de estacionalidad, no solo datos mensuales y trimestrales.
Se permite que el componente estacional cambie con el tiempo, y el usuario puede controlar la tasa de cambio.
La suavidad del ciclo de tendencia también puede ser controlada por el usuario.
Puede ser resistente a valores atípicos (es decir, el usuario puede especificar una descomposición robusta), de modo que las observaciones inusuales ocasionales no afectarán las estimaciones de los componentes estacionales y de tendencia-ciclo. Sin embargo, afectarán al componente restante.
Por otro lado, STL tiene algunas desventajas. En particular, no maneja automáticamente la variación del día de negociación o del calendario, y solo proporciona facilidades para descomposiciones aditivas.
elecequip %>%
stl(t.window=13, s.window="periodic", robust=TRUE) %>%
autoplot()
Los dos parámetros principales a elegir cuando se utiliza STL son la ventana tendencia-ciclo ( t.window) y la ventana estacional ( s.window). Estos controlan la rapidez con la que pueden cambiar los componentes estacionales y de tendencia-ciclo. Los valores más pequeños permiten cambios más rápidos. Ambos t.windowy s.windowdeben ser números impares; t.windowes el número de observaciones consecutivas que se utilizarán al estimar la tendencia-ciclo; s.windowes el número de años consecutivos que se utilizará para estimar cada valor en el componente estacional. El usuario debe especificar s.windowya que no existe un valor predeterminado. Configurarlo para que sea infinito es equivalente a forzar que el componente estacional sea periódico (es decir, idéntico a lo largo de los años). La especificación t.windowes opcional y se utilizará un valor predeterminado si se omite.
La mstl()función proporciona una descomposición STL automatizada conveniente usando s.window=13, y t.windowtambién se elige automáticamente. Por lo general, esto brinda un buen equilibrio entre sobreajustar la estacionalidad y permitir que cambie lentamente con el tiempo. Pero, como con cualquier procedimiento automatizado, será necesario ajustar la configuración predeterminada para algunas series de tiempo.
Si bien la descomposición es principalmente útil para estudiar datos de series de tiempo y explorar cambios históricos a lo largo del tiempo, también se puede usar en pronósticos. Por lo general, se supone que el componente estacional no cambia, o cambia muy lentamente, por lo que se pronostica simplemente tomando el último año del componente estimado. En otras palabras, se utiliza un método ingenuo estacional para el componente estacional.Para pronosticar el componente desestacionalizado, se puede utilizar cualquier método de pronóstico no estacional.
fit <- stl(elecequip, t.window=13, s.window="periodic",
robust=TRUE)
fit %>% seasadj() %>% naive() %>%
autoplot() + ylab("New orders index") +
ggtitle("Naive forecasts of seasonally adjusted data")
fit %>% forecast(method="naive") %>%
autoplot() + ylab("New orders index")
fcast <- stlf(elecequip, method='naive')
Estos luego se “reestacionalizan” agregando los pronósticos ingenuos estacionales del componente estacional.
Esto se hace fácil con la forecast()función aplicada al stlobjeto. Los intervalos de predicción que se muestran en este gráfico se construyen de la misma manera que los pronósticos puntuales. Es decir, los límites superior e inferior de los intervalos de predicción de los datos ajustados estacionalmente se “reestacionalizan” agregando los pronósticos del componente estacional. En este cálculo se ha ignorado la incertidumbre en los pronósticos del componente estacional.
La stlf()función utiliza mstl()para realizar la descomposición, por lo que existen valores por defecto para s.windowy t.window.
Además del método ingenuo, hay varios otros posibles métodos de pronóstico disponibles con stlf(), como se describe en el archivo de ayuda correspondiente. Si methodno se especifica, utilizará el enfoque ETS (discutido en el próximo capítulo) aplicado a la serie desestacionalizada.