传递新数据以模拟.glmmTMB

时间:2019-03-18 21:14:39

标签: r regression

在上一个问题(Generate a predicted count distribution from a ZINB model of class glmmTMB)中,我问如何为“ glmmTMB”类的零膨胀负二项式模型生成预测的计数分布。从那以后,我找到了一个解决方案,就是函数Simulation.glmmTMB(https://www.rdocumentation.org/packages/glmmTMB/versions/0.2.3/topics/simulate.glmmTMB)。但是,我想对测试数据进行仿真以验证模型的预测能力,并且我只看到如何对用于拟合模型的相同数据进行仿真。

在下面的示例中,如何模拟新数据数据框的结果?

library(glmmTMB)
data("bioChemists", package = "pscl")
zinb <- glmmTMB(art ~ fem + mar + kid5 + phd + ment, ziformula = ~ ., data = 
bioChemists, family = nbinom2(link = "log"))
sim_1 <- simulate(zinb) #works as expected

#make new dataframe
newdata = unique(bioChemists[,c("fem","mar","kid5","phd","ment")])
sim_2 <- simulate(zinb, newdata = newdata) #ignores newdata

1 个答案:

答案 0 :(得分:1)

我认为这可行(可以封装在函数中等):

n <- nrow(newdata)
## construct model matrices for conditional and Z-I
##  components (.[-2] drops the LHS of the formula)
X <- model.matrix(formula(zinb)[-2],newdata)
X_zi <- model.matrix(formula(zinb,component="cond")[-2],newdata)
## extract coefficients
beta <- fixef(zinb)$cond
beta_zi <- fixef(zinb)$zi
## draw random values for each component
cond <- rnbinom(n, mu=exp(X %*% beta), size=sigma(zinb))
zi <- rbinom(1, prob=plogis(X_zi %*% beta_zi), size=1)
cond*zi

最后一步太聪明了:ifelse(zi==0,0,cond)可能更清晰,或者对于最后三个步骤,您可以使用rzinbinom包中的emdbook函数...

一般来说,我认为simulate()方法应该同时允许newdatanewparams-它为参数自举,后验仿真,等。


更紧凑(可能更强大):

cond <- predict(zinb, newdata=newdata, type="conditional")
zi <- predict(zinb, newdata=newdata, type="zprob")
emdbook::rzinbinom(nrow(newdata),
                   mu=cond, size=sigma(zinb),
                   zprob=zi)