希望有人能帮助我解决这个问题,因为我真的被卡住了,并且没有找到我的编码错误!
我在JAGS(使用R2Jag)中拟合零膨胀泊松/负二项式GLM(无随机效应),并且参数估计,先验,初始值和链收敛的一切都很好。所有结果完全符合例如pscl-package的估计,包括我在模型中计算皮尔逊残差...
我唯一无法工作的是从模型中采样一个新样本以获得贝叶斯p值来评估模型拟合。我之前拟合的“正常”泊松和负二项模型给出了预期的重复样本,没有出现任何问题。
到目前为止,这是我的代码,但重要的部分是“#New Samples”:
model{
# 1. Priors
beta ~ dmnorm(b0[], B0[,])
aB ~ dnorm(0.001, 1)
#2. Likelihood function
for (i in 1:N){
# Logistic part
W[i] ~ dbern(psi.min1[i])
psi.min1[i] <- 1 - psi[i]
eta.psi[i] <- aB
logit(psi[i]) <- eta.psi[i]
# Poisson part
Y[i] ~ dpois(mu.eff[i])
mu.eff[i] <- W[i] * mu[i]
log(mu[i]) <- max(-20, min(20, eta.mu[i]))
eta.mu[i] <- inprod(beta[], X[i,])
# Discrepancy measures:
ExpY[i] <- mu [i] * (1 - psi[i])
VarY[i] <- (1- psi[i]) * (mu[i] + psi[i] * pow(mu[i], 2))
PRes[i] <- (Y[i] - ExpY[i]) / sqrt(VarY[i])
D[i] <- pow(PRes[i], 2)
# New Samples:
YNew[i] ~ dpois(mu.eff[i])
PResNew[i] <- (YNew[i] - ExpY[i]) / sqrt(VarY[i])
DNew[i] <- pow(PResNew[i], 2)
}
Fit <- sum(D[1:N])
FitNew <- sum(DNew[1:N])
}
最大的问题是,我真的尝试了所有可能/应该工作的组合和改动,但是当我看到模拟样本时,我会在这里得到:
> all.equal( Jags1$BUGSoutput$sims.list$YNew, Jags1$BUGSoutput$sims.list$Y )
[1] TRUE
并且,当使用Fit和FitNew的方法时,真的很奇怪:
> Jags1$BUGSoutput$mean$Fit
[1] 109.7883
> Jags1$BUGSoutput$mean$FitNew
[1] 119.2111
有谁知道我做错了什么?任何帮助都将深表感谢!
亲切的问候,Ulf
答案 0 :(得分:2)
我怀疑情况并非如此,但我怀疑Y [i]和YNew [i]始终相同的唯一明显原因是mu.eff [i]为零,或者因为W [i]为0或mu [i]接近于零。这意味着Y []始终为零,这很容易从您的数据中检查,但正如我所说,您试图对此进行建模似乎很奇怪......否则,我不确定会发生什么on ...尝试简化代码以查看是否解决了问题,然后重新添加内容直到它再次中断。其他一些建议:
调试查看Y和YNew的绝对值而不仅仅是Y == YNew
如果你想要一个负二项式(= gamma-Poisson)尝试从一个伽玛分布中采样mu [i] - 我已经广泛使用了这个公式用于ZINB模型,所以我确定它有效
你对aB的先前看起来很奇怪 - 它给出了之前的95%CI,零通胀率在12-88%左右 - 这是你的意图吗?为什么0.001的平均值不是0?如果你没有预测因子,那么psi.min之前的beta值似乎更自然 - 如果你没有有用的先验信息,那么beta(1,1)先前将是一个明显的选择。
小点但你在for循环中计算aB的许多确定性函数 - 这会减慢你的模型...
希望有所帮助,
马特
答案 1 :(得分:0)
所以,在搜索到我的编码错误后,在经历了一次神经衰弱并一次又一次地输入所有内容之后,我发现了迄今为止最愚蠢的错误 - 到目前为止:
我刚刚没有指明&#34; Y&#34;作为保存的参数,只有&#34; YNew&#34;,所以当我将sims.list中的YNew和Y与all.equal进行比较时,我没有得到我认为应该的东西。我不知道为什么JAGS会给我Y(来自JAGS对象的sims.list),但出于某种原因,当被要求给Y时,它只是给我YNew所以这部分实际上是正确的:
Jags1 $ $ BUGSoutput意味着$拟合 [1] 109.7883 Jags1 $ BUGSoutput $意味着$ FitNew [1] 119.2111
所以我希望我不会对任何人造成重大混淆......