Test del rapporto di verosimiglianza in R


25

Supponiamo che farò una regressione logistica univariata su diverse variabili indipendenti, come questa:

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

Ho fatto un confronto tra i modelli (test del rapporto di verosimiglianza) per vedere se il modello è migliore del modello null con questo comando

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

Quindi ho creato un altro modello con tutte le variabili al suo interno

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

Per vedere se la variabile è statisticamente significativa nel modello multivariato, ho usato il lrtestcomando fromepicalc

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

Mi chiedo se il pchisqmetodo e il lrtestmetodo siano equivalenti per fare il test di responsabilità? Come non so come utilizzare lrtestper il modello logistico univato.


@Gavin grazie per avermelo ricordato, in confronto a StackOverflow, devo dedicare più tempo a "digerire" la risposta prima di decidere se la risposta è appropriata o meno, comunque grazie ancora.
lokheart,

Non consiglierei di usare waldtest di lmtest. Utilizzare il pacchetto AOD per il test del modello. È molto più semplice. cran.r-project.org/web/packages/aod/aod.pdf
Mr. Nobody

epicalcè stato rimosso ( fonte ). Un'alternativa potrebbe essere lmtest.
Martin Thoma,

Risposte:


21

Fondamentalmente sì, a condizione che tu usi la differenza corretta nella verosimiglianza:

> 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

e non la devianza per il modello nullo, che è la stessa in entrambi i casi. Il numero di df è il numero di parametri che differiscono tra i due modelli nidificati, qui df = 1. A proposito, puoi guardare il codice sorgente lrtest()semplicemente digitando

> lrtest

al prompt R.


grazie, e ho appena scoperto che posso usare glm (output ~ NULL, data = z, family = binomial ("logistic")) per creare un modello NULL, e quindi posso usare il più piccolo in seguito. Cordiali saluti, grazie ancora
lokheart

2
Anche @lokheart anova(model1, model0)funzionerà.
chl

5
@lokheart glm(output ~ 1, data=z, family=binomial("logistic"))sarebbe un modello nullo più naturale, che dice che outputè spiegato da un termine costante (l'intercetta) / L'intercettazione è implicita in tutti i tuoi modelli, quindi stai testando l'effetto di adopo aver tenuto conto dell'intercetta.
Ripristina Monica - G. Simpson,

Oppure puoi farlo "manualmente": valore p del test LR = 1-pchisq (devianza, dof)
Umka

22

Un'alternativa è il lmtestpacchetto, che ha una lrtest()funzione che accetta un singolo modello. Ecco l'esempio ?lrtestdel lmtestpacchetto, che è per un LM ma ci sono metodi che funzionano con i GLM:

> 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 È buono a sapersi (e sembra che mi sia dimenticato di quel pacchetto).
chl

2
@GavinSimpson Questo può sembrare sciocco, ma come interpreteresti i risultati di "lrtest (fm2, fm1)"? Il modello 2 è significativamente diverso dal modello 1 e quindi l'aggiunta della variabile con1 è stata utile? O il più piccolo (fm2) sta dicendo che il modello 2 è significativamente diverso dal modello 1? Ma quale modello è migliore?
Kerry,

5
@Kerry fm1ha una probabilità di log inferiore e quindi un adattamento più scarso rispetto a fm2. L'LRT ci sta dicendo che il grado in cui abbiamo realizzato fm1un modello più povero di quello che fm2è inaspettatamente grande se i termini diversi tra i modelli fossero utili (ha spiegato la risposta). lrtest(fm2)non viene confrontata con fm1affatto, il modello fm2viene confrontato con in tal caso, se, come indicato in uscita, questo: con ~ 1. Quel modello, il modello nullo, afferma che il miglior predittore di conè la media campionaria di con(il termine intercetta / costante).
Ripristina Monica - G. Simpson,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.