评估 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)
感谢@dipetkov 的link,我自己解决了这个问题。我没有使用 link 中的确切方法,而是想出了一个替代方法。您可以从 R 中调用 stan 函数来计算模型的对数似然,即使数据是未知的(而且速度非常快!)。
首先,我将 transformed parameters
块中的所有内容放入 stan 的 functions
块中的函数中。然后,我创建了第二个函数来包装第一个函数,并评估给定观察的对数似然并提供参数估计(然后我删除了我的 generated_quantities
块)。 rstan
有一个函数 expose_stan_functions
,它将 stan functions
块中的所有函数添加到 R 环境中。
然后,您可以调用您创建的对数似然函数,以使用任何观察值(以前见过或未见过)以及一组参数估计值来评估您的模型。
我知道我可以在采样期间计算每个样本的对数似然,例如
...
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)
感谢@dipetkov 的link,我自己解决了这个问题。我没有使用 link 中的确切方法,而是想出了一个替代方法。您可以从 R 中调用 stan 函数来计算模型的对数似然,即使数据是未知的(而且速度非常快!)。
首先,我将 transformed parameters
块中的所有内容放入 stan 的 functions
块中的函数中。然后,我创建了第二个函数来包装第一个函数,并评估给定观察的对数似然并提供参数估计(然后我删除了我的 generated_quantities
块)。 rstan
有一个函数 expose_stan_functions
,它将 stan functions
块中的所有函数添加到 R 环境中。
然后,您可以调用您创建的对数似然函数,以使用任何观察值(以前见过或未见过)以及一组参数估计值来评估您的模型。