Este R-notebook lee datos del Banco Central de Costa Rica que han sido previamente almacenados en el archivo de Excel Datos-business-cycle.xlsx, y aplica el filtro de Hodrick Prescott para analizar los ciclos.

Empezamos importando algunos paquetes que serán útiles para este trabajo:

library(readxl)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(magrittr)
library(ggplot2)
library(lubridate)
## 
## Attaching package: 'lubridate'
## The following object is masked from 'package:base':
## 
##     date
library(mFilter)

FILENAME <- "Datos-business-cycle.xlsx"

LECTURA DE LOS DATOS

En lo que sigue, se asume que los datos han sido previamente guardados en el archivo de Excel Datos-business-cycle.xlsx, ubicado en la misma carpeta que este cuaderno de R. Los datos se guardaron tal como fueron bajados desde el sitio web del BCCR. A los datos no se les aplicó ninguna transformación en Excel, únicamente se le cambió nombre a cada hoja de cálculo para que hiciera referencia al número de cuadro que se está utilizando.

Cuentas nacionales

Los datos están en la hoja chart1677, corresponden a

Ahora leemos los datos usando la función read_excel del paquete readxl La opción skip=4 indica que deben ignorarse las primeras 4 líneas de la hoja de excel; [, -1] le indica a R que la primera columna debe ser omitida (tiene nombres, no datos). La función t() transpone los datos. Seleccionamos las tres columnas de interés, y les cambiamos el nombre a las series a ‘PIB’, ‘C’, ‘I’. Finalmente, indexamos los datos con la columna DATE, indicando que el primer dato es de 1991q1, y que la serie es trimestral.

ctasnac <- read_excel(FILENAME, sheet = "chart1677", skip = 4)[,-1] %>%
  t() %>%
  data.frame() %>%
  select(c(1,3,5))

colnames(ctasnac) <- c('PIB','C','I')
ctasnac$DATE <- quarter(ymd('1991-03-01') + 3*months(0:(nrow(ctasnac)-1)), TRUE)
ctasnac <- ctasnac[,c(4,1:3)]

Precios

Los datos están en la hoja chart2732, corresponden a

Al leer los datos de Excel, seleccionamos únicamente la serie ‘Nivel’, la cual renombramos como ‘IPC’. Los datos originales son mensuales, por ello los indexamos como tales. Para poder compararlos con los datos de cuentas nacionales, los convertimos a datos trimestrales usando las funciones group_by y summarize, indicando que queremos el promedio de los tres meses correspondientes con .mean().

precios <- read_excel(FILENAME, sheet = "chart2732", skip = 4) %>%
  data.frame() %>%
  select(Nivel)

colnames(precios) <- c('IPC')
rownames(precios) <- ymd('1991-01-01') + months(0:(nrow(precios)-1))
precios$DATE <- quarter(rownames(precios), TRUE)
precios %<>% group_by(DATE) %>% 
  summarise(IPC=mean(IPC))

Dinero

Los datos están en la hoja chart125, corresponden a

dinero <- read_excel(FILENAME, sheet = "chart125", skip = 4)[,-1] %>%
  t() %>%
  data.frame() %>%
  stack() %>%
  select(values)

colnames(dinero) <- c('M1')
rownames(dinero) <- ymd('1991-01-01') + months(0:(nrow(dinero)-1))
dinero$DATE <- quarter(rownames(dinero), TRUE)
dinero %<>% group_by(DATE) %>% 
  summarise(M1=mean(M1))

Empleo

Los datos están en la hoja chart1914, que corresponde a

Finalmente, leemos los datos de empleo, los cuales transponemos para que las columnas correspondan a series y las filas a trimestres. Utilizamos únicamente la serie ‘Asalariado’, la cual renombramos como ‘N’.

empleo <- read_excel(FILENAME, sheet = "chart1914", skip = 4)[,-1] %>%
  t() %>%
  data.frame() %>%
  select(c(2))

colnames(empleo) <- c('N')
empleo$DATE <- quarter(ymd('2010-09-01') + 3*months(0:(nrow(empleo)-1)), TRUE)

Combinar todos los datos

Juntamos todos los datos de los ciclos en una misma base de datos usando full_join. Borramos las bases de datos previas.

DATOS <- ctasnac %>%
  full_join(precios,by="DATE") %>%
  full_join(dinero,by="DATE") %>%
  full_join(empleo,by="DATE")

remove(ctasnac,dinero, precios, empleo)

ANÁLISIS DE LOS DATOS

Calcular el ciclo de cada serie, usando el filtro de Hodrick-Prescott

Hacemos una base de datos CYCLES, en la cual almacenamos el ciclo del (logaritmo) de cada serie, filtrados con hpfilter. La variable t se utiliza para lidiar con los valores faltantes.

CYCLES  <- DATOS
for (k in 2:ncol(DATOS)){
  t <- !is.na(DATOS[,k])
  x <- log(DATOS[t,k])
  CYCLES[t, k] <- hpfilter(x,1600)$cycle
}

Calcular la correlación de los ciclos

Las correlaciones de estas series con el PIB (rezagado, actual, futuro) puede calcularse usando cor.

CYCLES["LPIB"] <- lag(CYCLES$PIB)
CYCLES["FPIB"] <- lead(CYCLES$PIB)

CORRELACIONES <- cor(CYCLES[,2:7],select(CYCLES, ends_with("PIB")),use = 'pairwise')[,c(3,1,2)]

CYCLES[,8:9] <- NULL

CORRELACIONES
##           FPIB        PIB       LPIB
## PIB  0.9313155  1.0000000  0.9313155
## C    0.7265979  0.7482360  0.6984099
## I    0.6502565  0.6869240  0.6477750
## IPC -0.2804027 -0.2548740 -0.2377533
## M1   0.5564408  0.5893834  0.5669072
## N    0.3494546  0.5251851  0.5057111

Estas correlaciones las ilustramos graficando cada serie contra el PIB. En cada gráfico mostramos además una regresión lineal entre la serie respectiva y el PIB.

CYCLES[,-1] %>% tidyr::gather('serie','valor',2:6) %>%
  ggplot(aes(PIB, valor)) +
  geom_point() + 
  geom_smooth(method = lm) + 
  facet_wrap(~serie, scales='free_y') 
## Warning: Removed 113 rows containing non-finite values (stat_smooth).
## Warning: Removed 113 rows containing missing values (geom_point).

Volatilidad de los ciclos

Finalmente, calculamos la volatilidad de cada serie, relativa a la del PIB.

volatiliy <- CYCLES[,2:7] %>% 
  summarise_each(funs(sd(.,na.rm = TRUE)))

volatiliy <- 100 * t(volatiliy) / volatiliy[1,1]
volatiliy
##          [,1]
## PIB 100.00000
## C    59.63728
## I   287.56726
## IPC  95.58117
## M1  327.55427
## N   122.09311

Puede verse que el consumo es menos volátil que el PIB, mientras que la inversión y el dinero son mucho más volátiles.