###Usa la función “opts_chunk” de la biblioteca “knitr” para establecer opciones globales para los bloques de código en R Markdown knitr::opts_chunk$set(echo = TRUE)

Pruebas de Normalidad

library(wooldridge) #Esta línea carga la biblioteca wooldridge, que contiene conjuntos de datos utilizados en el libro "Introductory Econometrics: A Modern Approach" de Jeffrey M. Wooldridge.
data(hprice1) #Esta línea carga el conjunto de datos hprice1en el entorno de trabajo. Este conjunto de datos contiene información sobre casas vendidas en un suburbio de Chicago en 1987, incluyendo el precio de venta, el número de habitaciones, el tamaño del lote y la edad de la casa.
head(force(hprice1),n=5) #Esta línea imprime las primeras cinco filas del conjunto de datos hprice1. La función forcese utiliza para forzar la carga del conjunto de datos si aún no se ha cargado en el entorno de trabajo. La función headse utiliza para seleccionar las primeras cinco filas del conjunto de datos y mostrarlas en la consola.
##   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
#mostrar las primeras 5 observaciones

1. estime el siguiente modelo,

price = ˆα + ˆα1(lotsize) + ˆα2(sqrft) + ˆα3(bdrms) + E

library(stargazer) #La primera línea carga la librería "stargazer" en la sesión de R:
modelo_estimado<-lm(price ~ lotsize + sqrft + bdrms,data = hprice1) #se está ajustando un modelo que predice la variable priceen función de las variables lotsize, sqrfty bdrms. Los datos que se están utilizando para ajustar el modelo provienen del conjunto de datos hprice1.
stargazer(modelo_estimado,title = "Modelo para Ejemplo", type = "text")
## 
## Modelo para Ejemplo
## ===============================================
##                         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

Ajuste de los residuos a la Distribución Normal

library(fitdistrplus) #Esta línea carga la biblioteca fitdistrplus, que proporciona funciones para ajustar distribuciones de probabilidad a datos.
fit_normal<-fitdist(data = modelo_estimado$residuals,distr = "norm") #En esta línea, se ajusta una distribución normal a los residuos del modelo estimado. La función fitdistde fitdistrplusrealizar el ajuste y devuelve un objeto fitdistque contiene los resultados.
plot(fit_normal) #Esta línea traza el ajuste de la distribución normal realizada en la línea anterior. La función plotse usa para visualizar el objeto fitdisty sus resultados.

summary(fit_normal) #Esta línea imprime un resumen de los resultados del ajuste de distribución en la consola. El resumen incluye información como los medios, la desviación estándar y la probabilidad de que los residuos sigan una distribución normal.
## Fitting of the distribution ' norm ' by maximum likelihood 
## Parameters : 
##          estimate Std. Error
## mean 9.992007e-16   6.231624
## sd   5.845781e+01   4.406424
## Loglikelihood:  -482.8775   AIC:  969.7549   BIC:  974.7096 
## Correlation matrix:
##      mean sd
## mean    1  0
## sd      0  1

2. Verique el supuesto de normalidad, a través de:

  1. La prueba JB
library(tseries) # Carga la librería tseries, que proporciona funciones para el análisis de series temporales.
salida_jb<-jarque.bera.test(modelo_estimado$residuals) #realiza la prueba de Jarque-Bera sobre los residuos del modelo estimado y almacena los resultados en la variable salida_jb. La prueba de Jarque-Bera es una prueba de normalidad que utiliza la asimetría y la curvatura de una distribución para determinar si la distribución es normal o no.
salida_jb #simplemente imprime los resultados de la prueba.
## 
##  Jarque Bera Test
## 
## data:  modelo_estimado$residuals
## X-squared = 32.278, df = 2, p-value = 9.794e-08
library(fastGraph)
alpha_sig<-0.05 #define el nivel de significancia que se ajusta en la prueba. En este caso, se utiliza un nivel de significancia de 0.05, lo que significa que se rechazará la hipótesis nula si la probabilidad de obtener un estadístico de prueba tan extremo o más extremo que el valor observado es menor que 0.05.
jb<-salida_jb$statistic #almacena el valor del estadístico de prueba de Jarque-Bera en la variable jb.
gl<-salida_jb$parameter #almacena el número de grados de libertad de la distribución chi-cuadrado asociado a la prueba de Jarque-Bera en la variable gl.
VC<-qchisq(1- alpha_sig,gl,lower.tail = TRUE) #calcula el valor crítico para la distribución chi-cuadrado correspondiente a un nivel de significancia de 0.05 y el número de grados de libertad obtenidos en la prueba de Jarque-Bera. Este valor crítico se almacena en la variable VC.
shadeDist(jb,ddist = "dchisq",
          parm1 = gl,
          lower.tail = FALSE, xmin = 0,
          sub=paste("VC",round(VC,2)," ","jb:",round(jb,2))) #utiliza la función shadeDistde la librería "fastGraph" para graficar la distribución chi-cuadrado con el número de grados de libertad obtenidos en la prueba de Jarque-Bera y sombrear el área de la distribución correspondiente al valor del estadístico de prueba observado . Además, la línea también agrega un subtítulo al gráfico que indica el valor crítico calculado y el valor del estadístico de prueba observado. En resumen, este gráfico ayuda a interpretar visualmente el resultado de la prueba de Jarque-Bera y determinar si los residuos del modelo siguen una distribución normal.

Usando notmtest (descatalogada)

library(nortest) #Esta línea carga la biblioteca nortest, que proporciona funciones para realizar pruebas de normalidad.
jarque.bera.test(modelo_estimado$residuals) #Esta línea realiza una prueba de Jarque-Bera en los residuos del modelo estimado. La prueba de Jarque-Bera es una prueba de bondad de ajuste que se utiliza para determinar si una muestra de datos tiene una distribución normal. La función jarque.bera.testde nortestrealizar la prueba y devuelve un objeto htestque contiene los resultados de la prueba, incluyendo el estadístico de prueba y el valor p.
## 
##  Jarque Bera Test
## 
## data:  modelo_estimado$residuals
## X-squared = 32.278, df = 2, p-value = 9.794e-08

##b) La prueba KS

library(dplyr) # Cargamos la librería dplyr para trabajar con los datos de manera más eficiente
residuos<-modelo_estimado$residuals # Guardamos los residuos del modelo estimado en una variable llamada "residuos"
residuos %>% # Convertimos los residuos en un tibble
  as_tibble() %>% #Convierte el objeto en un tibble (tabla) para que pueda ser manipulado por la biblioteca "dplyr"
  mutate(posicion=row_number()) %>% # Agregamos una columna llamada "posicion" que indica la posición de cada valor en el tibble
  arrange(value) %>% # Ordenamos el tibble en orden ascendente de valores
  mutate(dist1=row_number()/n()) %>% # Agregamos una columna llamada "dist1" que indica la distancia relativa entre la posición de cada valor y la distribución teórica
  mutate(dist2=(row_number()-1)/n()) %>% # Agregamos una columna llamada "dist2" que indica la distancia relativa entre la posición de cada valor menos uno y la distribución teórica
  mutate(zi=as.vector(scale(value,center=TRUE))) %>% # Agregamos una columna llamada "zi" que indica los residuos estandarizados
  mutate(pi=pnorm(zi,lower.tail = TRUE)) %>% # Agregamos una columna llamada "pi" que indica la probabilidad acumulada de los residuos estandarizados en la distribución normal
  mutate(dif1=abs(dist1-pi)) %>% # Agregamos una columna llamada "dif1" que indica la diferencia absoluta entre la distribución teórica y la posición de cada valor
  mutate(dif2=abs(dist2-pi)) %>% # Agregamos una columna llamada "dif2" que indica la diferencia absoluta entre la distribución teórica y la posición de cada valor menos uno
  rename(residuales=value) -> tabla_KS# Renombramos la columna "value" a "residuales"


#forma
library(gt)
library(gtExtras) #Carga las bibliotecas "gt" y "gtExtras", que se utilizan para crear tablas interactivas en R.

tabla_KS %>%
  gt() %>% #Crea una tabla interactiva de la tabla "tabla_KS" utilizando la función "gt" de la biblioteca "gt". El operador "%>%" se utiliza para pasar el objeto "tabla_KS" a la siguiente función.
  tab_header("Tabla para calcular el Estadistico KS") %>%  #Agrega un encabezado a la tabla.
  tab_source_note(source_note = "Fuente: Elaboración propia") %>%  #Agrega una nota de fuente a la tabla.
  tab_style(style = list(
      cell_fill(color = "#82E0AA"),  
      cell_text(style = "italic")), 
    locations = cells_body( 
      columns = dif1,  
      rows = dif1==max(dif1) #Aplica un estilo a las celdas que tienen la columna "dif1" y la fila correspondiente al valor máximo de "dif1". El estilo aplicado es un color de fondo verde claro ("#82E0AA") y texto en cursiva. 
    )) %>%
   tab_style(  
    style = list(
      cell_fill(color = "#CB4335"),  
      cell_text(style = "italic") 
      ),
    locations = cells_body(  
      columns = dif2, 
      rows = dif2==max(dif2)))#Aplica otro estilo a las celdas que tienen la columna "dif2" y la fila correspondiente al valor máximo de "dif2". El estilo aplicado es un color de fondo rojo oscuro ("#CB4335") y texto en cursiva.
Tabla para calcular el Estadistico KS
residuales posicion dist1 dist2 zi pi dif1 dif2
-120.026447 81 0.01136364 0.00000000 -2.041515459 0.02059981 0.0092361731 0.0205998094
-115.508697 77 0.02272727 0.01136364 -1.964673586 0.02472601 0.0019987418 0.0133623781
-107.080889 24 0.03409091 0.02272727 -1.821326006 0.03427866 0.0001877487 0.0115513850
-91.243980 48 0.04545455 0.03409091 -1.551957925 0.06033615 0.0148816002 0.0262452366
-85.461169 12 0.05681818 0.04545455 -1.453598781 0.07302879 0.0162106057 0.0275742421
-77.172687 32 0.06818182 0.05681818 -1.312620980 0.09465535 0.0264735301 0.0378371665
-74.702719 54 0.07954545 0.06818182 -1.270609602 0.10193378 0.0223883300 0.0337519664
-65.502849 39 0.09090909 0.07954545 -1.114130117 0.13261169 0.0417025941 0.0530662305
-63.699108 69 0.10227273 0.09090909 -1.083450505 0.13930425 0.0370315271 0.0483951634
-62.566594 83 0.11363636 0.10227273 -1.064187703 0.14362184 0.0299854747 0.0413491110
-59.845223 36 0.12500000 0.11363636 -1.017900230 0.15436269 0.0293626861 0.0407263225
-54.466158 13 0.13636364 0.12500000 -0.926408352 0.17711690 0.0407532663 0.0521169027
-54.300415 14 0.14772727 0.13636364 -0.923589260 0.17785010 0.0301228311 0.0414864675
-52.129801 15 0.15909091 0.14772727 -0.886669532 0.18762842 0.0285375141 0.0399011505
-51.441108 17 0.17045455 0.15909091 -0.874955638 0.19079902 0.0203444766 0.0317081129
-48.704980 47 0.18181818 0.17045455 -0.828417174 0.20371714 0.0218989601 0.0332625965
-48.350295 29 0.19318182 0.18181818 -0.822384375 0.20542908 0.0122472664 0.0236109028
-47.855859 11 0.20454545 0.19318182 -0.813974573 0.20782976 0.0032843043 0.0146479407
-45.639765 1 0.21590909 0.20454545 -0.776281294 0.21879146 0.0028823668 0.0142460032
-43.142550 9 0.22727273 0.21590909 -0.733806463 0.23153335 0.0042606233 0.0156242596
-41.749618 57 0.23863636 0.22727273 -0.710114247 0.23881665 0.0001802823 0.0115439187
-40.869022 27 0.25000000 0.23863636 -0.695136302 0.24348494 0.0065150566 0.0048485798
-37.749811 34 0.26136364 0.25000000 -0.642082009 0.26040997 0.0009536682 0.0104099682
-36.663785 71 0.27272727 0.26136364 -0.623609925 0.26644190 0.0062853771 0.0050782592
-36.646568 79 0.28409091 0.27272727 -0.623317083 0.26653809 0.0175528221 0.0061891857
-33.801248 37 0.29545455 0.28409091 -0.574921384 0.28267223 0.0127823120 0.0014186757
-29.766931 16 0.30681818 0.29545455 -0.506302171 0.30632227 0.0004959124 0.0108677240
-26.696234 22 0.31818182 0.30681818 -0.454073044 0.32488813 0.0067063089 0.0180699452
-24.271531 23 0.32954545 0.31818182 -0.412831567 0.33986501 0.0103195566 0.0216831929
-23.651448 86 0.34090909 0.32954545 -0.402284648 0.34373728 0.0028281851 0.0141918214
-19.683427 88 0.35227273 0.34090909 -0.334793052 0.36889060 0.0166178738 0.0279815102
-17.817835 10 0.36363636 0.35227273 -0.303061413 0.38092153 0.0172851663 0.0286488027
-16.762094 60 0.37500000 0.36363636 -0.285104441 0.38778206 0.0127820638 0.0241457002
-16.596960 21 0.38636364 0.37500000 -0.282295711 0.38885839 0.0024947507 0.0138583870
-16.271207 58 0.39772727 0.38636364 -0.276755010 0.39098411 0.0067431583 0.0046204781
-13.815798 56 0.40909091 0.39772727 -0.234991254 0.40710776 0.0019831485 0.0093804879
-13.462160 75 0.42045455 0.40909091 -0.228976273 0.40944368 0.0110108666 0.0003527698
-12.081520 4 0.43181818 0.42045455 -0.205493119 0.41859344 0.0132247451 0.0018611087
-11.629207 51 0.44318182 0.43181818 -0.197799788 0.42160086 0.0215809622 0.0102173258
-11.312669 74 0.45454545 0.44318182 -0.192415834 0.42370825 0.0308372092 0.0194735728
-8.236558 3 0.46590909 0.45454545 -0.140094626 0.44429261 0.0216164775 0.0102528411
-7.662789 70 0.47727273 0.46590909 -0.130335452 0.44815052 0.0291222111 0.0177585748
-6.752801 67 0.48863636 0.47727273 -0.114857588 0.45427900 0.0343573625 0.0229937262
-6.707262 31 0.50000000 0.48863636 -0.114083016 0.45458599 0.0454140074 0.0340503710
-6.402439 85 0.51136364 0.50000000 -0.108898313 0.45664157 0.0547220642 0.0433584278
-5.446904 82 0.52272727 0.51136364 -0.092645733 0.46309251 0.0596347676 0.0482711313
-3.537785 43 0.53409091 0.52272727 -0.060173762 0.47600862 0.0580822876 0.0467186512
-2.824941 61 0.54545455 0.53409091 -0.048049090 0.48083856 0.0646159857 0.0532523493
-2.745208 68 0.55681818 0.54545455 -0.046692922 0.48137899 0.0754391961 0.0640755598
-0.195089 65 0.56818182 0.55681818 -0.003318245 0.49867621 0.0695056040 0.0581419676
1.399296 55 0.57954545 0.56818182 0.023800450 0.50949411 0.0700513452 0.0586877088
5.363331 26 0.59090909 0.57954545 0.091224254 0.53634280 0.0545662924 0.0432026561
6.700640 53 0.60227273 0.59090909 0.113970383 0.54536936 0.0569033628 0.0455397265
7.386314 80 0.61363636 0.60227273 0.125632935 0.54998875 0.0636476093 0.0522839730
9.099900 41 0.62500000 0.61363636 0.154779103 0.56150227 0.0634977329 0.0521340965
12.433611 46 0.63636364 0.62500000 0.211481796 0.58374433 0.0526193043 0.0412556680
16.718018 62 0.64772727 0.63636364 0.284354766 0.61193074 0.0357965328 0.0244328965
18.093192 5 0.65909091 0.64772727 0.307744934 0.62086179 0.0382291219 0.0268654856
18.801816 38 0.67045455 0.65909091 0.319797835 0.62543921 0.0450153400 0.0336517036
19.168108 33 0.68181818 0.67045455 0.326028052 0.62779843 0.0540197476 0.0426561112
19.219211 72 0.69318182 0.68181818 0.326897255 0.62812720 0.0650546167 0.0536909803
20.334434 59 0.70454545 0.69318182 0.345865960 0.63527827 0.0692671805 0.0579035442
24.909926 78 0.71590909 0.70454545 0.423689939 0.66410402 0.0518050676 0.0404414312
26.236229 40 0.72727273 0.71590909 0.446248874 0.67229126 0.0549814685 0.0436178321
30.924022 25 0.73863636 0.72727273 0.525982978 0.70054998 0.0380863808 0.0267227444
32.253952 45 0.75000000 0.73863636 0.548603608 0.70836125 0.0416387548 0.0302751184
32.529367 49 0.76136364 0.75000000 0.553288104 0.70996693 0.0513967091 0.0400330727
32.675968 18 0.77272727 0.76136364 0.555781630 0.71081993 0.0619073452 0.0505437088
33.275839 20 0.78409091 0.77272727 0.565984762 0.71429793 0.0697929786 0.0584293423
36.031430 52 0.79545455 0.78409091 0.612854281 0.73001365 0.0654408934 0.0540772571
37.147186 84 0.80681818 0.79545455 0.631832029 0.73625168 0.0705665028 0.0592028664
40.320875 7 0.81818182 0.80681818 0.685812928 0.75358446 0.0645973596 0.0532337232
44.334467 30 0.82954545 0.81818182 0.754079634 0.77459930 0.0549461574 0.0435825211
46.907165 28 0.84090909 0.82954545 0.797838357 0.78751785 0.0533912405 0.0420276041
54.418366 87 0.85227273 0.84090909 0.925595465 0.82267187 0.0296008528 0.0182372164
55.091131 35 0.86363636 0.85227273 0.937038450 0.82563061 0.0380057535 0.0266421172
55.470305 44 0.87500000 0.86363636 0.943487765 0.82728426 0.0477157353 0.0363520989
62.939597 6 0.88636364 0.87500000 1.070532059 0.85781006 0.0285535797 0.0171899433
66.478628 50 0.89772727 0.88636364 1.130727018 0.87091500 0.0268122757 0.0154486394
67.426518 63 0.90909091 0.89772727 1.146849569 0.87427810 0.0348128083 0.0234491719
67.603959 19 0.92045455 0.90909091 1.149867648 0.87490081 0.0455537393 0.0341901029
69.707122 64 0.93181818 0.92045455 1.185640095 0.88211777 0.0497004123 0.0383367759
69.843246 8 0.94318182 0.93181818 1.187955411 0.88257451 0.0606073068 0.0492436705
74.848732 2 0.95454545 0.94318182 1.273093116 0.89850750 0.0560379553 0.0446743189
112.729191 66 0.96590909 0.95454545 1.917397313 0.97240626 0.0064971714 0.0178608078
163.795081 73 0.97727273 0.96590909 2.785970904 0.99733162 0.0200588896 0.0314225260
198.660139 42 0.98863636 0.97727273 3.378986513 0.99963623 0.0109998685 0.0223635048
209.375830 76 1.00000000 0.98863636 3.561248407 0.99981545 0.0001845478 0.0111790885
Fuente: Elaboración propia
###Cálculo del estadístico D:

D<-max(max(tabla_KS$dif1),max(tabla_KS$dif2))
print(D)
## [1] 0.0754392

Valor crítico de la tabla de Lilliefors

n=88 α=0.05

n>50 (0,875897/√n)=0,0933709

Conclusión:

En este caso dado que 0.0754392 < 0,0933709 No se rechaza la Hipótesis Nula: ϵ∼N(0,σ2) , por lo que los residuos siguen una distribución normal.

Usando nortest

library(nortest)
prueba_KS<-lillie.test(modelo_estimado$residuals) #En esta línea, se realiza la prueba de Lilliefors para comprobar si los residuos del modelo estimado siguen una distribución normal. La función lillie.testde la biblioteca nortestrealiza la prueba y devuelve un objeto htestque contiene los resultados de la prueba, como el estadístico de prueba y el valor p.
print(prueba_KS) #Esta línea imprime los resultados de la prueba de Lilliefors en la consola. En particular, la salida obtuvo el valor del estadístico de prueba y el valor p.
## 
##  Lilliefors (Kolmogorov-Smirnov) normality test
## 
## data:  modelo_estimado$residuals
## D = 0.075439, p-value = 0.2496
p.value<-prueba_KS$p.value #Esta línea extrae el valor p del objeto htestgenerado por la prueba de Lilliefors y lo almacena en la variable p.value. El valor p es una medida de la evidencia en contra de la hipótesis nula, que en este caso sería que los residuos siguen una distribución normal. Si el valor p es menor que el nivel de significancia elegido, se rechazaría la hipótesis nula y se concluiría que los residuos no siguen una distribución normal.

En este caso dado que 0.2496 > 0.05 No se rechaza la Hipótesis Nula: ϵ∼N(0,σ2), por lo que los residuos siguen una distribución normal.

###c) La prueba SW

library(dplyr)
library(gt) # La biblioteca dplyrproporciona funciones para manipular y transformar datos, mientras que gtes una biblioteca para generar tablas elegantes y bien formateadas.
residuos<-modelo_estimado$residuals #Esta línea extrae los residuos del modelo estimado y los almacena en la variable residuos.

residuos %>%  
  as_tibble() %>%
  rename(residuales=value) %>%
  arrange(residuales) %>%
  mutate(pi=(row_number()-0.375)/(n()+0.25)) %>%
  mutate(mi=qnorm(pi,lower.tail = TRUE)) %>% 
  mutate(ai=0)->tabla_SW #En esta sección de código se realiza un cálculo de los valores necesarios para la prueba de normalidad de Shapiro-Wilk. Primero, los residuos se definen en un tibble utilizando as_tibble(). Luego, se renombra la columna de residuos como "residuales" utilizando rename(). Después, los residuos se ordenan en orden creciente arrange(). Luego, se calculan los valores pi, mi, y ainecesarios para la prueba de Shapiro-Wilk de normalidad. Estos cálculos se realizan utilizando la función mutate(). Finalmente, la tabla quedó asignada a la variable tabla_SW.

m<-sum(tabla_SW$mi^2) #Esta línea calcula la suma de los cuadrados de los valores mide la tabla tabla_SWy lo almacena en la variable m.
n<-nrow(hprice1) #Esta línea calcula el número de filas de la base de datos hprice1(que contiene los datos del modelo) y lo almacena en la variable n.
theta<-1/sqrt(n) #Esta línea calcula el valor de thetaque se reafirma en los cálculos posteriores y lo almacena en la variable theta.


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)
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) #Estas dos líneas calculan y asignan valores a los elementos aien las posiciones ny n-1de la tabla tabla_SW. Los cálculos se basan en los valores de theta, mi, y my en constantes específicas del método de Shapiro-Wilk.
tabla_SW$ai[1]<- -tabla_SW$ai[n]
tabla_SW$ai[2]<- -tabla_SW$ai[n-1] #Estas dos líneas calculan y asignan valores a los elementos aien las posiciones 1 y 2 de la tabla tabla_SW. Los cálculos se basan en los valores previamente asignados a los elementos aien las posiciones ny n-1.

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) #Esta línea calcula el valor de omegautilizar los valores previamente calculados de m, mi, y ai.
tabla_SW$ai[3:(n-2)]<-tabla_SW$mi[3:(n-2)]/sqrt(omega) #Esta línea calcula y asigna valores a los elementos aien las posiciones 3 a n-2de la tabla tabla_SW. Los cálculos se basan en los valores previamente calculados de miy omega.

tabla_SW %>% 
  mutate(ai_ui=ai*residuales,ui2=residuales^2) ->tabla_SW
tabla_SW %>% #se crea una nueva columna en la tabla tabla_SWllamada "ai_ui", que corresponde al producto entre la columna "ai" y "residuales". También se crea una columna llamada "ui2", que corresponde al cuadrado de los residuos.
  gt() %>% tab_header("Tabla para calcular el Estadistico W") %>% #se genera una tabla utilizando la función gt(), que muestra las columnas "residuales", "pi", "mi", "ai_ui" y "ui2". Esta tabla está encabezada por el texto "Tabla para calcular el Estadistico W" usando la función tab_header(). 
  tab_source_note(source_note = "Fuente: Elaboración propia") # se agrega una nota de fuente con el texto "Fuente: Elaboración propia" utilizando la función tab_source_note().
Tabla para calcular el Estadistico W
residuales pi mi ai ai_ui ui2
-120.026447 0.007082153 -2.45306927 -0.286093929 34.338837782 1.440635e+04
-115.508697 0.018413598 -2.08767462 -0.226331231 26.143225495 1.334226e+04
-107.080889 0.029745042 -1.88455395 -0.201511408 21.578020632 1.146632e+04
-91.243980 0.041076487 -1.73832835 -0.185875811 16.960048752 8.325464e+03
-85.461169 0.052407932 -1.62194155 -0.173430814 14.821600075 7.303611e+03
-77.172687 0.063739377 -1.52411994 -0.162970954 12.576906330 5.955624e+03
-74.702719 0.075070822 -1.43903134 -0.153872609 11.494702279 5.580496e+03
-65.502849 0.086402266 -1.36324747 -0.145769197 9.548297773 4.290623e+03
-63.699108 0.097733711 -1.29457343 -0.138426027 8.817614500 4.057576e+03
-62.566594 0.109065156 -1.23151500 -0.131683320 8.238976839 3.914579e+03
-59.845223 0.120396601 -1.17300649 -0.125427129 7.506214499 3.581451e+03
-54.466158 0.131728045 -1.11825971 -0.119573169 6.512691096 2.966562e+03
-54.300415 0.143059490 -1.06667420 -0.114057239 6.193355472 2.948535e+03
-52.129801 0.154390935 -1.01778137 -0.108829231 5.673246083 2.717516e+03
-51.441108 0.165722380 -0.97120790 -0.103849228 5.342119306 2.646188e+03
-48.704980 0.177053824 -0.92665123 -0.099084876 4.825926905 2.372175e+03
-48.350295 0.188385269 -0.88386232 -0.094509548 4.569564512 2.337751e+03
-47.855859 0.199716714 -0.84263354 -0.090101040 4.311862673 2.290183e+03
-45.639765 0.211048159 -0.80278966 -0.085840618 3.917745629 2.082988e+03
-43.142550 0.222379603 -0.76418130 -0.081712307 3.525277277 1.861280e+03
-41.749618 0.233711048 -0.72667986 -0.077702356 3.244043648 1.743031e+03
-40.869022 0.245042493 -0.69017366 -0.073798824 3.016085791 1.670277e+03
-37.749811 0.256373938 -0.65456498 -0.069991263 2.642156946 1.425048e+03
-36.663785 0.267705382 -0.61976766 -0.066270458 2.429725818 1.344233e+03
-36.646568 0.279036827 -0.58570518 -0.062628228 2.295109622 1.342971e+03
-33.801248 0.290368272 -0.55230918 -0.059057264 1.996209250 1.142524e+03
-29.766931 0.301699717 -0.51951819 -0.055550992 1.653582575 8.860702e+02
-26.696234 0.313031161 -0.48727661 -0.052103467 1.390966354 7.126889e+02
-24.271531 0.324362606 -0.45553386 -0.048709282 1.182248861 5.891072e+02
-23.651448 0.335694051 -0.42424369 -0.045363489 1.072912217 5.593910e+02
-19.683427 0.347025496 -0.39336354 -0.042061540 0.827915257 3.874373e+02
-17.817835 0.358356941 -0.36285409 -0.038799229 0.691318234 3.174752e+02
-16.762094 0.369688385 -0.33267878 -0.035572645 0.596272007 2.809678e+02
-16.596960 0.381019830 -0.30280344 -0.032378138 0.537378676 2.754591e+02
-16.271207 0.392351275 -0.27319601 -0.029212277 0.475319006 2.647522e+02
-13.815798 0.403682720 -0.24382619 -0.026071824 0.360203050 1.908763e+02
-13.462160 0.415014164 -0.21466524 -0.022953704 0.309006447 1.812298e+02
-12.081520 0.426345609 -0.18568573 -0.019854987 0.239878409 1.459631e+02
-11.629207 0.437677054 -0.15686137 -0.016772858 0.195055032 1.352385e+02
-11.312669 0.449008499 -0.12816677 -0.013704604 0.155035654 1.279765e+02
-8.236558 0.460339943 -0.09957734 -0.010647596 0.087699542 6.784089e+01
-7.662789 0.471671388 -0.07106908 -0.007599268 0.058231584 5.871833e+01
-6.752801 0.483002833 -0.04261848 -0.004557105 0.030773222 4.560033e+01
-6.707262 0.494334278 -0.01420234 -0.001518626 0.010185824 4.498736e+01
-6.402439 0.505665722 0.01420234 0.001518626 -0.009722911 4.099122e+01
-5.446904 0.516997167 0.04261848 0.004557105 -0.024822110 2.966876e+01
-3.537785 0.528328612 0.07106908 0.007599268 -0.026884576 1.251592e+01
-2.824941 0.539660057 0.09957734 0.010647596 -0.030078835 7.980294e+00
-2.745208 0.550991501 0.12816677 0.013704604 -0.037621996 7.536170e+00
-0.195089 0.562322946 0.15686137 0.016772858 -0.003272200 3.805971e-02
1.399296 0.573654391 0.18568573 0.019854987 0.027782994 1.958028e+00
5.363331 0.584985836 0.21466524 0.022953704 0.123108313 2.876532e+01
6.700640 0.596317280 0.24382619 0.026071824 0.174697904 4.489858e+01
7.386314 0.607648725 0.27319601 0.029212277 0.215771059 5.455764e+01
9.099900 0.618980170 0.30280344 0.032378138 0.294637808 8.280817e+01
12.433611 0.630311615 0.33267878 0.035572645 0.442296424 1.545947e+02
16.718018 0.641643059 0.36285409 0.038799229 0.648646203 2.794921e+02
18.093192 0.652974504 0.39336354 0.042061540 0.761027520 3.273636e+02
18.801816 0.664305949 0.42424369 0.045363489 0.852915978 3.535083e+02
19.168108 0.675637394 0.45553386 0.048709282 0.933664777 3.674164e+02
19.219211 0.686968839 0.48727661 0.052103467 1.001387528 3.693781e+02
20.334434 0.698300283 0.51951819 0.055550992 1.129598008 4.134892e+02
24.909926 0.709631728 0.55230918 0.059057264 1.471112049 6.205044e+02
26.236229 0.720963173 0.58570518 0.062628228 1.643128534 6.883397e+02
30.924022 0.732294618 0.61976766 0.066270458 2.049349072 9.562951e+02
32.253952 0.743626062 0.65456498 0.069991263 2.257494854 1.040317e+03
32.529367 0.754957507 0.69017366 0.073798824 2.400629035 1.058160e+03
32.675968 0.766288952 0.72667986 0.077702356 2.538999708 1.067719e+03
33.275839 0.777620397 0.76418130 0.081712307 2.719045583 1.107281e+03
36.031430 0.788951841 0.80278966 0.085840618 3.092960242 1.298264e+03
37.147186 0.800283286 0.84263354 0.090101040 3.347000059 1.379913e+03
40.320875 0.811614731 0.88386232 0.094509548 3.810707636 1.625773e+03
44.334467 0.822946176 0.92665123 0.099084876 4.392875123 1.965545e+03
46.907165 0.834277620 0.97120790 0.103849228 4.871272904 2.200282e+03
54.418366 0.845609065 1.01778137 0.108829231 5.922308882 2.961359e+03
55.091131 0.856940510 1.06667420 0.114057239 6.283542333 3.035033e+03
55.470305 0.868271955 1.11825971 0.119573169 6.632760113 3.076955e+03
62.939597 0.879603399 1.17300649 0.125427129 7.894332885 3.961393e+03
66.478628 0.890934844 1.23151500 0.131683320 8.754126443 4.419408e+03
67.426518 0.902266289 1.29457343 0.138426027 9.333585010 4.546335e+03
67.603959 0.913597734 1.36324747 0.145769197 9.854574914 4.570295e+03
69.707122 0.924929178 1.43903134 0.153872609 10.726016772 4.859083e+03
69.843246 0.936260623 1.52411994 0.162970954 11.382420482 4.878079e+03
74.848732 0.947592068 1.62194155 0.173430814 12.981076532 5.602333e+03
112.729191 0.958923513 1.73832835 0.185875811 20.953629849 1.270787e+04
163.795081 0.970254958 1.88455395 0.201511408 33.006577315 2.682883e+04
198.660139 0.981586402 2.08767462 0.226331231 44.962993843 3.946585e+04
209.375830 0.992917847 2.45306927 0.286093929 59.901153719 4.383824e+04
Fuente: Elaboración propia
W<-(sum(tabla_SW$ai_ui)^2)/sum(tabla_SW$ui2) # se calcula el estadístico de Shapiro-Wilk utilizando la fórmula W = (sum(ai_ui)^2)/sum(ui2), que se almacena en la variable W.
print(W) #se muestra el valor del estadistico utilizando la funcion print().
## [1] 0.9413208

Cálculo del 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) #se calculan los valores de mu y sigma necesarios para normalizar el estadístico. Los valores de mu y sigma se calculan utilizando las ecuaciones obtenidas por Royston (1982) para muestras de tamaño n >= 20.
Wn<-(log(1-W)-mu)/sigma #Luego, se calcula el valor estandarizado del estadístico de Shapiro-Wilk utilizando la fórmula Wn = (log(1-W)-mu)/sigma, que se almacena en la variable Wn.
print(Wn)
## [1] 3.241867
p.value.sw<-pnorm(Wn,lower.tail = FALSE) #se calcula el valor-p asociado al estadístico normalizado utilizando la función de distribución acumulativa de la normal estándar pnorm(), con el argumento lower.tail=FALSEpara obtener el valor-p de la cola superior. El valor-p se almacena en la variable p.value.sw
print(p.value.sw) #El valor-p se almacena en la variable p.value.swy se muestra utilizando la función print().
## [1] 0.0005937472
library(fastGraph) #llama a la función shadeDist()del paquete fastGraph, que se utiliza para sombrear una distribución de probabilidad a partir de un valor crítico.
shadeDist(Wn,ddist = "dnorm",lower.tail = FALSE) #El argumento lower.tail = FALSEindica que se quiere sombrear el area de la cola superior. Si se quisiera sombrear la cola inferior, se usaría lower.tail = TRUE.

En este caso dado que 0.645292 > 0.05 No se rechaza la Hipótesis Nula: ϵ∼N(0,σ2), por lo que los residuos siguen una distribución normal.

Usando la librería stats (precargada al iniciar R)

salida_SW<-shapiro.test(modelo_estimado$residuals) #llama a la función shapiro.test()de R, que se utiliza para realizar la prueba de normalidad de Shapiro-Wilk en una muestra de datos. En este caso, se está aplicando esta prueba a los residuos del modelo estimado.
print(salida_SW) #La salida que se muestra al imprimir el resultado de la función estadística de prueba de Shapiro-Wilk ( W) y su valor-p ( p-value), así como un mensaje que indica si se rechaza o no la hipótesis nula de normalidad.
## 
##  Shapiro-Wilk normality test
## 
## data:  modelo_estimado$residuals
## W = 0.94132, p-value = 0.0005937

Si el valor-p es menor que el nivel de significancia (generalmente 0.05), se rechaza la hipótesis nula de normalidad y se concluye que los residuos no siguen una distribución normal. Si el valor-p es mayor que el nivel de significancia, se acepta la hipótesis nula de normalidad y se concluye que los residuos se distribuyen normalmente.

salida_Wn<-qnorm(salida_SW$p.value,lower.tail = FALSE)
print(salida_Wn)
## [1] 3.241867