Indicación: Aplicar la librería stargazer para presentar modelos corregidos con estimadores HAC (Heterocedastisticity And Autocorrelation).

Retomando el dataset visto en clase:

Carga de datos.

options(scipen = 999999)
library(foreign)
datos_regresion <- read.dta("https://stats.idre.ucla.edu/stat/data/crime.dta")
modelo_estimado<-lm(crime~poverty+single,data=datos_regresion)
print(modelo_estimado)
## 
## Call:
## lm(formula = crime ~ poverty + single, data = datos_regresion)
## 
## Coefficients:
## (Intercept)      poverty       single  
##   -1368.189        6.787      166.373

Una vez cargado el modelo deben realizarse las pruebas para realizar la estimación robusta adecuada.

Pruebas de Heterocedasticidad.

Prueba de White (Breusch Pagan test).

Nota: Incluir los términos cruzados. Se trata de un modelo de 2 variables explicativas.

Hipótesis

\(H_o\): La varianza de los residuos es homocedástica. Todos los paramétros del modelo son simultáneamente cero.

\(H_1\): La varianza de los residuos es heterocedástica. No todos los coeficientes del modelo son cero.

Regla de rechazo

\(LM_W ≥ VC\) rechazar \(H_o\)

\(p-value ≤ α\) rechazar \(H_o\)

library(lmtest)
white_test<-bptest(modelo_estimado,~I(poverty^2)+I(single^2)+poverty*single,
                   data = datos_regresion)
print(white_test)
## 
##  studentized Breusch-Pagan test
## 
## data:  modelo_estimado
## BP = 10.73, df = 5, p-value = 0.057

Se rechaza la hipótesis nula dado que p-value = 0.057 ≤ 0.05. Hay evidencia de heterocedisticidad en el modelo. No todos los coeficientes son simultáneamente cero.

Pruebas de Autocorrelación.

Prueba de Durbin Watson: Primer orden.

Hipótesis

\(H_o: ρ = 0\) No hay evidencia de autocorrelación de primer orden en los residuos del modelo.

\(H_1: ρ ≠ 0\) Hay evidencia de autocorrelación de primer orden en los residuos del modelo.

Regla de rechazo

\(p-value ≤ α\) rechazar \(H_o\)

library(car)
durbinWatsonTest(model = modelo_estimado)
##  lag Autocorrelation D-W Statistic p-value
##    1     -0.07014421      2.040007   0.988
##  Alternative hypothesis: rho != 0

No hay evidencia de autocorrelación de primer orden dado que el p-value es mayor al nivel de significancia.

Multiplicador de Lagrange: Breusch Godfey: Orden m.

Hipótesis

\(H_o: ρ_m = 0\) No hay evidencia de autocorrelación de orden “m” en los residuos del modelo.

\(H_1: ρ_m ≠ 0\) Hay evidencia de autocorrelación de orden “m” en los residuos del modelo.

Regla de rechazo

\(LM_B > VC\) rechazar \(H_o\)

\(p-value ≤ α\) rechazar \(H_o\)

Para la detección de autocorrelación de segundo orden se tiene que:

library(lmtest)
prueba_LM <- bgtest(modelo_estimado,order = 2)
print(prueba_LM)
## 
##  Breusch-Godfrey test for serial correlation of order up to 2
## 
## data:  modelo_estimado
## LM test = 0.27165, df = 2, p-value = 0.873

El p-value = 0.873 > 0.05, no hay evidencia de autocorrelación de orden 2.

Estimación robusta HAC.

Dado que las pruebas únicamente detectaron heterocedisticad se hará uso de la librería lmtest y sandwich con el argumento HCO.

Modelo sin corregir.

options(scipen = 99999)
library(lmtest)
# Mostrando el modelo original
coeftest(modelo_estimado)
## 
## t test of coefficients:
## 
##               Estimate Std. Error t value         Pr(>|t|)    
## (Intercept) -1368.1887   187.2052 -7.3085 0.00000000247861 ***
## poverty         6.7874     8.9885  0.7551           0.4539    
## single        166.3727    19.4229  8.5658 0.00000000003117 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Corrección del modelo, HCO

options(scipen = 99999)
library(lmtest)
library(sandwich)
# Matriz VarCov corregida
estimacion_omega <- vcovHC(modelo_estimado, type = "HC0") 
coeftest_corregido <- coeftest(modelo_estimado, vcov. = estimacion_omega)
print(coeftest_corregido)
## 
## t test of coefficients:
## 
##               Estimate Std. Error t value      Pr(>|t|)    
## (Intercept) -1368.1887   276.4111 -4.9498 0.00000956181 ***
## poverty         6.7874    10.6010  0.6403        0.5251    
## single        166.3727    25.4510  6.5370 0.00000003774 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Comparación de modelos con Stargazer

options(scipen = 99999)
library(stargazer)
# Retomando
estimacion_omega <- vcovHC(modelo_estimado, type = "HC0") 
se_fix <- sqrt(diag(estimacion_omega)) # Para obtener los errores estándar
# Comparación de modelos
stargazer(modelo_estimado, modelo_estimado, 
          se=list(NULL, se_fix), # Agregando la correción HAC
          type = "html",
          title = "Comparación de modelos: corrección HAC.",
          column.labels = c("Original", "Corregido"),
          model.names = FALSE,
          dep.var.labels = "Modelo",
          dep.var.caption = "Dependent variable: crime",
          model.numbers = FALSE)
Comparación de modelos: corrección HAC.
Dependent variable: crime
Modelo
Original Corregido
poverty 6.787 6.787
(8.989) (10.601)
single 166.373*** 166.373***
(19.423) (25.451)
Constant -1,368.189*** -1,368.189***
(187.205) (276.411)
Observations 51 51
R2 0.707 0.707
Adjusted R2 0.695 0.695
Residual Std. Error (df = 48) 243.610 243.610
F Statistic (df = 2; 48) 57.964*** 57.964***
Note: p<0.1; p<0.05; p<0.01

Estimación robusta del modelo.

A través de la estimación robusta de estimadores MM de Yohai se calculan los coeficientes de regresión y la matriz de covarianzas de los errores de forma simultánea.

options(scipen = 999999)
library(robustbase)
library(stargazer)
modelo_robusto <- lmrob(crime~poverty+single, data=datos_regresion)

stargazer(modelo_estimado,modelo_robusto,
          type = "html",
          title = "Comparación de modelos: Estimación robusta.",
          column.labels = c("Original", "Robusto"),
          model.names = FALSE,
          model.numbers = FALSE,
          dep.var.caption = "Dependent variable: crime",
          dep.var.labels = "Modelo")
Comparación de modelos: Estimación robusta.
Dependent variable: crime
Modelo
Original Robusto
poverty 6.787 11.466
(8.989) (9.263)
single 166.373*** 176.569***
(19.423) (23.223)
Constant -1,368.189*** -1,539.640***
(187.205) (235.765)
Observations 51 51
R2 0.707 0.795
Adjusted R2 0.695 0.787
Residual Std. Error (df = 48) 243.610 191.864
F Statistic 57.964*** (df = 2; 48)
Note: p<0.1; p<0.05; p<0.01

Extra: Uso de la librería NeweyTest.

Para corregir correlación de segundo orden en un modelo el procedimiento a seguir es el siguiente:

library(lmtest)
library(sandwich)
# Correlación de orden 2, lag = 2
estimacion_omega2<-NeweyWest(modelo_estimado,lag = 2)
coeftest(modelo_estimado,vcov. = estimacion_omega2)
## 
## t test of coefficients:
## 
##               Estimate Std. Error t value      Pr(>|t|)    
## (Intercept) -1368.1887   303.8466 -4.5029 0.00004279768 ***
## poverty         6.7874    10.5943  0.6407        0.5248    
## single        166.3727    25.9154  6.4198 0.00000005708 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Comparación de modelos con Stargazer

options(scipen = 99999)
library(stargazer)
# Retomando
estimacion_omega2<-NeweyWest(modelo_estimado,lag = 2)
se_fix2 <- sqrt(diag(estimacion_omega2)) # Para obtener los errores estándar
# Comparación de modelos
stargazer(modelo_estimado, modelo_estimado, 
          se=list(NULL, se_fix2), # Agregando la correción HAC
          type = "html",
          title = "Comparación de modelos: corrección HAC de NeweyTest.",
          column.labels = c("Original", "Corregido"),
          model.names = FALSE,
          dep.var.labels = "Modelo",
          dep.var.caption = "Dependent variable: crime",
          model.numbers = FALSE)
Comparación de modelos: corrección HAC de NeweyTest.
Dependent variable: crime
Modelo
Original Corregido
poverty 6.787 6.787
(8.989) (10.594)
single 166.373*** 166.373***
(19.423) (25.915)
Constant -1,368.189*** -1,368.189***
(187.205) (303.847)
Observations 51 51
R2 0.707 0.707
Adjusted R2 0.695 0.695
Residual Std. Error (df = 48) 243.610 243.610
F Statistic (df = 2; 48) 57.964*** 57.964***
Note: p<0.1; p<0.05; p<0.01