Very simple hierarchical model divergencies - am I missing something obvious?

Hello Community,

I am fitting a test model, really simple. There are 2 hierarchies of normal distributions. I get divergencies and I don’t understand why. Is there anything obvious I am missing.

The only challenging aspect is that there is little data.

The model


data{
int N;
int K;
vector[N] y;
int idx[N];
}
parameters{
  real mu_mu;
  real<lower=0> mu_sigma;
  
  real<lower=0> sigma_mu;
  real<lower=0> sigma_sigma;
  
  vector<offset=mu_mu, multiplier=mu_sigma>[K] mu;
  vector<lower=0>[K] sigma;
  

}
model{
y ~ normal(mu[idx], sigma[idx]);

mu ~ normal(mu_mu, mu_sigma);
sigma~ normal(sigma_mu, sigma_sigma);

sigma_sigma ~ student_t(3, 0, 5);
mu_sigma ~ student_t(3, 0, 5);
}

Rscript to replicate

library(rstan)
library(tidyverse)

mod = "
data{
int N;
int K;
vector[N] y;
int idx[N];
}
parameters{
  real mu_mu;
  real<lower=0> mu_sigma;
  
  real<lower=0> sigma_mu;
  real<lower=0> sigma_sigma;
  
  vector<offset=mu_mu, multiplier=mu_sigma>[K] mu;
  vector<lower=0>[K] sigma;
  

}
model{
y ~ normal(mu[idx], sigma[idx]);

mu ~ normal(mu_mu, mu_sigma);
sigma~ normal(sigma_mu, sigma_sigma);

sigma_sigma ~ student_t(3, 0, 5);
mu_sigma ~ student_t(3, 0, 5);
}
"
my_mod = stan_model(model_code = mod)

.data = 
  tibble(idx = c(1,2), .mean = c(1, 2), .sigma = c(1, 1)) %>%
  mutate(y = map2(.mean, .sigma, ~ rnorm(100, .x, .y))) %>%
  unnest(y) 


fit = sampling(my_mod, data = list(N=nrow(.data), y = .data$y, idx = .data$idx, K=(.data$idx %>% unique %>% length)))

Although you see a funnel, I am using non-centered parametrization (trough offset and multiplier)

1 Like

As a first step in debugging, would it help if you used std_normal() here first? (and comment out hyperparameters for sigma)

sigma ~ std_normal()