Base de datos.

library(wooldridge) #carga la librería "wooldridge" que contiene conjuntos de datos para enseñar econometría.
data(hprice1) #carga el conjunto de datos "hprice1" en la memoria de R.
head(force(hprice1),n=5) #fuerza la carga del conjunto de datos "hprice1" y muestra las primeras cinco filas de la base de datos. La función force() se utiliza aquí para evitar una posible demora en la carga de datos y para asegurarse de que los datos se han cargado correctamente. head() es una función que muestra las primeras filas de un objeto, en este caso de "hprice1" con un argumento n=5 que indica que se deben mostrar solo las primeras cinco filas.
price assess bdrms lotsize sqrft colonial lprice lassess llotsize lsqrft
300 349.1 4 6126 2438 1 5.703783 5.855359 8.720297 7.798934
370 351.5 3 9903 2076 1 5.913503 5.862210 9.200593 7.638198
191 217.7 3 5200 1374 0 5.252274 5.383118 8.556414 7.225481
195 231.8 3 4600 1448 1 5.273000 5.445875 8.433811 7.277938
373 319.1 4 6095 2514 1 5.921578 5.765504 8.715224 7.829630

1. Estimación del modelo.

library(stargazer) #Se carga la librería "stargazer" con la función library(stargazer)
modelo_ejercicio<-lm(formula = price~lotsize+sqrft+bdrms, data=hprice1) #Se ajusta un modelo lineal múltiple utilizando la función lm, especificando la variable dependiente price y las variables independientes lotsize, sqrft y bdrms del conjunto de datos hprice1. El modelo ajustado se guarda en el objeto modelo_ejercicio.
stargazer(modelo_ejercicio, title = "Ejercicio", type = "text") #Se utiliza la función stargazer para crear una tabla de resumen del modelo modelo_ejercicio. La tabla se titula "Ejercicio" y se especifica que se quiere que el resultado sea en formato de texto (type = "text").
## 
## Ejercicio
## ===============================================
##                         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) #Se carga la biblioteca "fitdistrplus" para realizar ajustes de distribución a los datos.
## Loading required package: MASS
## 
## Attaching package: 'MASS'
## The following object is masked from 'package:wooldridge':
## 
##     cement
## Loading required package: survival
fit_normal<-fitdist(data = modelo_ejercicio$residuals,distr = "norm") # Se ajusta la distribución normal a los residuos del modelo utilizando la función "fitdist" de la biblioteca "fitdistrplus" y se almacena el resultado en la variable "fit_normal".
plot(fit_normal) #Se grafica el resultado del ajuste de distribución normal a los residuos utilizando la función "plot" de R.

summary(fit_normal) #Se imprime en la consola un resumen de los resultados del ajuste de distribución normal utilizando la función "summary" de R.
## 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. Verificación del supuesto de normalidad.

a) Prueba de Normalidad de Jarque Bera

Utilizando tseries.

library(tseries) #Se carga la biblioteca "tseries" para realizar la prueba de Jarque-Bera.
prueba_JB<-jarque.bera.test(modelo_ejercicio$residuals) #Se realiza la prueba de Jarque-Bera a los residuos del modelo utilizando la función "jarque.bera.test" de la biblioteca "tseries" y se almacena el resultado en la variable "prueba_JB".
prueba_JB 
## 
##  Jarque Bera Test
## 
## data:  modelo_ejercicio$residuals
## X-squared = 32.278, df = 2, p-value = 9.794e-08
library(fastGraph) # carga el paquete fastGraph para realizar gráficos de distribuciones de probabilidad.
alpha_sig<-0.05 #asigna un valor de 0.05 a la variable alpha_sig, que representa el nivel de significancia. 
JB<-prueba_JB$statistic #extrae la estadística de prueba de la prueba de Jarque-Bera (prueba_JB) y la almacena en la variable JB.
gl<-prueba_JB$parameter #extrae los grados de libertad de la prueba de Jarque-Bera (prueba_JB) y los almacena en la variable gl.
VC<-qchisq(1-alpha_sig,gl,lower.tail = TRUE) #calcula el valor crítico para la distribución chi-cuadrado utilizando la función qchisq con 1-alpha_sig grados de libertad y un nivel de significancia de 0.05. El argumento lower.tail = TRUE especifica que se requiere el valor crítico en la cola inferior de la distribución.
shadeDist(JB,ddist = "dchisq",
          parm1 = gl,
          lower.tail = FALSE,xmin=0,
          sub=paste("VC:",round(VC,2)," ","JB:",round(JB,2))) #realiza un gráfico de la distribución chi-cuadrado con gl grados de libertad y sombrea el área a la derecha del valor de JB. xmin=0 especifica que se inicie el gráfico en 0. El argumento sub agrega una subetiqueta al gráfico con los valores críticos y de prueba redondeados a dos decimales.

Se rechaza la hipotesis nula debido a que JB:32.28 es > a VC: 5.99

b) Prueba de Kolmogorov Smirnov - Lilliefors.

Cálculo manual

library(dplyr)  #carga el paquete dplyr que proporciona herramientas para manipulación de datos.
library(gt)  #carga el paquete gt que permite crear tablas con formato para presentaciones.
library(gtExtras)  #carga el paquete gtExtras que proporciona funciones adicionales para dar formato a las tablas creadas con gt.
residuos<-modelo_ejercicio$residuals  #crea un objeto llamado residuos que contiene los residuos del modelo especificado en el objeto modelo_ejercicio.
residuos %>%  #pasa el objeto residuos al siguiente comando utilizando el operador %>%, que permite encadenar varias operaciones.
  as_tibble() %>%  #convierte el objeto residuos en una tabla (tibble) y lo pasa al siguiente comando.
  mutate(posicion=row_number()) %>% # añade una columna llamada posicion que contiene el número de fila de cada observación y pasa la tabla resultante al siguiente comando.
  arrange(value) %>%  #ordena las observaciones por los valores de los residuos y pasa la tabla resultante al siguiente comando.
  mutate(dist1=row_number()/n()) %>%  # añade una columna llamada dist1 que contiene la proporción acumulada de observaciones por orden de los valores de residuos y pasa la tabla resultante al siguiente comando.
  mutate(dist2=(row_number()-1)/n()) %>% #añade una columna llamada dist2 que contiene la proporción acumulada de observaciones por orden inverso de los valores de residuos y pasa la tabla resultante al siguiente comando.
  mutate(zi=as.vector(scale(value,center=TRUE))) %>%  #añade una columna llamada zi que contiene los residuos estandarizados (escalados y centrados) y pasa la tabla resultante al siguiente comando.
  mutate(pi=pnorm(zi,lower.tail = TRUE)) %>% #añade una columna llamada pi que contiene las probabilidades acumuladas de una distribución normal estándar a partir de los valores de zi y pasa la tabla resultante al siguiente comando.
  mutate(dif1=abs(dist1-pi)) %>%  #añade una columna llamada dif1 que contiene la diferencia absoluta entre las proporciones acumuladas de observaciones (dist1) y las probabilidades acumuladas de la distribución normal (pi) y pasa la tabla resultante al siguiente comando.
  mutate(dif2=abs(dist2-pi)) %>% #añade una columna llamada dif2 que contiene la diferencia absoluta entre las proporciones acumuladas de observaciones en orden inverso (dist2) y las probabilidades acumuladas de la distribución normal (pi) y pasa la tabla resultante al siguiente comando.
  rename(residuales=value) -> tabla_KS  #cambia el nombre de la columna value por residuales y guarda la tabla resultante en un objeto llamado tabla_KS.


tabla_KS %>%  #está tomando la tabla tabla_KS creada anteriormente y utilizándola como entrada para el siguiente paso.
  gt() %>%  #está tomando la tabla tabla_KS creada anteriormente y utilizándola como entrada para el siguiente paso.
  tab_header("Tabla para calcular el Estadistico KS") %>%  #está agregando un encabezado a la tabla creado utilizando el texto "Tabla para calcular el Estadistico KS".
  tab_source_note(source_note = "Fuente: Elaboración propia") %>%  #está agregando una nota de fuente a la tabla creada utilizando el texto "Fuente: Elaboración propia".
  tab_style(  #está estableciendo el estilo de la tabla utilizando la siguiente configuración:
    style = list( 
      cell_fill(color = "#33FFA8"), 
      cell_text(style = "italic") 
      ), # está estableciendo el estilo del texto en la celda como cursiva y el color de fondo de la celda como verde claro.
    locations = cells_body(  
      columns = dif1,  
      rows = dif1==max(dif1)  
    )) %>% #está especificando que la configuración de estilo se debe aplicar a la columna dif1 en la fila donde el valor de dif1 sea el máximo.
   tab_style(  #está estableciendo otro estilo de tabla utilizando la siguiente configuración:
    style = list(
      cell_fill(color = "#EA1250"),  
      cell_text(style = "italic")  
      ), # está estableciendo el estilo del texto en la celda como cursiva y el color de fondo de la celda como rojo oscuro.
    locations = cells_body(  
      columns = dif2,  
      rows = dif2==max(dif2)  
    ))#está especificando que la configuración de estilo se debe aplicar a la columna dif2 en la fila donde el valor de dif2 sea el máximo.
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)) #Esta línea define la variable D y calcula el valor máximo entre el máximo de tabla_KS$dif1 y el máximo de tabla_KS$dif2. tabla_KS es un objeto creado previamente que contiene las diferencias entre la función de distribución empírica y la función de distribución teórica en cada punto de corte de los datos. dif1 y dif2 son dos columnas de tabla_KS que contienen estas diferencias en puntos específicos. Por lo tanto, max(tabla_KS$dif1) y max(tabla_KS$dif2) encuentran los valores máximos de estas columnas y luego max() selecciona el valor más grande entre ellos. Finalmente, el resultado se almacena en la variable D. 
print(D)
## [1] 0.0754392

Valor critico de la tabla de Lilliefors.

En este caso 0.0754392 < 0.093370933 No se rechaza la hipotesis nula.

Cálculo utilizando nortest.

library(nortest) #Carga el paquete nortest que contiene funciones para probar la normalidad de una distribución.
prueba_KS<-lillie.test(modelo_ejercicio$residuals) # Ejecuta la prueba de Lilliefors para verificar si los residuos del modelo siguen una distribución normal. La prueba Lilliefors es una versión modificada de la prueba de Kolmogorov-Smirnov (KS) para ajustar una distribución teórica a los datos observados. La función lillie.test() realiza la prueba de Lilliefors y devuelve un objeto de prueba que contiene estadísticas y valores p.
prueba_KS 
## 
##  Lilliefors (Kolmogorov-Smirnov) normality test
## 
## data:  modelo_ejercicio$residuals
## D = 0.075439, p-value = 0.2496

c) Prueba de Shapiro - Wilk.

Cálculo Manual.

library(dplyr) # Carga el paquete dplyr, que proporciona funciones para manipular y transformar datos.
library(gt) # Carga el paquete gt, que proporciona herramientas para crear tablas con formato en R.
residuos<-modelo_ejercicio$residuals #Asigna los residuos del objeto modelo_ejercicio a la variable 
residuos %>%  
  as_tibble() %>% #Convierte los residuos en un tibble, una versión moderna del data frame de R, y pasa el resultado como entrada al siguiente comando.
  rename(residuales=value) %>% #Renombra la columna del tibble que contiene los residuos como "residuales" y pasa el resultado como entrada al siguiente comando.
  arrange(residuales) %>% #Ordena los residuales en orden ascendente y pasa el resultado como entrada al siguiente comando.
  mutate(pi=(row_number()-0.375)/(n()+0.25)) %>% #Calcula los percentiles empíricos de los residuos y los almacena en una nueva columna llamada "pi". Esto se hace mediante la fórmula (i-0.375)/(n+0.25), donde i es el rango del residuo y n es el número total de residuos.
  mutate(mi=qnorm(pi,lower.tail = TRUE)) %>% #Calcula los valores correspondientes de la distribución normal estándar que tienen los percentiles empíricos, y los almacena en una nueva columna llamada "mi". Esto se hace mediante la función qnorm, que es la función inversa de la función de distribución acumulada de la distribución normal estándar. El argumento lower.tail = TRUE especifica que se están calculando las colas inferiores de la distribución normal.
  mutate(ai=0)->tabla_SW #Crea una nueva columna llamada "ai" en el tibble y la inicializa en cero. Los resultados se almacenan en un nuevo objeto llamado tabla_SW.

m<-sum(tabla_SW$mi^2) #  calcula la suma de los residuos al cuadrado y lo guarda en la variable m.
n<-nrow(hprice1) # obtiene el número de filas de la base de datos hprice1 y lo guarda en la variable n.
theta<-1/sqrt(n) #  calcula el valor de theta y lo guarda 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)#calcula el valor de ai para la última fila de la tabla_SW según la fórmula del estadístico W y lo guarda en la posición n de la columna ai de la tabla_SW.
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) #calcula el valor de ai para la penúltima fila de la tabla_SW según la fórmula del estadístico W y lo guarda en la posición n-1 de la columna ai de la tabla_SW.
tabla_SW$ai[1]<- -tabla_SW$ai[n] #calcula el valor de ai para la primera fila de la tabla_SW según la fórmula del estadístico W y lo guarda en la posición 1 de la columna ai de la tabla_SW.
tabla_SW$ai[2]<- -tabla_SW$ai[n-1] #calcula el valor de ai para la segunda fila de la tabla_SW según la fórmula del estadístico W y lo guarda en la posición 2 de la columna ai de la tabla_SW.
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) #calcula el valor de omega según la fórmula del estadístico W y lo guarda en la variable omega.
tabla_SW$ai[3:(n-2)]<-tabla_SW$mi[3:(n-2)]/sqrt(omega) #calcula el valor de ai para las filas 3 hasta n-2 de la tabla_SW según la fórmula del estadístico W y los guarda en las posiciones correspondientes de la columna ai de la tabla_SW.

tabla_SW %>% 
  mutate(ai_ui=ai*residuales,ui2=residuales^2) ->tabla_SW #añade dos nuevas columnas a la tabla_SW, ai_ui y ui2, que contienen el resultado de multiplicar ai por los residuos y los residuos al cuadrado, respectivamente, y guarda la tabla_SW actualizada en la misma variable.

tabla_SW %>% 
  gt() %>% tab_header("Tabla para calcular el Estadistico W") %>%  
  tab_source_note(source_note = "Fuente: Elaboración propia") #crea una tabla con la información contenida en la tabla_SW y le agrega un encabezado y una nota de fuente. 
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

Cálculo del Estadístico W

W<-(sum(tabla_SW$ai_ui)^2)/sum(tabla_SW$ui2) #crea una nueva variable llamada "W" y asigna el valor de lo que se calculará a la derecha de la flecha, eleva al cuadrado la suma de la columna "ai_ui" de la tabla_SW. Esto es parte del numerador del estadístico W, suma los cuadrados de los residuos (columna "ui2" en la tabla_SW).
print(W) #imprime en la consola el valor de W, que es el resultado del cálculo anterior.
## [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 #Calcula el valor de mu mediante una fórmula matemática que involucra el logaritmo natural de n (el número de observaciones).
sigma<-exp(0.0030302*log(n)^2-0.082676*log(n)-0.4803) #Calcula el valor de sigma mediante otra fórmula matemática que involucra el logaritmo natural de n.
Wn<-(log(1-W)-mu)/sigma #Calcula el valor de Wn mediante otra fórmula matemática que utiliza el valor de W previamente calculado, y los valores de mu y sigma calculados en los pasos anteriores.
print(Wn) #Imprime el valor de Wn.
## [1] 3.241867
p.value<-pnorm(Wn,lower.tail = FALSE) #Calcula el valor p asociado a Wn mediante la función de distribución acumulada de la distribución normal (que se asume por la prueba de Shapiro-Wilk).
print(p.value) # Imprime el valor de p.
## [1] 0.0005937472
library(fastGraph) #Carga la librería fastGraph.
shadeDist(Wn,ddist = "dnorm", lower.tail = FALSE) #Crea un gráfico que muestra la distribución normal y sombrea el área correspondiente a la cola derecha de la distribución (es decir, el área asociada a un valor igual o mayor que Wn).

En este caso 0.0005937472 < 0.05 Se rechaza la hipotesis nula.

Cálculo utilizando la libreria stats.

prueba_SW<-shapiro.test(modelo_ejercicio$residuals) #Se realiza una prueba de normalidad de Shapiro-Wilk en los residuos del modelo y se guarda el resultado en la variable prueba_SW.
print(prueba_SW) #Se imprime en la consola el resultado de la prueba de normalidad, que incluye el valor del estadístico de prueba y el p-valor obtenido.
## 
##  Shapiro-Wilk normality test
## 
## data:  modelo_ejercicio$residuals
## W = 0.94132, p-value = 0.0005937

Cálculo del Wn

Wn_salida<-qnorm(prueba_SW$p.value,lower.tail = FALSE) #Se calcula el valor de la estadística de prueba de Shapiro-Wilk transformado en una distribución normal estándar utilizando la función qnorm(). El argumento prueba_SW$p.value es el p-valor obtenido en la prueba de normalidad de Shapiro-Wilk, y lower.tail = FALSE indica que se está calculando el percentil de la distribución normal estándar que está por encima del valor prueba_SW$p.value.
print(Wn_salida) #Se imprime en la consola el valor de la estadística de prueba de Shapiro-Wilk transformado en una distribución normal estándar. Este valor se utiliza para compararlo con los valores críticos de la distribución normal estándar y determinar si se rechaza o no la hipótesis nula de normalidad.
## [1] 3.241867