4

我目前正在尝试将一些 JAGS 模型移植到 STAN。我收到一些奇怪的错误“stan::prob::exponential_log(N4stan5agrad3varE): Random variable is nan:0, but must not be nan!” 并调试那些我想知道一些本地参数的值。

在 JAGS 中,我可以为任何变量设置监视器。STAN 仅监控参数。但是参数不能有赋值(如果我理解正确的话)。

那么如何监控中间变量呢?

我还粘贴了模型代码,以防有人看到我犯的愚蠢错误。但是请注意,我知道可以将相同的模型表示为双指数(具有两个速率)的 CDF。这是我计划的简化形式。

Model:

data {
    int y[11]; // 
    int reps[11];
    real soas[11]; 

}
parameters {
    real<lower=0.001,upper=0.200> v1;
    real<lower=0.001,upper=0.200> v2;

}


model {
    int dif[11,96];
    real cf[11];

    real p[11];

    real t1[11,96];
    real t2[11,96];

    for (i in 1:11){
        for (r in 1:reps[i]){     
            t1[i,r]  ~ exponential(v1);
            t2[i,r]  ~ exponential(v2);
            dif[i,r] <-  (t1[i,r]+soas[i]<=(t2[i,r]));

            }
        cf[i] <- sum(dif[i]);
        p[i]  <-cf[i]/reps[i];
        y[i] ~ binomial(reps[i],p[i]); 
    }

}

这是一些虚拟数据:

psy_dat = { 
         'soas' :  numpy.array(range(-100,101,20)),
            'y' :  [47, 46, 62, 50, 59, 47, 36, 13, 7, 2, 1],
         'reps' :  [48, 48, 64, 64, 92, 92, 92, 64, 64, 48, 48]
          }
4

1 回答 1

7

在这种特殊情况下,问题在于t1t2就此而言)在您利用可能性NaN之前被初始化并且没有更改为任何内容。exponential我的猜测是,如果您打算从它们的后验预测分布中提取它们t1,则t2需要将它们放在一个块中。generated quantities

要按所述回答您的问题,您可以使用print()模型块中的语句来调试有问题的 Stan 程序。如果你真的想存储中间体,那么你需要transformed parameters在 Stan 程序的一个块中声明和定义它们。

于 2015-01-13T20:38:49.110 回答