Las series de tiempo son una clase de datos que están estructuradon en el tiempo (valga la redundancia), es decir, cada observación se refiere a un periodo en particular y estas tienden a ser menos volátiles que los datos de corte transversal. Estas suelen tener ciertos componentes que las caracterizan, como son:
Dados los componenentes anteriores, podemos decir que una ecuación de serie de tiempo está dada por:
\[\begin{equation} Y_t = \tau_t + \epsilon_t + I_t \end{equation}\]
Donde \(\tau_t\) es la tendencia de largo plazo, \(\epsilon_t\) es el componente estacional y \(I_t\) es el componente aleatorio.
Ahora, no todas las series de tiempo son estacionarias. Para que una serie de tiempo se considere estacionaria, su media y varianza deben ser constantes en el tiempo, es decir:
\[\begin{equation} \begin{bmatrix} Var[U_1] & Cov[U_1, U_2] & ... & Cov[U_1,U_T] \\ Cov[U_2,U_1] & Var[U_2] & ... & Cov[U_2,U_T] \\ \vdots & \vdots & \ddots & \vdots \\ Cov[U_T,U_1] & Cov[U_T,U_2] & ... & Var[U_T] \end{bmatrix}= \begin{bmatrix} \sigma_1^2 & 0 & ... & 0\\ 0 & \sigma_2^2 & ... & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & ... & \sigma_T^2 \end{bmatrix} \end{equation}\] Donde \(\sigma_i^2 = \sigma_j^2\), para todo \(i = j\) y \(i,j=1,2,...,T\).
Para la matriz de varianzas y covarianzas. Es importante mencionar que de no tener una serie con estacionariedad, no tendría sentido hacer el siguiente procedimiento para desestacionalizar una serie.
Existen diversos métodos para desestacionalizar una serie de tiempo, como el método analítico de análisis de tendencia por mínimos cuadrados, pero el que usaremos en este caso es el método de medias móviles, el cual consiste en obtener una promedios de ciertos grupos de periodos de la serie de tiempo, tal que:
\[\begin{equation} Y_t=\frac{Y_{t-1}+Y_{t}+Y_{t+1}+...+Y_{t+n}}{n} \end{equation}\] O bien, generalizando: \[\begin{equation} Y_t=\frac{\sum Y_{tn}}{n} \end{equation}\]
Este método tiene sus limitantes, ya que hay que considerar que al obtener promedios de los valores originales entonces perderemos valores, por lo que no es recomendable para series de tiempo de periodos cortos.
Vamos con el ejercicio en R. Empezamos cargando las librerias necesarias:
#Instalación en caso de no tenerlas
#install.packages("ggseas")
#install.packages("ggplot2")
#install.packages("tseries")
#install.packages("plotly")
library(ggseas)
## Loading required package: ggplot2
## Warning: replacing previous import 'vctrs::data_frame' by 'tibble::data_frame'
## when loading 'dplyr'
library(readxl)
library(ggplot2)
library(tseries)
## Registered S3 method overwritten by 'xts':
## method from
## as.zoo.xts zoo
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
library(plotly)
## Warning: package 'plotly' was built under R version 3.6.2
##
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout
Ahora, usaremos datos de contagios diarios de Covid-19 para el caso de México disponibles en la página de la OMS. Cargamos la base de datos:
datacovid <- read_excel("/Users/jorge/Downloads/datacovid.xlsx")
datacovid
## # A tibble: 280 x 3
## Fecha `Casos totales` `Casos nuevos`
## <chr> <dbl> <dbl>
## 1 2020-02-28 1 1
## 2 2020-02-29 4 3
## 3 2020-03-01 5 1
## 4 2020-03-02 5 0
## 5 2020-03-03 5 0
## 6 2020-03-04 5 0
## 7 2020-03-05 5 0
## 8 2020-03-06 6 1
## 9 2020-03-07 6 0
## 10 2020-03-08 7 1
## # … with 270 more rows
#Leemos la base
attach(datacovid)
Ahora, a veces R suele tener problemas para leer el vector de fechas debido a que las páginas que proporcionan la base de datos usan otro formato, por lo que para evitar este problema vamos a crear un vector de fechas de la siguiente manera (considerando la fecha inicial y la fecha final de la base de datos):
Fecha1<-seq(as.Date("2020-02-28"), as.Date("2020-12-03"), by = "day")
Creamos un data frame que incluya el nuevo vector de fechas y los datos a utilizar:
Datos_covid<-data.frame(Fecha1, `Casos nuevos`, `Casos totales`)
Graficamos un GGplot simple:
ggplot(Datos_covid, aes( x = Fecha1, y = `Casos nuevos`) ) +
geom_line(size = 0.5, color = "darkblue")
Cambiamos el fondo, agregamos nombres a los ejes y agregamos títulos y subtítulos:
ggplot(Datos_covid, aes( x = Fecha1, y = `Casos nuevos`) ) +
geom_line(size = 0.5, color = "darkblue") +
theme_bw() +
theme(legend.position = "none") +
theme(legend.title = element_blank()) +
guides(col = guide_legend(nrow = 1, byrow = TRUE)) +
#Nombre de los ejes
xlab("Periodo") +
ylab("Casos nuevos diarios")+
#Ajuste de tamaños
theme(plot.title = element_text(size = 11, face = "bold", hjust = 0)) +
theme(plot.subtitle = element_text(size = 10, hjust = 0)) +
theme(plot.caption = element_text(size = 10, hjust = 0)) +
theme(plot.margin = unit(c(1,1,1,1), "cm")) +
#Títulos y subtitulos
labs(
title = "Casos nuevos de COVID-19 en México.",
subtitle = "Valores diarios.",
caption = "Fuente: Elaboración propia con datos de WHO. \nNotas: Datos gubernamentales."
)
Ahora, agregamos una linea desestacionalizada con la función “stat_rollapplyr” del paquete “ggseas”:
ggplot(Datos_covid, aes( x = Fecha1, y = `Casos nuevos`) ) +
geom_line(size = 0.5, color = "darkblue") +
stat_rollapplyr(width = 12, align = "center", col = "Darkred", size = 1)+
theme_bw() +
theme(legend.position = "none") +
theme(legend.title = element_blank()) +
guides(col = guide_legend(nrow = 1, byrow = TRUE)) +
xlab("Periodo") +
ylab("Casos nuevos diarios")+
theme(plot.title = element_text(size = 11, face = "bold", hjust = 0)) +
theme(plot.subtitle = element_text(size = 10, hjust = 0)) +
theme(plot.caption = element_text(size = 10, hjust = 0)) +
theme(plot.margin = unit(c(1,1,1,1), "cm")) +
labs(
title = "Casos nuevos de COVID-19 en México.",
subtitle = "Valores diarios.",
caption = "Fuente: Elaboración propia con datos de WHO. \nNotas: Datos gubernamentales."
)
## Warning: Removed 11 row(s) containing missing values (geom_path).
Podemos cambiar los colores para denotar con mayor claridad la serie desestacionalizada:
ggplot(Datos_covid, aes( x = Fecha1, y = `Casos nuevos`) ) +
geom_line(size = 0.5, color = "grey74") +
stat_rollapplyr(width = 12, align = "center", col = "Darkred", size = 1)+
theme_bw() +
theme(legend.position = "none") +
theme(legend.title = element_blank()) +
guides(col = guide_legend(nrow = 1, byrow = TRUE)) +
xlab("Periodo") +
ylab("Casos nuevos diarios")+
theme(plot.title = element_text(size = 11, face = "bold", hjust = 0)) +
theme(plot.subtitle = element_text(size = 10, hjust = 0)) +
theme(plot.caption = element_text(size = 10, hjust = 0)) +
theme(plot.margin = unit(c(1,1,1,1), "cm")) +
labs(
title = "Casos nuevos de COVID-19 en México.",
subtitle = "Valores diarios.",
caption = "Fuente: Elaboración propia con datos de WHO. \nNotas: Datos gubernamentales."
)
## Warning: Removed 11 row(s) containing missing values (geom_path).
Como podemos observar, la serie desestacionalizada pierde valores tanto al principio como al final debido a la obtención de los promedios, sin embargo, debido a la gran cantidad de datos que tenemos en este caso, esto no resulta ser un inconveniente demasiado grave, pero si debe tomarse en cuenta con series que cuentes con una menor cantidad de datos.
Ahora, para hacer interactiva la gráfica haremos de la función “Ggplotly” del paquete “Plotly”:
#Convertimos a la gráfica en un objeto
GRAFCOVID<- ggplot(Datos_covid, aes( x = Fecha1, y = `Casos nuevos`) ) +
geom_line(size = 0.5, color = "grey74") +
stat_rollapplyr(width = 12, align = "center", col = "Darkred", size = 1)+
theme_bw() +
theme(legend.position = "none") +
theme(legend.title = element_blank()) +
guides(col = guide_legend(nrow = 1, byrow = TRUE)) +
xlab("Periodo") +
ylab("Casos nuevos diarios")+
theme(plot.title = element_text(size = 11, face = "bold", hjust = 0)) +
theme(plot.subtitle = element_text(size = 10, hjust = 0)) +
theme(plot.caption = element_text(size = 10, hjust = 0)) +
theme(plot.margin = unit(c(1,1,1,1), "cm")) +
labs(
title = "Casos nuevos de COVID-19 en México.",
subtitle = "Valores diarios.",
caption = "Fuente: Elaboración propia con datos de WHO. \nNotas: Datos gubernamentales."
)
#Lo volvemos interactivo:
ggplotly(GRAFCOVID)
[1] Brockwell, P. J., Davis, R. A., & Calder, M. V. (2002). Introduction to time series and forecasting (Vol. 2, pp. 3118-3121). New York: springer.
[2] Granger, C. W., & Joyeux, R. (1980). An introduction to long-memory time series models and fractional differencing. Journal of time series analysis, 1(1), 15-29.
[3] Chatfield, C., & Xing, H. (2019). The analysis of time series: an introduction with R. CRC press.
[4] Oksendal, B. (2003). Stochastic differential equations. In Stochastic differential equations (pp. 65-84). Springer, Berlin, Heidelberg.
[5] Enders, W. (2008). Applied econometric time series. John Wiley & Sons.
[6] Vazquez Oliva Benjamín. (2020). Notas de Clase: Series de Tiempo. Ciudad de México. UNAM.