评估 rstan 中未见数据的对数似然

Evaluating log-likelihood of unseen data in rstan

我知道我可以在采样期间计算每个样本的对数似然,例如

...

model {

  for (i in 1:N) {
    (y[i] - 1) ~ bernoulli(p[i, 2]);
  }

}

generated quantities {

  vector[N] log_lik;
  for (i in 1:N){
    log_lik[i] = bernoulli_lpmf((y[i] - 1) | p[i, 2]);
  }

}

拟合后,我可以使用 loo 包提取对数似然:

log_lik_m <- extract_log_lik(stan_fit)

但我想评估未见数据的对数似然性。这在 brms:

中是可能的
ll <- log_lik(fit_star, newdata = new_df)

但我想用 rstan 来做这件事,因为我不能轻易地在 brms 中定义我的模型(我假设)。

作为参考,我正在尝试使用估计的 LFO-CV 来评估和比较我的时间序列模型。 (例如 https://github.com/paul-buerkner/LFO-CV-paper/blob/master/sim_functions.R#L186

(https://mc-stan.org/loo/articles/loo2-lfo.html)

感谢@dipetkov 的link,我自己解决了这个问题。我没有使用 link 中的确切方法,而是想出了一个替代方法。您可以从 R 中调用 stan 函数来计算模型的对数似然,即使数据是未知的(而且速度非常快!)。

首先,我将 transformed parameters 块中的所有内容放入 stan 的 functions 块中的函数中。然后,我创建了第二个函数来包装第一个函数,并评估给定观察的对数似然并提供参数估计(然后我删除了我的 generated_quantities 块)。 rstan 有一个函数 expose_stan_functions ,它将 stan functions 块中的所有函数添加到 R 环境中。

然后,您可以调用您创建的对数似然函数,以使用任何观察值(以前见过或未见过)以及一组参数估计值来评估您的模型。