我试图使用pscl
包使用零膨胀泊松回归来构建一些模型,在处理了变成zeroinfl
的输出对象后,我发现做residuals(fm_zip)
不等于fm_zip$residuals
。
下面是我所说的一个例子:
library("pscl")
data("bioChemists", package = "pscl")
fm_zip <- zeroinfl(art ~ . | 1, data = bioChemists)
names(fm_zip)
fm_zip$residuals
residuals(fm_zip)
all.equal(fm_zip$residuals,residuals(fm_zip))
qplot(fm_zip$residuals,residuals(fm_zip))
正如你可能意识到的那样,结果是不平等的。我想说,这两种方式是等效的,但似乎不是。你能解释一下这个怎么了吗?根据残差R的帮助,这两个备选方案应该返回差值(observed - fitted)
。相比之下,我用普通的线性回归做了同样的事情,它们是相等的。
我的R版本是:
sessionInfo()
R version 3.0.1 (2013-05-16)
Platform: x86_64-w64-mingw32/x64 (64-bit)...
包版本为pscl_1.04.4
感谢您的帮助。
要获得相等的结果,您应该将type
设置为response
(默认为pearson)
all.equal(fm_zip$residuals,residuals(fm_zip,'response'))
[1] TRUE
来自?residuals.zeroinfl
:
残差方法可以计算原始残差(观测-拟合)和Pearson残差(按方差平方根缩放的原始残差函数)。
perason
方差定义为:
mu <- predict(fm_zip, type = "count")
phi <- predict(fm_zip, type = "zero")
theta1 <- switch(fm_zip$dist, poisson = 0,
geometric = 1,
negbin = 1/object$theta)
variance <- fm_zip$fitted.values * (1 + (phi + theta1) * mu)
编辑不要犹豫阅读后面的代码,这通常是一个学习的来源,你也可以避免许多混淆。要获得S3 method
residuals.zeroinfl
背后的代码,您可以使用以下内容:
getS3method('residuals','zeroinfl')