Skip to content
Statistical RethinkingStatistical Rethinking

12.1 Ejemplo: Renacuajos multinivel

Los modelos multinivel son modelos dentro de modelos. Los datos están agrupados, y cada grupo tiene sus propios parámetros. Los parámetros de grupo se extraen de una distribución común, que vincula los grupos entre sí. Este agrupamiento parcial comparte información entre grupos.

12.1.1 El ejemplo de los renacuajos

Los renacuajos de rana se crían en tanques con densidades variables. La supervivencia varía por tanque, pero todos los tanques comparten un entorno común. Modelamos la supervivencia de cada tanque como una extracción de una distribución común:

logit(pj)=α+γj\text{logit}(p_j) = \alpha + \gamma_j γj∼Normal(0,σγ)\gamma_j \sim \text{Normal}(0, \sigma_\gamma)

donde jj indexa los tanques, α\alpha es el promedio poblacional, y γj\gamma_j es la desviación específica del tanque.

# Multilevel model: tadpole survival
# Simulate data inspired by the reed frog example

set.seed(42)
n_tanks <- 48
density <- sample(c(10, 25, 35), n_tanks, replace = TRUE)

# Population-level survival

a_pop <- 0.5 # log-odds
sigma_tank <- 1.5 # between-tank variation

# Tank-specific deviations

gamma_tank <- rnorm(n_tanks, 0, sigma_tank)
p_tank <- 1 / (1 + exp(-(a_pop + gamma_tank)))
survival <- rbinom(n_tanks, density, p_tank)

d <- data.frame(tank = 1:n_tanks, density = density, survival = survival)

cat("Tadpole survival data:\n")
cat(" Tanks:", n_tanks, "\n")
cat(" Densities:", paste(sort(unique(density)), collapse = ", "), "\n")
cat(" Survival proportions range:",
round(min(survival/density), 2), "to", round(max(survival/density), 2), "\n")

# No-pooling estimates (separate per tank)

p_nopool <- survival / density

# Complete-pooling estimate (one common p)

p_pool <- sum(survival) / sum(density)

cat("\nComplete pooling p:", round(p_pool, 3), "\n")
cat("No pooling range:", round(min(p_nopool), 3), "to", round(max(p_nopool), 3), "\n")

# Plot

plot(1:n_tanks, p_nopool, pch = 16, col = "steelblue",
ylim = c(0, 1), xlab = "Tank", ylab = "Survival proportion",
main = "Tadpole survival: no-pooling estimates")
abline(h = p_pool, lwd = 2, col = "firebrick", lty = 2)
legend("topright", legend = c("No pooling", "Complete pooling"),
col = c("steelblue", "firebrick"), pch = c(16, NA), lty = c(NA, 2), lwd = c(NA, 2))
Click Run to execute this code in your browser with WebR

12.1.2 Ajustando el modelo multinivel

El modelo multinivel estima tanto el promedio poblacional α\alpha como la variación entre tanques σγ\sigma_\gamma, mientras produce estimados específicos por tanque que son encogidos hacia la media poblacional.

# Fit multilevel model using lme4
library(lme4)

# Binomial multilevel model with tank-level random intercepts

m <- glmer(cbind(survival, density - survival) ~ (1 | tank),
family = binomial, data = d)

cat("Multilevel model:\n")
cat(" Fixed intercept (log-odds):", round(fixef(m)[1], 3), "\n")
cat(" Population p:", round(plogis(fixef(m)[1]), 3), "\n")
cat(" Between-tank SD (log-odds):", round(attr(VarCorr(m)$tank, "stddev"), 3), "\n")

# Extract tank-specific estimates (partial pooling)

p_partial <- plogis(fixef(m)[1] + ranef(m)$tank[, 1])
p_nopool <- d$survival / d$density
p_pool <- sum(d$survival) / sum(d$density)

cat("\nComparison (first 10 tanks):\n")
cat(" Tank No-pool Partial Complete\n")
for (i in 1:10) {
cat(sprintf(" %4d %7.3f %7.3f %7.3f\n",
i, p_nopool[i], p_partial[i], p_pool))
}

# Plot: shrinkage

plot(p_nopool, p_partial, pch = 16, col = "steelblue",
xlim = c(0, 1), ylim = c(0, 1),
xlab = "No-pooling estimate", ylab = "Partial pooling estimate",
main = "Shrinkage: no-pooling vs partial pooling")
abline(0, 1, lty = 2, col = "gray50")
abline(h = p_pool, lty = 3, col = "firebrick")
abline(v = p_pool, lty = 3, col = "firebrick")

cat("\nShrinkage: partial pooling estimates are pulled toward\n")
cat("the population mean, especially for tanks with few tadpoles.\n")
Click Run to execute this code in your browser with WebR
Rethinking

El agrupamiento parcial es regularización adaptativa. El modelo multinivel regulariza automáticamente: los tanques con pocas observaciones se encogen más hacia la media poblacional, mientras que los tanques con muchas observaciones se encienden menos. La cantidad de encogimiento la determinan los datos — específicamente, el cociente de variación dentro del tanque y entre tanques. Si los tanques son muy diferentes (grande σγ\sigma_\gamma), hay poco encogimiento. Si los tanques son similares (pequeño σγ\sigma_\gamma), hay mucho encogimiento. Esto es regularización adaptativa: el modelo aprende cuánto regularizar a partir de los datos mismos.

Resumen de la Sección 12.1

  • Los modelos multinivel tienen parámetros dentro de parámetros: efectos de nivel de grupo extraídos de una distribución poblacional.
  • El agrupamiento parcial comparte información entre grupos — mejores estimados para grupos pequeños.
  • El ejemplo de los renacuajos: logit(pj)=α+γj\text{logit}(p_j) = \alpha + \gamma_j, γj∼Normal(0,σγ)\gamma_j \sim \text{Normal}(0, \sigma_\gamma).
  • Use lme4::glmer() para modelos multinomiales multinivel en R.
  • Agrupamiento parcial = regularización adaptativa — la cantidad de encogimiento se aprende de los datos.