library(wooldridge)
## Warning: package 'wooldridge' was built under R version 4.5.3
data(hprice1)
head(force(hprice1),n=5) #mostrar las primeras 5 observaciones
## price assess bdrms lotsize sqrft colonial lprice lassess llotsize lsqrft
## 1 300 349.1 4 6126 2438 1 5.703783 5.855359 8.720297 7.798934
## 2 370 351.5 3 9903 2076 1 5.913503 5.862210 9.200593 7.638198
## 3 191 217.7 3 5200 1374 0 5.252274 5.383118 8.556414 7.225482
## 4 195 231.8 3 4600 1448 1 5.273000 5.445875 8.433811 7.277938
## 5 373 319.1 4 6095 2514 1 5.921578 5.765504 8.715224 7.829630
library(stargazer)
## Warning: package 'stargazer' was built under R version 4.5.2
##
## Please cite as:
## Hlavac, Marek (2022). stargazer: Well-Formatted Regression and Summary Statistics Tables.
## R package version 5.2.3. https://CRAN.R-project.org/package=stargazer
modelo_estimado <- lm(price ~ lotsize + sqrft + bdrms, data = hprice1)
stargazer(modelo_estimado, type = "text", title = "modelo estimado")
##
## modelo estimado
## ===============================================
## Dependent variable:
## ---------------------------
## price
## -----------------------------------------------
## lotsize 0.002***
## (0.001)
##
## sqrft 0.123***
## (0.013)
##
## bdrms 13.853
## (9.010)
##
## Constant -21.770
## (29.475)
##
## -----------------------------------------------
## Observations 88
## R2 0.672
## Adjusted R2 0.661
## Residual Std. Error 59.833 (df = 84)
## F Statistic 57.460*** (df = 3; 84)
## ===============================================
## Note: *p<0.1; **p<0.05; ***p<0.01
# Opción 1: Usando la librería "lmtest"
library(lmtest)
## Warning: package 'lmtest' was built under R version 4.5.2
## Cargando paquete requerido: zoo
## Warning: package 'zoo' was built under R version 4.5.2
##
## Adjuntando el paquete: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
# alternative = "two.sided" busca autocorrelación tanto positiva como negativa
test_dw_1 <- dwtest(modelo_estimado, alternative = "two.sided", iterations = 1000)
print(test_dw_1)
##
## Durbin-Watson test
##
## data: modelo_estimado
## DW = 2.1098, p-value = 0.6218
## alternative hypothesis: true autocorrelation is not 0
# Opción 2: Usando la librería "car"
library(car)
## Warning: package 'car' was built under R version 4.5.3
## Cargando paquete requerido: carData
## Warning: package 'carData' was built under R version 4.5.2
# durbinWatsonTest suele usar bootstrapping (simulate=TRUE) para el p-value
test_dw_2 <- durbinWatsonTest(modelo_estimado, simulate = TRUE, reps = 1000)
print(test_dw_2)
## lag Autocorrelation D-W Statistic p-value
## 1 -0.05900522 2.109796 0.61
## Alternative hypothesis: rho != 0
# 1. Modelo original
modelo <- lm(price ~ lotsize + sqrft + bdrms, data = hprice1)
# 2. Residuos (u_i)
u_i <- resid(modelo)
# 3. Crear dataset para BG
data_prueba_BG <- hprice1
data_prueba_BG$u_i <- u_i
data_prueba_BG$Lag_1 <- dplyr::lag(u_i, 1)
data_prueba_BG$Lag_2 <- dplyr::lag(u_i, 2)
# 4. Modelo BG
bg_2 <- lm(u_i ~ lotsize + sqrft + bdrms + Lag_1 + Lag_2,
data = data_prueba_BG)
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.5.3
##
## Adjuntando el paquete: 'dplyr'
## The following object is masked from 'package:car':
##
## recode
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(tidyr)
## Warning: package 'tidyr' was built under R version 4.5.2
library(kableExtra)
## Warning: package 'kableExtra' was built under R version 4.5.3
##
## Adjuntando el paquete: 'kableExtra'
## The following object is masked from 'package:dplyr':
##
## group_rows
# Usamos los residuos u_i que ya extrajiste de tu modelo_ejemplo
data_prueba_BG <- cbind(u_i, hprice1) %>%
as.data.frame() %>%
mutate(Lag_1 = dplyr::lag(u_i, 1),
Lag_2 = dplyr::lag(u_i, 2)) %>%
replace_na(list(Lag_1 = 0, Lag_2 = 0))
# Ver las primeras filas para verificar los rezagos
kable(head(data_prueba_BG, 6))
| u_i | price | assess | bdrms | lotsize | sqrft | colonial | lprice | lassess | llotsize | lsqrft | Lag_1 | Lag_2 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| -45.639765 | 300.000 | 349.1 | 4 | 6126 | 2438 | 1 | 5.703783 | 5.855359 | 8.720297 | 7.798934 | 0.000000 | 0.000000 |
| 74.848732 | 370.000 | 351.5 | 3 | 9903 | 2076 | 1 | 5.913503 | 5.862210 | 9.200593 | 7.638198 | -45.639765 | 0.000000 |
| -8.236558 | 191.000 | 217.7 | 3 | 5200 | 1374 | 0 | 5.252274 | 5.383118 | 8.556414 | 7.225481 | 74.848732 | -45.639765 |
| -12.081520 | 195.000 | 231.8 | 3 | 4600 | 1448 | 1 | 5.273000 | 5.445875 | 8.433811 | 7.277938 | -8.236558 | 74.848732 |
| 18.093192 | 373.000 | 319.1 | 4 | 6095 | 2514 | 1 | 5.921578 | 5.765504 | 8.715224 | 7.829630 | -12.081520 | -8.236558 |
| 62.939597 | 466.275 | 414.5 | 5 | 8566 | 2754 | 1 | 6.144775 | 6.027073 | 9.055556 | 7.920810 | 18.093192 | -12.081520 |
# 2. Calculando la regresión auxiliar
# Se regresan los residuos contra las variables originales + los rezagos
regresion_auxiliar_BG <- lm(u_i ~ lotsize + sqrft + bdrms + Lag_1 + Lag_2,
data = data_prueba_BG)
sumario_BG <- summary(regresion_auxiliar_BG)
# 3. Cálculo del estadístico LM (Breusch-Godfrey)
n_bg <- nrow(data_prueba_BG)
R2_bg <- sumario_BG$r.squared
LM_bg <- n_bg * R2_bg
# Grados de libertad = número de rezagos (en este caso 2)
gl_bg <- 2
p_valor_bg <- 1 - pchisq(LM_bg, df = gl_bg)
# Mostrar resultado rápido
cat("Estadístico LM:", LM_bg, "\nP-valor:", p_valor_bg)
## Estadístico LM: 3.033403
## P-valor: 0.2194345
# Regresión auxiliar (orden 1)
bg_1 <- lm(u_i ~ lotsize + sqrft + bdrms + Lag_1,
data = data_prueba_BG)
# LM
n1 <- nrow(data_prueba_BG)
R2_1 <- summary(bg_1)$r.squared
LM_1 <- n1 * R2_1
# p-valor
p_1 <- 1 - pchisq(LM_1, df = 1)
cat("Orden 1 -> LM:", LM_1, "p-valor:", p_1)
## Orden 1 -> LM: 0.3936243 p-valor: 0.5304004
# Regresión auxiliar (orden 2)
bg_2 <- lm(u_i ~ lotsize + sqrft + bdrms + Lag_1 + Lag_2,
data = data_prueba_BG)
# LM
n2 <- nrow(data_prueba_BG)
R2_2 <- summary(bg_2)$r.squared
LM_2 <- n2 * R2_2
# p-valor
p_2 <- 1 - pchisq(LM_2, df = 2)
cat("Orden 2 -> LM:", LM_2, "p-valor:", p_2)
## Orden 2 -> LM: 3.033403 p-valor: 0.2194345
Para la prueba de de primer orden, se obtuvo un p-valor de 0.5304, el cual es mayor que 0.05. Por lo tanto, no se rechaza la hipótesis nula, concluyendo que no existe autocorrelación de primer orden en los residuos.
Para la prueba de segundo orden, el p-valor es 0.2094, también mayor que 0.05. En consecuencia, no se rechaza la hipótesis nula, indicando que no existe autocorrelación de segundo orden.
se concluye que no hay evidencia de autocorrelación en los residuos del modelo, por lo que se cumple el supuesto de independencia de los errores.