← Catálogo · Capítulo 4

T04_CP02_mECO_NB_Accidentes.R

Ver crudo
# TEMA 04 — CP2: NB — Accidentes de Tráfico por Tramo de Carretera
# Manual de Microeconometría — Carlos de Anta Puig — UNIR
# https://github.com/carlanta/MicroEconometrics  Versión 1.0 — 2026
# INSTRUCCIONES: Session > Set Working Directory > To Source File Location

pausa <- function(msg="\n>>> Pulsa ENTER para continuar...") {
  if (interactive()) readline(msg) else Sys.sleep(0.5)
}
for (p in c("AER","MASS")) if (!requireNamespace(p,quietly=TRUE)) install.packages(p,quiet=TRUE)
suppressPackageStartupMessages({ library(AER); library(MASS) })
.get_script_dir <- function() {
  args <- commandArgs(trailingOnly = FALSE)
  for (a in args) {
    if (startsWith(a, "--file=")) return(dirname(normalizePath(substring(a, 8))))
  }
  for (i in seq_len(sys.nframe())) {
    ofile <- tryCatch(sys.frame(i)$ofile, error = function(e) NULL)
    if (!is.null(ofile)) return(dirname(normalizePath(ofile)))
  }
  return(normalizePath("."))
}
.sdir <- .get_script_dir()
DATA_DIR <- normalizePath(file.path(.sdir, "..", "data"), mustWork=FALSE)
OUTPUT_DIR <- normalizePath(file.path(.sdir, "..", "output"), mustWork=FALSE)
if (!dir.exists(OUTPUT_DIR)) dir.create(OUTPUT_DIR, recursive=TRUE)

cat("\n================================================================\n")
cat("  CP02 — Accidentes de Tráfico: Poisson y Binomial Negativa\n")
cat("================================================================\n\n")

load(file.path(DATA_DIR,"T04_CP02_accidentes.RData"))
mu_a <- mean(accid$accidentes); var_a <- var(accid$accidentes)
cat(sprintf("  n=%d | Media=%.2f | Varianza=%.2f | VMR=%.2f | Ceros: %.1f%%\n\n",
            nrow(accid), mu_a, var_a, var_a/mu_a, 100*mean(accid$accidentes==0)))
cat("  La ILUMINACIÓN y la VELOCIDAD MÁXIMA son los factores de riesgo\n")
cat("  más conocidos en la literatura de seguridad vial.\n")

pausa()

cat("\n--- TEST DE SOBREDISPERSIÓN Y ESTIMACIÓN ---\n\n")
fml_a <- accidentes ~ trafico_diario + velocidad_max + num_curvas + dias_lluvia + iluminacion + longitud_km
p_a   <- glm(fml_a, data=accid, family=poisson)
nb_a  <- glm.nb(fml_a, data=accid)
dt_a  <- dispersiontest(p_a, trafo=2)

cat(sprintf("  Test Cameron-Trivedi: alpha=%.4f, z=%.2f, p=%.6f\n",
            dt_a$estimate, dt_a$statistic, dt_a$p.value))
cat(sprintf("  → %s\n\n", if(dt_a$p.value<0.05) "✓ Sobredispersión confirmada. NB preferida."
             else "Equidispersión no rechazada."))

vars_a <- c("trafico_diario","velocidad_max","num_curvas","dias_lluvia","iluminacion","longitud_km")
ct_a   <- coef(summary(nb_a))
irr_a  <- exp(coef(nb_a)[vars_a])
ame_a  <- mean(fitted(nb_a)) * coef(nb_a)[vars_a]

cat("  Variable          | IRR     | AME  | Sig.\n")
cat("  -----------------------------------------------\n")
for (v in vars_a) {
  sig <- ifelse(ct_a[v,4]<0.001,"***",ifelse(ct_a[v,4]<0.01,"**",
               ifelse(ct_a[v,4]<0.05,"*","   ")))
  cat(sprintf("  %-17s | %6.3f  | %5.3f | %s\n", v, irr_a[v], ame_a[v], sig))
}

cat(sprintf("\n  theta (NB): %.4f | AIC NB=%.1f vs AIC Pois=%.1f\n",
            nb_a$theta, AIC(nb_a), AIC(p_a)))
cat("\n▶ INTERPRETACIONES PRINCIPALES:\n")
cat(sprintf("  · Iluminación (=1): IRR=%.3f → tramos iluminados tienen un %.0f%% MENOS\n",
            irr_a["iluminacion"], (1-irr_a["iluminacion"])*100))
cat("    accidentes que los tramos sin iluminar.\n")
cat(sprintf("  · Velocidad máxima: IRR=%.4f por km/h → a 120 vs 80 km/h se espera un\n",
            irr_a["velocidad_max"]))
cat(sprintf("    %.0f%% más de accidentes.\n", (irr_a["velocidad_max"]^40-1)*100))
cat(sprintf("  · Días de lluvia: IRR=%.4f → más días de lluvia = más accidentes.\n",
            irr_a["dias_lluvia"]))

png(file.path(OUTPUT_DIR,"T04_CP02_predichos.png"), width=1400, height=700, res=150)
par(mfrow=c(1,2), mar=c(4.5,4.5,2,0.5))
plot(fitted(p_a), fitted(nb_a), pch=1, col=gray(0.5), cex=0.7,
     xlab="Predichos Poisson", ylab="Predichos NB", main="Poisson vs NB predichos")
abline(0,1,lwd=2); legend("topleft","Línea 45°",lty=1,lwd=2,bty="n",cex=0.85)
resid_p <- residuals(p_a, type="pearson")
hist(resid_p, breaks=30, col=gray(0.70), border="white",
     main="Residuos Pearson (Poisson)", xlab="Residuo Pearson", ylab="Frecuencia")
dev.off()
cat("\n  Gráfico diagnóstico: output/T04_CP02_predichos.png\n")
cat("\n================================================================\n")
cat("  FIN T04_CP02_mECO_NB_Accidentes.R\n")
cat("================================================================\n\n")