options(scipen = 9999)
set.seed(50)
library(foreign)
library(lmtest)
library(sandwich)
library(robustbase)
library(stargazer)
library(haven)
crime <- read_dta("C:/Users/Rebeca/Downloads/crime.dta")
View(crime)
cat("--- PARTE 1: SIMULACIÓN DE PRONÓSTICO (MODELO BASE) ---\n")
## --- PARTE 1: SIMULACIÓN DE PRONÓSTICO (MODELO BASE) ---
modelo_crime <- lm(crime ~ poverty + single, data = crime)
print(summary(modelo_crime))
## 
## Call:
## lm(formula = crime ~ poverty + single, data = crime)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -811.14 -114.27  -22.44  121.86  689.82 
## 
## Coefficients:
##              Estimate Std. Error t value        Pr(>|t|)    
## (Intercept) -1368.189    187.205  -7.308 0.0000000024786 ***
## poverty         6.787      8.989   0.755           0.454    
## single        166.373     19.423   8.566 0.0000000000312 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 243.6 on 48 degrees of freedom
## Multiple R-squared:  0.7072, Adjusted R-squared:  0.695 
## F-statistic: 57.96 on 2 and 48 DF,  p-value: 0.0000000000001578
nuevo_escenario <- data.frame(
  poverty = mean(crime$poverty, na.rm = TRUE),
  single  = mean(crime$single, na.rm = TRUE)
)

pronostico_tabla <- predict(modelo_crime, newdata = nuevo_escenario, interval = "prediction")
print(pronostico_tabla)
##        fit      lwr      upr
## 1 612.8431 118.2534 1107.433

PARTE 2: Simulación de Pronóstico con Enfoque de Validación Cruzada (HAC)

cat("\n--- PARTE 2: SIMULACIÓN ENFOQUE TRAIN/TEST (500 RÉPLICAS) ---\n")
## 
## --- PARTE 2: SIMULACIÓN ENFOQUE TRAIN/TEST (500 RÉPLICAS) ---
n_replicas <- 500
proporcion_train <- 0.75
n_total <- nrow(crime)
n_train <- round(n_total * proporcion_train)
# Vectores para almacenar las métricas de desempeño
rmse_mecanico <- numeric(n_replicas)
mae_mecanico  <- numeric(n_replicas)
# Bucle de simulación (Monte Carlo / Validación Cruzada Aleatoria)
for(i in 1:n_replicas) {# 1. División aleatoria de datos (Train 75% / Test 25%)
  indices_train <- sample(seq_len(n_total), size = n_train)
  datos_train   <- crime[indices_train, ]
  datos_test    <- crime[-indices_train, ]
  
  # 2. Ajuste del modelo con datos de entrenamiento
  modelo_train <- lm(crime ~ poverty + single, data = datos_train)
  
  # 3. Predicción sobre los datos "desconocidos" (Test)
  predicciones <- predict(modelo_train, newdata = datos_test)
  
  # 4. Cálculo de errores
  errores <- datos_test$crime - predicciones
  
  # 5. Guardar métricas de desempeño para la réplica i
  rmse_mecanico[i] <- sqrt(mean(errores^2, na.rm = TRUE))
  mae_mecanico[i]  <- mean(abs(errores), na.rm = TRUE)
}

ANÁLISIS DE RESULTADOS DESEMPEÑO DEL MODELO

cat("ANÁLISIS DE DESEMPEÑO EN DATOS DESCONOCIDOS (TEST)\n")
## ANÁLISIS DE DESEMPEÑO EN DATOS DESCONOCIDOS (TEST)
resultados_desempeno <- data.frame(
  Metrica = c("RMSE (Error Cuadrático Medio Raíz)", "MAE (Error Absoluto Medio)"),
  Media   = c(mean(rmse_mecanico), mean(mae_mecanico)),
  Mediana = c(median(rmse_mecanico), median(mae_mecanico)),
  Minimo  = c(min(rmse_mecanico), min(mae_mecanico)),
  Maximo  = c(max(rmse_mecanico), max(mae_mecanico)),
  Desv_Est = c(sd(rmse_mecanico), sd(mae_mecanico))
)

print(resultados_desempeno, row.names = FALSE)
##                             Metrica    Media  Mediana    Minimo   Maximo
##  RMSE (Error Cuadrático Medio Raíz) 275.0489 284.3751 130.25144 429.0787
##          MAE (Error Absoluto Medio) 200.3083 198.3948  97.97605 325.7022
##  Desv_Est
##  76.57143
##  47.24460
# Histograma de los errores de predicción (RMSE) distribuidos en las 500 réplicas
hist(rmse_mecanico, 
     main = "Distribución del RMSE en 500 Réplicas de Simulación",
     xlab = "RMSE (Datos de Validación)", 
     col  = "skyblue", 
     border = "white")
abline(v = mean(rmse_mecanico), col = "red", lwd = 2, lty = 2)
legend("topright", legend = c("RMSE Medio"), col = c("red"), lty = 2, lwd = 2)