10.2 Regresión de Poisson
La regresión Poisson modela datos de conteo usando un enlace log. Asume que el logaritmo del conteo esperado es una función lineal de los predictores.
10.2.1 El modelo Poisson
El enlace log asegura . El supuesto clave es que media = varianza ().
# Poisson regression: tool count and population
set.seed(42)
n <- 30
# Simulate: tool count increases with log population
log_pop <- runif(n, 7, 12)
lambda_true <- exp(-2 + 0.3 * log_pop)
total_tools <- rpois(n, lambda_true)
# Fit Poisson regression
m <- glm(total_tools ~ log_pop, family = poisson)
cat("Poisson regression:\n")
cat(" Intercept:", round(coef(m)[1], 3), "\n")
cat(" log_pop:", round(coef(m)[2], 3), "\n")
# Interpret: each unit increase in log_pop multiplies expected count by exp(beta)
cat("\n Multiplicative effect of log_pop:", round(exp(coef(m)[2]), 3), "\n")
# Predicted counts
cat("\nPredicted counts:\n")
for (lp in c(8, 10, 12)) {
cat(sprintf(" log_pop = %d: lambda = %.1f\n", lp, exp(coef(m)[1] + coef(m)[2] * lp)))
}
# Plot
x_seq <- seq(7, 12, length.out = 100)
log_pred <- coef(m)[1] + coef(m)[2] * x_seq
lambda_pred <- exp(log_pred)
plot(log_pop, total_tools, pch = 16, col = "steelblue",
xlab = "log(population)", ylab = "Total tools",
main = "Poisson regression: tools vs population")
lines(x_seq, lambda_pred, lwd = 2, col = "firebrick")10.2.2 Exposición y offset
Cuando las observaciones tienen diferente exposición (ej., diferentes períodos de tiempo o áreas), incluimos un offset:
# Poisson regression with offset (exposure)
set.seed(42)
n <- 50
# Different exposure times
exposure <- runif(n, 1, 10)
# Rate depends on x
x <- runif(n, 0, 5)
rate <- exp(-1 + 0.4 _ x) # events per unit time
counts <- rpois(n, rate _ exposure)
# Fit with offset
m_offset <- glm(counts ~ x + offset(log(exposure)), family = poisson)
cat("Poisson regression with offset:\n")
cat(" Intercept:", round(coef(m_offset)[1], 3), "\n")
cat(" x:", round(coef(m_offset)[2], 3), "\n")
cat("\n The offset adjusts for different exposure times.\n")
cat(" The coefficient on x is the rate ratio per unit x.\n")
# Compare without offset (wrong!)
m_no_offset <- glm(counts ~ x, family = poisson)
cat("\nWithout offset (wrong):\n")
cat(" x:", round(coef(m_no_offset)[2], 3), "(biased)\n")10.2.3 Verificación de sobredispersión
La Poisson asume media = varianza. La sobredispersión (varianza > media) es común y lleva a subestimar la incertidumbre.
# Check for overdispersion
set.seed(42)
n <- 100
x <- runif(n, 0, 10)
# Overdispersed counts: variance > mean
lambda <- exp(0.5 + 0.2 * x)
# Add extra variation
y <- rpois(n, lambda * rgamma(n, shape = 2, rate = 2))
# Fit Poisson
m <- glm(y ~ x, family = poisson)
# Check: mean vs variance
cat("Overdispersion check:\n")
cat(" Mean of y:", round(mean(y), 2), "\n")
cat(" Variance of y:", round(var(y), 2), "\n")
cat(" Ratio (var/mean):", round(var(y) / mean(y), 2), "\n")
if (var(y) / mean(y) > 1.5) {
cat("\n Overdispersion detected! Ratio > 1\n")
cat(" Consider negative-binomial or gamma-Poisson model.\n")
}
# Deviance-based overdispersion test
deviance_stat <- deviance(m) / df.residual(m)
cat("\n Deviance / df:", round(deviance_stat, 2), "\n")
cat(" (Values >> 1 indicate overdispersion)\n")El supuesto Poisson es fuerte. La distribución Poisson asume que la media es igual a la varianza. Este es un supuesto muy específico — significa que el proceso de conteo no tiene heterogeneidad no observada. En la práctica, los conteos casi siempre tienen más varianza de la que permite la Poisson, porque hay factores no observados que varían entre observaciones. Esto es sobredispersión, y es la regla, no la excepción. Siempre verifique. Si está presente, use un modelo que permita varianza extra (Sección 10.3).
Resumen de la Sección 10.2
- Regresión Poisson: con .
- Los coeficientes son razones de tasas logarítmicas — es el efecto multiplicativo.
- Use un offset para exposición variable: .
- Verifique sobredispersión: si varianza > media, la Poisson subestima la incertidumbre.
- La sobredispersión es la regla, no la excepción — siempre verifique.