为了可视化概率回归模型的拟合优度,“标准”残差(例如泊松或偏差)通常信息量不大,因为它们主要捕获均值的建模,而不是整个分布的建模。有时使用的一种替代方法是(随机)分位数残差。如果没有随机化,它们被定义为qnorm(pdist(y))
where pdist()
是拟合分布函数(这里是 ZIP 模型),y
是观察结果,并且qnorm()
是标准正态分布的分位数函数。如果模型拟合,残差的分布应为标准正态分布,并且可以在 Q-Q 图中检查。在离散分布的情况下(如此处),需要随机化来打破数据的离散性质。参见邓恩和史密斯 (1996,计算与图形统计杂志, 5,236-244)了解更多详细信息。在 R 中你可以使用countreg
R-Forge 提供的软件包(希望很快也能在 CRAN 上提供)。
检查数据边际分布的另一种替代方法是所谓的根图。它直观地比较计数 0、1、... 的观测频率和拟合频率。与随机分位数残差的 Q-Q 图相比,它通常更能显示过多零和/或过度分散的问题。请参阅我们的论文 Kleiber & Zeileis (2016,美国统计学家, 70(3), 296–303,号码:10.1080/00031305.2016.1173590 http://dx.doi.org/10.1080/00031305.2016.1173590) 更多细节。
将这些应用到您的回归模型中,很快就会发现零膨胀Poisson没有考虑到响应中的过度分散。 (当计数达到或超过 100 时,基于泊松的分布几乎永远不会很好地拟合。)此外,零通货膨胀模型不太适合,因为assnage
= 1 和 = 2 的零很少,不需要零通货膨胀。这导致零通胀部分的相应系数走向-Inf
具有非常大的标准误差(例如二元回归中的准分离)。因此,两部分障碍模型更适合并且可能更容易解释。最后,由于两人assnage
我会编码不同的组assnage
作为一个因素(我不清楚你是否已经这样做了)。
因此,为了分析你的数据,我使用yc
按照您的帖子中的规定并确保:
yc$assnage <- factor(yc$assnage)
首次探索性地了解以下因素的影响:assnage
我绘制是否count
是正数(左:零障碍)并且正数count
以对数刻度(右:计数)。
plot(factor(count > 0, levels = c(FALSE, TRUE), labels = c("=0", ">0")) ~ assnage,
data = yc, ylab = "count", main = "Zero hurdle")
plot(count ~ assnage, data = yc, subset = count > 0,
log = "y", main = "Count (positive)")
然后,我使用 ZIP、ZINB 和 hurdle NB 模型进行拟合countreg
来自 R-Forge 的软件包。这还包含更新版本zeroinfl()
and hurdle()
功能。
install.packages("countreg", repos = "http://R-Forge.R-project.org")
library("countreg")
zip <- zeroinfl(count ~ assnage * spawncob, offset = logoffset,
data = yc, dist = "poisson")
zinb <- zeroinfl(count ~ assnage * spawncob, offset = logoffset,
data = yc, dist = "negbin")
hnb <- hurdle(count ~ assnage * spawncob, offset = logoffset, data = yc,
dist = "negbin")
ZIP显然不合适,跨栏NB比ZINB稍好一些。
BIC(zip, zinb, hnb)
## df BIC
## zip 20 7700.085
## zinb 21 3574.720
## hnb 21 3556.693
如果你检查summary(zinb)
您还会看到零通货膨胀部分中的一些系数约为 10(对于虚拟变量),标准误差大一两个数量级。这本质上意味着相应组中的零膨胀概率为零,因为负二项式分布对于零响应已经具有足够的概率权重(assnage
第 1 组和第 2 组)。
为了可视化 ZIP 模型不适合而 HNB 适当捕获响应,我们现在可以使用根图。
rootogram(zip, main = "ZIP", ylim = c(-5, 15), max = 50)
rootogram(hnb, main = "HNB", ylim = c(-5, 15), max = 50)
ZIP 的波形图案清楚地显示了模型未正确捕获的数据过度分散的情况。相比之下,这个障碍相当合适。
作为最后的检查,我们还可以查看障碍模型中分位数残差的 Q-Q 图。这些看起来相当正常,并且与模型没有任何可疑的偏差。
qqrplot(hnb, main = "HNB")
由于残差是随机的,您可以重新运行代码几次以获得变化的印象。qqrplot()
还有一些参数可以让您在单个图中探索这种变化。