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"
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.
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)]
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))
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))
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)
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)
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
}
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).
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.