Esta publicación es una continuación de esta entrada.
No hay comando en este script que no se encuentre en sitios y foros como stackoverflow, repositorios de github, rpubs, los manuales de Wickham, The R graph gallery, etc.
Aviso: Recomiendo leer el artículo de Rodrik.
Como insumo para sus cálculos él utiliza la Penn World Table
6.2, sin embargo, debido al buen recibimiento de la entrega
pasada (click aquí)
y dado que varias personas me preguntaron por un código para una
estimación más actualizada, lo pongo a disposición en esta entrada. Este
cálculo es con la versión más reciente, la Penn World Table
10.01. La PWT 10.01 tiene una versión como
librería disponible para su uso en R, en mi entrada
Apuntes de ggplot2 pt. 2 explico cómo usar dicha librería (para
ver esa entrada click aquí). Debido a
esto, no me detendré a explicar a detalle el presente código, pues en
los ya referenciados blogs lo hice.
Si algún enlace no abre con click izquierdo, intenta usar click derecho y abrir en otra pestaña.
Cualquier corrección o comentario házmelo saber por este medio o a través de mi twitter ecodiegoale.
rm(list = ls()) #para borrar todos los objetos en la memoria de la consola
options(scipen=999) #para desactivar la notación científica
Los paquetes que usaremos.
#Si no cuentas con los paquetes, instálalos utilizando el comando install.packages("ejemplo")
library(tidyverse)
library(ggthemes)
library(pwt10)
Ahora la base de datos.
#??pwt10 #para leer la documentación
#data("pwt10.01")
Una vez que hemos visto a grandes rasgos la tabla, procedemos a
construir un data frame con las variables que nos
interesan.
attach(pwt10.01)
data <- pwt10.01%>%
dplyr::select(year, country, pl_gdpo,
rgdpo, pop)
#recomiendo leer la documentación para saber qué es cada variable o visitar el sitio web de la PWT10.01
data$f_time <- ceiling((data$year - 1949) / 5)
data$f_time<-as.factor(data$f_time)
#La función lm() convierte factores a dummies de manera automática.
glimpse(data)
## Rows: 12,810
## Columns: 6
## $ year <int> 1950, 1951, 1952, 1953, 1954, 1955, 1956, 1957, 1958, 1959, 19…
## $ country <fct> "Aruba", "Aruba", "Aruba", "Aruba", "Aruba", "Aruba", "Aruba",…
## $ pl_gdpo <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
## $ rgdpo <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
## $ pop <dbl> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
## $ f_time <fct> 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5,…
Siguiendo los pasos de Rodrik, primero se calcula un índice del tipo de cambio real:
\(lnRER_{it}=ln(XRAT_{it}/PPP_{it})\)
donde:
\(i\) es un subíndice para los países y \(t\) es un subíndice para periodos de tiempo (de 5 años).
Aquí generamos el PIB per cápita y las variables de interés relacionadas al tipo de cambio.
data <- data%>%
mutate(rer = 1/pl_gdpo,#leer la definición de pl_gdpo
ln_rer =log(rer),
rgdpch = (rgdpo/pop)/1000, #para calcular el PIB per capira
ln_rgdpch = log(rgdpch))%>%
filter(!is.na(ln_rer))
Ahora limpiamos la base de los NAs:
data <- na.omit(data)
Una vez calculado el tipo de cambio real, se ajusta por el efecto Balassa-Samuelson por medio de una regresión de datos panel del siguiente tipo:
\(lnRER_{it}=\alpha+\beta RDPCH_{it}+ f_t + u_{it}\)
donde:
Para Rodrik, usando datos de la Penn World Table 6.2, el estimador \(\hat{\beta}=-0.24\).
Procedemos a calcular dicha regresión:
lnrer <- lm(data = data,
ln_rer ~ ln_rgdpch + f_time -1)
summary(lnrer)
##
## Call:
## lm(formula = ln_rer ~ ln_rgdpch + f_time - 1, data = data)
##
## Residuals:
## Min 1Q Median 3Q Max
## -4.5728 -0.2620 0.0002 0.2826 2.8650
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## ln_rgdpch -0.18399 0.00393 -46.82 <0.0000000000000002 ***
## f_time1 2.62363 0.02689 97.56 <0.0000000000000002 ***
## f_time2 2.54227 0.02492 102.01 <0.0000000000000002 ***
## f_time3 2.54426 0.01997 127.38 <0.0000000000000002 ***
## f_time4 2.48203 0.01998 124.20 <0.0000000000000002 ***
## f_time5 2.33066 0.01766 131.94 <0.0000000000000002 ***
## f_time6 1.85777 0.01783 104.17 <0.0000000000000002 ***
## f_time7 1.54765 0.01791 86.41 <0.0000000000000002 ***
## f_time8 1.47820 0.01793 82.45 <0.0000000000000002 ***
## f_time9 1.41914 0.01703 83.32 <0.0000000000000002 ***
## f_time10 1.36617 0.01714 79.72 <0.0000000000000002 ***
## f_time11 1.40514 0.01736 80.95 <0.0000000000000002 ***
## f_time12 1.17057 0.01779 65.81 <0.0000000000000002 ***
## f_time13 1.06253 0.01812 58.65 <0.0000000000000002 ***
## f_time14 1.09800 0.01817 60.42 <0.0000000000000002 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.4614 on 10380 degrees of freedom
## Multiple R-squared: 0.9065, Adjusted R-squared: 0.9064
## F-statistic: 6709 on 15 and 10380 DF, p-value: < 0.00000000000000022
Para la versión más actual \(\hat{\beta}=-0.18\), además de que es altamente significativa.
Por último, se calcula lo que Rodrik llama el índice de subvaluación de tipo de cambio.
\(lnUNDERVAL_{it}=lnRER_{it}-ln\hat{RER_{it}}\)
Esto es la diferencia del tipo de cambio real observado menos el estimado por la regresión anterior.
#Calculamos el tipo de cambio real estimado
data$lnrer_hat <- predict(lnrer)
#Hacemos la diferencia del observado menos el estimado
data<- data%>%
mutate(lnunder = ln_rer - lnrer_hat)
Filtramos para México.
data.mx <- data%>%
filter(country == "Mexico")
Ahora graficamos.
tcr_mx <- ggplot(data = data.mx, aes(x = year, y = lnunder))+
geom_hline(yintercept = 0, size=1, linetype = 'dashed', alpha = 0.5)+
geom_line(aes(y = lnunder), colour="#00AFBB",cex = 1)+
theme_bw()+
labs(title="México: Índice de tipo de cambio real",
caption="Fuente: Elaboración propia con información de Penn World Table 10.01.")+
xlab(" ")+
ylab("Logaritmo natural")
tcr_mx
Cualquier duda o corrección por este medio o twitter.