JAGS 中的运行时错误

Runtime error in JAGS

我正尝试在 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

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

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

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

(即精度非常高的正态分布,或术语中的 Dirac delta)到模型。

您正在寻求建立零膨胀负二项式模型的模型。如果您使用 "ones trick",您可以在 JAGS 中执行此操作,这是一种伪似然法,当您的结果变量的分布不是 JAGS 中的标准分布之一时可以使用,但您仍然可以写下表达式可能性。

"ones trick" 包括创建值为 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 中被重载。有一个具有两个参数的分布和一个采用三个参数和 returns 可能性的函数。我们使用的是后者。

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