Instalar paquetes y llamar librerías
# install.packages("WDI")
library(WDI)
# install.packages("plm")
library(plm)
# install.packages("dplyr")
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:plm':
##
## between, lag, lead
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
Paso 1. Definir países
paises <- c("CHL", "PER", "COL", "MEX", "USA")
Paso 2. Definir indicadores del banco mundial
indicadores <- c(
gdp_pc = "NY.GDP.PCAP.KD", # GDP per capita
inv = "NE.GDI.TOTL.KD", # Gross capital formation
labor = "SL.TLF.TOTL.IN", # Labor force, total
energia = "EG.USE.PCAP.KG.OE" # Energy use per capita
)
Paso 3. Definir inicio y final para obtener datos
datos <- WDI(country = paises,
indicator = indicadores,
start = 2014,
end = 2023)
Paso 4. Limpiar datos
datos <- datos %>%
select(iso2c, country, year, gdp_pc, inv, labor, energia) %>%
na.omit()
Paso 5. Transformar a logaritmos
Este paso se hace cuando las variables son muy grandes y cuando la
relación es proporcional.
NO USAR cuando hay valores negativos o ceros, cuando los datos son
porcentajes o
cuando la relación es lineal.
datos <- datos %>%
mutate(
lgdp_pc = log(gdp_pc),
linv = log(inv),
llabor = log(labor),
lenergia = log(energia)
)
Paso 6. Convertir a panel
panel_data <- pdata.frame(datos, index = c("iso2c", "year"))
Paso 7. Modelo de Mínimos Cuadrados Ordinarios Agrupados /
Pooled Ordinary Least Squares Model (Pooled OLS)
modelo_pool <- plm(lgdp_pc ~ linv + llabor + lenergia,
data = panel_data,
model = "pooling")
summary(modelo_pool)
## Pooling Model
##
## Call:
## plm(formula = lgdp_pc ~ linv + llabor + lenergia, data = panel_data,
## model = "pooling")
##
## Unbalanced Panel: n = 5, T = 9-10, N = 49
##
## Residuals:
## Min. 1st Qu. Median 3rd Qu. Max.
## -0.2175589 -0.0628130 0.0094552 0.0760073 0.1966870
##
## Coefficients:
## Estimate Std. Error t-value Pr(>|t|)
## (Intercept) 0.65549 0.27148 2.4145 0.019885 *
## linv 0.56230 0.17810 3.1572 0.002842 **
## llabor -0.50633 0.18325 -2.7631 0.008265 **
## lenergia 0.39895 0.19238 2.0737 0.043859 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Total Sum of Squares: 33.71
## Residual Sum of Squares: 0.50699
## R-Squared: 0.98496
## Adj. R-Squared: 0.98396
## F-statistic: 982.349 on 3 and 45 DF, p-value: < 2.22e-16
Paso 8. Prueba Breusch–Pagan
Compara Pooled vs Aleatorios
Si p-value < 0.05, Pooled NO es adecuado, probar Aleatorios
Si p-value > 0.05, usar Pooled
plmtest(modelo_pool, type = "bp")
##
## Lagrange Multiplier Test - (Breusch-Pagan)
##
## data: lgdp_pc ~ linv + llabor + lenergia
## chisq = 122.59, df = 1, p-value < 2.2e-16
## alternative hypothesis: significant effects
Paso 9. Modelo de Efectos Fijos / Fixed Effects Model
model_fe <- plm(lgdp_pc ~ linv + llabor + lenergia,
data = panel_data,
model = "within")
summary(model_fe)
## Oneway (individual) effect Within Model
##
## Call:
## plm(formula = lgdp_pc ~ linv + llabor + lenergia, data = panel_data,
## model = "within")
##
## Unbalanced Panel: n = 5, T = 9-10, N = 49
##
## Residuals:
## Min. 1st Qu. Median 3rd Qu. Max.
## -0.049430 -0.011209 -0.001441 0.013278 0.066167
##
## Coefficients:
## Estimate Std. Error t-value Pr(>|t|)
## linv 0.311194 0.042565 7.3111 6.016e-09 ***
## llabor 0.479971 0.086631 5.5404 1.945e-06 ***
## lenergia -0.065499 0.087778 -0.7462 0.4598
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Total Sum of Squares: 0.081966
## Residual Sum of Squares: 0.020087
## R-Squared: 0.75494
## Adj. R-Squared: 0.7131
## F-statistic: 42.1013 on 3 and 41 DF, p-value: 1.3757e-12
Paso 10. Prueba F
Compara Fijos vs Pooled
Si p-value < 0.05, usar Efectos Fijos
Si p-value > 0.05, usar Pooled
pFtest(model_fe, modelo_pool)
##
## F test for individual effects
##
## data: lgdp_pc ~ linv + llabor + lenergia
## F = 248.46, df1 = 4, df2 = 41, p-value < 2.2e-16
## alternative hypothesis: significant effects
Paso 11. Modelo de Efectos Aleatorios / Random Effects Model
model_re <- plm(lgdp_pc ~ linv + llabor + lenergia,
data = panel_data,
model = "random")
summary(model_re)
## Oneway (individual) effect Random Effect Model
## (Swamy-Arora's transformation)
##
## Call:
## plm(formula = lgdp_pc ~ linv + llabor + lenergia, data = panel_data,
## model = "random")
##
## Unbalanced Panel: n = 5, T = 9-10, N = 49
##
## Effects:
## var std.dev share
## idiosyncratic 0.0004899 0.0221342 0.021
## individual 0.0228420 0.1511355 0.979
## theta:
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.9512 0.9537 0.9537 0.9533 0.9537 0.9537
##
## Residuals:
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## -5.91e-02 -2.02e-02 -2.41e-03 1.42e-05 2.09e-02 7.00e-02
##
## Coefficients:
## Estimate Std. Error z-value Pr(>|z|)
## (Intercept) -2.759644 1.263081 -2.1849 0.02890 *
## linv 0.283528 0.055538 5.1051 3.306e-07 ***
## llabor 0.214201 0.091470 2.3418 0.01919 *
## lenergia 0.154288 0.104458 1.4770 0.13966
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Total Sum of Squares: 0.14465
## Residual Sum of Squares: 0.040624
## R-Squared: 0.71916
## Adj. R-Squared: 0.70044
## Chisq: 126.667 on 3 DF, p-value: < 2.22e-16
Paso 12. Prueba de Hausman
Compara Fijos vs Aleatorios
Si p-value < 0.05, usar Efectos Fijos
Si p-value > 0.05, usar Efectos Aleatorios
phtest(model_fe, model_re)
##
## Hausman Test
##
## data: lgdp_pc ~ linv + llabor + lenergia
## chisq = 22.99, df = 3, p-value = 4.058e-05
## alternative hypothesis: one model is inconsistent
Paso 13. Conclusiones
De acuerdo al Modelo de Efectos Fijos, aumentar 1% la inversión,
aumentará 0.31% el PIB.
Aumentar 1% la fuera laboral, aumentará 0.47% el PIB, ceteris
paribus (todo lo demás constante).
Paso 14. Prueba de Heterocedasticidad
Evalúa si la varianza de los errores es constante.
install.packages(“lmtest”)
library(lmtest)
## Loading required package: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
bptest(model_fe)
##
## studentized Breusch-Pagan test
##
## data: model_fe
## BP = 11.585, df = 3, p-value = 0.00895
Prueba de Wooldridge (más apropiada para Efectos Fijos)
pwartest(model_fe)
##
## Wooldridge's test for serial correlation in FE panels
##
## data: model_fe
## F = 31.404, df1 = 1, df2 = 42, p-value = 1.472e-06
## alternative hypothesis: serial correlation
Prueba Breusch-Godfrey para panel (más apropiada para Efectos
Aleatorios)
pbgtest(model_re)
Interpretación:
Si p-value < 0.05 → Existe autocorrelación serial (problema
detectado)
Si p-value > 0.05 → No hay evidencia de autocorrelación
Paso 16. Corrección con Errores Estándar Robustos Clusterizados
Corrige heterocedasticidad y autocorrelación dentro de cada
país
install.packages(“sandwich”)
library(sandwich)
modelo_robusto <- coeftest(model_fe,
vcov = vcovHC(model_fe,
method = "arellano",
type = "HC1",
cluster = "group"))
modelo_robusto
##
## t test of coefficients:
##
## Estimate Std. Error t value Pr(>|t|)
## linv 0.311194 0.058393 5.3293 3.867e-06 ***
## llabor 0.479971 0.188309 2.5489 0.01465 *
## lenergia -0.065499 0.089521 -0.7317 0.46854
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Interpretación:
Los coeficientes NO cambian.
Cambian los errores estándar, estadísticos t y p-values.
Si una variable sigue siendo significativa después de la
corrección,
el resultado es estadísticamente más confiable.
Paso 17. Conclusiones Finales
De acuerdo al Modelo de Efectos Fijos, aumentar 1% la inversión
aumentará 0.31% el PIB, y aumentar 1% la fuerza laboral aumentará 0.47%
el PIB
(con un nivel de significancia del 5%), ceteris pluribus
La inversión tiene un efecto positivo y robusto sobre el PIB per
cápita.
La fuerza laboral también tiene un efecto positivo, aunque más
sensible a correcciones.
El consumo de energía no muestra evidencia estadística de
impacto.