是否可以根据任意后验函数定义Stan模型?
我正在考虑类似MCMCPack的MCMCmetrop1R()功能,用户定义任意后验功能。如果有一个很好的例子可以解决这个问题,我可以深入研究C ++ API。
答案 0 :(得分:2)
从某种意义上讲,定义一个任意的后验分布是你可以用Stan语言做的。但是,如果您特指的是后验分布不是已经在Stan中定义的分布的组合,那么您可以使用increment_log_prob
函数将术语添加到log-posterior,无论它们是否属于数据的可能性或参数的先验。请参阅“自定义概率函数”和“用户定义函数”用户手册的章节。
stan-users Google小组的常见问题解答下有一个example,虽然它使用了不再使用lp__
功能直接操纵increment_log_prob
符号的弃用语法同一件事情。现在.stan文件将是
data {
int<lower=1> N;
real<lower=0,upper=1> x[N];
}
transformed data {
real sum_log_x; // calculate this constant only once
sum_log_x <- 0.0;
for (i in 1:N)
sum_log_x <- sum_log_x + log(x[i]);
}
parameters {
real<lower=0> a;
real<lower=0> b;
}
model {
real summands[N];
// put priors on a and b here if you want
// log-likelihood
increment_log_prob(N * (log(a) + log(b)) + (a - 1) * sum_log_x);
for (i in 1:N) {
summands[i] <- (b - 1) * log1m(pow(x[i],a)); // log1m(y) := log(1 - y)
}
increment_log_prob(summands);
}