尝试在 Stan 中写入 normal_lpdf 和 bernoulli_lpmf 的联合似然时出错

Errors while trying to write joint likelihood of a normal_lpdf and a bernoulli_lpmf in Stan

我正在尝试使用 R 中的包 bridgesampling 来计算贝叶斯因子。为此,我正在尝试在 Stan 中拟合模型。它是一个分层模型,备选(假设)模型的参数为 beta, gamma1, gamma3 & sigma.

请查找以下型号:

stanmodelH1 = 'data {
 int<lower=0> n;
 int<lower=0> k;
 vector[n] y;
 int x1[n];
 real<lower=0> a;
 real<lower=0> b;
 matrix[n, k] G;
 matrix[n, k+1] X1;
 matrix[n, 2] x;
}

parameters {
 vector[2] beta;
 vector[k+1] gamma3;
 vector[k] gamma1;
 real<lower=0> sigma;
}

model {
 target += inv_gamma_lpdf(sigma | a, b);
 target += normal_lpdf(gamma1 | 0, sqrt(1.1));
 target += normal_lpdf(gamma3 | 0, 1);
 target += normal_lpdf(beta | 0, sqrt(1.2));
  target += normal_lpdf(y | x*beta + G*gamma1, sqrt(sigma)) + bernoulli_lpmf(x1 | Phi(X1*gamma3));
  
  //these two _lpdf and _lpmf should be added and not multiplied. This is the answer.
}
'

和对应的rstan代码:

stanfitmodelH1 = sampling(stanmodelH1, data = list(n = n, k = k, y = y, x1 = x1, 
                                                   a = 4, b = 3, G = G, X1 = X1, x = x),
                          iter = 50000, warmup = 20000, chains = 3, cores = 3,
                          control = list(adapt_delta = 0.99, max_treedepth = 15))

现在,当我在 Stan 中从这个模型中采样时;它抛出以下错误:

Warning messages:
1: There were 205 divergent transitions after warmup. Increasing adapt_delta above 0.99 may help. See
http://mc-stan.org/misc/warnings.html#divergent-transitions-after-warmup 
2: There were 3 chains where the estimated Bayesian Fraction of Missing Information was low. See
http://mc-stan.org/misc/warnings.html#bfmi-low 
3: Examine the pairs() plot to diagnose sampling problems

请注意,从空模型采样时会抛出类似的错误。 基本上 beta = beta0 = c(rnorm(1), 0)gamma3 = rep(0, k+1) 与替代模型中的无限制形成对比。

这些显然是一些 运行dom 错误,是由于 Stan 中的一些(我不知道是什么,我真的很想知道)抽样问题。我知道这一点是因为我多次 运行 模型(以及空模型)而没有以下部分: bernoulli_lpmf(x1 | Phi(X1*gamma3))Stan 模型的最后一行并修改数据块相应的代码,然后它没有返回任何警告或错误。但是,这不会解决我的目的。因为,我的假设涉及beta & gamma3,而上面的部分显然添加了gamma3

由于 Stan 中的错误,Rbridgesampling 中的函数 bridge_sampler 返回以下错误:

> H1.bridge = bridge_sampler(stanfitmodelH1, silent = TRUE)
Error in while (i <= maxiter && criterion_val > tol) { : 
  missing value where TRUE/FALSE needed
In addition: Warning message:
2744 of the 45000 log_prob() evaluations on the proposal draws produced -Inf/Inf. 

另请注意,Stan 没有错误时,不会抛出这些错误(来自 bridge_sampler)。例如,模型为 运行 而没有 bernoulli_lpmf(x1 | Phi(X1*gamma3)) 部分的情况。

我尽力解释了我的问题。如果需要更多说明,请问我。

有人可以确定错误 is/are 发生的确切位置吗?

非常感谢您!

我一直在犯一个愚蠢的错误!正如 Ben Goodrich Sir 所指出的那样,应该添加对数而不是乘以对数刻度。我这边的一个非常愚蠢的错误!我会用正确的代码编辑问题! 谢谢大家!