JAGS中的运行时错误

时间:2016-11-10 13:23:13

标签: r bayesian jags winbugs

我试图在JAGS中这样做:

z[l] ~ dbeta(0.5,0.5)
y[i,l] ~ z[l]*dnorm(0,10000) + inprod(1-z[l],dnegbin(exp(eta_star[i,l]),alpha[l]))

dnorm(0,10000)模拟0中的Dirac delta:如果您对模型感兴趣,请参阅here

但我明白了:

     RUNTIME ERROR:
     Incorrect number of arguments in function dnegbin

但如果我这样做:

y[i,l] ~ dnegbin(exp(eta_star[i,l]),alpha[l])

运行得很好。我想知道我不能为分布增加一个值,所以我想像这样的东西可以起作用:

z[l] ~ dbeta(0.5,0.5)
pointmass_0[l] ~ dnorm(0,10000)
y[i,l] ~ dnegbin(exp(eta_star[i,l]),alpha[l])
y_star[i,l] = z[l]*pointmass_0[l]+inprod(1-z[l],y[i,l])

如果我跑了,我得到:

ystar[1,1] is a logical node and cannot be observed

2 个答案:

答案 0 :(得分:4)

您正在寻找一个零膨胀负二项模型的模型。如果你使用“一招”,你可以在JAGS中执行此操作,这是一种伪似然方法,可以在结果变量的分布不是JAGS中的标准分布之一时使用,但你仍然可以写下表达式可能性。

“一招”包括创建值为1的伪观测值。然后将这些观测值建模为伯努利随机变量概率参数Lik / C,其中Lik是您观测的可能性,C是一个大常数,以确保Lik / C<< 1。

data {
   C <- 10000
   for (i in 1:N) {
      one[i,1] <- 1
   }
}
model {

   for (i in 1:N) {
      one[i,1] ~ dbern(lik[i,1]/C)

      lik[i,1] <- (y[i,1]==0)*z[1] + (1 - z[1]) * lik.NB[i,1]   
      lik.NB[i,1] <- dnegbin(y[i,1], exp(eta_star[i,1]), alpha[1])
   }

   z[l] ~ dbeta(0.5,0.5)
}

请注意,名称dnegbin在JAGS中被重载。有一个分布有两个参数,一个函数接受三个参数并返回可能性。我们正在使用后者。

我正在考虑向JAGS添加零膨胀版本的计数分布,因为上面的结构对用户来说是尴尬的,而零膨胀的分布很容易在JAGS内部实现。

答案 1 :(得分:2)

我也想知道处理这种情况的更好方法。

一个俗气的解决方案是添加一个随机节点

ystarstar[i,j] ~ dnorm(ystar[i,j],10000000) 

(即,精度非常高的正态分布,或术语中的狄拉克三角洲)。