我正试图通过rstan学习斯坦(因为我熟悉R)。我试过运行一个简单的混合Pareto和Normal模型。它编译得很好(据我所知),但它没有采样,给我错误:
“100次尝试后,( - 2,2)之间的初始化失败。 尝试指定初始值,减少约束值的范围或重新参数化模型。
调用采样器时发生错误;未完成抽样“
我只想说我尝试了各种方法来参数化,并尝试设置初始值,但都无济于事。
我的R + rstan代码如下:
library(rstan)
rpareto = function(n, location, shape){location/runif(n)^(1/shape)}
sdvec=runif(1e3,0.1,1)
HMFtest=list(x=rpareto(1e3,10,2)+rnorm(1e3,0,sdvec), sdev=sdvec, N=1e3)
HMF.stan <- "
data {
int<lower=0> N;
real x[N];
real sdev[N];
}
parameters {
real<lower=0,upper=20> y_min;
real<lower=0,upper=4> alpha;
real xtrue[N];
}
model {
y_min ~ lognormal(1, 1);
alpha ~ lognormal(1, 1);
xtrue ~ pareto(y_min, alpha);
for(i in 1:N){
x[i] ~ normal(xtrue[i], sdev[i]);
}
}
"
stan.test <- stan(model_code=HMF.stan, data=HMFtest, pars=c('y_min','alpha'), chains=1, iter=30000, warmup=10000)
此示例适用于JAGS(因此我也标记了JAGS)并且我可以发布该代码是否有用。
顺便说一句,如果我将帕累托分布更改为其他正态分布,它运行正常(但当然会给我一个无意义的答案)。
对于我做错的任何建议都将不胜感激!我担心不知怎的我还在想JAGS而不是Stan,但是我找不到任何人们用Stan拟合Pareto模型的例子,所以我很难交叉验证我的方法。
答案 0 :(得分:2)
错误消息表示尝试的所有随机起始点都产生了零的可能性。
我能够使用模型
在Stan中重现您的问题data {
int<lower=0> N;
real x[N];
real sdev[N];
}
parameters {
real<lower=0,upper=20> y_min;
real<lower=0,upper=4> alpha;
real xtrue[N];
}
model {
y_min ~ lognormal(1, 1);
alpha ~ lognormal(1, 1);
print("y_min=", y_min, " alpha=", alpha);
xtrue ~ pareto(y_min, alpha);
print("xtrue: ", xtrue);
x ~ normal(xtrue, sdev);
print("x=", x);
}
和数据
N <- 6
sdev <- c(0.3339302,0.2936877,0.8540434,0.2399283,0.1014759,0.3717446)
x <- c(12.640112,10.502748,11.015629,29.382395,61.180509,12.772482)
使用Stan 2.0.1进行编译和运行(现在已经很老了)我得到如下输出:
y_min=4.49609:0 alpha=2.54906:0
xtrue: [0.992331:0,0.303142:0,0.180334:0,1.96009:0,0.903113:0,1.75711:0]
x=[12.6401,10.5027,11.0156,29.3824,61.1805,12.7725]
y_min=17.0143:0 alpha=1.67509:0
xtrue: [-1.40618:0,1.82026:0,1.67344:0,-0.973618:0,0.746502:0,1.93469:0]
x=[12.6401,10.5027,11.0156,29.3824,61.1805,12.7725]
因此,虽然为y_min和alpha选择了合理的参数,但是帕累托生成的值也低于y_min。在手册中,概率分布函数也不包含截断。我认为这是问题(用正态分布代替帕累托运行正常)。
我建议在github上打开Stan的一个错误,声明x~pareto(y_min,alpha)生成的值低于y_min。
代码适用于最新的Stan版本。请先升级,这个bug似乎已经修复了一段时间。
答案 1 :(得分:2)
根本问题是参数声明的支持不匹配
parameters {
real<lower=0,upper=20> y_min;
real<lower=0,upper=4> alpha;
real xtrue[N];
}
以及先验的样本空间
model {
y_min ~ lognormal(1, 1);
alpha ~ lognormal(1, 1);
xtrue ~ pareto(y_min, alpha);
...
y_min
被约束到(0,20)区间,但对数正态先验在整个正实线上传播质量单位
alpha
被约束到(0,20)区间,但对数正态先验在整个正实线上传播质量单位
最糟糕的是,xtrue
的每个元素都是不受限制的 - 意味着它可以是整个实线上的任何东西 - 但是帕累托事先在这个区间内传播一个质量单位(Y_MIN,无穷远)
最简单的方法是将参数声明为
parameters {
real<lower=0> y_min;
real<lower=0> alpha;
real<lower=y_min> xtrue[N];
}
原则上,您可以将上限保留在y_min
和alpha
上,并指定一些在声明的支持上积分为1的先验。一种粗略的方法是截断(将对数正态PDF除以未截断质量的数量)对数正态先验
model {
y_min ~ lognormal(1, 1) T[,20];
alpha ~ lognormal(1, 1) T[,4];
统一或四参数β分布可能比截断的对数正态分布更合适。
最后,虽然它在逻辑上不是错误的
for(i in 1:N){
x[i] ~ normal(xtrue[i], sdev[i]);
}
计算上比逻辑上等同的语句更糟糕
x ~ normal(xtrue, sdev);
答案 2 :(得分:0)
所有固定的人。事实证明,我的R,stan和c ++编译器的混合存在一些深问题。
不想手工修理东西,我采取了大锤的方法,只是升级到Yosemite,然后从头开始安装关键组件。这似乎可以解决所有问题,现在我的锁链很好地收敛了。
这是一个奇怪的问题,因为编译器可以构建rstan并编译/采样许多rstan示例。我不知道帕累托为什么会引起这些问题,但现在肯定已经解决了。