使正态分布参数在stan程序中不居中。
decentralise的Python项目详细描述
分散
使(某些)斯坦程序不自动居中。
灵感来自阅读this paper。
安装
需要Python3.6+。
安装时使用pip
:
pip install decentralise
示例
这个包提供了一个命令行工具:decentralise
,使用如下:
decentralise <input-file> <output-destination>
它将接受任何正态分布的参数,这些参数的方差本身就是参数,并重新参数化它们以使它们不居中。 例如,规范的八所学校代码是:
data {
int<lower=0> J; // number of schools
vector[J] y; // estimated treatment effects
vector<lower=0>[J] sigma; // s.e. of effect estimates
}
parameters {
real mu;
real<lower=0> tau;
vector[J] theta;
}
model {
theta ~ normal(mu, tau);
y ~ normal(theta, sigma);
}
应用decentralise
后,此程序变为
data {
int<lower=0> J; // number of schools
vector[J] y; // estimated treatment effects
vector<lower=0>[J] sigma; // s.e. of effect estimates
}
parameters {
real mu;
real<lower=0> tau;
vector[J] theta_std;
}
transformed parameters {
vector[J] theta = mu + theta_std * tau;
}
model {
theta_std ~ normal(0, 1);
y ~ normal(theta, sigma);
}
我写这个工具是为了好玩,还没有彻底测试过。 例如,对于采样语句未矢量化的任何参数,它都将失败。 例如:
x ~ normal(mu, tau);
会起作用,但
for i in (1:n) {
x[i] ~ normal(mu, tau);
}
不会的。 可能还有很多其他的情况下,它会打破,我没有预料到,以及!