Main Site ↗

hierarchical-models

by benchflow-ai890173GitHub

Patterns for hierarchical/multilevel Bayesian models including random effects, partial pooling, and centered vs non-centered parameterizations.

Unlock Deep Analysis

Use AI to visualize the workflow and generate a realistic output preview for this skill.

Powered by Fastest LLM

Development
Compatible Agents
Claude Code
Claude Code
~/.claude/skills/
Codex CLI
Codex CLI
~/.codex/skills/
Gemini CLI
Gemini CLI
~/.gemini/skills/
O
OpenCode
~/.opencode/skills/
O
OpenClaw
~/.openclaw/skills/
GitHub Copilot
GitHub Copilot
~/.copilot/skills/
Cursor
Cursor
~/.cursor/skills/
W
Windsurf
~/.codeium/windsurf/skills/
C
Cline
~/.cline/skills/
R
Roo Code
~/.roo/skills/
K
Kiro
~/.kiro/skills/
J
Junie
~/.junie/skills/
A
Augment Code
~/.augment/skills/
W
Warp
~/.warp/skills/
G
Goose
~/.config/goose/skills/
SKILL.md

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)

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)

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

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

Source: https://github.com/benchflow-ai/SkillsBench#registry-terminal_bench_2.0-full_batch_reviewed-terminal_bench_2_0_mcmc-sampling-stan-environment-skills-hierarchical-models

Content curated from original sources, copyright belongs to authors

Grade B
-AI Score
Best Practices
Checking...
Try this Skill

User Rating

USER RATING

0UP
0DOWN
Loading files...

WORKS WITH

Claude Code
Claude
Codex CLI
Codex
Gemini CLI
Gemini
O
OpenCode
O
OpenClaw
GitHub Copilot
Copilot
Cursor
Cursor
W
Windsurf
C
Cline
R
Roo
K
Kiro
J
Junie
A
Augment
W
Warp
G
Goose