Skip to content
Statistical RethinkingStatistical Rethinking

10.5 Práctica

Los problemas de práctica del Capítulo 10 le piden ajustar regresiones binomial y Poisson, verificar sobredispersión y comparar modelos con criterios de información.

Practice

Problemas fáciles

10E1. Si un coeficiente de regresión logística es 0.7, ¿cuál es la razón de odds? ¿Cuál es la probabilidad cuando el predictor lineal es 0.7?

10E2. Si un coeficiente de regresión Poisson es 0.3, ¿cuál es el efecto multiplicativo sobre el conteo esperado?

10E3. ¿Qué es la sobredispersión? ¿Cómo la detecta?

10E4. ¿Cuál es la diferencia entre un Poisson con inflación de ceros y un modelo de barrera?

Problemas medios

10M1. Ajuste una regresión logística con dos predictores y una interacción. Interprete los resultados en la escala de probabilidad.

# 10M1: Logistic regression with interaction
set.seed(42)
n <- 300
x1 <- runif(n, 0, 10)
x2 <- runif(n, 0, 10)

# True relationship with interaction

logit*p <- -2 + 0.3 * x1 + 0.2 _ x2 + 0.05 _ x1 _ x2
p_true <- 1 / (1 + exp(-logit_p))
y <- rbinom(n, 1, p_true)

m <- glm(y ~ x1 * x2, family = binomial)

cat("Logistic regression with interaction:\n")
cat(" x1:", round(coef(m)[2], 3), "\n")
cat(" x2:", round(coef(m)[3], 3), "\n")
cat(" x1:x2:", round(coef(m)[4], 3), "\n")

# Predicted probabilities at different x2 values

cat("\nPredicted P(y=1) at x1=5, varying x2:\n")
for (x2*val in c(2, 5, 8)) {
logit <- coef(m)[1] + coef(m)[2] * 5 + coef(m)[3] _ x2_val + coef(m)[4] _ 5 _ x2_val
cat(sprintf(" x2 = %d: p = %.3f\n", x2_val, 1/(1+exp(-logit))))
}
Click Run to execute this code in your browser with WebR

10M2. Ajuste una regresión Poisson. Verifique sobredispersión. Si está presente, ajuste un modelo binomial negativo y compare.

# 10M2: Poisson vs negative binomial
set.seed(42)
n <- 100
x <- runif(n, 0, 10)

# Overdispersed counts

lambda <- exp(0.5 + 0.2 _ x)
y <- rpois(n, lambda _ rgamma(n, shape = 2, rate = 2))

# Poisson

m_pois <- glm(y ~ x, family = poisson)

# Check overdispersion

cat("Overdispersion check:\n")
cat(" Mean:", round(mean(y), 2), " Variance:", round(var(y), 2), "\n")
cat(" Deviance/df:", round(deviance(m_pois) / df.residual(m_pois), 2), "\n")

# Negative binomial

library(MASS)
m_nb <- glm.nb(y ~ x)

cat("\nModel comparison:\n")
cat(" Poisson AIC:", round(AIC(m_pois), 1), "\n")
cat(" NegBin AIC: ", round(AIC(m_nb), 1), "\n")
Click Run to execute this code in your browser with WebR

Problemas difíciles

10H1. Simule datos con inflación de ceros. Ajuste una Poisson estándar y observe el mal ajuste. Luego ajuste un modelo de barrera y compare.

# 10H1: Zero-inflated data and hurdle model
set.seed(42)
n <- 200
x <- runif(n, 0, 10)

# Zero-inflated: 40% structural zeros

is_zero <- rbinom(n, 1, 0.4)
lambda <- exp(0.3 + 0.15 * x)
y_pois <- rpois(n, lambda)
y <- ifelse(is_zero, 0, y_pois)

cat("Zero-inflated data:\n")
cat(" Zeros:", sum(y == 0), "/", n, "\n")
cat(" Proportion zeros:", round(mean(y == 0), 3), "\n")

# Standard Poisson (wrong)

m_pois <- glm(y ~ x, family = poisson)

# Hurdle model (two-part)

m_hurdle <- glm(I(y > 0) ~ x, family = binomial)
m_count <- glm(y[y > 0] ~ x[y > 0], family = poisson)

cat("\nStandard Poisson:\n")
cat(" Intercept:", round(coef(m_pois)[1], 3), " Slope:", round(coef(m_pois)[2], 3), "\n")

cat("\nHurdle model:\n")
cat(" Part 1 (y > 0): intercept =", round(coef(m_hurdle)[1], 3),
" slope =", round(coef(m_hurdle)[2], 3), "\n")
cat(" Part 2 (count): intercept =", round(coef(m_count)[1], 3),
" slope =", round(coef(m_count)[2], 3), "\n")

cat("\nThe hurdle model separates the zero process from the count process.\n")
Click Run to execute this code in your browser with WebR

10H2. Ajuste una regresión binomial con datos agregados (múltiples ensayos por observación). Compare con el modelo a nivel individual. ¿Dan los mismos resultados?

10H3. Use comprobaciones predictivas a posteriori para comparar un modelo Poisson y uno binomial negativo. ¿Cuál reproduce mejor los datos?