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 Excel

b. 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_1

c. 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$centrado

f. 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