Aplicación 3.10: Regresores endógenos
Determinantes de la inflación al nivel internacional
Para explicar las variaciones que se producen en la inflación observada al nivel internacional (muestra de 76 países) se propone el siguiente modelo econométrico, el cual se obtiene de la teoría cuantitativa del dinero:
\[INF_{i} = \beta_1 + \beta_2 RM_{i} + \beta_3 RY_{i} + e_{i}\]
siendo \(INF\) la inflación (tasa de variación del índice general de precios), \(RM\) la tasa de crecimiento de la oferta monetaria, y \(RY\) la tasa de crecimiento del PIB.
Se asumirá que la variable \(RM\) es exógena (política monetaria independiente), mientras que se supondrá que la variable \(RY\) podría ser endógena y, por tanto, puede estar correlacionada con el término de error del modelo, \[Cov(RY,e)≠0\]
Como instrumentos para la variable potencialmente endógena \(RY\) se tomarán el nivel inicial de PIB per cápita (\(YPC0\)), el nivel de educación relativo de la población (\(EDUC\)), el nivel de inversión (\(INV\)) y la tasa de crecimiento de la población (\(RPOB\) ).
Code
# Lectura de librerías
library(tidyverse)
library(ivreg)
# Para más detalles sobre el método de variables instrumentales
# (IV o 2SLS en inglés) ver las páginas web:
# https://cran.r-project.org/web/packages/ivreg/vignettes/ivreg.html
# https://cran.r-project.org/web/packages/ivreg/vignettes/
# /Diagnostics-for-2SLS-Regression.html
#
# Lectura de datos
<- read_csv("data/INF_INTERN.csv")
INF_INT summary(INF_INT)
EDUC INF INV RM
Min. :0.1400 Min. : -0.600 Min. :0.0868 Min. : 2.500
1st Qu.:0.6325 1st Qu.: 4.275 1st Qu.:0.1790 1st Qu.: 8.175
Median :0.9350 Median : 8.650 Median :0.2278 Median : 16.350
Mean :0.8259 Mean : 25.354 Mean :0.2240 Mean : 29.590
3rd Qu.:1.0600 3rd Qu.: 17.150 3rd Qu.:0.2565 3rd Qu.: 22.400
Max. :1.6400 Max. :374.300 Max. :0.4210 Max. :356.700
RPOB RY YPC0
Min. :0.100 Min. :-0.600 Min. :0.2370
1st Qu.:1.175 1st Qu.: 1.675 1st Qu.:0.5042
Median :2.250 Median : 2.700 Median :0.9190
Mean :2.012 Mean : 2.997 Mean :1.7034
3rd Qu.:2.800 3rd Qu.: 4.000 3rd Qu.:2.4505
Max. :3.700 Max. : 9.600 Max. :7.3800
Code
# Estimación MCO
<- lm(INF ~ RM + RY, data=INF_INT)
modelo_MCO summary(modelo_MCO)
Call:
lm(formula = INF ~ RM + RY, data = INF_INT)
Residuals:
Min 1Q Median 3Q Max
-24.799 -1.235 0.101 1.848 9.076
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.234214 0.979925 -0.239 0.812
RM 1.033131 0.009042 114.257 < 2e-16 ***
RY -1.662006 0.250566 -6.633 4.95e-09 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 4.31 on 73 degrees of freedom
Multiple R-squared: 0.9948, Adjusted R-squared: 0.9947
F-statistic: 6978 on 2 and 73 DF, p-value: < 2.2e-16
Code
# Estimación VI
<- ivreg(INF ~ RM + RY | RM + EDUC + INV + RPOB + YPC0,
modelo_IV data=INF_INT)
summary(modelo_IV, diagnostics=TRUE)
Call:
ivreg(formula = INF ~ RM + RY | RM + EDUC + INV + RPOB + YPC0,
data = INF_INT)
Residuals:
Min 1Q Median 3Q Max
-24.633 -1.487 0.204 1.937 9.498
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -1.093985 1.858208 -0.589 0.5579
RM 1.035059 0.009773 105.914 <2e-16 ***
RY -1.394200 0.551503 -2.528 0.0136 *
Diagnostic tests:
df1 df2 statistic p-value
Weak instruments 4 70 4.642 0.00221 **
Wu-Hausman 1 72 0.300 0.58551
Sargan 3 NA 2.455 0.48344
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 4.344 on 73 degrees of freedom
Multiple R-Squared: 0.9947, Adjusted R-squared: 0.9946
Wald test: 6852 on 2 and 73 DF, p-value: < 2.2e-16
Code
# Comparación de modelos
# car::compareCoefs(modelo_MCO, modelo_IV)
library("modelsummary")
<- list(MCO = modelo_MCO, IV = modelo_IV)
model_list msummary(model_list)
MCO | IV | |
---|---|---|
(Intercept) | -0.234 | -1.094 |
(0.980) | (1.858) | |
RM | 1.033 | 1.035 |
(0.009) | (0.010) | |
RY | -1.662 | -1.394 |
(0.251) | (0.552) | |
Num.Obs. | 76 | 76 |
R2 | 0.995 | 0.995 |
R2 Adj. | 0.995 | 0.995 |
AIC | 442.7 | 443.9 |
BIC | 452.0 | 453.2 |
Log.Lik. | -217.340 | |
F | 6978.325 | |
RMSE | 4.22 | 4.26 |
Code
modelplot(model_list)
Code
# Lectura de librerías
import numpy as np
import pandas as pd
import statsmodels.api as sm
from linearmodels.iv import IV2SLS
# Lectura de datos
= pd.read_csv('data/INF_INTERN.csv')
INF_INT INF_INT.describe()
EDUC INF INV ... RPOB RY YPC0
count 76.000000 76.000000 76.000000 ... 76.000000 76.000000 76.000000
mean 0.825921 25.353947 0.223951 ... 2.011842 2.997368 1.703421
std 0.319229 58.947670 0.066628 ... 1.021759 2.026950 1.765252
min 0.140000 -0.600000 0.086800 ... 0.100000 -0.600000 0.237000
25% 0.632500 4.275000 0.178975 ... 1.175000 1.675000 0.504250
50% 0.935000 8.650000 0.227850 ... 2.250000 2.700000 0.919000
75% 1.060000 17.150000 0.256500 ... 2.800000 4.000000 2.450500
max 1.640000 374.300000 0.421000 ... 3.700000 9.600000 7.380000
[8 rows x 7 columns]
Code
# Estimación MCO
= sm.add_constant(INF_INT)
INF_INT = IV2SLS(dependent = INF_INT.INF,
modelo_MCO = INF_INT[['const','RM','RY']],
exog = None,
endog = None)
instruments = modelo_MCO.fit(cov_type='unadjusted')
res_modelo_MCO print(res_modelo_MCO)
OLS Estimation Summary
==============================================================================
Dep. Variable: INF R-squared: 0.9948
Estimator: OLS Adj. R-squared: 0.9947
No. Observations: 76 F-statistic: 1.453e+04
Date: Sun, Feb 09 2025 P-value (F-stat) 0.0000
Time: 15:35:57 Distribution: chi2(2)
Cov. Estimator: unadjusted
Parameter Estimates
==============================================================================
Parameter Std. Err. T-stat P-value Lower CI Upper CI
------------------------------------------------------------------------------
const -0.2342 0.9604 -0.2439 0.8073 -2.1165 1.6481
RM 1.0331 0.0089 116.58 0.0000 1.0158 1.0505
RY -1.6620 0.2456 -6.7679 0.0000 -2.1433 -1.1807
==============================================================================
Code
# Estimación IV (2SLS)
= IV2SLS(dependent = INF_INT.INF,
modelo_IV = INF_INT[['const','RM']],
exog = INF_INT.RY,
endog = INF_INT[['EDUC','INV','RPOB','YPC0']])
instruments = modelo_IV.fit(cov_type='unadjusted')
res_modelo_IV print(res_modelo_IV)
IV-2SLS Estimation Summary
==============================================================================
Dep. Variable: INF R-squared: 0.9947
Estimator: IV-2SLS Adj. R-squared: 0.9946
No. Observations: 76 F-statistic: 1.427e+04
Date: Sun, Feb 09 2025 P-value (F-stat) 0.0000
Time: 15:35:57 Distribution: chi2(2)
Cov. Estimator: unadjusted
Parameter Estimates
==============================================================================
Parameter Std. Err. T-stat P-value Lower CI Upper CI
------------------------------------------------------------------------------
const -1.0940 1.8212 -0.6007 0.5480 -4.6634 2.4754
RM 1.0351 0.0096 108.07 0.0000 1.0163 1.0538
RY -1.3942 0.5405 -2.5794 0.0099 -2.4536 -0.3348
==============================================================================
Endogenous: RY
Instruments: EDUC, INV, RPOB, YPC0
Unadjusted Covariance (Homoskedastic)
Debiased: False
Code
res_modelo_IV.wu_hausman()
Wu-Hausman test of exogeneity
H0: All endogenous variables are exogenous
Statistic: 1.1498
P-value: 0.2872
Distributed: F(1,72)
WaldTestStatistic, id: 0x132debc70
Code
# Comparación de resultados
from collections import OrderedDict
from linearmodels.iv.results import compare
= OrderedDict()
res_modelos "MCO"] = res_modelo_MCO
res_modelos["IV"] = res_modelo_IV
res_modelos[print(compare(res_modelos))
Model Comparison
==================================================
MCO IV
--------------------------------------------------
Dep. Variable INF INF
Estimator OLS IV-2SLS
No. Observations 76 76
Cov. Est. unadjusted unadjusted
R-squared 0.9948 0.9947
Adj. R-squared 0.9947 0.9946
F-statistic 1.453e+04 1.427e+04
P-value (F-stat) 0.0000 0.0000
================== ============ ============
const -0.2342 -1.0940
(-0.2439) (-0.6007)
RM 1.0331 1.0351
(116.58) (108.07)
RY -1.6620 -1.3942
(-6.7679) (-2.5794)
==================== ============== ==============
Instruments EDUC
INV
RPOB
YPC0
--------------------------------------------------
T-stats reported in parentheses