混合帕累托和普通斯坦模型不起作用

时间:2015-02-07 14:32:07

标签: r jags stan rstan

我正试图通过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模型的例子,所以我很难交叉验证我的方法。

3 个答案:

答案 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); ...

  1. y_min被约束到(0,20)区间,但对数正态先验在整个正实线上传播质量单位

  2. alpha被约束到(0,20)区间,但对数正态先验在整个正实线上传播质量单位

  3. 最糟糕的是,xtrue的每个元素都是不受限制的 - 意味着它可以是整个实线上的任何东西 - 但是帕累托事先在这个区间内传播一个质量单位(Y_MIN,无穷远)

  4. 最简单的方法是将参数声明为 parameters { real<lower=0> y_min; real<lower=0> alpha; real<lower=y_min> xtrue[N]; } 原则上,您可以将上限保留在y_minalpha上,并指定一些在声明的支持上积分为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示例。我不知道帕累托为什么会引起这些问题,但现在肯定已经解决了。