我试图通过使用'target += bernoulli_logit_lmpf(y | alpha)'功能直接增加对数概率来在stan中实现模型。完整模型如下:
data {
int<lower=0> Ntotal;
int y[Ntotal];
int<lower=0> Nsubj;
int<lower=0> s[Ntotal];
int<lower=0> Nstages;
int<lower=0> Nstates;
vector[Nstages*Nstates] log_ts;
vector[Nstages*Nstates] log_ds;
int<lower=0> a_i[Ntotal];
int<lower=0> b_i[Ntotal];
}
parameters {
real log_w1;
real log_w3;
real delta;
real delta_p;
real tau_p;
}
transformed parameters {
vector[Nstates*Nstages] gradient;
gradient = exp(log_ds*delta_p + log_ts*tau_p + log_w3) + exp(log_ds*delta +
log_w1);
}
model {
log_w1 ~ normal(0,5);
log_w3 ~ normal(0,5);
delta ~ normal(0,2);
delta_p ~ normal(0,2);
tau_p ~ normal(0,2);
for(n in 1:Ntotal){
target += bernoulli_logit_lpmf(y[n] | (gradient[a_i[n]] -
gradient[b_i[n]]) );
}
}
我的理解是,这应该产生与下面的抽样语句相同的结果:
model {
log_w1 ~ normal(0,5);
log_w3 ~ normal(0,5);
delta ~ normal(0,2);
delta_p ~ normal(0,2);
tau_p ~ normal(0,2);
y ~ bernoulli_logit(gradient[a_i] - gradient[b_i]);
}
然而,这两个模型产生了完全不同的结果(即使在 R 和 Stan 中使用相同的种子)。我认为问题可能在于我如何实现直接增量,所以我也尝试了以下模型。
model {
real lps[Ntotal];
log_w1 ~ normal(0,5);
log_w3 ~ normal(0,5);
delta ~ normal(0,2);
delta_p ~ normal(0,2);
tau_p ~ normal(0,2);
for(n in 1:Ntotal){
lps[n] = bernoulli_logit_lpmf(y[n] | (gradient[a_i[n]] - gradient[b_i[n]]));
}
target += log_sum_exp(lps);
}
但是,所有三种模型都会产生不同的结果。有趣的是,直接增量的运行速度大约是采样语句的两倍,但似乎没有给出正确的结果。我需要使用直接增量方法,因为我最终会将这个模型转换为混合模型,而据我所知,混合模型需要直接更新对数概率。对此的任何帮助将不胜感激!
问候,蒂姆