Tópicos de Econometría II - Sesión 1
Tópicos de Econometría II - Sesión 1
1. Introducción
En esta sesión vamos a usar la serie de tiempo (\(ts\)) del desempleo trimestral para los Estados Unidos (EEUU) durante el periodo 1980-2019, la fuente del archivo es la página de la Reserva Federal de San Luis (stlouisfed). La \(ts\) está contenida en un archivo csv. Iniciaremos cargando la base en RStudio, posteriormente vamos a desestacionalizar la \(ts\) con el método de los índices ajustados (\(ia\)) a través de un promedio movil centrado y por último vamos a exportar el dataframe en un archivo Excel (xlsx).
\(~\)
2. Cargando el archivo csv
a. Librerías usadas en el ejercicio de desestacionalización.
### Limpiar los objetos previamente cargados
remove(list = ls())
### Paquetes usados en el trabajo
library(ggplot2) ## Gramática de gráficas
library(ggseas) ## Complemento de ggplot2
library(scales) ## Escalas para los ejes en ggplot2
library(forecast) ## Centrado de una serie de tiempo
library(lubridate) ## Formato de fechas
library(dplyr) ## Manipulación de dataframe
library(xlsx) ## Exportar dataframe en formato Excelb. Directorio de trabajo
Es necesario fijar un directorio de trabajo que contenga el archivo de la \(ts\). Este directorio también va a contener el datafame exportado al final de esta sesión.
setwd("/home/fabian/Descargas/Tópicos II")c. Cargando el archivo csv
Por medio de la función read.csv() vamos a cargar la \(ts\) del desempleo trimestral en los EEUU. R carga la base como un dataframe y nosotros la guardaremos en el objeto base_1.
base_1 <- read.csv("unemployment_usa.csv", dec = ",")Con la función head() podemos ver las seis primeras filas de base_1.
head(base_1)## fecha var_unemp
## 1 1980-01-01 6.9
## 2 1980-04-01 7.3
## 3 1980-07-01 7.7
## 4 1980-10-01 7.2
## 5 1981-01-01 8.1
## 6 1981-04-01 7.4
d. Clase de las columnas del dataframe
Base_1 contiene dos columnas: la primera se titula \(fecha\), esta contiene cada uno de los trimestres entre los años 1980 y 2019. La segunda es \(var\_unemp\) que corresponde a la tasa de desempleo trimestral calculada por la Bureau of Labor Statistics (BLS) en los EEUU.
Con la función sapply() podemos estudiar la clase de las dos columnas del dataframe base_1.
sapply(base_1, class)## fecha var_unemp
## "character" "numeric"
La función arroja que la columna \(fecha\) es character mientras que \(var\_unemp\) es numérica. Para nuestro ejercicio es necesario que la primera columna sea Date y la segunda una ts.
\(~\)
3. Manipulación del Dataframe
a. Conversión de las columnas
La librería lubridate nos permite convertir de forma sencilla un caracter a una fecha.
base_1$fecha <- ymd(base_1$fecha)Con la función ts() convertimos la segunda columna a una serie de tiempo. En primer lugar se pone dentro de la función el objeto que se quiere transformar, una frecuencia igual a cuatro (trimestral) y por último se indica con un vector que la serie de tiempo inicia en el primer trimestre de 1980.
base_1$var_unemp <- ts(base_1$var_unemp,
frequency = 4,
start = c(1980, 01))b. Gráfica de la ts estudiada
graf_1 <- ggplot(data = base_1) +
geom_line(aes(x = fecha, y = var_unemp),
col = "firebrick2", size = 1) +
scale_y_continuous(breaks = seq(0, 15, 0.5)) +
ylab("Porcentaje") + xlab("Fecha") +
theme(axis.text.x = element_text(angle = 90),
plot.title = element_text(hjust = 0.5, size = 21)) +
scale_x_date(breaks = date_breaks("1 year"),
date_labels = "%Y", expand = c(0,0)) +
ggtitle("Desempleo trimestral en los EEUU
1980-2019")
graf_1c. Descomposición de la ts
Con la librería ggseas es posible graficar la: tendencia, estacionalidad e irregularidad de una ts.
ggsdc(data = base_1, aes(x = fecha, y = var_unemp),
method = "decompose", start = c(1980, 01),
frequency = 4) + geom_line()d. Obtención del promedio móvil centrado
Con la función ma(), librería forecast, podemos obtener una media móvil centrada de orden cuatro (trimestral). Esta nueva columna tendrá el nombre de \(centrado\).
base_1$centrado <- ma(base_1$var_unemp,
order = frequency(base_1$var_unemp),
centre = TRUE)e. Cálculo de la razón
Al dividir la serie original (\(var\_unemp\)) con el promedio móvil centrado (\(centrado\)) obtenemos una nueva columna que llamaremos \(razon\).
base_1$razon <- base_1$var_unemp/base_1$centradof. Columna para el respectivo trimestre
Ahora es necesario generar una columna que tenga el número correspondiente a cada trimestre registrado en la ts. Usando la función quarter(), del paquete lubridate, podemos generar el número para los trimestres. Posteriormente transformo cada trimestre a número romano con la función as.roman().
base_1$trimestre <- as.roman(quarter(base_1$fecha))Con la función paste0() pegamos la palabra trimestre con cada número romano que tenemos en la columna \(trimestre\).
base_1$trimestre <- paste0("trimestre_", base_1$trimestre)g. Columnas de las nuevas columnas
Primeras seis columnas del dataframe base_1
head(base_1)## fecha var_unemp centrado razon trimestre
## 1 1980-01-01 6.9 NA NA trimestre_I
## 2 1980-04-01 7.3 NA NA trimestre_II
## 3 1980-07-01 7.7 7.4250 1.0370370 trimestre_III
## 4 1980-10-01 7.2 7.5875 0.9489292 trimestre_IV
## 5 1981-01-01 8.1 7.5625 1.0710744 trimestre_I
## 6 1981-04-01 7.4 7.6375 0.9689034 trimestre_II
\(~\)
4. Nuevos dataframe para las razones e índices ajustados
a. Dataframe para el promedio de la razón
El paso siguiente consiste en armar un nuevo dataframe (base_promedios) en el que cada trimestre tenga la media simple de todas las razones que le corresponden. Para esto usaré el paquete dplyr para contruir un pipeline con el operador pipe (%>%). Con las funciones group_by agrupamos base_promedios por cada trimestre y con summarise() ponemos cada promedio de la razón.
base_promedios <- base_1 %>%
group_by(trimestre) %>%
summarise(promedio = mean(razon, na.rm = TRUE))Así quedo base_promedios:
head(base_promedios)## # A tibble: 4 × 2
## trimestre promedio
## <chr> <dbl>
## 1 trimestre_I 1.07
## 2 trimestre_II 0.983
## 3 trimestre_III 0.993
## 4 trimestre_IV 0.949
La suma de los cuatro promedios de las razones queda:
suma_promedios <- sum(base_promedios$promedio)
suma_promedios## [1] 3.996641
b. Función de los Índices Ajustados (ia)
La fórmula de los ia consiste en multiplicar los promedios trimestrales de la razón por la división entre la periodicidad de la ts (numerador) y la suma de los promedios de la razón (denominador).
\[indices\_ajustados=\frac{periodicidad}{suma \ de \ los \ promedios} * \bar{X}_{razon}=\frac{4}{\sum_{i=1}^{4}promedio_{i}} * \bar{X}_{razon}\] En R podemos implementar la función de los ia mediante el siguiente código:
indice_ajustado <- function(x){
x * (frequency(base_1$var_unemp)/suma_promedios)
}La función para calcular los ia queda guardada en el ambiente de RStudio bajo el nombre indice_ajustado.
c. Dataframe para los cuatro Índices Ajustados
Ahora podemos crear un dataframe (base_indices) en donde tenemos los ia de cada trimestre. Volvemos a usar el paquete dplyr.
base_indices <- base_promedios %>%
group_by(trimestre) %>%
summarise(indice = indice_ajustado(promedio))Así queda base_indices:
base_indices## # A tibble: 4 × 2
## trimestre indice
## <chr> <dbl>
## 1 trimestre_I 1.07
## 2 trimestre_II 0.984
## 3 trimestre_III 0.994
## 4 trimestre_IV 0.950
Ahora la suma de los cuatro ia es igual a la periodicidad de \(ts\) estudiada:
sum(base_indices$indice)## [1] 4
d. Insertando los ia en base_1
Para poder poner una nueva columna en base_1 que tenga los cuatro ia tenemos que usar la función rep() en donde se indica que el tamaño del vector está dado por el número de datos del desempleo trimestral en EEUU. La nueva columna se llamará \(indices\).
base_1$indices <- rep(base_indices$indice,
length.out = NROW(base_1))Las primeras ocho filas del base_1 actualizado nos quedan:
base_1[1:8, ]## fecha var_unemp centrado razon trimestre indices
## 1 1980-01-01 6.9 NA NA trimestre_I 1.0725073
## 2 1980-04-01 7.3 NA NA trimestre_II 0.9840140
## 3 1980-07-01 7.7 7.4250 1.0370370 trimestre_III 0.9939042
## 4 1980-10-01 7.2 7.5875 0.9489292 trimestre_IV 0.9495745
## 5 1981-01-01 8.1 7.5625 1.0710744 trimestre_I 1.0725073
## 6 1981-04-01 7.4 7.6375 0.9689034 trimestre_II 0.9840140
## 7 1981-07-01 7.4 7.9500 0.9308176 trimestre_III 0.9939042
## 8 1981-10-01 8.1 8.4125 0.9628529 trimestre_IV 0.9495745
\(~\)
5. Desestacionalizando la ts
a. Fórmula para desestacionalizar
La fórmula de desestacionalización con ia es:
\[desest=\frac{serie \ estacional}{ia}=\frac{var\_unemp}{indices}\] En código R bautizamos la nueva \(ts\) desestacionalizada como \(desest\)
base_1$desest <- base_1$var_unemp*(1/base_1$indices)Encabezado de base_1:
head(base_1)## fecha var_unemp centrado razon trimestre indices desest
## 1 1980-01-01 6.9 NA NA trimestre_I 1.0725073 6.433523
## 2 1980-04-01 7.3 NA NA trimestre_II 0.9840140 7.418594
## 3 1980-07-01 7.7 7.4250 1.0370370 trimestre_III 0.9939042 7.747225
## 4 1980-10-01 7.2 7.5875 0.9489292 trimestre_IV 0.9495745 7.582344
## 5 1981-01-01 8.1 7.5625 1.0710744 trimestre_I 1.0725073 7.552396
## 6 1981-04-01 7.4 7.6375 0.9689034 trimestre_II 0.9840140 7.520218
b. Gráfica de la serie desestacionalizada vs la estacional
graf_2 <- ggplot(data = base_1) +
geom_line(aes(x = fecha, y = var_unemp,
colour = "Serie original"), size = 1) +
geom_line(aes(x = fecha, y = desest,
colour = "Desest"), size = 1) +
scale_y_continuous(breaks = seq(0, 15, 0.5)) +
ylab("Porcentaje") + xlab("Fecha") +
scale_colour_manual("", values = c("royalblue",
"firebrick2")) +
theme(axis.text.x = element_text(angle = 90),
plot.title = element_text(hjust = 0.5, size = 21)) +
scale_x_date(breaks = date_breaks("1 year"),
date_labels = "%Y", expand = c(0,0)) +
ggtitle("Serie original vs desestacionalizada")
graf_2\(~\)
6. Exportando el dataframe
En R es posible exportar un dataframe en formato Excel a través del paquete xlsx. En Microsoft Windows es necesario descagar el archivo ejecutable de Java 64 bits “Windows Fuera de línea (64 bits)” del siguiente link (https://www.java.com/es/download/manual.jsp) para poder instalar las librerías rjava y xlsx. Para usuarios de distribuciones Linux basadas en Debian pueden instalar Open JDK a través del siguiente enlace: https://www.r-bloggers.com/2018/02/installing-rjava-on-ubuntu/.
write.xlsx(base_1, "sesion_1.xlsx")\(~\)
7. Información adicional
Las bases de datos usadas en Tópicos de Econometría II, junto a los códigos originales en R y Python (JupyterLab), las pueden encontrar y descargar en GitLab mediante el enlace: https://gitlab.com/fevidals/topicos-de-econometria-ii