La seguente spiegazione non si limita alla regressione logistica ma si applica ugualmente alla normale regressione lineare e ad altri GLM. Di solito, R
esclude un livello del categoriale e i coefficienti indicano la differenza di ciascuna classe rispetto a questa classe di riferimento (o talvolta chiamata classe di base) (questo è chiamato codifica fittizia o contrasti di trattamento in R
, vedere qui per un'eccellente panoramica delle diverse opzioni di contrasto ). Per vedere i contrasti correnti in R
, digitare options("contrasts")
. Normalmente, R
ordina i livelli della variabile categoriale in ordine alfabetico e prende il primo come classe di riferimento. Questo non è sempre ottimale e può essere modificato digitando (qui imposteremo la classe di riferimento su "c" nella nuova variabile)new.variable <- relevel(old.variable, ref="c")
zpanova(model1, model2, test="LRT")
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
rank1
rank
rank1
rank
rank1
rank2
- 0.675rank1
rank2
- 3,99 - 0,675 = - 4,67rank1
rank1
. È inoltre possibile adattare il modello senza intercettazione aggiungendo - 1
alla formula del modello per visualizzare direttamente tutti i coefficienti:
my.mod2 <- glm(admit ~ gre + gpa + rank - 1, data = mydata, family = "binomial")
summary(my.mod2) # no intercept model
Coefficients:
Estimate Std. Error z value Pr(>|z|)
gre 0.002264 0.001094 2.070 0.038465 *
gpa 0.804038 0.331819 2.423 0.015388 *
rank1 -3.989979 1.139951 -3.500 0.000465 ***
rank2 -4.665422 1.109370 -4.205 2.61e-05 ***
rank3 -5.330183 1.149538 -4.637 3.54e-06 ***
rank4 -5.541443 1.138072 -4.869 1.12e-06 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Si noti che l'intercettazione è scomparsa ora e che il coefficiente di rank1
è esattamente l'intercetta del primo modello. Qui, il test Wald non controlla la differenza a coppie tra i coefficienti ma l'ipotesi che ogni singolo coefficiente sia zero. Ancora una volta, abbiamo prove che ogni coefficiente di rank
differisce da zero. Infine, per verificare se l'intera variabile rank
migliora l'adattamento del modello, adattiamo un modello con ( my.mod1
) e uno senza la variabile rank
( my.mod2
) e conduciamo un test del rapporto di verosimiglianza. Questo verifica l'ipotesi che tutti i coefficienti di rank
siano zero:
my.mod1 <- glm(admit ~ gre + gpa + rank, data = mydata, family = "binomial") # with rank
my.mod2 <- glm(admit ~ gre + gpa, data = mydata, family = "binomial") # without rank
anova(my.mod1, my.mod2, test="LRT")
Analysis of Deviance Table
Model 1: admit ~ gre + gpa + rank
Model 2: admit ~ gre + gpa
Resid. Df Resid. Dev Df Deviance Pr(>Chi)
1 394 458.52
2 397 480.34 -3 -21.826 7.088e-05 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Il test del rapporto di verosimiglianza è estremamente significativo e concluderemmo che la variabile rank
dovrebbe rimanere nel modello.
Anche questo post è molto interessante.
admit ~ 1
vsadmit ~ rank - 1
?