我正在尝试通过 rstan 学习 Stan(因为我熟悉 R)。我试过运行一个简单的混合 Pareto 和 Normal 模型。它编译得很好(据我所知),但它无法采样,给我错误:

“(-2, 2) 之间的初始化在 100 次尝试后失败。
尝试指定初始值、缩小约束值的范围或重新参数化模型。

调用采样器时发生错误;采样未完成”

可以说我已经尝试了各种方法来参数化事物,并尝试设置初始值,但都无济于事。

我的 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,但我找不到任何人将 Pareto 模型与 Stan 拟合的例子,所以我很难交叉验证我的方法。

最佳答案

错误消息意味着尝试的所有随机起点产生的可能性为零。

我能够使用模型在 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好像已经修复了一段时间。

关于r - 混合帕累托和正态斯坦模型不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28383339/

10-12 16:31