Skip to content
Statistical RethinkingStatistical Rethinking

13.3 Ejemplo: Chimpancés cruzados con pendientes variables

Los datos de chimpancés contienen múltiples efectos aleatorios cruzados: actor, bloque y tratamiento. Un modelo multinivel con pendientes variables maneja esta estructura compleja.

13.3.1 El modelo cruzado de pendientes variables

Cada actor puede responder diferentemente a los tratamientos, y cada bloque puede tener su propia línea base. El modelo incluye:

  • Efectos fijos del tratamiento: Efecto promedio de cada tratamiento.
  • Interceptos variables por actor: Algunos chimpancés tiran más que otros.
  • Interceptos variables por bloque: Algunas sesiones experimentales tienen líneas base diferentes.

logit(pi)=α+βtreat[i]+αactor[i]+αblock[i]\text{logit}(p_i) = \alpha + \beta_{\text{treat}[i]} + \alpha_{\text{actor}[i]} + \alpha_{\text{block}[i]}

# Cross-classified chimpanzee model with varying slopes
set.seed(42)
n_actors <- 7
n_blocks <- 6
n_treatments <- 4
n_trials <- 200

# Simulate data

actor <- sample(1:n_actors, n_trials, replace = TRUE)
block <- sample(1:n_blocks, n_trials, replace = TRUE)
treatment <- sample(1:n_treatments, n_trials, replace = TRUE)

# True effects

a_bar <- 0
a_actor <- rnorm(n_actors, 0, 1.5)
a_block <- rnorm(n_blocks, 0, 0.5)
b_treatment <- c(0, 0.5, 0.3, 0.7) # treatment effects

# Generate outcome

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

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

# Fit cross-classified model

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

cat("Cross-classified chimpanzee model:\n")
cat(" Fixed effects (treatment baseline = 1):\n")
fe <- fixef(m)
for (i in seq_along(fe)) {
cat(sprintf(" %s: %.3f\n", names(fe)[i], fe[i]))
}
cat(" Random SD: actor =", round(attr(VarCorr(m)$actor, "stddev"), 3),
  "  block =", round(attr(VarCorr(m)$block, "stddev"), 3), "\n")
Click Run to execute this code in your browser with WebR

13.3.2 Añadiendo pendientes variables por actor

También podemos dejar que cada actor responda diferentemente al tratamiento:

logit(pi)=α+βtreat[i]+αactor[i]+βactor[i]⋅treati+αblock[i]\text{logit}(p_i) = \alpha + \beta_{\text{treat}[i]} + \alpha_{\text{actor}[i]} + \beta_{\text{actor}[i]} \cdot \text{treat}_i + \alpha_{\text{block}[i]}

# Cross-classified with varying slopes by actor
set.seed(42)
n_actors <- 7
n_blocks <- 6
n_trials <- 200

actor <- sample(1:n_actors, n_trials, replace = TRUE)
block <- sample(1:n_blocks, n_trials, replace = TRUE)
treatment <- sample(1:n_treatments, n_trials, replace = TRUE)

a_actor <- rnorm(n_actors, 0, 1.5)
a_block <- rnorm(n_blocks, 0, 0.5)
b_treatment <- c(0, 0.5, 0.3, 0.7)

# Actor-specific treatment deviations

b_actor_treat <- matrix(rnorm(n_actors * n_treatments, 0, 0.3), nrow = n_actors)

logit_p <- rep(0, n_trials)
for (i in 1:n_trials) {
logit_p[i] <- a_actor[actor[i]] + a_block[block[i]] +
b_treatment[treatment[i]] + b_actor_treat[actor[i], treatment[i]]
}
p <- 1 / (1 + exp(-logit_p))
y <- rbinom(n_trials, 1, p)

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

library(lme4)

# Varying intercepts + slopes by actor, varying intercepts by block

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

cat("Cross-classified with varying slopes:\n")
cat(" Fixed effects:\n")
fe <- fixef(m)
for (i in seq_along(fe)) {
cat(sprintf(" %s: %.3f\n", names(fe)[i], fe[i]))
}
cat(" Actor SD (intercept):", round(attr(VarCorr(m)$actor, "stddev")[1], 3), "\n")
cat("  Block SD (intercept):", round(attr(VarCorr(m)$block, "stddev"), 3), "\n")

cat("\n Varying slopes by actor allow each chimp\n")
cat(" to respond differently to each treatment.\n")
Click Run to execute this code in your browser with WebR
Rethinking

Más estructura, más encogimiento. Añadir pendientes variables por actor significa que el modelo estima más parámetros, pero no sobreajusta — porque cada pendiente se encoge hacia el promedio poblacional. Un actor con pocos ensayos en un tratamiento tendrá una pendiente cercana al promedio. Un actor con muchos ensayos puede desviarse más. Este es el poder del agrupamiento parcial: puede añadir estructura sin añadir complejidad incontrolada. El modelo aprende cuánta variación hay y ajusta el encogimiento en consecuencia.

Resumen de la Sección 13.3

  • Los modelos cruzados manejan múltiples efectos aleatorios cruzados simultáneamente.
  • Los efectos de actor y bloque están cruzados — cada actor aparece en cada bloque.
  • Las pendientes variables por actor permiten que cada chimpancé responda diferentemente a los tratamientos.
  • Más estructura no significa sobreajuste — el agrupamiento parcial controla la complejidad.
  • Use (1 + treatment | actor) + (1 | block) en lme4.