
Leer el artículo completo
Registrarse ahora para leer el artículo completo y acceder a todos los artículos por solo suscriptores pagos.
SuscribirseGuías de 5 minutos para resolver tus proyectos de econometría. Escribe un paper, una tesis o simplemente has estudios internos para tu empresa.
Registrarse ahora para leer el artículo completo y acceder a todos los artículos por solo suscriptores pagos.
SuscribirseRegistrarse ahora para leer el artículo completo y acceder a todos los artículos por solo suscriptores pagos.
SuscribirseRegistrarse ahora para leer el artículo completo y acceder a todos los artículos por solo suscriptores pagos.
SuscribirseRegistrarse ahora para leer el artículo completo y acceder a todos los artículos por solo suscriptores pagos.
SuscribirseRegistrarse ahora para leer el artículo completo y acceder a todos los artículos por solo suscriptores pagos.
SuscribirseOtra 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).
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.
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]))
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.
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) }
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.
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.
Registrarse ahora para leer el artículo completo y acceder a todos los artículos por solo suscriptores pagos.
SuscribirseDurante toda la campaña estuvimos escuchando sobre diferentes alternativas para el voto. Lo normal es escuchar que cada uno de los partidos nos pidan el voto directamente, pero en esta ocasión hubo una coalición un tanto extraña en la que PRI, PAN y PRD unieron fuerzas para intentar vencer a MORENA en las elecciones. Como parte de su estrategia, promovieron mucho el "voto útil" contra MORENA, bajo el argumento de que este ayudaría a desconcentrar el poder.
Pero si la intención es una distribución más equitativa del poder, la mejor opción probablemente no sea elegir. Probablemente lo mejor que se pueda hacer sin mayor información es votar de manera aleatoria.
Me explico. De acuerdo a la Poll of Polls de oraculus.mx, MORENA mantendrá un 41% del aparato legislativo. Menor al 50% mas uno que necesitaría si se busca la mayoría absoluta que se necesita para reformar las leyes y aprobar el presupuesto anual. Esto sería menos de lo que en Morena querrían, pero probablemente a los demás partidos les parecerá demasiado. Nadie va a quedar contento en esta elección.
Esta es en teoría la justificación para hacer voto útil: desconcentrar el poder del legislativo para que no quede en las manos del presidente. Esto puede sonar razonable: de acuerdo a un análisis realizado por Rafael Prieto, la mayoría de las propuestas de los candidatos se concentran únicamente en dar continuidad con el proyecto de la cuarta transformación (lo que sea que eso signifique) y "votar lo que el presidente diga".
Sin embargo, un argumento en contra del voto útil es que este implica una regresión a "los de antes", al régimen anterior. En esta columna, Viridiana Ríos identifica entre los votantes de MORENA a los que llama "votantes verdugos", cuyo voto es aún un castigo al PRI y al PAN, a quienes identifica como los causantes de la corrupción, violencia y desigualdad, entre otros problemas que actualmente vivimos.
Si todo esto te parece abrumador y confuso, pero aún consideras que es necesario expresar tu voto, puedes tomar una solución relativamente sencilla: vota de manera aleatoria. Mis motivos son tres: ayuda a distribuir el poder, sirve como un voto de castigo más efectivo y no requiere que aprendas tanto de los candidatos para que tu voto se parezca más a un voto informado.
Si tu intención es que el poder quede mejor distribuido, un voto aleatorio es mucho más poderoso que tratar de elegir el que le va a causar más peso al ganador. Si toda persona indecisa hiciera eso, los lugares del legislativo quedarían más distribuidos entre partidos.
Sería un voto de castigo más efectivo que el voto en blanco o cancelar el voto porque beneficiaría a los partidos más chicos más que a los grandes. Si todos los partidos son igual de malos, entonces no importa a quién elijas, pero muy probablemente no estarás eligiendo a quien está ya en el poder. En cambio, cancelar el voto beneficia efectivamente al puntero de la elección.
Lo más importante es que no necesita que aprendas nada de los candidatos en absoluto. Si la única comunicación que hicieron llegar durante las campañas fueron chistes, chismes y ocurrencias, probablemente eso no es un excelente indicador del rendimiento como gobernante o legislador.
Con algo de suerte, la última condición podría tener dos efectos secundarios: que con menos carga cognitiva, más personas salgan a votar y que los candidatos en el largo plazo tengan mejores estrategias de comunicación de las políticas públicas que respaldan, para evitar ese voto aleatorio. Después de todo, un voto aleatorio tiene más probabilidad que sea por cualquiera de los demás partidos y no al mío.
Está bien, admito que esto es sólo un ejercicio de imaginación con un planteamiento que tiene sus propias complicaciones en la vida real. En particular, a menos de que el voto aleatorio fuera masivo, los beneficios del mismo no se disfrutan. Pero eso ya sucede: nuestro voto de manera individual no tiene gran efecto en comparación al voto que se moviliza por otros medios como las estructuras de partidos o los líderes sociales.
La primera opción es con un método que puede tener algo de sesgo, pero creo que muchos estarían más conformes con el resultado si ya tienen algo de información previa. El primer paso es recortar las opciones a seis, quitando aquellas opciones por las que nunca votarías. Por ejemplo, yo estoy seguro de que jamás votaría por un partido ultra religioso como el PES, así que lo podría quitar sin ninguna culpa. El segundo paso sería hacer una lista que asigne a cada partido restante un número del uno al seis. El tercer paso es lanzar un dado y dar mi voto al partido que me salga.
La segunda forma puede incluir todos los partidos que desees. La página de random.org tiene una opción para hacer listas aleatorias. Selecciona Lists and More y luego List Randomizer. Luego por las opciones en la caja de texto, una por cada línea en la caja. Cuando presionas Randomize! la página te regresa la lista ordenada en un orden aleatorio de preferencias. Elige la primera y vota.
Hay una tercera forma, pero esta requiere de R. Sólo corre la siguiente línea en la consola:
sample(c("Morena", "PRI", "PAN"),1)
Sólo completa la lista con todos los partidos y presiona enter y tendrás tu respuesta.
Pues ya salimos del COVID. Mi esposa tuvo un poco más de síntomas, pero nunca fue algo de preocupación. Yo estuve un tanto mejor, pero me tocó cuidar a todos y eso en las condiciones que tenía era totalmente extenuante. Afortunadamente todo sigue bien. El Taller de Exploración de la ENIGH con enfoque de cuidados sigue en pie, cambiando la fecha al lunes 14 de Junio a las 13 horas (hora de CDMX). Si te interesa asistir me puedes contestar a este correo para recibir la información. También puedes ponerlo en los comentarios, si lo estás leyendo en la página. ¡Nos vemos ahí!