尝试在 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
中的错误,R
包 bridgesampling
中的函数 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 所指出的那样,应该添加对数而不是乘以对数刻度。我这边的一个非常愚蠢的错误!我会用正确的代码编辑问题! 谢谢大家!
我正在尝试使用 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
中的错误,R
包 bridgesampling
中的函数 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 所指出的那样,应该添加对数而不是乘以对数刻度。我这边的一个非常愚蠢的错误!我会用正确的代码编辑问题! 谢谢大家!