繁体   English   中英

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

[英]Mixed Pareto and Normal Stan model not working

我正试图通过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不是斯坦,但是我找不到任何人与斯坦的Pareto模型拟合的例子,所以我很难交叉验证我的方法。

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

我能用模型在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打开一个bug,说明x~pareto(y_min,alpha)生成的值低于y_min。

代码适用于最新的Stan版本。 请先升级,这个bug似乎已经修复了一段时间。

基本问题是在参数parameters { real<lower=0,upper=20> y_min; real<lower=0,upper=4> alpha; real xtrue[N]; }上声明的支持之间的不匹配parameters { real<lower=0,upper=20> y_min; real<lower=0,upper=4> alpha; real xtrue[N]; } parameters { real<lower=0,upper=20> y_min; real<lower=0,upper=4> alpha; real xtrue[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); ... 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,Infinity)

最简单的方法是将参数声明为parameters { real<lower=0> y_min; real<lower=0> alpha; real<lower=y_min> xtrue[N]; } parameters { real<lower=0> y_min; real<lower=0> alpha; real<lower=y_min> xtrue[N]; } 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]; 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]); }逻辑上不是错误的for(i in 1:N){ x[i] ~ normal(xtrue[i], sdev[i]); } for(i in 1:N){ x[i] ~ normal(xtrue[i], sdev[i]); }比逻辑上等同语句差很多计算x ~ normal(xtrue, sdev);

所有固定的人。 事实证明,我的R,stan和c ++编译器的混合存在一些深层次的问题。

不想手工修理东西,我采取了大锤的方法,只是升级到Yosemite,然后从头开始安装关键组件。 这似乎可以解决所有问题,现在我的链条收敛得非常好。

这是一个奇怪的,因为编译器可以构建rstan并编译/采样许多rstan示例。 我不知道帕累托为什么会引起这些问题,但现在肯定已经解决了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM