1

我试图通过使用'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);
}

但是,所有三种模型都会产生不同的结果。有趣的是,直接增量的运行速度大约是采样语句的两倍,但似乎没有给出正确的结果。我需要使用直接增量方法,因为我最终会将这个模型转换为混合模型,而据我所知,混合模型需要直接更新对数概率。对此的任何帮助将不胜感激!

问候,蒂姆

4

0 回答 0