在上一个问题(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
答案 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()
方法应该同时允许newdata
和newparams
-它为参数自举,后验仿真,等。
更紧凑(可能更强大):
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)