Проверка отношения правдоподобия в 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

Я не рекомендовал бы использовать waldtest от lmtest. Используйте пакет aod для тестирования моделей. Это гораздо проще. cran.r-project.org/web/packages/aod/aod.pdf
Мистер Никто

epicalcбыл удален ( источник ). Альтернативой может быть lmtest.
Мартин Тома

Ответы:


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

а не отклонение для нулевой модели, которая одинакова в обоих случаях. Число df - это число параметров, которые отличаются между двумя вложенными моделями, здесь df = 1. Кстати, вы можете посмотреть на исходный код lrtest(), просто набрав

> lrtest

в приглашении R.


спасибо, и я только что обнаружил, что я могу использовать glm (output ~ NULL, data = z, family = binomial ("logistic")) для создания модели NULL, и поэтому я могу использовать lrtest впоследствии. К вашему сведению, еще раз спасибо
lokheart

2
@lokheart anova(model1, model0)тоже будет работать.
хл

5
@lokheart glm(output ~ 1, data=z, family=binomial("logistic"))будет более естественной нулевой моделью, которая говорит, что outputэто объясняется постоянным термином (перехват) / Перехват подразумевается во всех ваших моделях, поэтому вы проверяете эффект aпосле учета перехвата.
Восстановить Монику - Дж. Симпсон

Или вы можете сделать это «вручную»: p-значение теста LR = 1-pchisq (deviance, dof)
Умка

22

Альтернативой является lmtestпакет, в котором есть lrtest()функция, которая принимает одну модель. Вот пример из ?lrtestв lmtestпакете, который является для 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 Приятно знать (и, кажется, я забыл об этом пакете).
хл

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(перехват / постоянный член).
Восстановить Монику - Дж. Симпсон
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.