我正在创建一个新模型,我想将其与使用WAIC的另一个模型进行比较。我知道我需要编写生成的数量块。但是,我正努力转换beta的logsumexp。我非常感谢任何线索/帮助。我的模型块看起来像这样:
model {
//prior for phi,b
phi ~ cauchy(0,5);
mu_b ~ normal(0,1);
sigma_b ~ cauchy(0,1);
mu ~ normal(0,1);
sigma ~ cauchy(0,1);
//model
log_b_z ~ normal(0, 1);
theta_raw ~ normal(mu, sigma);
for (i in 1:n) {
vector[number_segments] test;
for (j in 1:number_segments) {
test[j] = beta_lpdf(response[i] | p[j][i]*phi, (1-p[j][i])*phi) + log(prob_segment[j]);
}
target += log_sum_exp(test);
}
}
答案 0 :(得分:0)
您需要定义生成的数量块,以定义每个数据点的后验预测对数似然。
您可以通过这种方式进行混合,只需最少的重新计算。
transformed parameters {
vector[n] log_lik;
{
vector[number_semgnents log_prob_segment = log(prob_segment);
for (i in 1:n) {
vector[number_segments] lp = log_prob_segment;
for (j in 1:number_segments) {
lp[j] += beta_lpdf(response[i] | p[j, i] * phi, (1 - p[j, i]) * phi);
log_lik[i] = log_sum_exp(lp);
}
}
...
model {
target += sum(log_lik);
...
您还可以将log_lik
定义为生成数量 - 如果您可以对可能性进行矢量化(对于Stan中的混合物来说,这是不可能的话),效率会更高。
完成后,您可以使用loo包计算WAIC等,如插图和参考文献中所述。