Simulation Based Calibration

Stan Development Team

2025年03月10日

Here is a Stan program for a beta-binomial model

data {
 int<lower = 1> N;
 real<lower = 0> a;
 real<lower = 0> b;
}
transformed data { // these adhere to the conventions above
 real pi_ = beta_rng(a, b);
 int y = binomial_rng(N, pi_);
}
parameters {
 real<lower = 0, upper = 1> pi;
}
model {
 target += beta_lpdf(pi | a, b);
 target += binomial_lpmf(y | N, pi);
}
generated quantities { // these adhere to the conventions above
 int y_ = y;
 vector[1] pars_;
 int ranks_[1] = {pi > pi_};
 vector[N] log_lik;
 pars_[1] = pi_;
 for (n in 1:y) log_lik[n] = bernoulli_lpmf(1 | pi);
 for (n in (y + 1):N) log_lik[n] = bernoulli_lpmf(0 | pi);
}

Notice that it adheres to the following conventions:

Assuming the above is compile to a code stanmodel named beta_binomial, we can then call the sbc function

output <-sbc(beta_binomial, data = list(N = 10, a = 1, b = 1), M = 500, refresh = 0) 

At which point, we can then call

print(output) 
## 0 chains had divergent transitions after warmup
plot(output, bins = 10) # it is best to specify the bins argument yourself 

References

Talts, S., Betancourt, M., Simpson, D., Vehtari, A., and Gelman, A. (2018). Validating Bayesian Inference Algorithms with Simulation-Based Calibration. arXiv preprint arXiv:1804.06788

AltStyle によって変換されたページ (->オリジナル) /