R 如何计算此二项式回归的 p 值?

机器算法验证 r 假设检验 物流 广义线性模型 二项分布
2022-03-15 17:46:58

考虑以下二项式回归:

# Create some data
set.seed(10)
n <- 500
x <- runif(n,0,100)
y <- x + rnorm(n,sd=100) < 0
 
# Fit a binomial regression model
model <- glm(y ~ x, family="binomial")

summary(model)

summary函数返回一个 p 值1.03e-05使用 时anova.glm,无论使用什么方法计算 p 值,都会得到稍微更极端的 p 值。

anova(model, test="Rao")   # p.value = 7.5e-6
anova(model, test="LRT")   # p.value = 6.3e-6
anova(model, test="Chisq") # p.value = 6.3e-6

函数的 p 值是否summary适用于与函数返回的假设相同的假设anova如果是,如何summary计算这个 p 值,是否可以直接使用 执行相同的计算anova

2个回答

R中,summary用于glm计算 p 值的函数使用简单的 Wald 统计量,即

2×Φ(|β^|SE(β^))

其中,是感兴趣的回归参数,是这个估计回归参数的标准误差,是标准正态分布的 CDF。β^SE(β^)Φ

要从您的输出中重新创建它,请尝试

 beta = coef(model)[2]
 # getting estimate
 B_SE = sqrt(vcov(model)[2,2])
 # extracting standard error
 pvalue =  pnorm(-abs(beta) / B_SE)  * 2
 # pvalue = 1.027859e-05

它可以帮助您在这里阅读我的答案:为什么我的 p 值在逻辑回归输出、卡方检验和 OR 的置信区间之间存在差异? 您在这里的问题几乎与此相同,但是您的问题中还有一些其他元素可以解决。

正如@CliffAB 所指出的,summary.glm()输出中的 p 值来自 Wald 测试。这些类似于检验,因为它们是系数的拟合值和参考值(取为)之间的差除以标准误差。不同之处在于这些被认为是作为标准法线而不是分布的。另一方面,这些对大样本有效,我们不一定知道在任何给定情况下什么构成“大样本”。 t0t

使用anova.glm()使您可以访问不同的测试。当您设置test="Rao"时,它会为您提供分数测试的 p 值。当您设置test="Chisq"test="LRT"(它们相同)时,它会为您提供似然比检验的 p 值。

在这种情况下,该函数确实测试了与输出中anova.glm()的 Wald 测试相同的零假设只是因为您的模型只有一个变量。函数将执行顺序测试,类似于线性设置中的“I 型 SS”,而 Wald 测试类似于线性设置中的“III 型 SS”(请参阅​​我的答案:如何解释 I 型, II 型和 III 型 ANOVA 和 MANOVA?)。考虑: summary()anova.glm()summary()

x2 = rnorm(n)
m2 = glm(y~x+x2, family="binomial")
summary(m2)$coefficients
#                Estimate  Std. Error    z value     Pr(>|z|)
# (Intercept) -0.05906436 0.186876339 -0.3160612 7.519561e-01
# x           -0.01567551 0.003537183 -4.4316372 9.352029e-06
# x2          -0.05967796 0.099093504 -0.6022388 5.470152e-01
anova(m2, test="LRT")
# Terms added sequentially (first to last)
# 
#      Df Deviance Resid. Df Resid. Dev  Pr(>Chi)    
# NULL                   499     619.10              
# x     1  20.3841       498     598.72 6.335e-06 ***
# x2    1   0.3627       497     598.35     0.547    
m3 = glm(y~x2+x, family="binomial")  # I just switched the order of x & x2 here
summary(m3)$coefficients
#                Estimate  Std. Error    z value     Pr(>|z|)
# (Intercept) -0.05906436 0.186876339 -0.3160612 7.519561e-01
# x2          -0.05967796 0.099093504 -0.6022388 5.470152e-01  # these are the same
# x           -0.01567551 0.003537183 -4.4316372 9.352029e-06  #  as above
anova(m3, test="LRT")
# Terms added sequentially (first to last)
# 
#      Df Deviance Resid. Df Resid. Dev  Pr(>Chi)    
# NULL                   499     619.10              
# x2    1   0.1585       498     618.94    0.6906      # these differ from the
# x     1  20.5883       497     598.35 5.694e-06 ***  #  anova output above

您可以anova.glm()在类似于“III 型 SS”的多元逻辑回归模型中为您提供单个变量的得分和似然比检验,但这很乏味。您需要不断调整模型,以便每个变量依次列在提供给glm()调用的公式中。输出中列出的最后一个 p 值anova.glm()类似于“III 型 SS”。

要更方便地获得单个变量的分数或似然比检验,请drop1()改用。考虑:

drop1(m3, test="LRT")
# Single term deletions
# 
# Model:
# y ~ x2 + x
#        Df Deviance    AIC     LRT  Pr(>Chi)    
# <none>      598.35 604.35                      
# x2      1   598.72 602.72  0.3627     0.547      # the same as when x2 is last above
# x       1   618.94 622.94 20.5883 5.694e-06 ***  # the same as when x  is last above