Otra vez toca un post técnico. En esta ocasión veremos uno de los modelos más utilizados en los trabajos de series de tiempo. Desde que Sims (1990) presentó su trabajo seminal, su uso se ha popularizado por ser una forma intuitiva de pensar en las relaciones causales entre variables. Sólo ese artículo de Sims tiene más de 16 mil citas en Google Académico. Sin embargo, su uso ha caído considerablemente en los últimos años. En la siguiente imagen podemos ver que la técnica tuvo dos auges: uno pocos años después de su lanzamiento por Sims y otro algunos años más adelante en los años 2000.
No obstante, es innegable que sigue siendo una técnica extremadamente popular, con mayor número de menciones en Ngram incluso de Diferencias en Diferencias, una técnica relativamente nueva de modelos en Panel que s motivo de discusión común hoy en día entre los expertos en econometría.
Este post tiene un poco más de técnica que los de las semanas pasadas. Así que, si quieres seguir el tutorial, te recomiendo que guardes este correo, lo pongas en favoritos o que compartas el link del post en Twitter (así le hago a veces para poder encontrar mas fácil mis tutoriales).
Intuición del modelo
El modelo VAR se llama así porque en inglés significa Vector Autorregression Models. La traducción literal sería autorregresión de vectores, pero se elige llamarle vectores autorregresivos porque mantiene las siglas sin perder mucho el significado. Vale la pena rescatar que el VAR de los econometristas vino muchísimo primero que el videoarbitraje que se usa en los partidos de futbol. Tenemos preferencia.
Pero, ¿que significa que un modelo sea autoregresivo? el nombre implica que cada variable se modela como una función de valores pasados. Es decir, los predictores son rezagos de la serie.
Esto debe de hacerte pensar en los modelos ARIMA. En este caso la serie de tiempo se modela como una combinación lineal de sus propios rezagos. Los valores pasados de la serie se usan para proyectar al futuro los valores. Un modelo típico de tipo AR(p) se ve algo así
En comparación, un modelo VAR hace que cada variable sea la combinación lineal de los valores pasados de sí misma y de los valores pasados de otras variables en el sistema. Un modelo de tipo VAR(2) que tiene tres variable se ve como un sistema de ecuaciones así
El proceso que usaremos en este tutorial es que haremos un análisis de la serie de tiempo, y encontraremos el orden óptimo del modelo. Usaremos este modelo para crear predicciones y probaremos las predicciones en un subconjunto de la serie.
Importando la base de datos
Para estos ejemplos usaremos las siguientes librerías. Recuerda que si no las tienes es necesario descargarlas usando install.packages()
.
library(tidyverse) library(xts) library(reshape) library(urca) library(tseries)
Los datos se alojan en un repositorio en Github. Para extraer la información que usaremos para este proyecto usamos.
path <- '<https://raw.githubusercontent.com/selva86/datasets/master/Raotbl6.csv>'
df <- read.csv(path) head(df)
Esta base de datos se basa en este artículo de Mehra (1994) sobre el proceso de la inflación y el crecimiento de salarios. Se compone por 8 series de tiempo: el Producto Nacional Bruto (GNP) en términos reales rgnp
. También tiene el GNP potencial en términos reales pgnp
, el costo unitario por el trabajo ulc
, el deflactor de los gastos de consumo personal excluyendo alimentación y energía gdfco
, el deflactor del GNP gdf
, el deflactor de importaciones gdfim
, el deflactor de alimentación en los gastos de consumo personal gdfcf
y el de energía, también dentro de los gastos de consumo personal gdfce
. Todos los deflactores son de ponderación fija.
Hagamos primero un análisis visual de los datos generando una gráfica de líneas para cada una de las variables. Usaremos ggplot
para esto
df %>%
reshape2::melt(id = "date") %>% ggplot(aes(x = as.Date(date), y = value, group = variable))+ geom_line()+ facet_wrap(~variable, scales = 'free_y')+
labs(x = 'Date', y = 'Value')
Hagamos un objeto de tipo xts
con la base de datos. En la sintaxis que uso estoy asumiendo que tal vez olvidaste cargar la librería xts
. Es también una buena práctica en ocasiones para liberar espacio RAM en la computadora y para ser muy claro si alguien más está viendo el código.
df_ts <- xts::xts(df[,-1], order.by = as.Date(df[,1]))
Análisis de Causalidad de Granger
La base detrás del modelo VAR es que cada una de las series de tiempo en el sistema tienen influencia en las demás. Es decir, podemos predecir la serie de tiempo para una serie utilizando los rezagos de la otra. Podemos probar esta primera hipótesis usando el test de causalidad de Granger incluso antes de comenzar a construir nuestro modelos.
En el test de causalidad de Granger, la hipótesis nula es que los coeficientes de los valores pasados en la ecuación de regresión es cero. Por lo tanto, si el valor p que nos arroje la prueba es menor al nivel de significancia de 0.5, entonces podremos rechazar la hipótesis nula.
En el siguiente código, hacemos un ciclo en el que probamos el modelo para todas las variables. Al final de cada iteración, R nos muestra únicamente los resultados del valor p para cada prueba que hacemos.
for (variable in names(df[,-1])) {
granger <- vars::causality(vars::VAR(df_ts, p = 2, type = "const", season = NULL, exogen = NULL), cause = variable)
print(paste(variable, ": ", granger$Granger$p.value)) }
# [1] "rgnp : 9.60699087370065e-05"
# [1] "pgnp : 1.2863997738144e-06"
# [1] "ulc : 5.20911812224023e-05" # [1] "gdfco : 0.00164865926316504" # [1] "gdf : 0.00648726819878298"
# [1] "gdfim : 0.0442774724624662"
# [1] "gdfcf : 0.0173597595666217"
# [1] "gdfce : 0.00868421111725359"
Podemos hacer pruebas con diferentes niveles de rezago. En este caso, encontramos que dos rezagos nos dan un nivel bastante bueno de causalidad en el sentido de Granger. Esto nos indica que es posible hacer un modelo con este sistema, pues todas las variables en la misma parecen tener causalidad en las demás. El siguiente paso es hacer una prueba de cointegración.
Cointegración
La prueba de cointegración ayuda a establecer la presencia de una conexión estadísticamente significativa entre dos o más series de tiempo. Cuando se tienen dos o más series de tiempo y existe una combinación lineal de ellas que tiene un orden de integración (d) menor al de la serie individual, se dice que la serie está cointegrada.
¿Y esto que significa? Cuando dos o más series de tiempo están cointegradas, significa que tienen una relación estadística significativa en el largo plazo. Esta condición es necesaria para cumplir con la premisa de los modelos VAR. Por eso es una buena idea implementar la prueba de cointegración antes de empezar a construir los modelos VAR.
Afortunadamente, Johansen (1991) nos muestra un método para implementar esta prueba. En la prueba de cointegración de Johansen, la hipótesis alternativa para el eigenvalor de la prueba es que hay $r + 1$ relaciones de cointegración. Por lo tanto es una prueba secuencial: primero pruebas para $r= 0$, después para $r = 1$, y así hasta encontrar la prueba en la que $H_0$ se rechaza por primera vez.
Podemos implementar esta prueba con el uso de la siguiente función dentro de la librería urca
.
johansen <- ca.jo(df[,-1], type = 'trace', ecdet = 'trend', spec = 'transitory') summary(johansen)
¡Este método nos muestra cointegración en nuestro sistema!
Alternativamente, también se puede usar la prueba Dickey Fuller para obtener el mismo tipo de resultado.
for (var in names(df[,-1])) { df_test <- ur.df(df_ts[,var], lags = 6, selectlags = "AIC", type = "drift") print(var) print(df_test) }
Comencemos con el modelo
Una vez con luz verde de los diagnósticos, podemos enfocarnos al modelo. Para eso primero partiremos nuestra serie en una serie de prueba y otra de entrenamiento, que nos permita generar un modelo a partir del cual haremos predicciones sobre la prueba.
Usaremos el modelo para predecir las siguientes 4 observaciones de los datos:
train <- df_ts[-((n-4):n),] test <- df_ts[(n-4):n,]
El siguiente paso es verificar estacionariedad. Para eso haremos nuestra prueba de Dickey-Fuller aumentada para revisar la existencia de raíces unitarias.
La prueba de Dickey Fuller Aumentada permite los procesos autorregresivos de alto orden, incluyendo $\Delta_{x_{t-p}}$ en el modelo.
for (var in names(train)) { adf <- tseries::adf.test(train[,var], alternative = 'stationary', k = trunc((length(train)-1)^(1/3))) print(var) print(adf) }
El resultado de esta prueba nos muestra que ninguna serie es estacionaria. Haremos por lo tanto diferenciación de todas las variables al mismo tiempo. Afortunadamente, R hace muy fácil esto usando únicamente diff(train)
. Al correr el modelo encontramos que algunas de las variables aún no son estacionarias. Esto lo podemos también observar de manera gráfica usando plot
de la variable diferenciada.
Por lo tanto, usaremos la segunda diferencia para llevar a cabo este modelo
diff_train <- diff(train, na.pad = F, lag = 2)
Y esto es todo por hoy en este proyecto. En la siguiente semana ya haremos el modelo y haremos pruebas con él para lograr hacer predicciones. También haremos algunos comentarios respecto a su implementación y algunos aspectos prácticos al respecto.
Referencias
- Sims, C. (1980). Macroeconomics and Reality. Econometrica, 48(1), 1-48. doi:10.2307/1912017
- Mehra Y.P. (1994) Wage Growth and the Inflation Process: An Empirical Approach. In: Rao B.B. (eds) Cointegration. Palgrave Macmillan, London. https://doi.org/10.1007/978-1-349-23529-2_5
- Johansen, S. (1991). Estimation and Hypothesis Testing of Cointegration Vectors in Gaussian Vector Autoregressive Models. Econometrica, 59(6), 1551-1580. doi:10.2307/2938278
Los mercados
Hoy es un día muy importante para los mercados. Hoy es el anuncio de política monetaria de Jerome Powell. En este, Jerome nos dará la pauta de lo que vendrá para los próximos meses.
Este anuncio es particularmente importante porque la FED ha estado inyectando dinero a la economía de una manera nunca antes vista de manera contínua. Hasta el momento lo había hecho sin preocupaciones de la inflación, pero esta vez los indicadores de inflación sugieren que probablemente los estímulos paren y que la tasa de interés podría subir.
Es una situación muy estresante para un documento tan aburrido y críptico en su lectura (eso es por diseño). Particularmente porque ya ha pasado que el mercado haga un berrinche cuando los estímulos paran. Esperemos que el anuncio de Powell sea lo suficientemente sutil para que la reacción de los mercados sea favorable.