1  Semana 1. Datos agrupados, dependencia y tipos de pooling

SP-1653 Modelos Mixtos

Autor/a

Programa de Posgrado en Estadística, Universidad de Costa Rica

Fecha de publicación

10 de agosto de 2026

1.1 Panorama de la semana

Esta primera semana introduce la idea que organizará buena parte del curso: cuando varias observaciones comparten contexto, historia, individuo, centro, parcela, escuela u otra unidad de agrupamiento, no conviene tratarlas como réplicas completamente independientes. El agrupamiento no es únicamente una característica descriptiva del conjunto de datos. Es parte del mecanismo que puede haber generado las observaciones y, por tanto, debe aparecer en el modelo cuando sea relevante para la pregunta científica.

El programa del curso sitúa esta discusión antes de introducir formalmente el coeficiente de correlación intraclase (ICC), las pendientes variables, el centrado o los modelos lineales generalizados mixtos. La meta de esta semana no es dominar todavía toda la teoría de los modelos jerárquicos, sino adquirir una forma de mirar los datos: identificar qué se observa, qué se comparte, qué puede variar entre grupos y qué información puede aprenderse conjuntamente (Gelman y Hill 2007, 237-58; Hox et al. 2018, 1-7).

La pregunta central es:

¿Por qué una regresión convencional puede ser inadecuada cuando las observaciones están agrupadas?

Responderemos esa pregunta comparando tres estrategias:

  • pooling completo: todos los grupos comparten exactamente el mismo parámetro;
  • ausencia de pooling (no pooling): cada grupo se estima por separado, sin aprender una distribución común entre grupos;
  • pooling parcial: cada grupo tiene su propio parámetro, pero esos parámetros están conectados mediante una distribución poblacional aprendida conjuntamente.

El contraste entre estas estrategias es una puerta de entrada natural a los modelos multinivel. Gelman y Hill presentan el pooling parcial como una característica central de los modelos multinivel, mientras McElreath lo conecta explícitamente con regularización y con el compromiso entre subajuste y sobreajuste (Gelman y Hill 2007, 252-58; McElreath 2020, 401-13).

Objetivos de aprendizaje

Al finalizar esta semana, se espera que la persona estudiante pueda:

  1. identificar la unidad de observación y una o más unidades de agrupamiento en un conjunto de datos;
  2. distinguir entre independencia marginal e independencia condicional en un modelo jerárquico sencillo;
  3. explicar por qué observaciones del mismo grupo pueden aportar menos información independiente que observaciones provenientes de grupos distintos;
  4. reconocer las consecuencias conceptuales y estadísticas de ignorar una estructura de agrupamiento relevante;
  5. distinguir pooling completo, ausencia de pooling y pooling parcial;
  6. escribir e interpretar un primer modelo generativo gaussiano con interceptos variables;
  7. explicar, de manera cualitativa, por qué el pooling parcial suele ser mayor en grupos con poca información;
  8. ajustar en brms las tres estrategias de pooling y comparar sus estimaciones;
  9. realizar una comprobación computacional y predictiva mínima de un modelo de interceptos variables;
  10. describir la estructura jerárquica preliminar de los datos que utilizará en el proyecto del curso.

1.2 Un problema motivador: diez centros con información desigual

Suponga que deseamos estimar una medida continua de desempeño en diez centros. Cada fila del conjunto de datos representa una persona, pero las personas pertenecen a centros distintos. Algunos centros aportan solamente seis u ocho observaciones; otros aportan treinta o cuarenta.

La estructura puede representarse como

\[ \text{persona } i \quad \text{dentro del centro } j. \]

Usaremos la notación

\[ i=1,\ldots,n_j, \qquad j=1,\ldots,J, \]

con \(n_j\) igual al número de observaciones del grupo \(j\) y \(J\) igual al número de grupos.

Este diseño plantea al menos tres preguntas diferentes:

  1. ¿Cuál es el nivel promedio de la respuesta en el conjunto de centros?
  2. ¿Cuál es el nivel promedio específico de cada centro observado?
  3. ¿Qué esperaríamos para un centro nuevo procedente de la misma población de centros?

Estas preguntas se parecen, pero no tienen el mismo estimando. Un modelo que solo contiene una media global puede ser suficiente para la primera, pero no para la segunda. Diez modelos completamente separados pueden describir los centros observados, pero no construyen por sí mismos una distribución explícita que permita aprender sobre un centro nuevo. El modelo multinivel crea un puente entre ambos extremos.

Esta distinción entre preguntas es importante desde el inicio. Un modelo no se justifica solo porque “los datos son jerárquicos”; se justifica en relación con la estructura del proceso y con las cantidades que queremos aprender o predecir. Esta manera de plantear el problema es coherente con el énfasis de Bayesian Workflow en relacionar cada componente del modelo con supuestos sustantivos y con su uso posterior (Gelman et al. 2026, 63-72).

1.2.1 Unidad de observación y unidad de agrupamiento

La unidad de observación es la entidad a la que corresponde una fila o una medición elemental del análisis. La unidad de agrupamiento identifica conjuntos de observaciones que comparten algún componente del proceso generador.

Ejemplos típicos son:

Unidad de observación Unidad de agrupamiento Fuente posible de semejanza
estudiante escuela o aula recursos, docentes, selección, vecindario
paciente hospital protocolos, personal, región, equipamiento
parcela finca suelo, manejo, clima local
medición individuo fisiología, historia personal
año-región región estructura económica o institucional persistente
producto lote materia prima y proceso de fabricación

Hox, Moerbeek y van de Schoot enfatizan que las estructuras multinivel aparecen cuando las unidades de nivel inferior se encuentran dentro de contextos de nivel superior; incluyen como ejemplos estudiantes dentro de aulas o escuelas, personas dentro de países, miembros dentro de familias y observaciones repetidas dentro de individuos (Hox et al. 2018, 1-2). Gelman y Hill amplían esta idea a datos agrupados, mediciones repetidas y estructuras que no necesariamente son una jerarquía perfectamente anidada (Gelman y Hill 2007, 237-44).

ImportanteLa jerarquía no la determina el archivo

Que una columna llamada grupo aparezca en una base de datos no basta para justificar un modelo multinivel. La pregunta es si las observaciones comparten componentes relevantes del proceso generador y si esa estructura importa para la inferencia o la predicción que queremos realizar.

1.3 ¿Dónde se pierde la independencia?

Una regresión gaussiana ordinaria suele escribirse como

\[ y_i = \mu_i + \varepsilon_i, \qquad \varepsilon_i \overset{\text{iid}}{\sim} \mathcal N(0,\sigma^2). \]

La notación iid expresa dos afirmaciones: los errores siguen la misma distribución y son independientes. Cuando varias unidades comparten un contexto no modelado, la segunda afirmación puede ser inadecuada.

Hox et al. señalan que, en muestras jerárquicas, las observaciones individuales generalmente no son independientes. En el ejemplo educativo, estudiantes de la misma escuela pueden parecerse por selección y por experiencias compartidas; si se ignora esa dependencia, los errores estándar obtenidos con métodos convencionales pueden ser demasiado pequeños (Hox et al. 2018, 4-5). En este curso nos interesa una formulación aún más directa: representar probabilísticamente el componente que comparten las observaciones.

1.3.1 Un mecanismo generador sencillo

Supongamos que cada grupo tiene su propio nivel medio \(\alpha_j\). Una observación se genera en dos etapas:

\[ \alpha_j \sim \mathcal N(\mu_\alpha,\tau_\alpha^2), \]

\[ y_{ij}\mid\alpha_j,\sigma \sim \mathcal N(\alpha_j,\sigma^2). \]

Equivalentemente,

\[ y_{ij}=\alpha_j+\varepsilon_{ij}, \qquad \varepsilon_{ij}\sim\mathcal N(0,\sigma^2). \]

El término \(\alpha_j\) es compartido por todas las observaciones del grupo \(j\). Esa sola característica basta para producir dependencia marginal.

1.3.1.1 Independencia condicional

Si conocemos \(\alpha_j\), las observaciones \(y_{1j},\ldots,y_{n_j j}\) pueden modelarse como independientes:

\[ p(y_{1j},\ldots,y_{n_j j}\mid \alpha_j,\sigma) = \prod_{i=1}^{n_j}p(y_{ij}\mid\alpha_j,\sigma). \]

La independencia es, por tanto, condicional al parámetro grupal.

1.3.1.2 Dependencia marginal

Ahora imaginemos que no condicionamos en \(\alpha_j\) sino que integramos la heterogeneidad entre grupos. Dos observaciones del mismo grupo contienen el mismo término aleatorio \(\alpha_j\):

\[ y_{ij}=\alpha_j+\varepsilon_{ij}, \qquad y_{i'j}=\alpha_j+\varepsilon_{i'j}. \]

Entonces, para \(i\neq i'\),

\[ \begin{aligned} \operatorname{Cov}(y_{ij},y_{i'j}) &=\operatorname{Cov}(\alpha_j+\varepsilon_{ij}, \alpha_j+\varepsilon_{i'j})\\ &=\operatorname{Var}(\alpha_j)\\ &=\tau_\alpha^2, \end{aligned} \]

si los errores individuales son independientes del intercepto grupal y entre sí.

Esta derivación es una elaboración directa a partir del modelo generativo. No requiere introducir todavía toda la teoría del ICC. La semana 2 retomará este resultado, combinará \(\tau_\alpha^2\) con la varianza marginal \(\tau_\alpha^2+\sigma^2\) y desarrollará formalmente el coeficiente de correlación intraclase.

NotaDos nociones de independencia

No hay contradicción en decir que las observaciones son independientes condicionalmente a \(\alpha_j\) y dependientes marginalmente. En modelos jerárquicos, la pregunta “¿son independientes?” está incompleta si no se especifica respecto de qué variables se está condicionando.

1.3.2 Pseudorreplicación

En estas notas usaremos pseudorreplicación como una etiqueta pedagógica para el error de tratar unidades fuertemente vinculadas por un componente compartido como si fueran réplicas independientes de ese componente.

Por ejemplo, medir 100 estudiantes en una sola escuela no equivale, para aprender variación entre escuelas, a medir un estudiante en cada una de 100 escuelas. En ambos casos hay 100 filas, pero la información sobre el nivel superior es radicalmente distinta.

El problema no es que “tener muchas observaciones por grupo sea malo”. Al contrario, esas observaciones pueden ser muy informativas acerca del grupo. El problema aparece cuando confundimos cantidad de filas con cantidad de unidades independientes para la pregunta relevante.

1.4 Tres estrategias para aprender sobre los grupos

La idea de pooling describe cuánto se comparte información entre grupos. Los tres casos siguientes son modelos diferentes, no simples opciones de software.

1.4.1 Pooling completo

En pooling completo se supone que todos los grupos comparten la misma media:

\[ y_{ij}\mid\mu,\sigma \sim \mathcal N(\mu,\sigma^2). \]

El índice \(j\) aparece en los datos, pero no tiene ninguna función en el modelo para la media. Toda observación informa el mismo parámetro \(\mu\).

Ventaja. Si los grupos fueran realmente indistinguibles en su media, combinar todos los datos produciría una estimación eficiente.

Costo. Si existe heterogeneidad sistemática entre grupos, el modelo la fuerza a entrar en el término residual y no puede representar diferencias reales de nivel entre grupos.

En palabras operativas: el pooling completo dice que para la cantidad que estamos modelando, las etiquetas de grupo no aportan estructura adicional.

1.4.2 Ausencia de pooling

En el extremo contrario, asignamos una media independiente a cada grupo:

\[ y_{ij}\mid\alpha_j,\sigma \sim \mathcal N(\alpha_j,\sigma^2), \qquad j=1,\ldots,J. \]

En un análisis bayesiano todavía debemos especificar una distribución previa para cada \(\alpha_j\). Para representar ausencia de pooling, esas previas pueden ser independientes con hiperparámetros fijados de antemano, por ejemplo

\[ \alpha_j \overset{\text{ind}}{\sim}\mathcal N(m_0,s_0^2), \]

sin aprender \(m_0\) ni \(s_0\) de la colección de grupos.

Esto es importante: no pooling no significa “sin prior”. Significa que la información observada en el grupo A no modifica una distribución poblacional común que a su vez informe al grupo B. Los grupos no aprenden unos de otros a través de una jerarquía compartida.

Gelman y Hill presentan la regresión con indicadores de grupo como una forma de no pooling y destacan que las estimaciones de grupos con poca información pueden ser muy imprecisas (Gelman y Hill 2007, 252-54; 2007, 270-71).

1.4.3 Pooling parcial

El modelo multinivel permite que cada grupo tenga su propio intercepto, pero supone que esos interceptos proceden de una distribución común:

\[ y_{ij}\mid\alpha_j,\sigma \sim \mathcal N(\alpha_j,\sigma^2), \]

\[ \alpha_j \mid \mu_\alpha,\tau_\alpha \sim \mathcal N( \mu_\alpha,\tau_\alpha^2). \]

Los parámetros \(\mu_\alpha\) y \(\tau_\alpha\) describen la población de interceptos:

  • \(\mu_\alpha\): nivel medio de los grupos;
  • \(\tau_\alpha\): heterogeneidad entre los interceptos de los grupos;
  • \(\sigma\): heterogeneidad de las observaciones alrededor del intercepto de su grupo.

La estructura es jerárquica porque un conjunto de parámetros, \(\alpha_1,\ldots,\alpha_J\), recibe a su vez un modelo probabilístico. BDA desarrolla esta lógica en términos de una distribución poblacional para parámetros intercambiables (Gelman et al. 2013, 101-8).

McElreath enfatiza la misma idea con el lenguaje de efectos variables: se estima un intercepto para cada grupo y simultáneamente se aprende la distribución común que conecta esos interceptos (McElreath 2020, 401-6).

1.4.4 Un continuo, no tres cajas aisladas

El pooling parcial se entiende mejor como un compromiso adaptativo entre los dos extremos. En un modelo normal simple, si tratáramos provisionalmente \(\mu_\alpha\), \(\tau_\alpha\) y \(\sigma\) como conocidos, la información de un grupo sobre \(\alpha_j\) proviene de dos fuentes:

  • su media observada \(\bar y_j\), cuya incertidumbre disminuye cuando \(n_j\) aumenta;
  • la distribución poblacional centrada en \(\mu_\alpha\).

El promedio posterior tiene la forma

\[ E(\alpha_j \mid\mathbf y_j,\mu_\alpha,\tau_\alpha,\sigma) = w_j\bar y_j+(1-w_j)\mu_\alpha, \]

con

\[ w_j= \frac{n_j\tau_\alpha^2} {n_j\tau_\alpha^2+\sigma^2}. \]

Gelman y Hill muestran esta estructura de promedio ponderado para los coeficientes grupales (Gelman y Hill 2007, 258). Aquí la usamos solamente para visualizar la lógica del pooling. La semana 2 estudiará con más detalle el shrinkage, su magnitud y su relación con las componentes de variación.

Observe dos propiedades inmediatas:

  • cuando \(n_j\) crece, \(w_j\) se acerca a 1 y la estimación depende más de los datos del propio grupo;
  • cuando \(n_j\) es pequeño, la distribución entre grupos tiene mayor influencia.

McElreath ilustra esta propiedad con tanques de renacuajos de diferentes tamaños: los grupos pequeños muestran mayor contracción hacia el promedio poblacional, mientras los grupos grandes permanecen más cerca de sus proporciones empíricas (McElreath 2020, 405-6). En sus simulaciones, el pooling parcial reduce el error promedio con especial claridad en los grupos pequeños, aunque no tiene por qué ganar en cada grupo individual (McElreath 2020, 412-13).

1.5 Intercambiabilidad: ¿por qué podemos compartir información?

Es tentador justificar un modelo jerárquico diciendo simplemente: “los grupos pertenecen a la misma población”. Esa frase es útil, pero necesita precisión.

BDA introduce la intercambiabilidad como una idea para construir modelos jerárquicos (Gelman et al. 2013, 104-8). Para esta semana basta una interpretación operativa: antes de observar los resultados de los grupos, no disponemos de una razón modelada para asignar a dos grupos con la misma información de covariables distribuciones diferentes de sus parámetros.

Esto no significa que los grupos sean idénticos. De hecho, el modelo existe precisamente porque esperamos diferencias. Significa que las diferencias se representan mediante una distribución común antes de incorporar información que las explique.

Si sabemos, por ejemplo, que hospitales públicos y privados pertenecen a mecanismos claramente distintos y esperamos diferencias sistemáticas, quizá no convenga tratarlos como intercambiables sin más. Una posibilidad es introducir el tipo de hospital como predictor de nivel grupal. Ese desarrollo se abordará en semanas posteriores.

AdvertenciaIntercambiabilidad no es semejanza perfecta

El supuesto jerárquico no afirma \(\alpha_1=\cdots=\alpha_J\). Afirma que los \(\alpha_j\) pueden describirse mediante una distribución común condicionada en la información que el modelo haya incorporado.

1.6 Terminología: interceptos variables y “efectos aleatorios”

La literatura utiliza varias expresiones para modelos muy cercanos: multilevel, hierarchical, mixed effects, random coefficients y otras. Además, “efecto fijo” y “efecto aleatorio” tienen definiciones distintas en diferentes tradiciones.

Gelman y Hill enumeran varias definiciones incompatibles de “fixed” y “random” y recomiendan centrarse en qué coeficientes varían y cómo se modela esa variación (Gelman y Hill 2007, 244-46). Bürkner adopta una decisión terminológica similar en brms, distinguiendo parámetros de nivel poblacional y de nivel grupal, y señala que los segundos siguen siendo parámetros cuya incertidumbre interesa (Bürkner 2017, 2-4). McElreath también advierte que la terminología cambia entre comunidades y que la formulación matemática del modelo es la referencia menos ambigua (McElreath 2020, 400-401).

Por ello, en estas notas preferiremos:

  • intercepto variable: un intercepto \(\alpha_j\) que cambia entre grupos;
  • pendiente variable: una pendiente \(\beta_j\) que cambia entre grupos;
  • parámetros de nivel grupal: las desviaciones o coeficientes asociados con la agrupación;
  • efectos aleatorios: se mencionará cuando sea necesario conectar con la literatura y el software tradicional.

1.7 El modelo generativo de la semana

Nuestro modelo base es

\[ \begin{aligned} y_{ij} &\sim \mathcal N(\alpha_j,\sigma^2),\\ \alpha_j &\sim \mathcal N(\mu_\alpha,\tau_\alpha^2). \end{aligned} \]

Para completar el modelo bayesiano necesitamos previas para los hiperparámetros. En un problema real deben justificarse usando la escala y conocimiento sustantivo. Para el ejemplo simulado de esta semana, cuya respuesta tendrá valores típicos alrededor de 50 unidades, utilizaremos:

\[ \begin{aligned} \mu_\alpha &\sim \mathcal N(50,20^2),\\ \tau_\alpha &\sim \operatorname{Normal}^{+}(0,10^2),\\ \sigma &\sim \operatorname{Exponential}(0.1). \end{aligned} \]

El superíndice \(+\) indica truncamiento a valores positivos. Estas previas son pedagógicas y dependientes de la escala del ejemplo; no constituyen recomendaciones universales.

La semana 6 desarrollará con detalle la especificación y la comprobación predictiva de previas. Por ahora interesa notar una regla básica: una jerarquía bayesiana no está completa si se escribe una distribución para \(\alpha_j\) pero se dejan sin especificar los parámetros que gobiernan esa distribución.

1.7.1 Dos convenciones para la distribución normal

En las ecuaciones de estas notas escribiremos

\[ \mathcal N(\mu,\sigma^2) \]

para indicar media y varianza. En brms y Stan, en cambio, normal(mu, sigma) utiliza media y desviación estándar. La distinción evita errores de escala cuando pasemos de la formulación matemática al código.

1.8 Laboratorio reproducible en R

El objetivo del laboratorio es simular diez grupos de tamaños distintos y comparar, usando exactamente los mismos datos, pooling completo, no pooling y pooling parcial. Esta actividad sigue la lógica comparativa desarrollada por Gelman y Hill y McElreath (Gelman y Hill 2007, 252-58; McElreath 2020, 408-13).

1.8.1 Preparación

El código usa brms con cmdstanr como backend. La comprobación de paquetes se hace de forma explícita para que un entorno incompleto falle con un mensaje informativo en lugar de producir errores más adelante.

1.8.2 Simulación del proceso generador

Generaremos diez grupos. Los tamaños son deliberadamente desiguales para que podamos observar que la cantidad de pooling no tiene por qué ser la misma en todos los grupos.

J <- 10
n_j <- c(6, 8, 10, 12, 15, 18, 22, 28, 35, 45)

mu_alpha_real  <- 50
tau_alpha_real <- 8
sigma_real     <- 10

niveles_grupo <- sprintf("G%02d", seq_len(J))

parametros_grupo <- tibble(
  grupo = factor(niveles_grupo, levels = niveles_grupo),
  n = n_j,
  alpha_real = rnorm(J, mean = mu_alpha_real, sd = tau_alpha_real)
)

datos <- parametros_grupo |>
  tidyr::uncount(n, .id = "i") |>
  mutate(
    y = rnorm(n(), mean = alpha_real, sd = sigma_real)
  )

stopifnot(
  !anyNA(datos),
  nlevels(datos$grupo) == J,
  all(count(datos, grupo)$n == n_j)
)

count(datos, grupo)
# A tibble: 10 × 2
   grupo     n
   <fct> <int>
 1 G01       6
 2 G02       8
 3 G03      10
 4 G04      12
 5 G05      15
 6 G06      18
 7 G07      22
 8 G08      28
 9 G09      35
10 G10      45

La simulación corresponde exactamente a

\[\alpha_j\sim\mathcal N(50,8^2), \qquad y_{ij}\sim\mathcal N(\alpha_j,10^2). \]

Conocemos los valores verdaderos porque nosotros generamos los datos. Esto nos permitirá comparar las estrategias no solo entre sí, sino también contra el proceso simulado.

1.8.3 Inspección gráfica

 ggplot(datos, aes(x = grupo, y = y)) +
  geom_jitter(width = 0.12, height = 0, alpha = 0.55) +
  geom_point(
    data = parametros_grupo,
    aes(x = grupo, y = alpha_real),
    shape = 4,
    size = 3,
    stroke = 1
  ) +
  labs(
    x = "Grupo",
    y = "Respuesta",
    subtitle = "Las cruces indican los interceptos verdaderos de la simulación"
  ) +
  theme_minimal(base_size = 12)
Figura 1.1: Datos simulados por grupo. La línea corta marca el valor verdadero del intercepto usado para generar cada grupo. Los tamaños de grupo son desiguales.

Dos rasgos son importantes. Primero, existen diferencias reales entre los centros. Segundo, la precisión con que podemos aprender el nivel de cada centro varía porque los \(n_j\) son diferentes.

1.8.4 Modelo 1: pooling completo

El primer modelo ignora la agrupación en la media:

\[ y_{ij}\sim\mathcal N(\mu,\sigma^2). \]

prior_pool <- c(
  prior(normal(50, 20), class = "Intercept"),
  prior(exponential(0.1), class = "sigma")
)

fit_pool <- brm(
  y ~ 1,
  data = datos,
  family = gaussian(),
  prior = prior_pool,
  chains = 4,
  iter = 2000,
  warmup = 1000,
  seed = 1653,
  backend = "cmdstanr",
  file = "_fits/semana01_pool",
  file_refit = "on_change"
)
Running MCMC with 4 parallel chains...

Chain 1 Iteration:    1 / 2000 [  0%]  (Warmup) 
Chain 1 Iteration:  100 / 2000 [  5%]  (Warmup) 
Chain 1 Iteration:  200 / 2000 [ 10%]  (Warmup) 
Chain 1 Iteration:  300 / 2000 [ 15%]  (Warmup) 
Chain 1 Iteration:  400 / 2000 [ 20%]  (Warmup) 
Chain 1 Iteration:  500 / 2000 [ 25%]  (Warmup) 
Chain 1 Iteration:  600 / 2000 [ 30%]  (Warmup) 
Chain 1 Iteration:  700 / 2000 [ 35%]  (Warmup) 
Chain 1 Iteration:  800 / 2000 [ 40%]  (Warmup) 
Chain 1 Iteration:  900 / 2000 [ 45%]  (Warmup) 
Chain 1 Iteration: 1000 / 2000 [ 50%]  (Warmup) 
Chain 1 Iteration: 1001 / 2000 [ 50%]  (Sampling) 
Chain 1 Iteration: 1100 / 2000 [ 55%]  (Sampling) 
Chain 1 Iteration: 1200 / 2000 [ 60%]  (Sampling) 
Chain 1 Iteration: 1300 / 2000 [ 65%]  (Sampling) 
Chain 1 Iteration: 1400 / 2000 [ 70%]  (Sampling) 
Chain 1 Iteration: 1500 / 2000 [ 75%]  (Sampling) 
Chain 1 Iteration: 1600 / 2000 [ 80%]  (Sampling) 
Chain 1 Iteration: 1700 / 2000 [ 85%]  (Sampling) 
Chain 1 Iteration: 1800 / 2000 [ 90%]  (Sampling) 
Chain 1 Iteration: 1900 / 2000 [ 95%]  (Sampling) 
Chain 1 Iteration: 2000 / 2000 [100%]  (Sampling) 
Chain 2 Iteration:    1 / 2000 [  0%]  (Warmup) 
Chain 2 Iteration:  100 / 2000 [  5%]  (Warmup) 
Chain 2 Iteration:  200 / 2000 [ 10%]  (Warmup) 
Chain 2 Iteration:  300 / 2000 [ 15%]  (Warmup) 
Chain 2 Iteration:  400 / 2000 [ 20%]  (Warmup) 
Chain 2 Iteration:  500 / 2000 [ 25%]  (Warmup) 
Chain 2 Iteration:  600 / 2000 [ 30%]  (Warmup) 
Chain 2 Iteration:  700 / 2000 [ 35%]  (Warmup) 
Chain 2 Iteration:  800 / 2000 [ 40%]  (Warmup) 
Chain 2 Iteration:  900 / 2000 [ 45%]  (Warmup) 
Chain 2 Iteration: 1000 / 2000 [ 50%]  (Warmup) 
Chain 2 Iteration: 1001 / 2000 [ 50%]  (Sampling) 
Chain 2 Iteration: 1100 / 2000 [ 55%]  (Sampling) 
Chain 2 Iteration: 1200 / 2000 [ 60%]  (Sampling) 
Chain 2 Iteration: 1300 / 2000 [ 65%]  (Sampling) 
Chain 2 Iteration: 1400 / 2000 [ 70%]  (Sampling) 
Chain 2 Iteration: 1500 / 2000 [ 75%]  (Sampling) 
Chain 2 Iteration: 1600 / 2000 [ 80%]  (Sampling) 
Chain 2 Iteration: 1700 / 2000 [ 85%]  (Sampling) 
Chain 2 Iteration: 1800 / 2000 [ 90%]  (Sampling) 
Chain 2 Iteration: 1900 / 2000 [ 95%]  (Sampling) 
Chain 2 Iteration: 2000 / 2000 [100%]  (Sampling) 
Chain 3 Iteration:    1 / 2000 [  0%]  (Warmup) 
Chain 3 Iteration:  100 / 2000 [  5%]  (Warmup) 
Chain 3 Iteration:  200 / 2000 [ 10%]  (Warmup) 
Chain 3 Iteration:  300 / 2000 [ 15%]  (Warmup) 
Chain 3 Iteration:  400 / 2000 [ 20%]  (Warmup) 
Chain 3 Iteration:  500 / 2000 [ 25%]  (Warmup) 
Chain 3 Iteration:  600 / 2000 [ 30%]  (Warmup) 
Chain 3 Iteration:  700 / 2000 [ 35%]  (Warmup) 
Chain 3 Iteration:  800 / 2000 [ 40%]  (Warmup) 
Chain 3 Iteration:  900 / 2000 [ 45%]  (Warmup) 
Chain 3 Iteration: 1000 / 2000 [ 50%]  (Warmup) 
Chain 3 Iteration: 1001 / 2000 [ 50%]  (Sampling) 
Chain 3 Iteration: 1100 / 2000 [ 55%]  (Sampling) 
Chain 3 Iteration: 1200 / 2000 [ 60%]  (Sampling) 
Chain 3 Iteration: 1300 / 2000 [ 65%]  (Sampling) 
Chain 3 Iteration: 1400 / 2000 [ 70%]  (Sampling) 
Chain 3 Iteration: 1500 / 2000 [ 75%]  (Sampling) 
Chain 3 Iteration: 1600 / 2000 [ 80%]  (Sampling) 
Chain 3 Iteration: 1700 / 2000 [ 85%]  (Sampling) 
Chain 3 Iteration: 1800 / 2000 [ 90%]  (Sampling) 
Chain 3 Iteration: 1900 / 2000 [ 95%]  (Sampling) 
Chain 3 Iteration: 2000 / 2000 [100%]  (Sampling) 
Chain 4 Iteration:    1 / 2000 [  0%]  (Warmup) 
Chain 4 Iteration:  100 / 2000 [  5%]  (Warmup) 
Chain 4 Iteration:  200 / 2000 [ 10%]  (Warmup) 
Chain 4 Iteration:  300 / 2000 [ 15%]  (Warmup) 
Chain 4 Iteration:  400 / 2000 [ 20%]  (Warmup) 
Chain 4 Iteration:  500 / 2000 [ 25%]  (Warmup) 
Chain 4 Iteration:  600 / 2000 [ 30%]  (Warmup) 
Chain 4 Iteration:  700 / 2000 [ 35%]  (Warmup) 
Chain 4 Iteration:  800 / 2000 [ 40%]  (Warmup) 
Chain 4 Iteration:  900 / 2000 [ 45%]  (Warmup) 
Chain 4 Iteration: 1000 / 2000 [ 50%]  (Warmup) 
Chain 4 Iteration: 1001 / 2000 [ 50%]  (Sampling) 
Chain 4 Iteration: 1100 / 2000 [ 55%]  (Sampling) 
Chain 4 Iteration: 1200 / 2000 [ 60%]  (Sampling) 
Chain 4 Iteration: 1300 / 2000 [ 65%]  (Sampling) 
Chain 4 Iteration: 1400 / 2000 [ 70%]  (Sampling) 
Chain 4 Iteration: 1500 / 2000 [ 75%]  (Sampling) 
Chain 4 Iteration: 1600 / 2000 [ 80%]  (Sampling) 
Chain 4 Iteration: 1700 / 2000 [ 85%]  (Sampling) 
Chain 4 Iteration: 1800 / 2000 [ 90%]  (Sampling) 
Chain 4 Iteration: 1900 / 2000 [ 95%]  (Sampling) 
Chain 4 Iteration: 2000 / 2000 [100%]  (Sampling) 
Chain 1 finished in 0.0 seconds.
Chain 2 finished in 0.0 seconds.
Chain 3 finished in 0.0 seconds.
Chain 4 finished in 0.0 seconds.

All 4 chains finished successfully.
Mean chain execution time: 0.0 seconds.
Total execution time: 0.4 seconds.

Este modelo produce una sola estimación de nivel para todos los grupos. Si se pide una predicción media para G01 y G10 bajo este modelo, ambas son iguales porque la etiqueta de grupo no participa en el predictor lineal.

1.8.5 Modelo 2: ausencia de pooling

Ahora asignamos un intercepto separado a cada grupo:

\[ y_{ij}\sim\mathcal N(\alpha_j,\sigma^2). \]

En brms, 0 + grupo crea un coeficiente para cada nivel del factor.

prior_nopool <- c(
  prior(normal(50, 20), class = "b"),
  prior(exponential(0.1), class = "sigma")
)

fit_nopool <- brm(
  y ~ 0 + grupo,
  data = datos,
  family = gaussian(),
  prior = prior_nopool,
  chains = 4,
  iter = 2000,
  warmup = 1000,
  seed = 1653,
  backend = "cmdstanr",
  file = "_fits/semana01_nopool",
  file_refit = "on_change"
)
Running MCMC with 4 parallel chains...

Chain 1 Iteration:    1 / 2000 [  0%]  (Warmup) 
Chain 1 Iteration:  100 / 2000 [  5%]  (Warmup) 
Chain 1 Iteration:  200 / 2000 [ 10%]  (Warmup) 
Chain 1 Iteration:  300 / 2000 [ 15%]  (Warmup) 
Chain 1 Iteration:  400 / 2000 [ 20%]  (Warmup) 
Chain 1 Iteration:  500 / 2000 [ 25%]  (Warmup) 
Chain 1 Iteration:  600 / 2000 [ 30%]  (Warmup) 
Chain 1 Iteration:  700 / 2000 [ 35%]  (Warmup) 
Chain 1 Iteration:  800 / 2000 [ 40%]  (Warmup) 
Chain 1 Iteration:  900 / 2000 [ 45%]  (Warmup) 
Chain 1 Iteration: 1000 / 2000 [ 50%]  (Warmup) 
Chain 1 Iteration: 1001 / 2000 [ 50%]  (Sampling) 
Chain 1 Iteration: 1100 / 2000 [ 55%]  (Sampling) 
Chain 1 Iteration: 1200 / 2000 [ 60%]  (Sampling) 
Chain 1 Iteration: 1300 / 2000 [ 65%]  (Sampling) 
Chain 1 Iteration: 1400 / 2000 [ 70%]  (Sampling) 
Chain 1 Iteration: 1500 / 2000 [ 75%]  (Sampling) 
Chain 1 Iteration: 1600 / 2000 [ 80%]  (Sampling) 
Chain 1 Iteration: 1700 / 2000 [ 85%]  (Sampling) 
Chain 1 Iteration: 1800 / 2000 [ 90%]  (Sampling) 
Chain 1 Iteration: 1900 / 2000 [ 95%]  (Sampling) 
Chain 1 Iteration: 2000 / 2000 [100%]  (Sampling) 
Chain 2 Iteration:    1 / 2000 [  0%]  (Warmup) 
Chain 2 Iteration:  100 / 2000 [  5%]  (Warmup) 
Chain 2 Iteration:  200 / 2000 [ 10%]  (Warmup) 
Chain 2 Iteration:  300 / 2000 [ 15%]  (Warmup) 
Chain 2 Iteration:  400 / 2000 [ 20%]  (Warmup) 
Chain 2 Iteration:  500 / 2000 [ 25%]  (Warmup) 
Chain 2 Iteration:  600 / 2000 [ 30%]  (Warmup) 
Chain 2 Iteration:  700 / 2000 [ 35%]  (Warmup) 
Chain 2 Iteration:  800 / 2000 [ 40%]  (Warmup) 
Chain 2 Iteration:  900 / 2000 [ 45%]  (Warmup) 
Chain 2 Iteration: 1000 / 2000 [ 50%]  (Warmup) 
Chain 2 Iteration: 1001 / 2000 [ 50%]  (Sampling) 
Chain 2 Iteration: 1100 / 2000 [ 55%]  (Sampling) 
Chain 2 Iteration: 1200 / 2000 [ 60%]  (Sampling) 
Chain 2 Iteration: 1300 / 2000 [ 65%]  (Sampling) 
Chain 2 Iteration: 1400 / 2000 [ 70%]  (Sampling) 
Chain 2 Iteration: 1500 / 2000 [ 75%]  (Sampling) 
Chain 2 Iteration: 1600 / 2000 [ 80%]  (Sampling) 
Chain 2 Iteration: 1700 / 2000 [ 85%]  (Sampling) 
Chain 2 Iteration: 1800 / 2000 [ 90%]  (Sampling) 
Chain 2 Iteration: 1900 / 2000 [ 95%]  (Sampling) 
Chain 2 Iteration: 2000 / 2000 [100%]  (Sampling) 
Chain 3 Iteration:    1 / 2000 [  0%]  (Warmup) 
Chain 3 Iteration:  100 / 2000 [  5%]  (Warmup) 
Chain 3 Iteration:  200 / 2000 [ 10%]  (Warmup) 
Chain 3 Iteration:  300 / 2000 [ 15%]  (Warmup) 
Chain 3 Iteration:  400 / 2000 [ 20%]  (Warmup) 
Chain 3 Iteration:  500 / 2000 [ 25%]  (Warmup) 
Chain 3 Iteration:  600 / 2000 [ 30%]  (Warmup) 
Chain 3 Iteration:  700 / 2000 [ 35%]  (Warmup) 
Chain 3 Iteration:  800 / 2000 [ 40%]  (Warmup) 
Chain 3 Iteration:  900 / 2000 [ 45%]  (Warmup) 
Chain 3 Iteration: 1000 / 2000 [ 50%]  (Warmup) 
Chain 3 Iteration: 1001 / 2000 [ 50%]  (Sampling) 
Chain 3 Iteration: 1100 / 2000 [ 55%]  (Sampling) 
Chain 3 Iteration: 1200 / 2000 [ 60%]  (Sampling) 
Chain 3 Iteration: 1300 / 2000 [ 65%]  (Sampling) 
Chain 3 Iteration: 1400 / 2000 [ 70%]  (Sampling) 
Chain 3 Iteration: 1500 / 2000 [ 75%]  (Sampling) 
Chain 3 Iteration: 1600 / 2000 [ 80%]  (Sampling) 
Chain 3 Iteration: 1700 / 2000 [ 85%]  (Sampling) 
Chain 3 Iteration: 1800 / 2000 [ 90%]  (Sampling) 
Chain 3 Iteration: 1900 / 2000 [ 95%]  (Sampling) 
Chain 3 Iteration: 2000 / 2000 [100%]  (Sampling) 
Chain 4 Iteration:    1 / 2000 [  0%]  (Warmup) 
Chain 4 Iteration:  100 / 2000 [  5%]  (Warmup) 
Chain 4 Iteration:  200 / 2000 [ 10%]  (Warmup) 
Chain 4 Iteration:  300 / 2000 [ 15%]  (Warmup) 
Chain 4 Iteration:  400 / 2000 [ 20%]  (Warmup) 
Chain 4 Iteration:  500 / 2000 [ 25%]  (Warmup) 
Chain 4 Iteration:  600 / 2000 [ 30%]  (Warmup) 
Chain 4 Iteration:  700 / 2000 [ 35%]  (Warmup) 
Chain 4 Iteration:  800 / 2000 [ 40%]  (Warmup) 
Chain 4 Iteration:  900 / 2000 [ 45%]  (Warmup) 
Chain 4 Iteration: 1000 / 2000 [ 50%]  (Warmup) 
Chain 4 Iteration: 1001 / 2000 [ 50%]  (Sampling) 
Chain 4 Iteration: 1100 / 2000 [ 55%]  (Sampling) 
Chain 4 Iteration: 1200 / 2000 [ 60%]  (Sampling) 
Chain 4 Iteration: 1300 / 2000 [ 65%]  (Sampling) 
Chain 4 Iteration: 1400 / 2000 [ 70%]  (Sampling) 
Chain 4 Iteration: 1500 / 2000 [ 75%]  (Sampling) 
Chain 4 Iteration: 1600 / 2000 [ 80%]  (Sampling) 
Chain 4 Iteration: 1700 / 2000 [ 85%]  (Sampling) 
Chain 4 Iteration: 1800 / 2000 [ 90%]  (Sampling) 
Chain 4 Iteration: 1900 / 2000 [ 95%]  (Sampling) 
Chain 4 Iteration: 2000 / 2000 [100%]  (Sampling) 
Chain 1 finished in 0.1 seconds.
Chain 2 finished in 0.0 seconds.
Chain 3 finished in 0.1 seconds.
Chain 4 finished in 0.0 seconds.

All 4 chains finished successfully.
Mean chain execution time: 0.1 seconds.
Total execution time: 0.2 seconds.

Los coeficientes tienen la misma forma de prior, pero son independientes y los parámetros de esa prior están fijados. Los datos de G01 no actualizan un hiperparámetro que después ayude a G02. Esta es la diferencia estructural relevante con el modelo siguiente.

1.8.6 Modelo 3: pooling parcial

prior_partial <- c(
  prior(normal(50, 20), class = "Intercept"),
  prior(normal(0, 10), class = "sd"),
  prior(exponential(0.1), class = "sigma")
)

fit_partial <- brm(
  y ~ 1 + (1 | grupo),
  data = datos,
  family = gaussian(),
  prior = prior_partial,
  chains = 4,
  iter = 2000,
  warmup = 1000,
  seed = 1653,
  backend = "cmdstanr",
  file = "_fits/semana01_partial",
  file_refit = "on_change"
)
Running MCMC with 4 parallel chains...

Chain 1 Iteration:    1 / 2000 [  0%]  (Warmup) 
Chain 1 Iteration:  100 / 2000 [  5%]  (Warmup) 
Chain 1 Iteration:  200 / 2000 [ 10%]  (Warmup) 
Chain 1 Iteration:  300 / 2000 [ 15%]  (Warmup) 
Chain 1 Iteration:  400 / 2000 [ 20%]  (Warmup) 
Chain 1 Iteration:  500 / 2000 [ 25%]  (Warmup) 
Chain 1 Iteration:  600 / 2000 [ 30%]  (Warmup) 
Chain 1 Iteration:  700 / 2000 [ 35%]  (Warmup) 
Chain 1 Iteration:  800 / 2000 [ 40%]  (Warmup) 
Chain 2 Iteration:    1 / 2000 [  0%]  (Warmup) 
Chain 2 Iteration:  100 / 2000 [  5%]  (Warmup) 
Chain 2 Iteration:  200 / 2000 [ 10%]  (Warmup) 
Chain 2 Iteration:  300 / 2000 [ 15%]  (Warmup) 
Chain 2 Iteration:  400 / 2000 [ 20%]  (Warmup) 
Chain 2 Iteration:  500 / 2000 [ 25%]  (Warmup) 
Chain 2 Iteration:  600 / 2000 [ 30%]  (Warmup) 
Chain 3 Iteration:    1 / 2000 [  0%]  (Warmup) 
Chain 3 Iteration:  100 / 2000 [  5%]  (Warmup) 
Chain 3 Iteration:  200 / 2000 [ 10%]  (Warmup) 
Chain 3 Iteration:  300 / 2000 [ 15%]  (Warmup) 
Chain 3 Iteration:  400 / 2000 [ 20%]  (Warmup) 
Chain 3 Iteration:  500 / 2000 [ 25%]  (Warmup) 
Chain 3 Iteration:  600 / 2000 [ 30%]  (Warmup) 
Chain 3 Iteration:  700 / 2000 [ 35%]  (Warmup) 
Chain 3 Iteration:  800 / 2000 [ 40%]  (Warmup) 
Chain 3 Iteration:  900 / 2000 [ 45%]  (Warmup) 
Chain 4 Iteration:    1 / 2000 [  0%]  (Warmup) 
Chain 4 Iteration:  100 / 2000 [  5%]  (Warmup) 
Chain 4 Iteration:  200 / 2000 [ 10%]  (Warmup) 
Chain 4 Iteration:  300 / 2000 [ 15%]  (Warmup) 
Chain 4 Iteration:  400 / 2000 [ 20%]  (Warmup) 
Chain 4 Iteration:  500 / 2000 [ 25%]  (Warmup) 
Chain 4 Iteration:  600 / 2000 [ 30%]  (Warmup) 
Chain 1 Iteration:  900 / 2000 [ 45%]  (Warmup) 
Chain 1 Iteration: 1000 / 2000 [ 50%]  (Warmup) 
Chain 1 Iteration: 1001 / 2000 [ 50%]  (Sampling) 
Chain 1 Iteration: 1100 / 2000 [ 55%]  (Sampling) 
Chain 1 Iteration: 1200 / 2000 [ 60%]  (Sampling) 
Chain 1 Iteration: 1300 / 2000 [ 65%]  (Sampling) 
Chain 1 Iteration: 1400 / 2000 [ 70%]  (Sampling) 
Chain 1 Iteration: 1500 / 2000 [ 75%]  (Sampling) 
Chain 1 Iteration: 1600 / 2000 [ 80%]  (Sampling) 
Chain 1 Iteration: 1700 / 2000 [ 85%]  (Sampling) 
Chain 1 Iteration: 1800 / 2000 [ 90%]  (Sampling) 
Chain 1 Iteration: 1900 / 2000 [ 95%]  (Sampling) 
Chain 2 Iteration:  700 / 2000 [ 35%]  (Warmup) 
Chain 2 Iteration:  800 / 2000 [ 40%]  (Warmup) 
Chain 2 Iteration:  900 / 2000 [ 45%]  (Warmup) 
Chain 2 Iteration: 1000 / 2000 [ 50%]  (Warmup) 
Chain 2 Iteration: 1001 / 2000 [ 50%]  (Sampling) 
Chain 2 Iteration: 1100 / 2000 [ 55%]  (Sampling) 
Chain 2 Iteration: 1200 / 2000 [ 60%]  (Sampling) 
Chain 2 Iteration: 1300 / 2000 [ 65%]  (Sampling) 
Chain 3 Iteration: 1000 / 2000 [ 50%]  (Warmup) 
Chain 3 Iteration: 1001 / 2000 [ 50%]  (Sampling) 
Chain 3 Iteration: 1100 / 2000 [ 55%]  (Sampling) 
Chain 3 Iteration: 1200 / 2000 [ 60%]  (Sampling) 
Chain 3 Iteration: 1300 / 2000 [ 65%]  (Sampling) 
Chain 3 Iteration: 1400 / 2000 [ 70%]  (Sampling) 
Chain 3 Iteration: 1500 / 2000 [ 75%]  (Sampling) 
Chain 3 Iteration: 1600 / 2000 [ 80%]  (Sampling) 
Chain 3 Iteration: 1700 / 2000 [ 85%]  (Sampling) 
Chain 4 Iteration:  700 / 2000 [ 35%]  (Warmup) 
Chain 4 Iteration:  800 / 2000 [ 40%]  (Warmup) 
Chain 4 Iteration:  900 / 2000 [ 45%]  (Warmup) 
Chain 4 Iteration: 1000 / 2000 [ 50%]  (Warmup) 
Chain 4 Iteration: 1001 / 2000 [ 50%]  (Sampling) 
Chain 4 Iteration: 1100 / 2000 [ 55%]  (Sampling) 
Chain 4 Iteration: 1200 / 2000 [ 60%]  (Sampling) 
Chain 4 Iteration: 1300 / 2000 [ 65%]  (Sampling) 
Chain 1 Iteration: 2000 / 2000 [100%]  (Sampling) 
Chain 2 Iteration: 1400 / 2000 [ 70%]  (Sampling) 
Chain 2 Iteration: 1500 / 2000 [ 75%]  (Sampling) 
Chain 2 Iteration: 1600 / 2000 [ 80%]  (Sampling) 
Chain 2 Iteration: 1700 / 2000 [ 85%]  (Sampling) 
Chain 2 Iteration: 1800 / 2000 [ 90%]  (Sampling) 
Chain 2 Iteration: 1900 / 2000 [ 95%]  (Sampling) 
Chain 2 Iteration: 2000 / 2000 [100%]  (Sampling) 
Chain 3 Iteration: 1800 / 2000 [ 90%]  (Sampling) 
Chain 3 Iteration: 1900 / 2000 [ 95%]  (Sampling) 
Chain 3 Iteration: 2000 / 2000 [100%]  (Sampling) 
Chain 4 Iteration: 1400 / 2000 [ 70%]  (Sampling) 
Chain 4 Iteration: 1500 / 2000 [ 75%]  (Sampling) 
Chain 4 Iteration: 1600 / 2000 [ 80%]  (Sampling) 
Chain 4 Iteration: 1700 / 2000 [ 85%]  (Sampling) 
Chain 4 Iteration: 1800 / 2000 [ 90%]  (Sampling) 
Chain 4 Iteration: 1900 / 2000 [ 95%]  (Sampling) 
Chain 4 Iteration: 2000 / 2000 [100%]  (Sampling) 
Chain 1 finished in 0.3 seconds.
Chain 2 finished in 0.3 seconds.
Chain 3 finished in 0.3 seconds.
Chain 4 finished in 0.3 seconds.

All 4 chains finished successfully.
Mean chain execution time: 0.3 seconds.
Total execution time: 0.4 seconds.

La fórmula

y ~ 1 + (1 | grupo)

representa un intercepto poblacional y desviaciones de intercepto que varían entre los niveles de grupo. Bürkner describe esta separación entre parámetros poblacionales y grupales en la formulación general de brms (Bürkner 2017, 2-4). Bayesian Workflow presenta la misma sintaxis para un modelo gaussiano de interceptos variables y explicita las previas para el intercepto, la desviación estándar grupal y la desviación estándar residual (Gelman et al. 2026, 280-83).

1.8.7 Comprobación predictiva previa mínima

La calibración sistemática de previas se trabajará en la semana 6. Sin embargo, incluso aquí podemos preguntar qué clase de respuestas implica el conjunto de previas antes de observar los datos.

El siguiente código simula manualmente una observación de un grupo genérico desde la jerarquía previa. Se hace manualmente para que el mecanismo sea transparente.

set.seed(1654)
S <- 5000

prior_predictiva <- tibble(
  mu = rnorm(S, 50, 20),
  tau = abs(rnorm(S, 0, 10)),
  sigma = rexp(S, rate = 0.1),
  alpha = rnorm(S, mu, tau),
  y_rep = rnorm(S, alpha, sigma)
)

ggplot(prior_predictiva, aes(x = y_rep)) +
  geom_density() +
  labs(
    x = expression(y^rep),
    y = "Densidad",
    subtitle = "Simulación antes de condicionar en los datos observados"
  ) +
  theme_minimal(base_size = 12)
Figura 1.2: Distribución predictiva previa pedagógica para una observación de un grupo genérico. No debe interpretarse como una previa universal.

La pregunta correcta no es si la curva “se ve bonita”, sino si los valores que genera son compatibles con lo que consideraríamos plausible para la variable de respuesta. En esta simulación artificial conocemos la escala; en una aplicación real esa valoración debe hacerse con conocimiento sustantivo.

1.8.8 Diagnóstico computacional mínimo

El curso dedicará la semana 7 a HMC, \(\widehat R\), ESS, divergencias y parametrizaciones. Aquí solo establecemos el hábito de no interpretar un ajuste sin verificar primero que el muestreo parece utilizable.

vars_clave <- c("b_Intercept", "sd_grupo__Intercept", "sigma")

posterior::summarise_draws(
  posterior::as_draws_array(fit_partial),
  "mean", "sd", "rhat", "ess_bulk", "ess_tail"
) |>
  filter(variable %in% vars_clave)
# A tibble: 3 × 6
  variable             mean    sd  rhat ess_bulk ess_tail
  <chr>               <dbl> <dbl> <dbl>    <dbl>    <dbl>
1 b_Intercept         51.6  3.38   1.00     873.    1248.
2 sd_grupo__Intercept  9.92 2.56   1.00     873.    1527.
3 sigma                9.94 0.509  1.00    2591.    2533.
bayesplot::mcmc_trace(
  as.array(fit_partial),
  pars = vars_clave
)
Figura 1.3: Trazas MCMC de tres parámetros principales del modelo de pooling parcial. La interpretación formal de estos diagnósticos se desarrollará en la semana 7.

En esta etapa basta comprobar que:

  • las cuatro cadenas exploran regiones similares;
  • \(\widehat R\) se encuentra muy cerca de 1;
  • los tamaños efectivos de muestra no son alarmantemente pequeños.

No se debe concluir que el modelo sustantivo es adecuado solo porque las cadenas convergen. Un algoritmo puede muestrear perfectamente de un modelo mal especificado.

1.8.9 Comparación de las tres estrategias

Extraeremos la distribución posterior de la media esperada para cada grupo bajo los tres modelos.

nuevos_grupos <- datos |>
  distinct(grupo) |>
  arrange(grupo)

resumir_epred <- function(fit, estrategia) {
  nuevos_grupos |>
    tidybayes::add_epred_draws(fit, ndraws = 1000) |>
    group_by(grupo) |>
    summarise(
      estimacion = median(.epred),
      q05 = quantile(.epred, 0.05),
      q95 = quantile(.epred, 0.95),
      .groups = "drop"
    ) |>
    mutate(estrategia = estrategia)
}

resumen_modelos <- bind_rows(
  resumir_epred(fit_pool, "Pooling completo"),
  resumir_epred(fit_nopool, "No pooling"),
  resumir_epred(fit_partial, "Pooling parcial")
) |>
  left_join(
    parametros_grupo |>
      select(grupo, n, alpha_real),
    by = "grupo"
  )

medias_observadas <- datos |>
  group_by(grupo) |>
  summarise(media_observada = mean(y), .groups = "drop")

resumen_modelos <- resumen_modelos |>
  left_join(medias_observadas, by = "grupo")

resumen_modelos
# A tibble: 30 × 8
   grupo estimacion   q05   q95 estrategia          n alpha_real media_observada
   <fct>      <dbl> <dbl> <dbl> <chr>           <dbl>      <dbl>           <dbl>
 1 G01         50.8  49.2  52.4 Pooling comple…     6       57.9            53.1
 2 G02         50.8  49.2  52.4 Pooling comple…     8       46.8            49.9
 3 G03         50.8  49.2  52.4 Pooling comple…    10       55.4            55.7
 4 G04         50.8  49.2  52.4 Pooling comple…    12       62.2            65.2
 5 G05         50.8  49.2  52.4 Pooling comple…    15       37.5            36.7
 6 G06         50.8  49.2  52.4 Pooling comple…    18       60.6            60.8
 7 G07         50.8  49.2  52.4 Pooling comple…    22       50.8            54.1
 8 G08         50.8  49.2  52.4 Pooling comple…    28       46.6            45.8
 9 G09         50.8  49.2  52.4 Pooling comple…    35       37.2            37.1
10 G10         50.8  49.2  52.4 Pooling comple…    45       56.6            58.8
# ℹ 20 more rows
resumen_modelos |>
  mutate(
    estrategia = factor(
      estrategia,
      levels = c("Pooling completo", "No pooling", "Pooling parcial")
    )
  ) |>
  ggplot(aes(x = grupo, y = estimacion)) +
  geom_point(
    aes(y = media_observada),
    alpha = 0.35,
    inherit.aes = TRUE
  ) +
  geom_linerange(aes(ymin = q05, ymax = q95)) +
  geom_point(size = 2) +
  geom_point(aes(y = alpha_real), shape = 4, size = 3, stroke = 1) +
  facet_wrap(~ estrategia, ncol = 1) +
  labs(
    x = "Grupo",
    y = "Media esperada del grupo",
    subtitle = "Intervalos posteriores centrales de 90%"
  ) +
  theme_minimal(base_size = 12)
Figura 1.4: Estimaciones por grupo bajo las tres estrategias de pooling. La cruz marca el valor verdadero de la simulación y el punto tenue la media observada de cada grupo.

La figura debe leerse comparando la estructura, no buscando un ganador mecánico:

  • pooling completo produce esencialmente la misma media esperada para todos los grupos;
  • no pooling permite que cada estimación siga de cerca la información de su propio grupo;
  • pooling parcial conserva heterogeneidad, pero mueve las estimaciones hacia una distribución común, sobre todo cuando el grupo aporta poca información.

McElreath insiste en un punto importante: pooling parcial no garantiza una menor pérdida para cada grupo en cada conjunto de datos. La ventaja es de regularización y desempeño esperado bajo situaciones en que una población común es una aproximación razonable (McElreath 2020, 408-13).

1.8.10 ¿Cuánto ayudó cada estrategia en esta simulación?

Como conocemos \(\alpha_j\) en el experimento simulado, podemos calcular el error absoluto de la mediana posterior para cada grupo. Esto es una ventaja de los experimentos con datos simulados: permiten comprobar si recuperamos cantidades que en datos reales serían desconocidas.

resumen_error <- resumen_modelos |>
  mutate(error_abs = abs(estimacion - alpha_real)) |>
  group_by(estrategia) |>
  summarise(
    error_abs_medio = mean(error_abs),
    error_abs_mediano = median(error_abs),
    .groups = "drop"
  )

resumen_error
# A tibble: 3 × 3
  estrategia       error_abs_medio error_abs_mediano
  <chr>                      <dbl>             <dbl>
1 No pooling                  1.79              1.41
2 Pooling completo            7.37              6.40
3 Pooling parcial             1.61              1.15

No usaremos este resultado para seleccionar una estrategia en futuros análisis. Aquí podemos calcularlo porque sabemos la verdad generadora. En una aplicación real, el objetivo será construir modelos científicamente defendibles y evaluarlos mediante comprobaciones y validación apropiadas a la pregunta predictiva.

1.9 Comprobación predictiva posterior

Una vez ajustado el modelo, podemos simular datos replicados desde la distribución predictiva posterior y compararlos con lo observado. Esta lógica es central en análisis bayesiano (Gelman et al. 2013, chap. 6) y será transversal durante todo el curso.

Empezamos con una comparación global de densidades.

pp_check(fit_partial, type = "dens_overlay", ndraws = 50)
Figura 1.5: Comprobación predictiva posterior global del modelo de pooling parcial.

Una comprobación global puede ocultar problemas grupales. Por eso también conviene examinar resúmenes por grupo.

pp_check(
  fit_partial,
  type = "stat_grouped",
  stat = "mean",
  group = "grupo"
)
Figura 1.6: Comprobación predictiva posterior de la media por grupo. Esta vista pregunta si el modelo reproduce la heterogeneidad observada entre grupos.

La pregunta no es “¿el modelo reproduce cada punto?”. Un modelo probabilístico adecuado no debe copiar los datos. Preguntamos si genera conjuntos de datos que se parecen a lo observado en aspectos relevantes para el propósito del análisis.

1.10 ¿Qué ocurre al introducir un predictor?

La estructura fundamental se conserva si añadimos un predictor individual \(x_{ij}\) con una pendiente común:

\[ y_{ij}\sim \mathcal N(\alpha_j+\beta x_{ij},\sigma^2), \]

\[ \alpha_j\sim\mathcal N(\mu_\alpha,\tau_\alpha^2). \]

La sintaxis básica sería

brm(
  y ~ x + (1 | grupo),
  data = datos,
  family = gaussian(),
  ...
)

Aquí \(\beta\) no varía entre grupos, mientras \(\alpha_j\) sí. Más adelante distinguiremos predictores individuales y grupales, estudiaremos centrado y permitiremos que las pendientes también varíen. Por ahora la extensión sirve para reconocer que un modelo multinivel no reemplaza a la regresión: la amplía incorporando estructura en los coeficientes y en la dependencia.

1.11 Qué puede salir mal si ignoramos el agrupamiento

  1. Incertidumbre mal caracterizada

Si un componente compartido genera correlación dentro de grupos y el modelo trata todas las observaciones como independientes, puede atribuir a las filas más información independiente de la que realmente aportan. Hox et al. destacan que esta situación puede conducir a errores estándar demasiado pequeños en análisis convencionales (Hox et al. 2018, 4-5).

En un análisis bayesiano el problema se expresa de forma más general: la posterior se construye bajo un modelo de datos equivocado. No basta con cambiar la interpretación del intervalo; es necesario representar la dependencia pertinente en el modelo.

  1. Confundir variación dentro y entre grupos

Una nube de datos puede contener variación a distintas escalas. Si se mezclan todas las observaciones sin representar los grupos, una asociación entre grupos puede parecer una asociación individual, o viceversa. La descomposición formal dentro/entre y el centrado se estudiarán en la semana 3, pero desde ahora debemos identificar los niveles en los que viven las variables.

  1. Sobreinterpretar grupos pequeños

Con no pooling, un grupo con pocas observaciones puede presentar una media extrema por variación muestral. Si cada grupo se interpreta aisladamente, es fácil confundir ruido con heterogeneidad real. El pooling parcial regulariza estas estimaciones mediante la información conjunta.

  1. Borrar heterogeneidad real

El problema contrario ocurre con pooling completo. Si todos los grupos son forzados a compartir exactamente la misma media, se pierde una fuente potencialmente importante de variación. Un buen modelo multinivel evita elegir de forma rígida entre “todos iguales” y “todos incomparables”.

1.12 Errores frecuentes de interpretación

“Hay una variable categórica de grupo, entonces debo usar un modelo mixto.”
No necesariamente. La estructura debe justificarse por el proceso y la pregunta. Una categoría con tres tratamientos diseñados no tiene automáticamente el mismo papel que 80 escuelas muestreadas de una población de escuelas.

“No pooling significa que no hay ninguna regularización bayesiana.”
No. Puede haber previas independientes para cada grupo. Lo que falta es una distribución poblacional aprendida conjuntamente que conecte los parámetros grupales.

“Pooling parcial supone que todos los grupos son casi iguales.”
No. La cantidad de heterogeneidad se representa mediante \(\tau_\alpha\). Si los datos apoyan gran heterogeneidad, los interceptos pueden permanecer muy separados.

“El grupo pequeño siempre debe moverse mucho hacia la media.”
El tamaño del grupo es importante, pero no es el único elemento. También intervienen la variabilidad residual, la heterogeneidad entre grupos y las previas.

“Si \(\widehat R\approx1\), el modelo es correcto.”
No. Eso se refiere al comportamiento de las cadenas, no a la adecuación sustantiva ni predictiva del modelo.

“Efecto aleatorio significa que el efecto carece de interés.”
No. Esa es solo una de varias convenciones históricas y no es una regla general. En este curso preferiremos describir explícitamente qué coeficientes varían.

1.13 Hito del proyecto: mapa de la estructura de datos

El proyecto se inicia esta semana. Antes de elegir una familia compleja o escribir una fórmula de brms, prepare una descripción de la arquitectura de sus datos.

Entregue una página o una diapositiva con los siguientes elementos:

  1. Pregunta de investigación preliminar. ¿Qué cantidad desea explicar, estimar o predecir?
  2. Unidad de observación. ¿Qué representa una fila?
  3. Variable de respuesta. Tipo, unidad y rango plausible.
  4. Agrupamiento principal. ¿Qué observaciones comparten contexto o historia?
  5. Número de grupos. Incluya el número total y el rango de tamaños por grupo.
  6. Posibles niveles adicionales. Por ejemplo, estudiantes dentro de aulas dentro de escuelas.
  7. Estructura no anidada. Indique si una unidad puede pertenecer a más de un contexto relevante.
  8. Variables medidas en distintos niveles. Separe, provisionalmente, variables individuales y grupales.
  9. Pregunta predictiva. ¿Interesa predecir nuevas observaciones en grupos ya vistos, grupos nuevos, o ambas cosas?
  10. Riesgo principal de ignorar el agrupamiento. Explíquelo en lenguaje sustantivo.

Una tabla mínima útil es:

Elemento Descripción del proyecto
Unidad de observación
Respuesta
Agrupamiento principal
\(J\)
Mínimo \(n_j\)
Mediana \(n_j\)
Máximo \(n_j\)
¿Nuevos grupos son parte de la meta predictiva?

El objetivo no es comprometerse todavía con el modelo final, sino hacer explícita la estructura que el modelo tendrá que representar.

1.14 Síntesis

Los datos agrupados exigen distinguir la unidad observada de la unidad que induce dependencia. En un modelo de interceptos variables, varias observaciones comparten \(\alpha_j\). Condicionalmente a ese intercepto pueden ser independientes, pero marginalmente no lo son.

Los tres tipos de pooling representan tres supuestos estructurales:

\[ \text{pooling completo} \quad\longleftrightarrow\quad \text{una sola media}, \]

\[ \text{no pooling} \quad\longleftrightarrow\quad \text{medias separadas sin una jerarquía aprendida}, \]

\[ \text{pooling parcial} \quad\longleftrightarrow\quad \text{medias grupales conectadas por una distribución común}. \]

El pooling parcial permite que grupos con mucha información hablen principalmente por sí mismos y que grupos con poca información se beneficien más de la población de grupos. Esta regularización no es un ajuste posterior añadido al modelo: surge de la propia estructura probabilística jerárquica.

La próxima semana profundizará en el modelo de interceptos variables, las componentes de variación, el ICC, la magnitud del shrinkage y la predicción para grupos existentes y nuevos.

1.15 Ejercicios

1.15.1 Ejercicios conceptuales

1.15.1.1 Ejercicio 1. ¿Cuál es el grupo?

Para cada situación, identifique una unidad de observación y al menos una unidad de agrupamiento plausible. Explique qué mecanismo podría inducir dependencia.

  1. Presión arterial medida cuatro veces a cada paciente en cinco clínicas.
  2. Rendimiento de 300 parcelas pertenecientes a 20 fincas.
  3. Calificaciones de 2 000 estudiantes en 80 cursos impartidos por 25 docentes.
  4. Tiempo de resolución de solicitudes atendidas por 40 oficinas regionales.

En el caso 3, discuta por qué la estructura podría no corresponder a una jerarquía simple.

1.15.1.2 Ejercicio 2. Condicional versus marginal

Considere

\[ y_{ij}=\alpha_j+\varepsilon_{ij}, \qquad \alpha_j\sim\mathcal N(0,4), \qquad \varepsilon_{ij}\sim\mathcal N(0,9). \]

  1. Explique por qué \(y_{1j}\) y \(y_{2j}\) pueden considerarse independientes condicionalmente en \(\alpha_j\).
  2. Calcule \(\operatorname{Cov}(y_{1j},y_{2j})\) marginalmente.
  3. ¿Qué cambiaría si las dos observaciones pertenecieran a grupos distintos y los interceptos de grupo fueran independientes?
  4. Sin calcular todavía el ICC, explique qué ocurriría con la semejanza dentro del grupo si la varianza de \(\alpha_j\) aumentara mucho.

1.15.1.3 Ejercicio 3. Tres afirmaciones para criticar

Explique qué tiene de problemático cada enunciado.

  1. “Tenemos 500 filas, por lo tanto tenemos 500 observaciones independientes.”
  2. “Para evitar sesgos, lo más seguro es estimar cada escuela por separado.”
  3. “Como las escuelas son diferentes, no tiene sentido compartir información entre ellas.”

1.15.2 Ejercicios computacionales

1.15.2.1 Ejercicio 4. Cambiar el desbalance

Modifique n_j para que cinco grupos tengan \(n_j=4\) y cinco tengan \(n_j=50\).

  1. Simule nuevamente los datos manteniendo \(\mu_\alpha=50\), \(\tau_\alpha=8\) y \(\sigma=10\).
  2. Ajuste no pooling y pooling parcial.
  3. Grafique las estimaciones de cada grupo.
  4. Describa cómo cambia la separación entre ambas estrategias según el tamaño del grupo.
  5. Repita la simulación con otra semilla. ¿Se conserva exactamente el patrón para cada grupo? ¿Qué patrón general permanece?

1.15.2.2 Ejercicio 5. Cambiar la heterogeneidad entre grupos

Mantenga los tamaños originales y compare tres escenarios:

\[ \tau_\alpha\in{2,8,20}. \]

Para cada escenario:

  1. genere un conjunto de datos;
  2. ajuste el modelo de pooling parcial;
  3. grafique la media observada y la mediana posterior de cada intercepto grupal;
  4. describa cómo cambia la magnitud aparente del pooling;
  5. explique por qué este experimento muestra que el tamaño de grupo no es el único determinante del shrinkage.

1.15.3 Ejercicio de lectura crítica

Un informe presenta una regresión lineal de resultados de aprendizaje para 1 500 estudiantes de 12 escuelas. Incluye predictores individuales, pero no identifica la escuela en el modelo. El informe afirma que “la gran muestra garantiza estimaciones precisas”.

Redacte una crítica de 200 a 300 palabras que:

  • distinga número de estudiantes y número de escuelas;
  • explique una posible fuente de dependencia;
  • indique qué aspecto de la incertidumbre podría estar mal caracterizado;
  • proponga al menos un modelo inicial alternativo;
  • señale qué información adicional necesitaría antes de afirmar que el modelo multinivel es superior.

1.16 Lecturas para profundizar

Para esta semana se recomienda priorizar:

Como complemento:

  • Gelman et al., BDA3, §§5.1–5.2: construcción de modelos jerárquicos e intercambiabilidad (Gelman et al. 2013, 101-8).
  • Hox et al., cap. 1: estructura jerárquica, agregación/desagregación y dependencia (Hox et al. 2018, 1-7).
  • Bürkner: formulación de modelos multinivel en brms y terminología de parámetros poblacionales y grupales (Bürkner 2017, 1-5).
  • Gelman et al., Bayesian Workflow, cap. 5 y §17.2: relación entre supuestos sustantivos, modelo generativo y especificación de modelos lineales multinivel en brms (Gelman et al. 2026, 63-97; 2026, 280-83).