我知道我可以计算采样过程中每个样本的对数似然,例如
...
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中定义我的模型(我假设)。
作为参考,我试图使用Estimated LFO-CV来评估和比较我的时间序列模型。 (例如https://github.com/paul-buerkner/LFO-CV-paper/blob/master/sim_functions.R#L186)
(Qazxswpoi)
感谢@dipetkov的链接,我自己解决了这个问题。我没有使用https://mc-stan.org/loo/articles/loo2-lfo.html中的确切方法,但提出了另一种选择。您可以从R调用stan函数来使其计算模型的对数似然,即使是看不见的数据(也非常快!)。
首先,我将我的link块中的所有内容放入stan的transformed parameters
块中的函数中。然后,我创建了第二个包装第一个函数的函数,并评估给定观察的对数似然和提供的参数估计(然后我删除了我的functions
块)。 generated_quantities
有一个函数rstan
,它将stan expose_stan_functions
块中的所有函数添加到R环境中。
然后,您可以调用您使用任何观察值(先前已见或未见过)评估模型的对数似然函数,以及一组参数估计值。