Presentación

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.

Preparación y Paquetes

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,…

Índice de tipo de cambio real ajustado por el efecto Balassa-Samuelson

1. Tipo de cambio real

Siguiendo los pasos de Rodrik, primero se calcula un índice del tipo de cambio real:

\(lnRER_{it}=ln(XRAT_{it}/PPP_{it})\)

donde:

  • \(RER\) es tipo de cambio real
  • \(XRAT\) es tipo de cambio nominal
  • \(PPP\) es un índice de paridad del poder adquisitivo sobre el PIB

\(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)

2. Ajuste Balassa-Samuelson

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:

  • \(RDPCH_{it}\) es el PIB per cápita
  • \(f_t\) es el efecto fijo del periodo de tiempo
  • \(u_{it}\) es el término de error

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.

3. Índice de tipo de cambio real

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)

El tipo de cambio real para México

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.