使用glm()代替简单的卡方检验


15

我有兴趣更改glm()R中使用的原假设。

例如:

x = rbinom(100, 1, .7)  
summary(glm(x ~ 1, family = "binomial"))

检验的假设p=0.5。如果我想将null更改为p =某个任意值,该glm()怎么办?

我知道也可以使用prop.test()和来完成此操作chisq.test(),但是我想探讨一下使用glm()来测试与分类数据有关的所有假设的想法。


7
+1。 显然是指以概率表示的二项式参数 由于自然链接(以及默认情况下默认使用的链接)是logit,因此为了避免混淆,将p与logit 进行区分很重要,log log是log几率log p /1 - p pglmp日志p/1-p
whuber

Answers:


19

可以使用一个偏移glmfamily="binomial"对数优势比或分对数尺度的估计参数,所以对应于对数概率的0或0.5的概率。如果要与p的概率进行比较,则希望基线值为q = logitp = log p /1 - p 。现在是统计模型β0=0pq=logit(p)=log(p/(1p))

YBinom(μ)μ=1/(1+exp(η))η=β0+q

从标准设置仅更改了最后一行。在R代码中:

  • 使用offset(q)该式中
  • logit / log-odds函数是 qlogis(p)
  • 有点烦人的是,您必须为响应变量中的每个元素提供一个偏移值-R不会自动为您复制一个常数值。这是通过设置数据框来完成的,但是您可以使用rep(q,100)
x = rbinom(100, 1, .7)
dd <- data.frame(x, q = qlogis(0.7)) 
summary(glm(x ~ 1 + offset(q), data=dd, family = "binomial"))

2
(+1)这将给您Wald测试。可以完成LRT拟合空模型glm(y ~ offset(q)-1, family=binomial, data=dd)lrtestlmtest包中使用。培生卡方检验是GLM模型的得分检验。Wald / LRT / Score都是一致的测试,应该在相当大的样本量中提供等效的推断。
AdamO

1
我认为您也可以使用anova()glm上的R进行LR测试
Ben Bolker

有趣的是,我已经失去了使用ANOVA的习惯。但是,我观察到方差分析拒绝打印该测试的pvalue,而lrtest确实打印。
AdamO

2
也许anova(.,test="Chisq")吧?
本·博克

6

查看您的GLM参数的置信区间:

> set.seed(1)
> x = rbinom(100, 1, .7)
> model<-glm(x ~ 1, family = "binomial")
> confint(model)
Waiting for profiling to be done...
    2.5 %    97.5 % 
0.3426412 1.1862042 

这是对数奇数的置信区间。

对于我们有log o d d s = log pp=0.5。因此,检验p=0.5的假设等同于检查置信区间是否包含0。这一假设不成立,因此该假设被拒绝。日志Ødds=日志p1-p=日志1=0p=0.5

现在,对于任意,您可以计算对数奇数,并检查它是否在置信区间内。p


1
p<0.05

2
confintp<005

2

基于glm.summary函数中z- / t值的p值用作假设检验是(完全)正确/不正确的。

  1. 这是令人困惑的语言。报告的值称为z值。但是在这种情况下,他们使用估计的标准误差代替了真实的偏差。因此,实际上它们更接近t值。比较以下三个输出:
    1)summary.glm
    2)t检验
    3)z检验

    > set.seed(1)
    > x = rbinom(100, 1, .7)
    
    > coef1 <- summary(glm(x ~ 1, offset=rep(qlogis(0.7),length(x)), family = "binomial"))$coefficients
    > coef2 <- summary(glm(x ~ 1, family = "binomial"))$coefficients
    
    > coef1[4]  # output from summary.glm
    [1] 0.6626359
    > 2*pt(-abs((qlogis(0.7)-coef2[1])/coef2[2]),99,ncp=0) # manual t-test
    [1] 0.6635858
    > 2*pnorm(-abs((qlogis(0.7)-coef2[1])/coef2[2]),0,1) # manual z-test
    [1] 0.6626359
  2. 它们不是精确的p值。使用二项式分布精确地计算p值会更好(目前具有计算能力,这不是问题)。假设误差为高斯分布,则t分布不准确(它高估了p,超过“ alpha”级别在“现实”中发生的频率较小)。请参阅以下比较:

    # trying all 100 possible outcomes if the true value is p=0.7
    px <- dbinom(0:100,100,0.7)
    p_model = rep(0,101)
    for (i in 0:100) {
      xi = c(rep(1,i),rep(0,100-i))
      model = glm(xi ~ 1, offset=rep(qlogis(0.7),100), family="binomial")
      p_model[i+1] = 1-summary(model)$coefficients[4]
    }
    
    
    # plotting cumulative distribution of outcomes
    outcomes <- p_model[order(p_model)]
    cdf <- cumsum(px[order(p_model)])
    plot(1-outcomes,1-cdf, 
         ylab="cumulative probability", 
         xlab= "calculated glm p-value",
         xlim=c(10^-4,1),ylim=c(10^-4,1),col=2,cex=0.5,log="xy")
    lines(c(0.00001,1),c(0.00001,1))
    for (i in 1:100) {
      lines(1-c(outcomes[i],outcomes[i+1]),1-c(cdf[i+1],cdf[i+1]),col=2)
    #  lines(1-c(outcomes[i],outcomes[i]),1-c(cdf[i],cdf[i+1]),col=2)
    }
    
    title("probability for rejection as function of set alpha level")

    被alpha拒绝的CDF

    黑色曲线代表平等。红色曲线在其下方。这意味着对于通过glm摘要函数计算的给定p值,我们发现这种情况(或更大的差异)在现实中的出现频率少于p值指示的情况。


嗯..我可能对将T分布用于GLM的理由感到困惑。您能在我刚才在这里提出的一个相关问题上加油吗?
AdamO

2
这个答案很有趣但有问题。(1)OP并未真正询问分数,卡方,“精确”或基于GLM的方法来检验关于二项式响应的假设之间的区别(他们可能实际上已经知道所有这些内容),所以这没有。不能回答提出的问题;(2)剩余方差等的估计与线性模型(如@AdamO的问题)具有一组不同的假设和抽样分布,因此使用t检验值得商;;...
本·博克

2
(3)二项式响应的“精确”置信区间实际上是棘手的(“精确” [Clopper-Wilson]区间是保守的;分数测试可能在某些范围内表现更好
Ben Bolker

@Ben您是对的,z检验si实际上比t检验更好。答案中显示的图形用于z检验。它使用GLM函数的输出。我的回答的底线是“ p值”是一件棘手的事情。因此,我发现更好地进行显式计算,例如使用正态分布,而不是从glm函数中提取p值,该函数已经很方便地随偏移量移动了,但隐藏了p值的计算来源。
Sextus Empiricus

1
@BenBolker,我相信确切的测试确实是保守的,但是...只是因为实际上我们不是从理想的二项式分布中采样。从经验的角度来看,替代的z检验更好。这是两个“错误”相互抵消的:1)二项式分布在实际情况下不是残差的真实分布; 2)z分布不是二项式分布的精确表达式。值得怀疑的是,我们是否应该为错误的模型选择错误的分布,仅仅是因为在实践中结果是“可以”。
Sextus Empiricus
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.