###cargar los datos

library(stats)
library(readxl)
## Warning: package 'readxl' was built under R version 4.5.2
# Esto abrirá una ventana, busca tu archivo Excel y selecciónalo
ventas_empresa <- read_excel("C:\\Users\\MINEDUCYT\\Desktop\\EMA118\\SEGUNDO EXAMEN PARCIAL\\ventas_empresa.xlsx")

# Verificas
head(ventas_empresa, n=10)
## # A tibble: 10 × 4
##        V     C     P     M
##    <dbl> <dbl> <dbl> <dbl>
##  1   607   197   173   110
##  2   590   208   152   107
##  3   543   181   150    99
##  4   558   194   150   102
##  5   571   192   163   109
##  6   615   196   179   114
##  7   606   203   169   113
##  8   593   200   166   113
##  9   582   198   159   115
## 10   646   221   206   119

##Estimación del modelo

library(stargazer)
modelo_estimado <- lm(V ~ C + P + M, data = ventas_empresa)
stargazer(modelo_estimado,title = "MODELO_ESTIMADO",type = "text")
## 
## MODELO
## ===============================================
##                         Dependent variable:    
##                     ---------------------------
##                                  V             
## -----------------------------------------------
## C                            0.923***          
##                               (0.223)          
##                                                
## P                            0.950***          
##                               (0.156)          
##                                                
## M                            1.298***          
##                               (0.431)          
##                                                
## Constant                    107.444***         
##                              (18.057)          
##                                                
## -----------------------------------------------
## Observations                    24             
## R2                             0.980           
## Adjusted R2                    0.977           
## Residual Std. Error       9.506 (df = 20)      
## F Statistic           323.641*** (df = 3; 20)  
## ===============================================
## Note:               *p<0.1; **p<0.05; ***p<0.01

#Pruebas de normalidad ##Prueba de Jarque_Bera ##Usando la libreria tseries

options(scipen = 9999)
library(tseries)
salida_JB<-jarque.bera.test(modelo_estimado$residuals)
salida_JB
## 
##  Jarque Bera Test
## 
## data:  modelo_estimado$residuals
## X-squared = 1.4004, df = 2, p-value = 0.4965
#Resultado: Dado que el p-value=1.4004 y el nivel de signficancia es de 0.05 entonces 1.4004>0.05 por lo tanto no se se rechaza la hipotesis nula y se concluye que los datos siguen una distribución normal 

##Calculo manual de la prueba Jarque-Bera

library(dplyr)
## 
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(gt)
# 1. Extraer residuales y definir n
residuos<- modelo_estimado$residuals
n <- length(residuos)

# 2. Calcular los componentes de la prueba
# Asimetría (Skewness)
asimetria <- sum((residuos - mean(residuos))^3) / (n * (sd(residuos) * sqrt((n-1)/n))^3)

# Curtosis
curtosis <- sum((residuos - mean(residuos))^4) / (n * (sd(residuos) * sqrt((n-1)/n))^4)

# Estadístico Jarque-Bera (JB)
jb_est <- (n / 6) * (asimetria^2 + ((curtosis - 3)^2 / 4))

# Valor p (usa una distribución Chi-cuadrado con 2 grados de libertad)
p_val_jb <- pchisq(jb_est, df = 2, lower.tail = FALSE)

# 3. Crear la tabla de resultados
tabla_JB <- tibble(
  Estadistico = c("Asimetría", "Curtosis", "Jarque-Bera (JB)", "Valor p"),
  Valor = c(asimetria, curtosis, jb_est, p_val_jb),
  Interpretacion = c(
    ifelse(asimetria > 0, "Positiva", "Negativa"),
    ifelse(curtosis > 3, "Leptocúrtica", "Platicúrtica"),
    "Estadístico de prueba",
    ifelse(p_val_jb > 0.05, "No Rechaza Normalidad", "Rechaza Normalidad")
  )
)

# 4. Formatear con gt
tabla_JB %>%
  gt() %>%
  tab_header(title = "Resultados de la Prueba Jarque-Bera",
             subtitle = "Evaluación de Asimetría y Curtosis de los Residuales") %>%
  fmt_number(columns = Valor, decimals = 4) %>%
  cols_label(Estadistico = "Métrica", Valor = "Valor Calculado")
Resultados de la Prueba Jarque-Bera
Evaluación de Asimetría y Curtosis de los Residuales
Métrica Valor Calculado Interpretacion
Asimetría −0.4023 Negativa
Curtosis 2.1322 Platicúrtica
Jarque-Bera (JB) 1.4004 Estadístico de prueba
Valor p 0.4965 No Rechaza Normalidad

##Gráfico de la prueba Jarque-BERA

library(fastGraph)
## Warning: package 'fastGraph' was built under R version 4.5.3
alpha_sig<-0.05
JB<-salida_JB$statistic
gl<-salida_JB$parameter
VC<-qchisq(1-alpha_sig,gl,lower.tail=TRUE)
shadeDist(JB,ddist = "dchisq",
          parm1=gl,
          lower.tail= FALSE, xmin=0,
          sub=paste("VC:",round(VC,2)," ","JB:",round(JB,2)))

##Calculo de la prueba de Kolmogorov Smimov-Liliefors ###libreria nortest

library(nortest)
prueba_KS<-lillie.test(modelo_estimado$residuals)
prueba_KS
## 
##  Lilliefors (Kolmogorov-Smirnov) normality test
## 
## data:  modelo_estimado$residuals
## D = 0.13659, p-value = 0.2935
#Resultado, dado que p-value=0.2935> 0.05 entonces no se rechaza Ho, entonces los datos siguen una distribución normal

#Calculo manual de la prueba K-S

library(dplyr)  
library(gt) 
library(gtExtras)
## Warning: package 'gtExtras' was built under R version 4.5.3
residuos<-modelo_estimado$residuals  
residuos |>  
  as_tibble() |>   
  mutate(posicion=row_number()) |>  
  arrange(value) |>   
  mutate(dist1=row_number()/n()) |> 
  mutate(dist2=(row_number()-1)/n()) |> 
  mutate(zi=as.vector(scale(value,center=TRUE))) |>  
  mutate(pi=pnorm(zi,lower.tail = TRUE)) |>   
  mutate(dif1=abs(dist1-pi)) |>  
  mutate(dif2=abs(dist2-pi)) |> 
  rename(residuales=value) ->tabla_KS
  
  #Formato
 tabla_KS |>  
  gt() |>  
  tab_header("Tabla para calcular el Estadistico KS") |> 
  tab_source_note(source_note = "Fuente: Elaboración propia") |> 
  tab_style(  
    style = list(
      cell_fill(color = "#A569BD"),  
      cell_text(style = "italic")
    ),
    locations = cells_body(
      columns = dif1,  
      rows = dif1==max(dif1)  
    )) |> 
   tab_style(  
    style = list(
      cell_fill(color = "#3498DB"),  
      cell_text(style = "italic")
    ),
    locations = cells_body(
      columns = dif2,  
      rows = dif2==max(dif2)
    ))
Tabla para calcular el Estadistico KS
residuales posicion dist1 dist2 zi pi dif1 dif2
-17.27950969 11 0.04166667 0.00000000 -1.949405386 0.02562352 0.0160431507 0.025623516
-15.50384667 10 0.08333333 0.04166667 -1.749082164 0.04013841 0.0431949244 0.001528258
-13.84401165 19 0.12500000 0.08333333 -1.561826195 0.05916447 0.0658355305 0.024168864
-9.91393148 5 0.16666667 0.12500000 -1.118450221 0.13168738 0.0349792889 0.006687378
-8.43534410 9 0.20833333 0.16666667 -0.951641887 0.17063932 0.0376940180 0.003972649
-7.90808316 24 0.25000000 0.20833333 -0.892158410 0.18615402 0.0638459847 0.022179318
-6.65267950 23 0.29166667 0.25000000 -0.750528776 0.22646815 0.0651985168 0.023531850
-3.33614422 8 0.33333333 0.29166667 -0.376370489 0.35332074 0.0199874078 0.061654074
-3.32226362 4 0.37500000 0.33333333 -0.374804535 0.35390292 0.0210970793 0.020569587
-2.43553165 3 0.41666667 0.37500000 -0.274766969 0.39174764 0.0249190286 0.016747638
-0.40251845 21 0.45833333 0.41666667 -0.045410527 0.48189005 0.0235567120 0.065223379
0.01280369 14 0.50000000 0.45833333 0.001444461 0.50057626 0.0005762565 0.042242923
3.09667909 20 0.54166667 0.50000000 0.349354988 0.63658859 0.0949219225 0.136588589
4.04562361 7 0.58333333 0.54166667 0.456411125 0.67595282 0.0926194830 0.134286150
4.98802235 12 0.62500000 0.58333333 0.562728793 0.71319021 0.0881902126 0.129856879
5.88324503 22 0.66666667 0.62500000 0.663724246 0.74656659 0.0798999242 0.121566591
6.28004614 18 0.70833333 0.66666667 0.708489765 0.76067942 0.0523460837 0.094012750
6.69809559 15 0.75000000 0.70833333 0.755652438 0.77507120 0.0250711962 0.066737863
6.78865323 16 0.79166667 0.75000000 0.765868789 0.77812281 0.0135438559 0.028122811
7.37251119 2 0.83333333 0.79166667 0.831737317 0.79722138 0.0361119495 0.005554717
8.70403920 6 0.87500000 0.83333333 0.981954997 0.83693899 0.0380610096 0.003605657
9.77138853 13 0.91666667 0.87500000 1.102369093 0.86484938 0.0518172880 0.010150621
10.67367778 1 0.95833333 0.91666667 1.204161768 0.88573647 0.0725968632 0.030930197
14.71907878 17 1.00000000 0.95833333 1.660547780 0.95159785 0.0484021522 0.006735485
Fuente: Elaboración propia

##Cálculo del estadistico SK

D<-max(max(tabla_KS$dif1),max(tabla_KS$dif2))
print(D)
## [1] 0.1365886
##Resultado: dado que 0.1365<0.2693. Es decir que D<V.C entonces la hipótesis nula no se rechaza y por lo tanto, los datos siguen una distribución normal

##Cálculo de la prueba Shapiro Will ##Usando la libreria stats

salida_SW<-shapiro.test(modelo_estimado$residuals)
print(salida_SW)
## 
##  Shapiro-Wilk normality test
## 
## data:  modelo_estimado$residuals
## W = 0.95315, p-value = 0.3166
Wn_salida<-qnorm(salida_SW$p.value,lower.tail = FALSE)
print(Wn_salida)
## [1] 0.4773519
#Conclusión: Dado que 0.3166(p-value)>0.05 entonces no se rechaza la hipótesis nula y los datos siguen una distribución normal

##calculo manual de la prueba Shapiro Will

library(dplyr) # Carga la librería para manipulación de datos (pipes, mutate, etc.)
library(gt)    # Carga la librería para la creación de tablas con formato profesional
residuos <-modelo_estimado$residuals # Extrae los residuales del objeto del modelo previamente ajustado
residuos |>   # Toma el vector de residuales y lo pasa al siguiente paso
  as_tibble() |>  # Convierte el vector en una estructura de datos tipo tabla (tibble)
  rename(residuales = value) |>   # Cambia el nombre de la columna por defecto 'value' a 'residuales'
  arrange(residuales) |>   # Ordena los residuales de menor a mayor (requisito de Shapiro-Wilk)
  mutate(pi = (row_number() - 0.375) / (n() + 0.25)) |>   # Calcula la posición de graficación (Blom's plotting position)
  mutate(mi = qnorm(pi, lower.tail = TRUE)) |>   # Calcula los cuantiles teóricos (esperados) de una normal estándar
  mutate(ai = 0) -> tabla_SW # Inicializa la columna 'ai' en cero y guarda el resultado en 'tabla_SW'

m <-sum(tabla_SW$mi^2) # Calcula la suma de los cuadrados de los cuantiles teóricos (m)
n <-nrow(tabla_SW) # Obtiene el tamaño de la muestra original
theta<-1/sqrt(n) # Define una variable auxiliar basada en la raíz inversa de n para las aproximaciones

# Calcula el coeficiente 'ai' para el último dato usando el polinomio de aproximación de Royston
tabla_SW$ai[n] <- -2.706056*theta^5 + 4.434685*theta^4 - 2.071190*theta^3 - 0.147981*theta^2 + 0.2211570*theta + tabla_SW$mi[n]/sqrt(m)

# Calcula el coeficiente 'ai' para el penúltimo dato usando la fórmula polinómica correspondiente
tabla_SW$ai[n-1] <- -3.582633*theta^5 + 5.682633*theta^4 - 1.752461*theta^3 - 0.293762*theta^2 + 0.042981*theta + tabla_SW$mi[n-1]/sqrt(m)

tabla_SW$ai[1] <- -tabla_SW$ai[n] # El primer coeficiente es el negativo del último (por simetría)
tabla_SW$ai[2] <- -tabla_SW$ai[n-1] # El segundo coeficiente es el negativo del penúltimo

# Calcula un factor de escala (omega) para los coeficientes restantes basándose en m y los extremos calculados
omega <- (m - 2*tabla_SW$mi[n]^2 - 2*tabla_SW$mi[n-1]^2) / (1 - 2*tabla_SW$ai[n]^2 - 2*tabla_SW$ai[n-1]^2)

# Asigna los coeficientes 'ai' intermedios escalándolos por la raíz de omega
tabla_SW$ai[3:(n-2)] <- tabla_SW$mi[3:(n-2)] / sqrt(omega)

# Calcula los productos (ai * residual) y los residuales al cuadrado para el estadístico W final
tabla_SW |>   
  mutate(ai_ui = ai * residuales, ui2 = residuales^2) -> tabla_SW # Actualiza la tabla con los cálculos de los productos y cuadrados
print(tabla_SW)
## # A tibble: 24 × 6
##    residuales     pi     mi      ai ai_ui    ui2
##         <dbl>  <dbl>  <dbl>   <dbl> <dbl>  <dbl>
##  1     -17.3  0.0258 -1.95  -0.448  7.73  299.  
##  2     -15.5  0.0670 -1.50  -0.313  4.85  240.  
##  3     -13.8  0.108  -1.24  -0.255  3.53  192.  
##  4      -9.91 0.149  -1.04  -0.214  2.12   98.3 
##  5      -8.44 0.191  -0.875 -0.181  1.52   71.2 
##  6      -7.91 0.232  -0.732 -0.151  1.20   62.5 
##  7      -6.65 0.273  -0.603 -0.124  0.828  44.3 
##  8      -3.34 0.314  -0.483 -0.0997 0.333  11.1 
##  9      -3.32 0.356  -0.370 -0.0764 0.254  11.0 
## 10      -2.44 0.397  -0.261 -0.0539 0.131   5.93
## # ℹ 14 more rows

##calclo del estadistico w de la prueba shapiro

W<-(sum(tabla_SW$ai_ui)^2)/sum(tabla_SW$ui2)
print(W)
## [1] 0.9531481

##calculo del estadistico Wn y su p-value

mu<-0.0038915*log(n)^3-0.083751*log(n)^2-0.31082*log(n)-1.5861
sigma<-exp(0.0030302*log(n)^2-0.082676*log(n)-0.4803)
Wn<-(log(1-W)-mu)/sigma
print(Wn)
## [1] 0.4773519
p.value<-pnorm(Wn,lower.tail = FALSE)
print(p.value)
## [1] 0.3165558
#Dado que el pvalue=0.3166>0.05 entonces no se rechaza la hipotesis nula y los datos siguen una distribución normal

##Grafico de la prueba Shapiro-will

library(fastGraph)
shadeDist(Wn,ddist = "dnorm",lower.tail = FALSE)

#PRUEBAS DE MULTICOLANIEDAD ##CALCULO DEL INDICE DE CONDICIÓN CON LA LIBRERIA MCTEST

library(mctest)
X_mat<-model.matrix(modelo_estimado)
mctest(mod = modelo_estimado)
## 
## Call:
## omcdiag(mod = mod, Inter = TRUE, detr = detr, red = red, conf = conf, 
##     theil = theil, cn = cn)
## 
## 
## Overall Multicollinearity Diagnostics
## 
##                        MC Results detection
## Determinant |X'X|:         0.0346         0
## Farrar Chi-Square:        71.2080         1
## Red Indicator:             0.8711         1
## Sum of Lambda Inverse:    20.9196         1
## Theil's Method:            0.5430         1
## Condition Number:         71.1635         1
## 
## 1 --> COLLINEARITY is detected by the test 
## 0 --> COLLINEARITY is not detected by the test
#dado que el indice de condición k(x)=71.2080 y es superior a 30. Entonces como k(x)> 30 se considera colinealidad severa

##calculo del indice usando la libreria olsrr

library(olsrr)
## 
## Adjuntando el paquete: 'olsrr'
## The following object is masked from 'package:datasets':
## 
##     rivers
ols_eigen_cindex(model = modelo_estimado)
##     Eigenvalue Condition Index    intercept             C            P
## 1 3.9869237681         1.00000 0.0007213226 0.00009632167 0.0002714936
## 2 0.0095007154        20.48523 0.8775733849 0.00494748750 0.0877003286
## 3 0.0027882470        37.81406 0.1182991896 0.15940219484 0.8478049007
## 4 0.0007872695        71.16349 0.0034061029 0.83555399599 0.0642232771
##               M
## 1 0.00008216652
## 2 0.00754342318
## 3 0.06362314121
## 4 0.92875126909
#dado que el indice de condición k(x)=71.2080 y es superior a 30. Entonces como k(x)> 30 se considera colinealidad severa

##PRUEBA DE Farrar-Glauber ##usando la libreria physis

library(psych)
FG_test<-cortest.bartlett(X_mat[,-1])
## R was not square, finding R from data
print(FG_test)
## $chisq
## [1] 71.20805
## 
## $p.value
## [1] 0.000000000000002352605
## 
## $df
## [1] 3

##REGLA DE DESCISIÓN: DADO QUE EL pvalue=0.000000<0.05 se rechaza la hipotesis nula y por lo tanto hay evidencia de colinealidad entre las variables explicativas. Otra forma de comprobarlo es mediante la regla de decisión utilizando el valor critico. si FG>= V.C se rechaza H0. Dado que FG= 71.81 y con tres grados de libertad de y un 5% de significancia en la tabla chi cuadrado el V.C= 7.81— 71.81>7.81 entonces se rechaza H0.

calculo de la prueba Farrar-Glauber usando la libreria mctest

library(mctest)
mctest::omcdiag(mod = modelo_estimado)
## 
## Call:
## mctest::omcdiag(mod = modelo_estimado)
## 
## 
## Overall Multicollinearity Diagnostics
## 
##                        MC Results detection
## Determinant |X'X|:         0.0346         0
## Farrar Chi-Square:        71.2080         1
## Red Indicator:             0.8711         1
## Sum of Lambda Inverse:    20.9196         1
## Theil's Method:            0.5430         1
## Condition Number:         71.1635         1
## 
## 1 --> COLLINEARITY is detected by the test 
## 0 --> COLLINEARITY is not detected by the test

##GRAFICANDO LA PRUEBA DE FARRAR

library(fastGraph)
shadeDist(xshade = 71.208, 
          ddist = "dchisq", 
          parm1 = 3, 
          lower.tail = FALSE, 
          main = "Prueba Global de Farrar-Glauber",
          sub = "Distribución Chi-cuadrado con df=3")

alpha_sig <- 0.05
farrar_stat <- 71.20805  
gl_farrar <- 3          
VC <- qchisq(1 - alpha_sig, gl_farrar)
shadeDist(xshade = farrar_stat, 
          ddist = "dchisq", 
          parm1 = gl_farrar, 
          lower.tail = FALSE, 
          xmin = 0, 
          xmax = max(20, farrar_stat + 5), 
          main = "Prueba Global de Multicolinealidad (Farrar-Glauber)",
          sub = paste("VC:", round(VC, 2), " | Estadístico Farrar:", round(farrar_stat, 2)))

#VERFICACIÓN DEL SUPUESTO DE HOMOCEDASTICIDAD

library(lmtest)
prueba_white <- bptest(modelo_estimado, 
                       ~ C + P + M + 
                         I(C^2) + I(P^2) + I(M^2) + 
                         C*P + C*M + M*P, 
                       data = ventas_empresa)
print(prueba_white)
## 
##  studentized Breusch-Pagan test
## 
## data:  modelo_estimado
## BP = 7.1227, df = 9, p-value = 0.6244

##Dado que el p-value=0.6244>0.05 entonces no se rechaza H0 ENTONCES hay evidencia de que la varianza de los residuos es homocedástica. Si requiere hacerlo por medio de V.C entonces daber los gl o df, luego revisar la tabla y aplicar la regla de descisión. RECHAZAR H0 SI: LMn> V.C—- BP=LMn

library(fastGraph)

# Extrae los datos de tu objeto 'prueba_white'
est_white <- prueba_white$statistic
gl_white <- prueba_white$parameter # Debería ser 9

shadeDist(xshade = est_white, 
          ddist = "dchisq", 
          parm1 = gl_white, 
          lower.tail = FALSE, 
          main = "Prueba de Heterocedasticidad de White",
          sub = paste("Estadístico:", round(est_white, 2), " | p-valor:", round(prueba_white$p.value, 4)))

##Supuestos de no autocorrelación #SUPUESTO DE AUTOCORRELACIÓN DE PRIMER ORDEN ##PRUEBA DE DURBIN WATSON

library(lmtest)
dwtest(modelo_estimado,alternative="two.sided",iterations = 1000)
## 
##  Durbin-Watson test
## 
## data:  modelo_estimado
## DW = 1.2996, p-value = 0.05074
## alternative hypothesis: true autocorrelation is not 0

###Dado que el p-valor (0.0507) es mayor al nivel de significancia (0.05), no existe evidencia estadística suficiente para rechazar la hipótesis nula (H_0). Por lo tanto, con un nivel de confianza del 95%, se concluye que no hay problemas de autocorrelación en el modelo

##Prueba con la libreria Car

library(car)
## Warning: package 'car' was built under R version 4.5.2
## Cargando paquete requerido: carData
## Warning: package 'carData' was built under R version 4.5.2
## 
## Adjuntando el paquete: 'car'
## The following object is masked from 'package:psych':
## 
##     logit
## The following object is masked from 'package:dplyr':
## 
##     recode
durbinWatsonTest(modelo_estimado,simulate= TRUE,reps=1000)
##  lag Autocorrelation D-W Statistic p-value
##    1       0.3013888      1.299572    0.06
##  Alternative hypothesis: rho != 0

##Dado que en los dos casos el p-valu>0.05 entonces se rechaza H0. ##Tomando en cuenta dL=1.101 y du=1.656 entonces nuetro estadistico cae en zona no conluyente, sin embargo, nuevo p-value nos hace rechazar h0.

#GRAFICO DE LA PRUEBA DURVIN WATSON

# Script para visualizar tu posición en la prueba DW
plot(0, 0, type="n", xlim=c(0,4), ylim=c(0,1), xlab="Estadístico DW", ylab="", 
     main="Zonas de Decisión Durbin-Watson", yaxt="n")

# Dibujar las zonas
rect(0, 0, 1.10, 1, col="red", border=NA)      # Rechazo (Positiva)
rect(1.10, 0, 1.65, 1, col="gray", border=NA)   # Indecisión
rect(1.65, 0, 2.35, 1, col="green", border=NA)  # No Autocorrelación
rect(2.35, 0, 2.90, 1, col="gray", border=NA)   # Indecisión
rect(2.90, 0, 4, 1, col="red", border=NA)       # Rechazo (Negativa)

# Marcar tu valor (1.29)
abline(v = 1.2996, col = "blue", lwd = 3, lty = 2)
text(1.2996, 0.5, "Tu DW = 1.29", pos = 4, col="blue", font=2)

#P-VALUE

library(fastGraph)

# Parámetros basados en tu resultado
# El p-valor es 0.0507. 
# En una distribución normal estándar, esto corresponde a un valor Z de aprox 1.64

shadeDist(xshade = 1.64, 
          ddist = "dnorm", 
          parm1 = 0, 
          parm2 = 1, 
          lower.tail = FALSE, 
          main = "Representación del p-valor (Durbin-Watson)",
          sub = "p-valor = 0.0507 | Decisión: No se rechaza H0")

#Autocorrelación de orden superior ##Prueba del Multiplicador de Lagrange [Breusch-Godfrey] ##usando la libreria lmtest

library(lmtest)
bgtest(modelo_estimado,order = 2)
## 
##  Breusch-Godfrey test for serial correlation of order up to 2
## 
## data:  modelo_estimado
## LM test = 3.8409, df = 2, p-value = 0.1465

#GRAFICO DE PRUEBA DE AUTOCORRELACIÓN ORDEN 2

library(fastGraph)

# Usamos tus resultados: LM = 3.84 y df = 2
shadeDist(xshade = 3.8409, 
          ddist = "dchisq", 
          parm1 = 2, 
          lower.tail = FALSE, 
          main = "Prueba de Breusch-Godfrey (Orden 2)",
          sub = paste("Estadístico LM:", 3.84, "| p-valor:", 0.1465))

#Dado que el p-value>0.05 entonces puede concluirse que, los residuos del modelo no siguen autocorrelación de orden 2

##orden 1

library(lmtest)
bgtest(modelo_estimado,order = 1)
## 
##  Breusch-Godfrey test for serial correlation of order up to 1
## 
## data:  modelo_estimado
## LM test = 2.5963, df = 1, p-value = 0.1071

#Dado que el p-value>0.05 entonces puede concluirse que, los residuos del modelo no siguen autocorrelación de orden 1