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]))
}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:
# 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")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:schoolpara efectos anidados enlme4. - La estructura del modelo debe reflejar el proceso generador de datos.