2020 CamposLopez EE BigDataGoogle PDF
2020 CamposLopez EE BigDataGoogle PDF
2020 CamposLopez EE BigDataGoogle PDF
net/publication/338521663
CITATION READS
1 17
2 authors:
Some of the authors of this publication are also working on these related projects:
The effects of real exchange rate shocks on firms decisions: The case of the Mexican Manufacturing sector 2000-2014 View project
All content following this page was uploaded by Raymundo M. Campos-Vazquez on 10 June 2020.
Sergio E. López-Araiza B.
El Colegio de México, A. C.
Abstract: We use Google Trends data for employment opportunities related reply
in order to forecast the unemployment rate in Mexico. We begin by
discussing the literature related to big data and nowcasting in which
user generated data is used to forecast unemployment. Afterwards, we
explain the basics of several machine learning algorithms. Finally, we
implement such algorithms in order to find the best model to predict
unemployment using both Google Trends queries and unemployment
lags. From a public policy perspective, we believe that both user gen-
erated data and new statistical methods may provide great tools for
the design of policy interventions.
1. Introducción
2. Bibliografı́a relevante
La ciencia económica ha visto en las últimas décadas un fuerte au-
mento de trabajos empı́ricos (Einav y Levin, 2014b). En este con-
texto, es natural que el uso tanto de fuentes de datos alternativas
como de nuevos métodos de análisis estadı́stico estén incorporán-
dose cada vez con mayor frecuencia a la literatura económica. Es
cierto que el enfoque de dichas técnicas consiste en buscar mejorar las
predicciones de los modelos y no, como en los métodos econométricos
tradicionales, lograr identificar una relación causal entre dos variables
(Einav y Levin, 2014b).
Sin embargo, su capacidad predictiva y las nuevas fuentes de
datos han generado importantes ejemplos de su enorme valor para
guiar polı́ticas públicas (Athey, 2017; Banco Mundial, 2014) y para
mejorar la investigación económica cuantitativa en general (Taddy,
2018). De hecho, estas nuevas técnicas estadı́sticas ya han comenzado
a ser empleadas para responder a preguntas clave de las ciencias so-
ciales, como mejorar la precisión de los pronósticos electorales alrede-
dor del mundo (Gerunov, 2014; Kennedy, Lazer y Wojcik, 2017). Por
otro lado, también se ha enfatizado la utilidad de dichos algoritmos
para hacer que la toma de decisiones esté sistematizada y sea eficiente.
Ejemplos de ello podemos encontrarlos en Erel et al. (2018) -en el
ámbito de la conformación de los directivos de grandes empresas- o en
Mullainathan y Obermeyer (2017), referente a diagnósticos médicos.
Otros usos de estos métodos para ciencias sociales abarcan di-
versos ámbitos del sector público, desde la educación hasta los de-
partamentos policiacos. En el ámbito educativo, diversos estudios se
han enfocado en predecir a los estudiantes de educación media con
una mayor propensión a no terminar sus estudios, canalizando ası́ de
forma mucho más eficiente los recursos para apoyarlos (Sara et al.
2015; Lakkaraju et al. 2015; Aguiar et al. 2015). Por otro lado,
estas herramientas han sido utilizadas también para identificar a los
elementos policiales más propensos a tener un desencuentro con la
sociedad (como, por ejemplo, hacer uso desmedido de la fuerza) y
evitar ası́ el desgaste de la imagen de la policı́a en Estados Unidos
(Carton et al. 2016).
Se ha enfatizado también cómo el poder predictivo del llamado
aprendizaje de máquina puede ser utilizado en el entorno de inferencia
causal econométrico (Varian, 2014). En este sentido, se ha destacado
su capacidad para encontrar la forma funcional adecuada (Athey,
2018), su probable uso para escoger el instrumento más adecuado
en un estudio de variables instrumentales (Belloni, Chernozhukov y
Hansen, 2014), contrastar empı́ricamente el desempeño de diversas
GRANDES DATOS, GOOGLE Y DESEMPLEO 129
3. Tendencias en Google
Busquedas empleo
interes = (1)
T otal de busquedas Google
Gráfica 1
IGT y tasa de desocupación a nivel nacional
Gráfica 2
Matriz de correlaciones
Fuente: Elaboración propia con datos de la ENOE y del IGT para la búsqueda
“empleo + ‘bolsa de trabajo’ ”. La gráfica muestra una matriz de correlaciones entre
diversas variables. En la diagonal encontramos la distribución y el nombre de las
variables, en la parte inferior izquierda los puntos de dispersión de las variables corre-
lacionadas acompañado de una lı́nea de tendencia entre ambas. Finalmente, la parte
superior derecha presenta el ı́ndice de correlación de Pearson.
GRANDES DATOS, GOOGLE Y DESEMPLEO 137
Gráfica 3
IGT y desocupación nacional por sexo
138 ESTUDIOS ECONÓMICOS
Gráfica 3
(continuación)
Fuente: Elaboración propia con datos de la ENOE y del IGT para la búsqueda
“empleo + ‘bolsa de trabajo’ ”.
GRANDES DATOS, GOOGLE Y DESEMPLEO 139
p
X X
β̂ = argmin (Yi − β 0 (Xi ))2 + λ |βj | (4)
i j=1
3
t−1
X t
X
ut ∼ ui + IGTi (5)
i=t−12 j=t−12
Antes de analizar qué tan precisos son los modelos en todo el periodo,
es conveniente comprender cómo se comportan a través del tiempo.
En la gráfica 4 observamos los errores de cada estimación para cada
periodo.
En primera instancia, en la gráfica podemos notar que, en tér-
minos generales, todos los modelos cometen sistemáticamente errores
similares. Es decir que, para prácticamente todos los meses, la di-
ferencia entre los errores de los modelos corresponde a la magnitud
del error y no su sentido (todos subestiman o sobrestiman la tasa de
desempleo).
Quizás el modelo más interesante para analizar de esta gráfica
sea el AR sin el IGT. Si bien es cierto que la dirección del error en
GRANDES DATOS, GOOGLE Y DESEMPLEO 145
Gráfica 4
Error de predicción por modelo
Fuente: Elaboración propia con datos de la ENOE y del IGT para la búsqueda
“empleo + ‘bolsa de trabajo’ ”.
Si bien es cierto que la gráfica 4 nos sirve para analizar las tenden-
cias temporales de los estimadores, al presentar cuatro modelos en un
periodo de 13 años, basándonos en ella resulta imposible poder iden-
tificar cuál es el modelo más eficiente. Por tal motivo, en esta sección
analizaremos el error cuadrático medio durante todo el periodo para
cada modelo.
En el cuadro 2 presentamos el error cuadrático medio de las
predicciones para los cuatro modelos:
Cuadro 1
ECM por modelo
7. Conclusiones
Agradecimientos
Referencias
Choi, H. y H. Varian. 2012. Predicting the Present with Google Trends, Eco-
nomic Record, 88(s1): 29.
Einav, L., C. Farronato, J. Levin y N. Sundaresan. 2018. Auctions versus Posted
Prices in Online Markets, Journal of Political Economy, 126(1): 178-215.
Einav, L., D. Knoepfle, J. Levin y N. Sundaresan. 2014. Sales Tax and Internet
Commerce, American Economic Review, 104(1): 1-26.
Einav, L. y J. Levin. 2014a. The Data Revolution and Economic Analysis,
Innovation Policy and the Economy, 14(1): 1-24.
Einav, L. y J. Levin. 2014b. Economics in the Age of Big Data, Science,
345(6210): 1-6.
Erel, I., L. Henny, C. Tan y M. Weisbach. 2018. Selecting Directors Using Ma-
chine Learning, WP núm. 24435, NBER, Cambridge, http://www.nber.org/
papers/w24435.
Gerunov, A. 2014. Big Data Approaches to Modeling the Labor Market, publi-
cado en Proceedings of the International Conference on Big Data, Knowl-
edge and Control Systems Engineering, pp. 47-56.
Gleaser, E., H. Kim y M. Luca. 2017. Nowcasting the Local Economy: Using
Yelp Data to Measure Economic Activity, WP núm. 24010, NBER, Mas-
sachusetts, http://www.nber.org/papers/w24010.
Global Pulse Lab. 2014. Mining Indonesian Tweets to Understand Food Price
Crises, UN GLOBAL PULSE METHODS PAPER, february, https://www.unglob
alpulse.org/projects/social-media-social-protection-indonesia.
Goel, S., J. Hofman, S. Lahaie, D. Pennock y D. Watts. 2010. Predicting
consumer behavior with Web search, Proceedings of the National Academy
of Sciences, 107(41): 17486-17490.
Hamermesh, D. 2013. Six Decades of Top Economics Publishing: Who and How?
Journal Of Economic Literature, 51(1): 162-172.
Hastie et al. 2013. An Introduction to Statistical Learning: with Applications in
R, Springer.
Hayashi, F. 2011. Econometrics, Princeton University Press.
Henderson, J., A. Storeygard y D. Weil. 2012. Measuring Economic Growth
from Outer Space, American Economic Review, 102(2): 994-1028.
Hilbert, M. 2016. Big Data for Development: A Review of Promises and Chal-
lenges, Development Policy Review, 34(1): 135-174.
Horton, J. y P. Tambe. 2015. Labor Economists Get Their Microscope: Big
Data and Labor Market Analysis, Big Data, 3(3): 130-137.
Hota, H.S., R. Handa y A.K. Shrivas. 2017. Time Series Data Prediction Us-
ing Sliding Window Based RBF Neural Network, International Journal of
Computational Intelligence Research, 13(5): 1145-1156.
INEGI. 2017. Estadı́sticas a propósito del dı́a mundial de Internet, Aguas-
calientes, México. http://www.inegi.org.mx/saladeprensa/aproposito/2017
/internet2017 Nal.pdf
Inoue, Atsushi, Lu Jin y Barbara Rossi. 2017. Rolling window selection for
out-of-sample forecasting with time-varying parameters, Journal of Econo-
metrics, 196(1): 55-67.
Kennedy, R., D. Lazer y S. Wojcik. 2017. Improving election prediction inter-
nationally, Science, 355(6324): 515-520.
GRANDES DATOS, GOOGLE Y DESEMPLEO 151
estadístico. En él, es posible trabajar con todo tipo de objetos ─bases de datos (conocidos
como data frames), matrices, vectores y escalares, entre otros─ de forma simultánea. Se trata
de un software libre, con una gran comunidad de usuarios a nivel global, en el que
Por estos motivos es que R es quizás una de las plataformas más populares a nivel profesional
popularidad, R cuenta ya con una gran cantidad de paquetes para hacer prácticamente
cualquier tipo de análisis de datos. De hecho, es relativamente común que, cuando se propone
implementarlo.
sociólogos, entre otros, sí va en aumento, tanto en México como en el resto del mundo. Por
este motivo es que resulta conveniente comprender este lenguaje y agregarlo al conjunto de
En este anexo, explicamos el algoritmo para entrenar, generar y evaluar los modelos de
de explicar más a detalle los algoritmos, presentamos también el código en R que utilizamos
y lo explicamos paso por paso. Antes de comenzar, vale la pena recalcar que para entrenar
tanto al LASSO como al bosque aleatorio utilizamos la misma estructura de código para
implementar la ventana cambiante para su evaluación, por lo que esta podría ser un poco
utilizando un modelo AR y, posteriormente, nos centraremos en los modelos más propios del
aprendizaje de máquina.
aclarar que el operador “<-” se utiliza para asignar valores, de tal suerte que, para declarar
que “a=3”, escribiría “a<-3”. Pese a que desde hace un par de años R ha comenzado a
reconocer el operador “=”, sigue siendo recomendable usar la flecha1. Otro elemento
importante es el operador “c()”, que significa concatenar. Este operador nos permite crear
vectores, de tal suerte que si queremos asignarle a la variable “a” el vector [3,4,7,9],
escribiríamos “a<-c(3,4,7,9)”.
Finalmente, es importante hablar de los índices. R es un lenguaje base uno, lo que significa
que comienza a indexar los elementos de matrices y vectores a partir del número 1 (esta
distinción es importante puesto que hay otros lenguajes, como Python, que lo hacen a partir
del cero). Ahora bien, para acceder a los elementos de un objeto basta con poner,
inmediatamente al lado del nombre del objeto, entre corchetes, el número de elemento al que
se desee acceder. Por ejemplo, si queremos obtener el segundo elemento del vector “a” que
1
Hay que enfatizar que la dirección de la flecha importa. Siguiendo con el ejemplo anterior, es equivalente
escribir “a<-3” que “3->a”, pero escribir “3<-a” o a->3” sería incorrecto, pues no se le puede asignar un valor
a un número.
1
definimos anteriormente (recordemos que a=[3,4,7,9]) basta con escribir “a[2]”, lo cual nos
regresaría el número 4. Si se trata de una matriz, los índices van separados por una coma, el
primer elemento se refiere al renglón y el segundo a la columna (ej. B[2,4] nos regresaría el
que llamamos “entrenamiento del modelo”) como para la evaluación de los modelos, por lo
que entender su estructura es esencial. Utilizaremos como ejemplo los modelos AR, tanto el
que incluye al IGT como al que lo omite. Esta sección del código no la utilizamos durante
una base de datos, a la que hemos decidido llamar “nacional” (puesto que información a nivel
número de meses por el que fueron rezagadas). Por otro lado, tenemos el IGT al que hemos
llamado “indice” con sus respectivos rezagos, nombrados bajo la misma lógica que los
rezagos de la tasa de desocupación. Hay que recalcar que, para que este código funcione, las
El primer paso para implementar un algoritmo de ventana móvil consiste en declarar el ancho
2
w_size<-60
n_windows<-nrow(nacional) – 60
En nuestro caso, utilizamos una ventana de 60 meses. Notemos que para definir el número
total de ventanas utilizamos la función “nrow()”, que nos devuelve el número de renglones
Ya que tenemos claro el ancho de las ventanas y el número de ventanas que podemos generar,
lo que sigue es generar un ciclo (loop) que vaya recorriendo los renglones de la base,
En primera instancia, es conveniente tener una idea general de lo que estamos haciendo: al
objeto “forecasts” le estamos asignando los valores que regrese el ciclo que declaramos
inmediatamente después. Este ciclo, como podrá observarse, lo declaramos con la función
“foreach”, a la que hay que otorgarle un vector de valores (“i=1:n_windows”). Notemos que
el operador “:” sirve para generar un vector que vaya desde lo que se encuentre de su lado
3
izquierdo ─en este caso “i”─ hasta el valor que se encuentre del lado derecho ─en este caso
queremos que nos regrese (“.combine = rbind”). Este último elemento le indica a la función
que lo que esperamos recibir es una matriz cuyas filas se van a ir llenando en cada iteración.
Finalmente, el operador “%do%” le indica a la función que haga sus cálculos de forma
Lo primero que estamos haciendo es generar las submuestras. La variable nacional_in está
tomando todas las observaciones que se encuentran en la base de datos nacional desde la
observación i(es decir, el número de iteración) hasta la observación “n_windows + i -1”. Por
El resto del código consiste en correr la regresión y después hacer las predicciones.
Recordemos que un modelo AR no es más que un problema de MCO con valores rezagados
de la serie de tiempo. Podemos correr regresiones con la función “lm()” (por “modelo lineal”
en inglés), a la que le tenemos que decir la fórmula de la regresión que queremos correr (si
queremos hacer una regresión de x y z sobre y escribiríamos “y~x+z”) y el nombre del objeto
del que obtendremos los datos (en nuestro caso, lo hacemos con la base de datos
La función “lm()” genera varios valores, entre ellos el valor de los coeficientes de la
función “predict()” para, con los valores que guardamos en “m1”, hacer una predicción del
valor que tomará la tasa de desempleo dados los valores de sus predictores. Notemos que
basta con que “nacional_out” contenga las mismas variables que utilizamos en la regresión
4
para que la función “predict()” genere la predicción. El valor de la predicción se lo asignamos
a “f1”.
Como se mencionó anteriormente, se utilizaron ambos modelos AR por lo que lo que sigue
en el código es exactamente igual: corremos la regresión (ahora sin el IGT), le asignamos sus
valores a “m2”, hacemos la predicción para “nacional_out” y asignamos este valor a “f2”.
Ahora, “forecasts” es una matriz que contiene todas las predicciones hechas mediante la
ventana móvil, su primera columna contiene las predicciones para el modelo AR con el IGT
y la segunda para el AR sin el IGT. Generar un vector con los errores de predicción para cada
Utilizamos la función “tail()” para quedarnos con las últimas n observaciones de “nacional”
contiene ahora los errores de predicción del modelo AR con el IGT y “e2” el del AR sin el
IGT. Como veremos más adelante, ahora que tenemos estos vectores de errores podemos
5
A continuación, presentamos el código utilizado para buscar el hiperparámetro λ óptimo
para el LASSO. Sin embargo, antes de hacerlo, hay que generar primero la base de datos
interacciones cúbicas entre el IGT y sus rezagos con la tasa de desocupación y sus rezagos.
“nacional” las columnas que no nos interesan. La función “which” nos ayuda a seleccionarlas
y el signo “-” indica que lo que se hará con esas columnas será quitarlas. Finalmente, la
matriz. Recordemos que, aunque ambos tengan el mismo formato, para R son objetos
distintos con propiedades diferentes. Finalmente, utilizamos la función “poly()” para generar
la matriz “predictores” con todas las interacciones cúbicas para las columnas de la matriz
“pol”. A esta matriz, le aplicamos la función scale para estandarizar todas sus columnas.
Generamos también otros objetos que serán necesarios en el proceso. Para correr el modelo
“lm()”, “glmnet()” no acepta bases de datos (dataframes) como elementos de entrada, por lo
6
que debemos de trabajar con matrices. Por este motivo, generamos el vector “response” que
Por otro lado, generaremos un vector de distintos valores para λ con el objetivo de iterar
sobre de él y encontrar la que minimice el ECM. Aunque no hay una motivación teórica
acerca de qué valores de λ debemos probar, este vector es el más utilizado. Finalmente,
En la primera línea del código, estamos indicándole a R que corra el ciclo de ventana móvil
que vimos anteriormente ─ahora aplicado a LASSO─ para cada valor l en el vector
7
“lambdas”. El objeto “forecasts”, la función “foreach” y el operador “%do%” se utilizan
Por otro lado, para utilizar la función “glmnet” necesitamos una matriz de predictores y un
vector con los valores de la variable que queremos predecir. Por este motivo generamos los
como “y_in”, que contiene los valores de la variable objetivo. Notemos que el criterio de
asignación de renglones se da igual que antes: desde i (el número de iteración) hasta w_size
+i-1.
Nuevamente, en “m1” guardamos el resultado del modelo LASSO que obtenemos de correr
la función “glmnet()”. A esta función tenemos que darle varios argumentos: x, los predictores
parámetro de penalización (al que nosotros le asignamos “l” que es la λ que estamos tomando
en cada iteración) y alpha, que siempre es igual a uno para que el modelo sea un LASSO2.
El paso restante consiste en tomar los vectores de predicciones que emergieron con el valor
el valor de λ que minimiza el ECM, calculado con el algoritmo de ventana móvil, para el
método LASSO.
2
La función “glmnet” nos sirve para correr modelos más generales que LASSO. Si definieramos α=0, nos
quedaríamos con otro modelo para grandes dimensiones llamado Ridge.
3
En la primera iteración es muy factible que lo sea pero, a partir del segundo valor l, estaremos comparando
los errores entre los modelos.
8
A.4 Parametrizando el bosque aleatorio
En términos generales, el algoritmo para parametrizar el bosque aleatorio funciona del mismo
corremos un ciclo en el que, para cada valor o combinación de valores, calculemos el valor
de los errores utilizando el ciclo de ventana móvil y, finalmente, nos quedamos con los
mejor_m <- -1
mejor_t <- -1
error_min <- 10000000000
mvector <- ncol(nacional)/c(1:19)
tvector <- seq(from=500, to=550, by=5)4
set.seed(1993)
Hay que mencionar que los bosques aleatorios son modelos muy populares puesto que
simultáneamente son muy flexibles (es decir, podemos ajustar muchos hiperparámetros) y
no requieren ser ajustados de forma exhaustiva. Para fines del presente trabajo, nosotros
que se seleccionan aleatoriamente para construir cada árbol individual (m, en el vector
“set.seed()” nos permite fijar la distribución aleatoria de los datos para asegurarnos que el
ejercicio es replicable.
4
t=500 es el valor que la función “RandomForest” introduce por default. Para poder hacer una búsqueda
amplia sobre el valor óptimo corrimos los ciclos para distintos vectores “tvector”. La idea es primero generar
un vector con mayor amplitud aunque menos granular (ej. Nosotros comenzamos con tvector =
seq(400,1500, by=150) ) e ir concentrándonos en las regiones en las que el ECM se minimice.
9
forecasts = foreach(i=1:n_windows, .combine = rbind) %do%{
nacional_in = nacional[i:(w_size + i - 1), ]
nacional_out = nacional[w_size + i, ]
m4 = randomForest(desocupacion_nacional ~ desocupacion_nacional_l1 +
desocupacion_nacional_l3 + desocupacion_nacional_l6 + desocupacion_nacional_l9 +
desocupacion_nacional_l12 + indice + indice_l1 + indice_l3 + indice_l6 + indice_l9 +
indice_l12, data=nacional_in, mtry=m, ntree=t)
f1 =predict(m4, nacional_out)
return(c(f1)) }
error = tail(nacional[ ,"desocupacion_nacional"], nrow(forecasts)) - forecasts[ ,1]
rmse = 1000 * sqrt(mean(error ^ 2))
if (rmse<error_min){
mejor_m <- m
mejor_t <- t
error_min<-rmse}}}
Como la estructura del código es muy similar a las que hemos visto anteriormente, no nos
principales novedades. La primera diferencia que salta a la vista es que ahora se trata de tres
ahora tenemos dos (t y m) cuando antes solo teníamos uno (λ). Además, cabe mencionar que,
al igual que la función “lm()”, la función “randomForest()” sí acepta como entrada una base
de datos, por lo que no es necesario transformar a la base “nacional” en una matriz, como sí
Comentemos la función “randomFores()”, pues se trata de una función tan flexible como el
modelo. En primera instancia, hay que hacer explícito cuál es la variable que queremos
predecir, cuáles los predictores y de qué base de datos los estamos sacando, con la misma
sintaxis en que lo hicimos para el AR. En nuestro caso, es necesario declarar también los
10
valores de los hiperparámetros que decidimos afinar: “ntree” y “mtry”. Notemos que, al igual
que en LASSO, asignamos a los hiperparámetros el valor que adquieren en cada iteración.
usamos para calcular el vector de errores y calculamos el ECM para cada combinación de
hiperparámetros. Haciendo la comparación de cada ECM, nos quedamos con los valores de
Una vez que encontramos los valores óptimos para λ, m y t (guardados en “mejor_lambda”,
“mejor_m” y “mejor_t”, respectivamente), queremos construir una base de datos con los
errores de los cuatro modelos para poder compararlos. Para hacerlo, utilizamos el ciclo que
que vimos en la sección A2 para explicar la ventana móvil, pero añadiéndole los dos modelos
faltantes:
set.seed(1993)
forecasts = foreach(i=1:n_windows, .combine = rbind) %do%{
nacional_in = nacional[i:(w_size + i - 1), ]
nacional_out = nacional[w_size + i, ]
x_in = as.matrix(predictores[i:(w_size + i - 1), ])
y_in = response[i:(w_size + i - 1)]
x_out = predictores[w_size + i, ]
# AR con IGT #
m1 = lm(desocupacion_nacional ~ desocupacion_nacional_l1 +
desocupacion_nacional_l12 + indice, data = nacional_in)
f1 = predict(m1, nacional_out)
#AR sin IGT#
m2 = lm(desocupacion_nacional ~ desocupacion_nacional_l1 +
desocupacion_nacional_l12, data = nacional_in)
11
f2 = predict(m2, nacional_out)
# LASSO #
m3 = glmnet(x=x_in, y=y_in, lambda = mejor_lambda, alpha = 1)
f3 = predict(m3, t(x_out), s=l, type="response")
# Random Forest #
m4 = randomForest(desocupacion_nacional ~ desocupacion_nacional_l1 +
desocupacion_nacional_l3 + desocupacion_nacional_l6 + desocupacion_nacional_l9 +
desocupacion_nacional_l12 + indice + indice_l1 + indice_l3 + indice_l6 + indice_l9 +
indice_l12, data=nacional_in, mtry=mejor_m, ntree = mejor_t)
f4 =predict(m4, nacional_out)
return(c(f1, f2, f3, f4))
setTxtProgressBar(pb, i)}
Notemos que estamos brindando los valores óptimos de los hiperparámetros que
encontramos anteriormente para, en este ciclo, quedarnos con las mejores predicciones que
posibles. Ahora, el objeto “forecasts” contendrá la matriz con las predicciones de los cuatro
modelos. Con él, podemos construir los vectores de errores para, por ejemplo, graficar su
Primero, al igual que como lo hicimos en la sección A.2, construimos los vectores de errores
de predicción de cada modelo. Con ellos, construimos una base de datos y tomamos sus
12
fechas de la base “nacional”. Hacemos esto con la función “dataframe()”, a la que le
indicamos los datos y los nombres de las columnas. Finalmente, generamos la base “mdf”
con la función “melt()”, que nos apila las columnas por fecha para generar las series de
tiempo. Este último paso es fundamental para generar la gráfica. Es importante recalcar que
Por otro lado, calcular el ECM de cada modelo es relativamente sencillo utilizando los
vectores de errores:
A6. Gráficas
En términos generales, pueden generarse gráficas en R utilizando ya sea el motor base (con
la función “plot()”) o a través del paquete ggplot2. Debido a su enorme flexibilidad, esta
última opción es, por mucho, la más popular para los usuarios de R. Por este motivo, esta es
13
legend.text=element_text(size=15))
La sintaxis para generar gráficas en ggplot2 es relativamente sencilla: primero utilizas la
mediante el símbolo “+”, se van agregando nuevos elementos. En nuestro caso, a la función
“ggplot()” solo le indicamos que los datos necesarios para generar la gráfica se encuentran
graficar son líneas (podríamos usar, por ejemplo, “geom_point()” o “geom_bar()” para
elementos de la gráfica usando “aes()”: indicamos qué queremos en cada eje y cuáles son los
diferentes grupos dentro de la base de datos (en nuestro caso, los grupos corresponden a los
modelos predictivos).
Posteriormente, con la función “labs()” declaramos el texto que queremos que aparezca tanto
en el título como en los ejes, así como el título de la leyenda para diferenciar a los grupos.
Utilizamos “theme_bw()” para cambiar el color del fondo de la gráfica (que, por default, es
tamaño de texto del título y del nombre de los ejes, así como la posición de la leyenda.
Apéndice B
Sin IGT
Modelo ECM
14
(el que utilizamos)
Con IGT
Modelo ECM
+ 𝜖𝑡
15