R中的似然比检验


25

假设我要对几个自变量进行单变量逻辑回归,如下所示:

mod.a <- glm(x ~ a, data=z, family=binominal("logistic"))
mod.b <- glm(x ~ b, data=z, family=binominal("logistic"))

我进行了模型比较(似然比检验),以查看该命令是否比空模型更好

1-pchisq(mod.a$null.deviance-mod.a$deviance, mod.a$df.null-mod.a$df.residual)

然后我建立了一个包含所有变量的模型

mod.c <- glm(x ~ a+b, data=z, family=binomial("logistic"))

为了查看变量在多变量模型中是否具有统计意义,我使用了以下lrtest命令epicalc

lrtest(mod.c,mod.a) ### see if variable b is statistically significant after adjustment of a
lrtest(mod.c,mod.b) ### see if variable a is statistically significant after adjustment of b

我想知道该pchisq方法和该lrtest方法是否等效于进行对数似然检验?正如我不知道如何lrtest用于统一逻辑模型。


@Gavin感谢您提醒我,与stackoverflow相比,我需要花费更多时间来“消化”答案,然后再决定答案是否合适,再次感谢。
lokheart 2011年

我不建议使用lmtest中的waldtest。使用aod软件包进行模型测试。它要简单得多。cran.r-project.org/web/packages/aod/aod.pdf
没人先生

epicalc已被删除()。另一种可能是lmtest
马丁·托马

Answers:


21

基本上,是的,只要您使用对数似然的正确区别:

> library(epicalc)
> model0 <- glm(case ~ induced + spontaneous, family=binomial, data=infert)
> model1 <- glm(case ~ induced, family=binomial, data=infert)
> lrtest (model0, model1)
Likelihood ratio test for MLE method 
Chi-squared 1 d.f. =  36.48675 , P value =  0 
> model1$deviance-model0$deviance
[1] 36.48675

不是两种情况都相同的null模型的偏差。df的数量是两个嵌套模型之间不同的参数的数量,此处df = 1。顺便说一句,您lrtest()只需输入以下内容即可查看源代码

> lrtest

在R提示符下。


谢谢,我刚刚发现我可以使用glm(output〜NULL,data = z,family = binomial(“ logistic”))创建一个NULL模型,因此以后可以使用lrtest。仅供参考,再次感谢
lokheart 2011年

2
@lokheart anova(model1, model0)也会工作。
chl

5
@lokheart glm(output ~ 1, data=z, family=binomial("logistic"))将是一个更自然的空模型,它表示output为一个常数项(截距)/所有模型中都隐含了截距,因此您要a在考虑了截距之后测试其效果。
恢复莫妮卡-G.辛普森

或者,您也可以“手动”执行:LR测试的p值= 1-pchisq(deviance,dof)
乌姆卡

22

替代方案是lmtest包装,其具有lrtest()接受单个模型的功能。下面是从例如?lrtestlmtest包,它是用于LM但也有方法与GLMS工作:

> require(lmtest)
Loading required package: lmtest
Loading required package: zoo
> ## with data from Greene (1993):
> ## load data and compute lags
> data("USDistLag")
> usdl <- na.contiguous(cbind(USDistLag, lag(USDistLag, k = -1)))
> colnames(usdl) <- c("con", "gnp", "con1", "gnp1")
> fm1 <- lm(con ~ gnp + gnp1, data = usdl)
> fm2 <- lm(con ~ gnp + con1 + gnp1, data = usdl)
> ## various equivalent specifications of the LR test
>
> ## Compare two nested models
> lrtest(fm2, fm1)
Likelihood ratio test

Model 1: con ~ gnp + con1 + gnp1
Model 2: con ~ gnp + gnp1
  #Df  LogLik Df  Chisq Pr(>Chisq)    
1   5 -56.069                         
2   4 -65.871 -1 19.605  9.524e-06 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1 
>
> ## with just one model provided, compare this model to a null one
> lrtest(fm2)
Likelihood ratio test

Model 1: con ~ gnp + con1 + gnp1
Model 2: con ~ 1
  #Df   LogLik Df  Chisq Pr(>Chisq)    
1   5  -56.069                         
2   2 -119.091 -3 126.04  < 2.2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1 

+1很高兴知道(似乎我忘了那个包裹了)。
chl

2
@GavinSimpson这似乎很愚蠢,但是您将如何解释“ lrtest(fm2,fm1)”结果?模型2与模型1明显不同,因此添加con1变量是否有用?还是lrtest(fm2)说模型2与模型1明显不同?但是哪种模式更好?
凯利

5
@Kerry的fm1对数可能性较低,因此拟合度较差fm2。LRT告诉我们,如果模型之间的不同术语有用(解释了响应),那么我们制作fm1一个较差的模型的程度比fm2预期的要大。lrtest(fm2)不相比较fm1,在所有的模型fm2是在这种情况下相比,如果在输出作为说明,本:con ~ 1。该模型为空模型,它表示的最佳预测因子con是的样本均值con(截距/常数项)。
恢复莫妮卡-G.辛普森
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.