R中的零膨胀计数模型:真正的优势是什么?

机器算法验证 r 泊松分布 零通胀
2022-03-28 14:49:17

为了分析零膨胀鸟类数量,我想使用 R 包pscl应用零膨胀计数模型。但是,查看文档中提供的主要功能之一的示例(?zeroinfl),我开始怀疑这些模型的真正优势是什么。根据那里给出的示例代码,我计算了标准泊松、准泊松和负二项式模型、简单的零膨胀泊松和负二项式模型以及零膨胀泊松和负二项式模型以及零分量的回归量。然后我检查了观察数据和拟合数据的直方图。(这是复制它的代码。)

library(pscl)
data("bioChemists", package = "pscl")

## standard count data models
fm_pois  <- glm(art ~ .,    data = bioChemists, family = poisson)
fm_qpois <- glm(art ~ .,    data = bioChemists, family = quasipoisson)
fm_nb    <- glm.nb(art ~ ., data = bioChemists)

## with simple inflation (no regressors for zero component)
fm_zip  <- zeroinfl(art ~ . | 1, data = bioChemists)
fm_zinb <- zeroinfl(art ~ . | 1, data = bioChemists, dist = "negbin")

## inflation with regressors
fm_zip2  <- zeroinfl(art ~ fem + mar + kid5 + phd + ment | fem + mar + kid5 + phd + 
                     ment, data = bioChemists)
fm_zinb2 <- zeroinfl(art ~ fem + mar + kid5 + phd + ment | fem + mar + kid5 + phd + 
                     ment, data = bioChemists, dist = "negbin")

## histograms
breaks <- seq(-0.5,20.5,1)
par(mfrow=c(4,2))
hist(bioChemists$art,  breaks=breaks)
hist(fitted(fm_pois),  breaks=breaks)
hist(fitted(fm_qpois), breaks=breaks)
hist(fitted(fm_nb),    breaks=breaks)
hist(fitted(fm_zip),   breaks=breaks)
hist(fitted(fm_zinb),  breaks=breaks)
hist(fitted(fm_zip2),  breaks=breaks)
hist(fitted(fm_zinb2), breaks=breaks)!

观察和拟合数据的直方图

我看不出不同模型之间的任何根本区别(除了示例数据对我来说似乎不是很“零膨胀”......);实际上,没有一个模型对零的数量产生一半合理的估计。谁能解释零膨胀模型的优势是什么?我想一定有理由选择这个作为函数的例子。

2个回答

我认为这是一个选择不当的数据集,用于探索零膨胀模型的优势,因为正如您所注意到的,零膨胀并没有那么多。

plot(fitted(fm_pois), fitted(fm_zinb))

表明预测值几乎相同。

在零通胀率更高的数据集中,ZI 模型给出的结果与 Poisson 不同(通常拟合更好)。

比较模型拟合的另一种方法是比较残差的大小:

boxplot(abs(resid(fm_pois) - resid(fm_zinb)))

表明,即使在这里,泊松的残差也小于 ZINB 的残差。如果您对真正有问题的残差量有一些了解,您可以看到每个模型中残差的比例高于该量值。例如,如果偏离超过 1 是不可接受的

sum(abs(resid(fm_pois) > 1))
sum(abs(resid(fm_zinb) > 1))

显示后者要好一些 - 大残差少了 20 个。

那么问题是模型增加的复杂性对你来说是否值得。

由于随机变化,拟合值将显示出比观察值更小的离散度。您没有进行有意义的比较。举一个简单的例子,如果你的数据只是XiPois(μ)你不会比较直方图xi针对拟合值的直方图μ^- 所有人都一样i虽然模拟的值是合理的xiXiPois(μ^)&比较直方图xi&xi.