JAGS 中的运行时错误

Tom*_*ini 2 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]))
Run Code Online (Sandbox Code Playgroud)

dnorm(0,10000)对 0 的狄拉克 delta 进行建模:如果您对该模型感兴趣,请参阅此处)。

但我得到:

     RUNTIME ERROR:
     Incorrect number of arguments in function dnegbin
Run Code Online (Sandbox Code Playgroud)

但如果我这样做:

y[i,l] ~ dnegbin(exp(eta_star[i,l]),alpha[l])
Run Code Online (Sandbox Code Playgroud)

它运行得很好。我想知道我不能乘以分布的值,所以我想这样的东西可以工作:

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])
Run Code Online (Sandbox Code Playgroud)

如果我运行它,我会得到:

ystar[1,1] is a logical node and cannot be observed
Run Code Online (Sandbox Code Playgroud)

小智 5

您正在寻找零膨胀负二项式模型的模型。如果您使用“ones 技巧”,则可以在 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)
}
Run Code Online (Sandbox Code Playgroud)

请注意,名称 dnegbin 在 JAGS 中已重载。存在一个具有两个参数的分布和一个接受三个参数并返回似然度的函数。我们正在使用后者。

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