Utilizando los datos del dataframe hprice1: disponible en el paquete wooldridge use el siguiente código para generar el dataframe:

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

1. estime el siguiente modelo,

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

2. Verifique si los residuos del modelo son independientes entre sí (no autocorrelación), a través de:

a) Prueba de Durbin Watson.

# 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

autocorrelacion de orden superior (orden m)

# 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

b) Prueba del Multiplicador de Lagrange (verifique autocorrelación de primer y segundo orden).

autocorrelación de primer orden

# 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

autocorrelación de segundo orden

# 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.