Regressão logística: teste de qui-quadrado de anova vs. significância dos coeficientes (anova () vs resumo () em R)

35

Eu tenho um modelo GLM logístico com 8 variáveis. Fiz um teste do qui-quadrado em R anova(glm.model,test='Chisq')e 2 das variáveis ​​se mostraram preditivas quando ordenadas no início do teste e não tanto quando ordenadas na parte inferior. O summary(glm.model)sugere que os seus coeficientes são insignificantes (elevado valor de p). Nesse caso, parece que as variáveis ​​não são significativas.

Eu queria perguntar qual é o melhor teste de significância das variáveis ​​- a significância do coeficiente no resumo do modelo ou no teste do qui-quadrado anova(). Além disso - quando um é melhor sobre o outro?

Eu acho que é uma pergunta ampla, mas qualquer sugestão sobre o que considerar será apreciada.

StreetHawk
fonte
4
Isso é análogo à distinção entre somas de quadrados do tipo I e do tipo III para testar coeficientes em modelos lineares. Ele pode ajudá-lo a ler a minha resposta aqui: como interpretar tipo I sequencial ANOVA e MANOVA .
gung - Restabelece Monica

Respostas:

61

Além da resposta do @ gung, tentarei fornecer um exemplo do que a anovafunção realmente testa. Espero que isso permita que você decida quais testes são adequados para as hipóteses que você está interessado em testar.

yx1 1x2x3my.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")

Portanto, ele compara sequencialmente o modelo menor com o próximo modelo mais complexo, adicionando uma variável em cada etapa. Cada uma dessas comparações é feita por meio de um teste de razão de verossimilhança (teste LR; veja o exemplo abaixo). Que eu saiba, essas hipóteses raramente são de interesse, mas isso deve ser decidido por você.

Aqui está um exemplo em 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)

  • Para coeficiente de x1: glm(y~x2+x3, family="binomial")vs. glm(y~x1+x2+x3, family="binomial")
  • Para coeficiente de x2: glm(y~x1+x3, family="binomial")vs.glm(y~x1+x2+x3, family="binomial")
  • Para coeficiente de x3: glm(y~x1+x2, family="binomial")vs.glm(y~x1+x2+x3, family="binomial")

Portanto, cada coeficiente em relação ao modelo completo contém todos os coeficientes. Os testes de Wald são uma aproximação do teste da razão de verossimilhança. Também poderíamos fazer os testes de razão de verossimilhança (teste LR). Aqui está como:

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.088105rank

COOLSerdash
fonte
11
+1, esta é uma boa explicação abrangente. Um pequeno ponto: acredito que test="Chisq", quando você não estiver executando um teste de razão de verossimilhança, precisará definir test="LRT"isso, consulte ? Anova.glm .
gung - Restabelece Monica
6
@gung Obrigado pelo elogio. test="LRT"e test="Chisq"são sinônimos (está indicado na página que você vinculou).
COOLSerdash
2
Não tem problema, mas acho que é realmente um bom ponto. test="LRT"é melhor, pois fica imediatamente claro que é um teste de razão de verossimilhança. Eu mudei isso. Obrigado.
COOLSerdash
4
+1 Estou impressionado com seu rápido progresso aqui em apenas um mês e sua capacidade de fornecer uma explicação clara e bem trabalhada. Obrigada pelos teus esforços!
whuber
11
Ótima resposta. Posso perguntar como os valores-p ( 7.088e-05, 0.01419, 00.03684) devem ser interpretados?
TheSimpliFire 24/01