Тест на коефіцієнт ймовірності в 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 (вихід ~ NULL, дані = z, сімейство = двочлен ("логістичний")) для створення моделі NULL, і тому я можу використовувати lrtest згодом. FYI, ще раз дякую
lokheart

2
@lokheart anova(model1, model0)теж працюватиме.
чл

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

Або ви можете зробити це "вручну": p-значення тесту LR = 1-pchisq (відхилення, dof)
Umka

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 Це добре знати (і, здається, я забув про цей пакет).
chl

2
@GavinSimpson Це може здатися дурним, але як би ви інтерпретували результати "lrtest (fm2, fm1)"? Модель 2 суттєво відрізняється від моделі 1, тому додавання змінної con1 було корисним? Або найпростіший (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.