Patterns for hierarchical/multilevel Bayesian models including random effects, partial pooling, and centered vs non-centered parameterizations.
Scanned 9/7/2026
Install to Claude Code
npx -y skills add choxos/BiostatAgent --skill hierarchical-models --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Hierarchical Models?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/choxos-hierarchical-models)More formats (shields.io, HTML) on the badges page.
---
name: hierarchical-models
description: Patterns for hierarchical/multilevel Bayesian models including random effects, partial pooling, and centered vs non-centered parameterizations.
---
# Hierarchical Models
## When to Use
- Nested/grouped data (students in schools, patients in hospitals)
- Repeated measurements on subjects
- Meta-analysis with study-level variation
- Partial pooling between complete pooling and no pooling
## Core Concept: Partial Pooling
```
Group means shrink toward overall mean based on:
- Within-group sample size
- Within-group variance
- Between-group variance
```
## Stan Implementation
### Centered Parameterization (Default)
```stan
data {
int<lower=0> N; // Total observations
int<lower=0> J; // Number of groups
array[N] int<lower=1,upper=J> group;
vector[N] y;
}
parameters {
real mu; // Population mean
real<lower=0> tau; // Between-group SD
real<lower=0> sigma; // Within-group SD
vector[J] theta; // Group means
}
model {
// Hyperpriors
mu ~ normal(0, 10);
tau ~ cauchy(0, 2.5);
sigma ~ exponential(1);
// Group effects
theta ~ normal(mu, tau);
// Likelihood
y ~ normal(theta[group], sigma);
}
```
### Non-Centered Parameterization (Better for weak data/small tau)
```stan
parameters {
real mu;
real<lower=0> tau;
real<lower=0> sigma;
vector[J] theta_raw; // Standard normal
}
transformed parameters {
vector[J] theta = mu + tau * theta_raw;
}
model {
theta_raw ~ std_normal();
// ... rest same
}
```
**When to use non-centered**: Divergences, small tau, few observations per group.
## JAGS Implementation
```
model {
for (i in 1:N) {
y[i] ~ dnorm(theta[group[i]], tau.y)
}
for (j in 1:J) {
theta[j] ~ dnorm(mu, tau.theta)
}
# Hyperpriors
mu ~ dnorm(0, 0.0001)
tau.theta <- pow(sigma.theta, -2)
sigma.theta ~ dunif(0, 100)
tau.y <- pow(sigma.y, -2)
sigma.y ~ dunif(0, 100)
}
```
## Classic Example: Eight Schools
```stan
data {
int<lower=0> J;
array[J] real y; // Observed effects
array[J] real<lower=0> sigma; // Known SEs
}
parameters {
real mu;
real<lower=0> tau;
vector[J] theta_raw;
}
transformed parameters {
vector[J] theta = mu + tau * theta_raw;
}
model {
mu ~ normal(0, 5);
tau ~ cauchy(0, 5);
theta_raw ~ std_normal();
y ~ normal(theta, sigma);
}
```
## Diagnostics
- Check tau posterior (very small → use non-centered)
- Divergences often indicate centered/non-centered mismatch
- Compare to no-pooling and complete-pooling models
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!