Skip to content
Statistical RethinkingStatistical Rethinking

12.3 Más de un tipo de cluster

Los datos reales a menudo contienen más de un factor de agrupamiento. Los efectos aleatorios cruzados y anidados extienden el modelo multinivel básico para manejar múltiples fuentes de variación.

12.3.1 Efectos cruzados vs anidados

  • Anidados: Los grupos son jerárquicos. Estudiantes dentro de escuelas, escuelas dentro de distritos.
  • Cruzados: Los grupos no son jerárquicos. Actores y bloques, donde cada actor aparece en cada bloque.
# Multilevel model with crossed random effects
# Example: chimpanzee prosociality with actor and block effects

set.seed(42)
n_actors <- 7
n_blocks <- 6
n_trials <- 50

# Simulate crossed data

actor <- sample(1:n_actors, n_trials, replace = TRUE)
block <- sample(1:n_blocks, n_trials, replace = TRUE)
x <- sample(c(0, 1), n_trials, replace = TRUE) # prosocial on left

# True effects

a_bar <- 0
sigma_actor <- 1.5
sigma_block <- 0.5
a_actor <- rnorm(n_actors, 0, sigma_actor)
a_block <- rnorm(n_blocks, 0, sigma_block)
beta <- 0.5 # prosocial effect

# Generate outcome

logit_p <- a_bar + a_actor[actor] + a_block[block] + beta * x
p <- 1 / (1 + exp(-logit_p))
y <- rbinom(n_trials, 1, p)

d <- data.frame(actor = factor(actor), block = factor(block), x = x, y = y)

# Fit crossed multilevel model

library(lme4)
m <- glmer(y ~ x + (1 | actor) + (1 | block),
family = binomial, data = d)

cat("Crossed multilevel model:\n")
cat(" Fixed effects:\n")
cat(" Intercept:", round(fixef(m)[1], 3), "\n")
cat(" x (prosocial):", round(fixef(m)[2], 3), "\n")
cat(" Random effects SD:\n")
cat(" Actor:", round(attr(VarCorr(m)$actor, "stddev"), 3), "\n")
cat("    Block:", round(attr(VarCorr(m)$block, "stddev"), 3), "\n")

cat("\n Actor effects (deviations):\n")
actor_eff <- ranef(m)$actor[, 1]
for (i in 1:n_actors) {
cat(sprintf(" Actor %d: %.3f\n", i, actor_eff[i]))
}
Click Run to execute this code in your browser with WebR

12.3.2 Efectos anidados

Cuando los grupos están anidados (ej., estudiantes dentro de escuelas dentro de distritos), cada nivel añade su propio efecto aleatorio:

μi=α+γdistrito[i]+γescuela[i]+γestudiante[i]\mu_i = \alpha + \gamma_{\text{distrito}[i]} + \gamma_{\text{escuela}[i]} + \gamma_{\text{estudiante}[i]}

# Nested random effects: students within schools within districts
set.seed(42)
n_districts <- 5
n_schools_per <- 3
n_students_per <- 20

# Generate nested structure

district <- rep(1:n*districts, each = n_schools_per * n*students_per)
school <- rep(1:(n_districts * n_schools_per), each = n_students_per)
x <- runif(length(district), 0, 10)

# True effects

a_bar <- 2
sigma_district <- 1.0
sigma_school <- 0.5
sigma_student <- 0.3

a_district <- rnorm(n_districts, 0, sigma_district)
a_school <- rnorm(n_districts * n_schools_per, 0, sigma_school)

# Linear predictor

mu <- a_bar + a_district[district] + a_school[school] + 0.3 * x
y <- mu + rnorm(length(mu), 0, 1)

d <- data.frame(
district = factor(district),
school = factor(school),
x = x, y = y
)

# Fit nested model

library(lme4)
m <- lmer(y ~ x + (1 | district) + (1 | district:school), data = d)

cat("Nested multilevel model:\n")
cat(" Fixed effects:\n")
cat(" Intercept:", round(fixef(m)[1], 3), "\n")
cat(" x:", round(fixef(m)[2], 3), "\n")
cat(" Random effects SD:\n")
cat(" District:", round(attr(VarCorr(m)$district, "stddev"), 3), "\n")
cat(" School: ", round(attr(VarCorr(m)[[2]], "stddev"), 3), "\n")
cat(" Residual:", round(attr(VarCorr(m), "sc"), 3), "\n")
Click Run to execute this code in your browser with WebR
Rethinking

La estructura de los datos importa. Los efectos cruzados y anidados no son solo trucos estadísticos — reflejan la estructura del proceso generador de datos. Si los actores y bloques están cruzados, necesita un modelo cruzado. Si los estudiantes están anidados en escuelas, necesita un modelo anidado. Equivocar la estructura lleva a estimados sesgados e incertidumbre incorrecta. El modelo multinivel le obliga a pensar en cómo se recolectaron los datos y qué factores de agrupamiento importan. Esto no es una carga — es una oportunidad para construir un modelo que refleje el mundo real.

Resumen de la Sección 12.3

  • Efectos cruzados: Los grupos no son jerárquicos (ej., actores × bloques).
  • Efectos anidados: Los grupos son jerárquicos (ej., estudiantes dentro de escuelas).
  • Añada efectos aleatorios para cada factor de agrupamiento: (1 | factor).
  • Use la notación district:school para efectos anidados en lme4.
  • La estructura del modelo debe reflejar el proceso generador de datos.