← Catálogo
· Capítulo 4
T04_CP02_mECO_NB_Accidentes.R
# 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")