在这篇文章中,我们将看一下Poisson回归的拟合优度测试与个体计数数据。
最近我们被客户要求撰写关于Poisson回归的研究报告,包括一些图形和统计输出。许多软件包在拟合Poisson回归模型时在输出中提供此测试,或者在拟合此类模型(例如Stata)之后执行此测试,这可能导致研究人员和分析人员依赖它。在这篇文章中,我们将看到测试通常不会按预期执行,因此,我认为,应该谨慎使用。
偏差拟合度检验
由于偏差度量衡量了模型预测与观察结果的接近程度,我们可能会考虑将其作为给定模型拟合度检验的基础。虽然我们希望我们的模型预测接近观察到的结果,但即使我们的模型被正确指定,它们也不会相同 - 毕竟,模型给出了观察所遵循的泊松分布的预测平均值。
因此,为了将偏差用作拟合优度检验,我们需要弄清楚,假设我们的模型是正确的,在泊松假设下,我们在预测均值周围观察到的结果中会有多少变化。由于偏差可以作为将当前模型与饱和模型进行比较的轮廓似然比检验得出,因此可能性理论会预测(假设模型被正确指定),偏差遵循卡方分布,自由度等于参数数量的差异。饱和模型可以被视为一个模型,它为每个观察使用不同的参数,因此它具有参数。如果我们提出的模型具有参数,这意味着将偏差与参数的卡方分布进行比较。
在R中执行拟合优度测试
现在看看如何在R中执行拟合优度测试。首先我们将模拟一些简单的数据,具有均匀分布的协变量x和泊松结果y:
set.seed(612312)
n < - 1000
x < - runif(n)
y < - rpois(n,mean)
为了使Poisson GLM适合数据,我们只需使用glm函数:
Call:
glm(formula = y ~ x, family = poisson)
Deviance Residuals:
Min 1Q Median 3Q Max
-2.2547 -0.8859 -0.1532 0.6096 3.0254
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -0.04451 0.05775 -0.771 0.441
x 1.01568 0.08799 11.543 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Dispersion parameter for poisson family taken to be 1)
Null deviance: 1247.7 on 999 degrees of freedom
Residual deviance: 1110.3 on 998 degrees of freedom
AIC: 3140.9
Number of Fisher Scoring iterations: 5
这里的偏差被glm函数标记为“剩余偏差”,这里是1110.3。有1000个观测值,我们的模型有两个参数,因此自由度为998,由R作为残差df给出。为了计算偏差拟合度检验的p值,我们简单地计算998自由度上卡方分布的偏差值右侧的概率:
pchisq(mod $ deviance,df = mod $ df.residual,lower.tail = FALSE)
[1] 0.00733294
零假设是我们的模型被正确指定,我们有强有力的证据来拒绝这个假设。因此,我们有充分的证据表明我们的模型非常适合。
通过仿真检验泊松回归拟合检验的偏差优度
为了研究测试的性能,我们进行了一个小的模拟研究。我们将使用与以前相同的数据生成机制生成10,000个数据集。对于每一个,我们将拟合(正确的)泊松模型,并收集拟合p值的偏差良好性。然后我们将看到它小于0.05的次数:
nSim <- 10000
pvalues <- array(0, dim=nSim)
for (i in 1:nSim) {
n <- 1000
x <- runif(n)
mean <- exp(x)
y <- rpois(n,mean)
mod <- glm(y~x, family=poisson)
pvalues[i] <- pchisq(mod$ , df=mod$df. , lower.tail= )
}
mean(1*(pvalues<0.05))
最后一行创建一个向量,其中如果p值小于0.05,则每个元素为1,否则为零,然后使用mean()计算这些元素的比例。当我运行这个时,我得到了0.9437,这意味着偏差测试错误地表明我们的模型在94%的情况下被错误地指定
为了在平均值较大时查看情况是否发生变化,让我们修改模拟。我们现在将生成具有泊松均值的数据,其结果为20到55:
nSim < - 10000
pvalues < - array(0,dim = nSim)
for(i in 1:nSim){
n < - 1000
x < - runif(n)
< - exp(3 + x)
y < - rpois(n,mean)
mod < - glm(y~x,family = poisson)
pvalues [i] < - pchisq(mod $ ,df = mod $ df. ,lower.tail = FALSE)
}
现在,显着偏差测试的比例降低到0.0635,更接近标称的5%1类错误率。
结论
上面显然是一个非常有限的模拟研究,但我对结果的看法是,虽然偏差可能表明泊松模型是否适合,但我们应该对使用由此产生的p值有些警惕。