我试图在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
答案 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)
(即,精度非常高的正态分布,或术语中的狄拉克三角洲)。