为 WAIC(逻辑层次 stan 模型)编写对数似然

Writing log likelihood for WAIC (logistic hierarchal stan model)

我正在创建一个新模型,我想将其与另一个使用 WAIC 的模型进行比较。我知道我需要编写一个生成的数量块。但是,我正在努力转换 beta 的 logsumexp。我将不胜感激 leads/help。我的模型块如下所示:

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);
   }
}

您需要定义一个生成的数量块来定义每个数据点的后验预测对数似然。

您可以通过这种方式对混合物进行最少的重新计算。

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 等,如小插图和参考资料中所述。