为什么我的 p 值在逻辑回归输出、卡方检验和 OR 的置信区间之间存在差异?

机器算法验证 r 假设检验 物流 广义线性模型 优势比
2022-02-02 08:14:27

我已经建立了一个逻辑回归,其中结果变量在接受治疗后得到治愈(Curevs. No Cure)。本研究中的所有患者均接受了治疗。我有兴趣了解糖尿病是否与此结果相关。

在 R 中,我的逻辑回归输出如下所示:

Call:
glm(formula = Cure ~ Diabetes, family = binomial(link = "logit"), data = All_patients)
...
Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept)   1.2735     0.1306   9.749   <2e-16 ***
Diabetes     -0.5597     0.2813  -1.990   0.0466 *  
...
    Null deviance: 456.55  on 415  degrees of freedom
Residual deviance: 452.75  on 414  degrees of freedom
  (2 observations deleted due to missingness)
AIC: 456.75

但是,优势比的置信区间包括 1

                   OR     2.5 %   97.5 %
(Intercept) 3.5733333 2.7822031 4.646366
Diabetes    0.5713619 0.3316513 1.003167

当我对这些数据进行卡方检验时,我得到以下信息:

data:  check
X-squared = 3.4397, df = 1, p-value = 0.06365

如果您想自己计算,治愈组和未治愈组的糖尿病分布如下:

Diabetic cure rate:      49 /  73 (67%)
Non-diabetic cure rate: 268 / 343 (78%)

我的问题是:为什么 p 值和包括 1 的置信区间不一致?

1个回答

使用广义线性模型,可以运行三种不同类型的统计检验。它们是:Wald 检验、似然比检验和分数检验。优秀的 UCLA 统计帮助站点在这里对它们进行了讨论。下图(从他们的网站复制)有助于说明它们:

在此处输入图像描述

  1. Wald 检验假设似然性呈正态分布,并在此基础上使用曲率度来估计标准误差然后,参数估计除以 SE 得出z-分数。这在大N,但对于较小的则不完全正确Ns。很难说你什么时候N足够大,可以容纳此属性,因此此测试可能会有些风险。
  2. 似然比检验在其最大值和空值处查看似然比(或对数似然差)。这通常被认为是最好的测试。
  3. 分数测试基于空值处的似然斜率这通常不太强大,但有时无法计算完整的可能性,因此这是一个不错的备用选项。

附带的测试summary.glm()是 Wald 测试。你没有说你是如何得到你的置信区间的,但我假设你使用confint()了 ,这反过来又调用了profile()更具体地说,这些置信区间是通过分析可能性来计算的(这是一种比将 SE 乘以更好的方法1.96)。也就是说,它们类似于似然比检验,而不是 Wald 检验。χ2-test,反过来,是一个分数测试。

身为你的N变得无限大,三个不同的p应该收敛到相同的值,但是当您没有无限数据时,它们可能会略有不同。值得注意的是,(Wald)p-您的初始输出中的值几乎没有意义,刚刚超过和刚刚低于之间几乎没有真正的区别α=.05引用)。那条线不是“魔术”。鉴于两个更可靠的测试刚刚结束.05,我会说您的数据按照传统标准并不十分“重要”。

下面我对线性预测变量的系数进行了剖析,并明确地运行似然比检验(通过anova.glm())。我得到和你一样的结果:

library(MASS)
x = matrix(c(343-268,268,73-49,49), nrow=2, byrow=T);  x
#      [,1] [,2]
# [1,]   75  268
# [2,]   24   49
D = factor(c("N","Diabetes"), levels=c("N","Diabetes"))
m = glm(x~D, family=binomial)
summary(m)
# ...
# Coefficients:
#             Estimate Std. Error z value Pr(>|z|)    
# (Intercept)  -1.2735     0.1306  -9.749   <2e-16 ***
# DDiabetes     0.5597     0.2813   1.990   0.0466 *  
# ...
confint(m)
# Waiting for profiling to be done...
#                    2.5 %    97.5 %
# (Intercept) -1.536085360 -1.023243
# DDiabetes   -0.003161693  1.103671
anova(m, test="LRT")
# ...
#      Df Deviance Resid. Df Resid. Dev Pr(>Chi)  
# NULL                     1     3.7997           
# D     1   3.7997         0     0.0000  0.05126 .
chisq.test(x)
#         Pearson's Chi-squared test with Yates' continuity correction
# 
# X-squared = 3.4397, df = 1, p-value = 0.06365

正如@JWilliman 在评论(现已删除)中指出的那样,在 中R,您还可以使用anova.glm(model, test="Rao"). 在下面的示例中,请注意 p 值与上面的卡方检验并不完全相同,因为默认情况下R'chisq.test()应用连续性校正。如果我们更改该设置,则 p 值匹配:

anova(m, test="Rao")
# ...
#      Df Deviance Resid. Df Resid. Dev   Rao Pr(>Chi)  
# NULL                     1     3.7997                 
# D     1   3.7997         0     0.0000 4.024  0.04486 *
chisq.test(x, correct=FALSE)
#   Pearson's Chi-squared test
# 
# data:  x
# X-squared = 4.024, df = 1, p-value = 0.04486