Regressione logistica: test chi-quadro di anova vs. significatività dei coefficienti (anova () vs riepilogo () in R)


35

Ho un modello logistico GLM con 8 variabili. Ho eseguito un test chi-quadro in R anova(glm.model,test='Chisq')e 2 delle variabili risultano essere predittive quando vengono ordinate all'inizio del test e non tanto se ordinate nella parte inferiore. Il summary(glm.model)suggerisce che i coefficienti sono insignificanti (alto p-value). In questo caso sembra che le variabili non siano significative.

Volevo chiederti quale sia un test migliore del significato delle variabili: il significato del coefficiente nel riepilogo del modello o il test chi-quadrato di anova(). Inoltre, quando uno è meglio dell'altro?

Immagino sia una domanda ampia, ma qualsiasi suggerimento su cosa considerare sarà apprezzato.


4
Ciò è analogo alla distinzione tra Somma dei quadrati di tipo I e di tipo III per i coefficienti di prova nei modelli lineari. Potrebbe aiutare a leggere la mia risposta qui: come interpretare tipo I sequenziale ANOVA e MANOVA .
gung - Ripristina Monica

Risposte:


61

Oltre alla risposta di @ gung, proverò a fornire un esempio di ciò che la anovafunzione verifica effettivamente. Spero che questo ti permetta di decidere quali test sono appropriati per le ipotesi che ti interessano.

Supponiamo che tu abbia un risultato e 3 variabili predittive: , e . Ora, se il tuo modello di regressione logistica sarebbe . Quando si esegue , la funzione confronta i seguenti modelli in ordine sequenziale:yX1X2X3my.mod <- glm(y~x1+x2+x3, family="binomial")anova(my.mod, test="Chisq")

  1. glm(y~1, family="binomial") vs. glm(y~x1, family="binomial")
  2. glm(y~x1, family="binomial") vs. glm(y~x1+x2, family="binomial")
  3. glm(y~x1+x2, family="binomial") vs. glm(y~x1+x2+x3, family="binomial")

Quindi confronta in sequenza il modello più piccolo con il modello successivo più complesso aggiungendo una variabile in ogni passaggio. Ognuno di questi confronti viene effettuato tramite un test del rapporto di verosimiglianza (test LR; vedere l'esempio di seguito). Per quanto ne sappia, queste ipotesi sono raramente di interesse, ma questo deve essere deciso da voi.

Ecco un esempio in R:

mydata      <- read.csv("https://stats.idre.ucla.edu/stat/data/binary.csv")
mydata$rank <- factor(mydata$rank)

my.mod <- glm(admit ~ gre + gpa + rank, data = mydata, family = "binomial")
summary(my.mod)

Coefficients:
             Estimate Std. Error z value Pr(>|z|)    
(Intercept) -3.989979   1.139951  -3.500 0.000465 ***
gre          0.002264   0.001094   2.070 0.038465 *  
gpa          0.804038   0.331819   2.423 0.015388 *  
rank2       -0.675443   0.316490  -2.134 0.032829 *  
rank3       -1.340204   0.345306  -3.881 0.000104 ***
rank4       -1.551464   0.417832  -3.713 0.000205 ***
   ---
Signif. codes:  0***0.001**0.01*0.05 ‘.’ 0.1 ‘ ’ 1 

# The sequential analysis
anova(my.mod, test="Chisq")

Terms added sequentially (first to last)    

     Df Deviance Resid. Df Resid. Dev  Pr(>Chi)    
NULL                   399     499.98              
gre   1  13.9204       398     486.06 0.0001907 ***
gpa   1   5.7122       397     480.34 0.0168478 *  
rank  3  21.8265       394     458.52 7.088e-05 ***
---
Signif. codes:  0***0.001**0.01*0.05 ‘.’ 0.1 ‘ ’ 1

# We can make the comparisons by hand (adding a variable in each step)

  # model only the intercept
mod1 <- glm(admit ~ 1,                data = mydata, family = "binomial") 
  # model with intercept + gre
mod2 <- glm(admit ~ gre,              data = mydata, family = "binomial") 
  # model with intercept + gre + gpa
mod3 <- glm(admit ~ gre + gpa,        data = mydata, family = "binomial") 
  # model containing all variables (full model)
mod4 <- glm(admit ~ gre + gpa + rank, data = mydata, family = "binomial") 

anova(mod1, mod2, test="LRT")

Model 1: admit ~ 1
Model 2: admit ~ gre
  Resid. Df Resid. Dev Df Deviance  Pr(>Chi)    
1       399     499.98                          
2       398     486.06  1    13.92 0.0001907 ***

anova(mod2, mod3, test="LRT")

Model 1: admit ~ gre
Model 2: admit ~ gre + gpa
  Resid. Df Resid. Dev Df Deviance Pr(>Chi)  
1       398     486.06                       
2       397     480.34  1   5.7122  0.01685 *

anova(mod3, mod4, test="LRT")

Model 1: admit ~ gre + gpa
Model 2: admit ~ gre + gpa + rank
  Resid. Df Resid. Dev Df Deviance  Pr(>Chi)    
1       397     480.34                          
2       394     458.52  3   21.826 7.088e-05 ***

psummary(my.mod)

  • Per coefficiente di x1: glm(y~x2+x3, family="binomial")vs. glm(y~x1+x2+x3, family="binomial")
  • Per coefficiente di x2: glm(y~x1+x3, family="binomial")vs.glm(y~x1+x2+x3, family="binomial")
  • Per coefficiente di x3: glm(y~x1+x2, family="binomial")vs.glm(y~x1+x2+x3, family="binomial")

Quindi ogni coefficiente rispetto al modello completo contenente tutti i coefficienti. I test di Wald sono un'approssimazione del test del rapporto di verosimiglianza. Potremmo anche fare i test del rapporto di verosimiglianza (test LR). Ecco come:

mod1.2 <- glm(admit ~ gre + gpa,  data = mydata, family = "binomial")
mod2.2 <- glm(admit ~ gre + rank, data = mydata, family = "binomial")
mod3.2 <- glm(admit ~ gpa + rank, data = mydata, family = "binomial")

anova(mod1.2, my.mod, test="LRT") # joint LR test for rank

Model 1: admit ~ gre + gpa
Model 2: admit ~ gre + gpa + rank
  Resid. Df Resid. Dev Df Deviance  Pr(>Chi)    
1       397     480.34                          
2       394     458.52  3   21.826 7.088e-05 ***

anova(mod2.2, my.mod, test="LRT") # LR test for gpa

Model 1: admit ~ gre + rank
Model 2: admit ~ gre + gpa + rank
  Resid. Df Resid. Dev Df Deviance Pr(>Chi)  
1       395     464.53                       
2       394     458.52  1   6.0143  0.01419 *

anova(mod3.2, my.mod, test="LRT") # LR test for gre

Model 1: admit ~ gpa + rank
Model 2: admit ~ gre + gpa + rank
  Resid. Df Resid. Dev Df Deviance Pr(>Chi)  
1       395     462.88                       
2       394     458.52  1   4.3578  0.03684 *

psummary(my.mod)

rankanova(my.mod, test="Chisq")rankanova(mod1.2, my.mod, test="Chisq")p7,08810-5rank


1
+1, questa è una spiegazione valida e completa. 1 piccolo punto: credo che quando test="Chisq", non stai eseguendo un test del rapporto di verosimiglianza, devi impostarlo test="LRT", vedi ? Anova.glm .
gung - Ripristina Monica

6
@gung Grazie per il complimento. test="LRT"e test="Chisq"sono sinonimi (lo dice sulla pagina che hai collegato).
COOLSerdash

2
Nessun problema, ma penso che in realtà sia un buon punto. test="LRT"è migliore in quanto è immediatamente chiaro che si tratta di un test del rapporto di verosimiglianza. L'ho cambiato. Grazie.
COOLSerdash,

4
+1 Sono impressionato dai tuoi rapidi progressi qui in appena un mese e dalla tua capacità di fornire una spiegazione ben funzionante e chiara. Grazie per il tuo impegno!
whuber

1
Bella risposta. Posso chiedere come 7.088e-05, 0.01419, 00.03684interpretare i valori p ( )?
TheSimpliFire
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.