Tópicos de Econometría II - Sesión 2

1. Introducción

a. Descripción de los datos

En esta sesión vamos a usar el método de las variables dummy para detectar estacionalidad una serie de tiempo (\(ts\)), de igual forma podemos usar este método para desestacionalizar cualquier \(ts\). Después usaremos el método \(x13 \ ARIMA \ Seats\), desarrollado por la Oficina del Censo de los EEUU, para desestacionalizar series de tiempo. Los datos de este ejercicio corresponden a la tasa de desempleo mensual para las trece principales ciudades de Colombia, con sus áreas metropolitanas, durante el periodo 2000-2019.

\(~\)

2. Cargando el archivo RData

a. Librerías usadas en el ejercicio de desestacionalización con variables dummy son:

### Limpiar los objetos previamente cargados
remove(list = ls())

### Cargar los paquetes usados en la desestacionalización
library(lubridate)     ## Formatos de fecha
library(forecast)      ## Centrado de la serie de tiempo
library(dplyr)         ## Generar las tablas de resumen 
library(ggplot2)       ## Gramática de gráficos
library(scales)        ## Formato de fechas en el eje x
library(fastDummies)   ## Creación de variables dummy
library(seasonal)      ## Algoritmo X-13 ARIMA-Seats
library(xlsx)          ## Exportar archivos en .xlsx

b. Fijando el directorio de trabajo

setwd("/home/fabian/Descargas/Tópicos II")

c. Cargando la base

Con la función load() se carga a RStudio los archivos tipo RData.

load("desempleo_col.RData")

c. Vista preliminar del dataframe (base_1)

head(base_1)
## # A tibble: 6 × 3
##   fecha      ocupacion desempleo
##   <date>         <dbl>     <dbl>
## 1 2000-01-01      50.8      19.1
## 2 2000-02-01      50.2      17.7
## 3 2000-03-01      51.7      16.3
## 4 2000-04-01      51.5      17.8
## 5 2000-05-01      52.2      17.3
## 6 2000-06-01      52.6      17.5

Podemos observar que base_1 tiene tres columnas. La primera corresponde a la fecha (mensual) de cada dato registrado. La segunda columna es la tasa de ocupación y la tercera es la tasa de desempleo. Para este ejercicio solo usaremos el desempleo mensual por lo que vamos a eliminar la segunda columna:

base_1 <- base_1[, -c(2)]

Con la función sapply() podemos ver la clase de ambas columnas.

sapply(base_1, class)
##     fecha desempleo 
##    "Date" "numeric"

La primera columna (\(fecha\)) es de clase Date mientras que la segunda (\(desempleo\)) es numérica.

d. Transformamos desempleo a una serie de tiempo

Con la función ts() transformamos la segunda columna a una ts. En este ejercicio la frecuencia es igual a doce (mensual) y la serie inicia en enero del año 2000.

base_1$desempleo <- ts(base_1$desempleo, 
                       frequency = 12, 
                   start = c(2000, 01))

\(~\)

3. Regresión lineal múltiple con variables dummy

a. Variable de tendencia

En primer lugar vamos a incluir la variable \(tendencia\) que es una secuencia entre 1 y el tamaño muestral (240).

base_1$tendencia <- seq(1:NROW(base_1))

b. Construcción de las dummy

La nueva variable \(dummy\) va a empezar con los respectivos números del mes correspondiente. Usamos de nuevo el paquete lubridate, con la función month(), para numerar los meses.

base_1$dummy <- month(base_1$fecha)

Con la librería fastdummies podemos construir un nuevo dataframe (base_dummies) que contenga once variables dummies. Esto ocurre porque si se lleva a cabo una regresión lineal con doce variables dummy se tendrá el problema de la “multicolinealidad perfecta”, por lo que damos la indicación de remover la primera dummy (enero) en la función dummy_columns().

base_dummies <- dummy_columns(base_1,
                              select_columns = c("dummy"),
                              remove_first_dummy = TRUE)

Primeras seis filas de base_dummies:

head(base_dummies)
## # A tibble: 6 × 15
##   fecha      desempleo tendencia dummy dummy_2 dummy_3 dummy_4 dummy_5 dummy_6
##   <date>         <dbl>     <int> <dbl>   <int>   <int>   <int>   <int>   <int>
## 1 2000-01-01      19.1         1     1       0       0       0       0       0
## 2 2000-02-01      17.7         2     2       1       0       0       0       0
## 3 2000-03-01      16.3         3     3       0       1       0       0       0
## 4 2000-04-01      17.8         4     4       0       0       1       0       0
## 5 2000-05-01      17.3         5     5       0       0       0       1       0
## 6 2000-06-01      17.5         6     6       0       0       0       0       1
## # … with 6 more variables: dummy_7 <int>, dummy_8 <int>, dummy_9 <int>,
## #   dummy_10 <int>, dummy_11 <int>, dummy_12 <int>

c. Dataframe para la regresión con dummies

Para facilitar la implementación de una regresión lineal vamos a construir otro dataframe (base_regresion) que contenga las columnas de \(desempleo\), \(tendencia\) y las once variables dummy.

base_regresion <- base_dummies[, c(2:3, 5:15)]

d. Regresión lineal con dummies

regre_1 <- lm(base_1$desempleo~., data = base_regresion)
summary(regre_1)
## 
## Call:
## lm(formula = base_1$desempleo ~ ., data = base_regresion)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.5803 -0.9139 -0.1842  0.9985  2.9080 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 19.215118   0.344368  55.798  < 2e-16 ***
## tendencia   -0.034213   0.001295 -26.413  < 2e-16 ***
## dummy_2     -1.305128   0.439093  -2.972  0.00327 ** 
## dummy_3     -2.047515   0.439099  -4.663 5.32e-06 ***
## dummy_4     -2.231255   0.439108  -5.081 7.82e-07 ***
## dummy_5     -2.522005   0.439122  -5.743 2.96e-08 ***
## dummy_6     -2.133629   0.439139  -4.859 2.20e-06 ***
## dummy_7     -2.247158   0.439160  -5.117 6.61e-07 ***
## dummy_8     -2.468516   0.439185  -5.621 5.55e-08 ***
## dummy_9     -2.782672   0.439213  -6.336 1.26e-09 ***
## dummy_10    -3.312914   0.439246  -7.542 1.10e-12 ***
## dummy_11    -3.570741   0.439282  -8.129 2.80e-14 ***
## dummy_12    -3.110582   0.439322  -7.080 1.78e-11 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.389 on 227 degrees of freedom
## Multiple R-squared:  0.7845, Adjusted R-squared:  0.7731 
## F-statistic: 68.87 on 12 and 227 DF,  p-value: < 2.2e-16

En la regresión lineal múltiple todos los estimadores de las dummy son significativos (confianza del 95%), esto indica que la ts del desempleo mensual, en las 13 principales ciudades de Colombia, presenta estacionalidad en todos los meses del año.

\(~\)

4. Desestacionalización con variables dummy

a. Desestacionalizando con la función predict()

Para obtener una ts desestacionalizada debemos usar la función predict() con el objeto en el que se guardó la regresión lineal múltiple (regre_1). Esta nueva ts desestacionalizada la vamos a incluir en base_1 con el nombre de \(regresion\).

base_1$regresion <- predict(regre_1)

b. Gráfica de la nueva serie sin estacionalidad

graf_2 <- ggplot(data = base_1) + 
  geom_line(aes(x = fecha, y = desempleo, 
                colour = "Original"), size = 1) + 
  geom_line(aes(x = fecha, y = regresion, 
                colour = "Desest"), 
            size = 1) + 
  xlab("") + ylab("Porcentaje") + 
  theme(axis.text.x = element_text(angle = 90),
        plot.title = element_text(hjust = 0.5, size = 19)) + 
  scale_x_date(breaks = date_breaks("6 month"), 
               expand = c(0,0), 
               date_labels = "%Y-%b") + 
  scale_colour_manual("", values = c("firebrick2",
                                     "goldenrod2")) + 
  scale_y_continuous(breaks = seq(8, 24, 1)) + 
  ggtitle("Original vs Desestacionalizado (regresión)")

graf_2

\(~\)

5. Algoritmo X-13 ARIMA Seats

Usamos la función seas(), de la librería seasonal, y guardamos el objeto con el nombre \(paso\_1\).

paso_1 <- seas(base_1$desempleo)

Inserto la ts desestacionalizada en base_1 mediante la función trend(). Esta nueva columna va a tener el nombre de \(x13\).

base_1$x13 <- trend(paso_1)
graf_3 <- ggplot(data = base_1) + 
  geom_line(aes(x = fecha, y = desempleo, 
                colour = "Original"), size = 1) + 
  geom_line(aes(x = fecha, y = regresion, 
                colour="Dummies"), 
            size = 1) + 
  geom_line(aes(x = fecha, y = x13, 
                colour = "X-13"), 
            size = 1) + 
  xlab("") + ylab("Porcentaje") + 
  theme(axis.text.x = element_text(angle = 90),
        plot.title = element_text(hjust = 0.5, size = 19))+
  scale_x_date(breaks = date_breaks("6 month"), 
               expand = c(0,0), 
               date_labels = "%Y-%b") + 
  scale_colour_manual("", values = c("firebrick2",
                                     "forestgreen",
                                     "goldenrod2")) + 
  scale_y_continuous(breaks = seq(6, 24, 1)) + 
  ggtitle("Original vs métodos")

graf_3