R Markdown

# Instalación
library(wooldridge)
## Warning: package 'wooldridge' was built under R version 4.5.3
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.5.3
## 
## 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
# Cargar datos y mostrar primeras observaciones [cite: 4, 5, 6]
data(hprice1)
df <- hprice1
# 1. Estimar el modelo:
modelo <- lm(price ~ lotsize + sqrft + bdrms, data = df)

# Extraer los residuos (u) para las pruebas de normalidad
residuos <- residuals(modelo)
2. # Cálculo manual de estadísticos descriptivos para Jarque-Bera
## [1] 2
stats_manual <- data.frame(residuos) %>%
  summarise(
    n = n(),
    media = mean(residuos),
    desv_est = sd(residuos),
    # Asimetría (Skewness)
    asimetria = sum((residuos - media)^3) / (n * desv_est^3),
    # Curtosis
    curtosis = sum((residuos - media)^4) / (n * desv_est^4),
    # Estadístico JB
    JB_stat = (n/6) * (asimetria^2 + ((curtosis - 3)^2 / 4)))

print(stats_manual)
##    n         media desv_est asimetria curtosis  JB_stat
## 1 88 -2.321494e-15 58.79282 0.9443546 5.141959 29.90244
# Tabla manual para visualizar diferencias (primeras 10 filas)
tabla_ks_manual <- data.frame(residuos = sort(residuos)) %>%
  mutate(
    n = n(),
    i = row_number(),
    F_empirica = i / n,
    z_score = (residuos - mean(residuos)) / sd(residuos),
    F_teorica = pnorm(z_score)
  )

head(tabla_ks_manual, 10)
##      residuos  n  i F_empirica   z_score  F_teorica
## 81 -120.02645 88  1 0.01136364 -2.041515 0.02059981
## 77 -115.50870 88  2 0.02272727 -1.964674 0.02472601
## 24 -107.08089 88  3 0.03409091 -1.821326 0.03427866
## 48  -91.24398 88  4 0.04545455 -1.551958 0.06033615
## 12  -85.46117 88  5 0.05681818 -1.453599 0.07302879
## 32  -77.17269 88  6 0.06818182 -1.312621 0.09465535
## 54  -74.70272 88  7 0.07954545 -1.270610 0.10193378
## 39  -65.50285 88  8 0.09090909 -1.114130 0.13261169
## 69  -63.69911 88  9 0.10227273 -1.083451 0.13930425
## 83  -62.56659 88 10 0.11363636 -1.064188 0.14362184
3. # pruebas de normalidad
## [1] 3
library(tseries)
## Warning: package 'tseries' was built under R version 4.5.3
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
jb_test <- jarque.bera.test(residuos)

# Resultado tabular
print(jb_test)
## 
##  Jarque Bera Test
## 
## data:  residuos
## X-squared = 32.278, df = 2, p-value = 9.794e-08
# Gráfico con fastGraph 
library(fastGraph)
## Warning: package 'fastGraph' was built under R version 4.5.3
# Jarque-Bera se distribuye como una Chi-cuadrado con 2 grados de libertad
shadeDist(jb_test$statistic, "dchisq", 2, lower.tail = FALSE, 
          sub = paste("Prueba JB - p-value:", round(jb_test$p.value, 4)))

library(nortest)
ks_test <- lillie.test(residuos)

# Resultado tabular
print(ks_test)
## 
##  Lilliefors (Kolmogorov-Smirnov) normality test
## 
## data:  residuos
## D = 0.075439, p-value = 0.2496
sw_test <- shapiro.test(residuos)

# Resultado tabular
print(sw_test)
## 
##  Shapiro-Wilk normality test
## 
## data:  residuos
## W = 0.94132, p-value = 0.0005937
# Gráfico con fastGraph 
# Shapiro-Wilk utiliza una distribución específica, visualizada mediante la normal
shadeDist(sw_test$statistic, "dnorm", 0, 1, lower.tail = TRUE,
          sub = paste("Prueba SW - p-value:", round(sw_test$p.value, 4)))