如何从ZIP或ZINB模型中获取贝叶斯p值的新样本

时间:2014-08-20 17:13:05

标签: r bayesian glm poisson jags

希望有人能帮助我解决这个问题,因为我真的被卡住了,并且没有找到我的编码错误!

我在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

2 个答案:

答案 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

所以我希望我不会对任何人造成重大混淆......