Следующее объяснение не ограничивается логистической регрессией, но в равной степени применимо к нормальной линейной регрессии и другим GLM. Обычно R
исключает один уровень категориального, а коэффициенты обозначают разницу каждого класса с этим эталонным классом (или иногда его называют базовым классом) (это называется фиктивным контрастом кодирования или обработки R
, см. Здесь отличный обзор различных вариантов контраста). ). Чтобы увидеть текущие контрасты R
, введите options("contrasts")
. Обычно R
упорядочивает уровни категориальной переменной в алфавитном порядке и принимает первый в качестве эталонного класса. Это не всегда оптимально и может быть изменено путем ввода (здесь мы бы установили ссылочный класс на «c» в новой переменной)new.variable <- relevel(old.variable, ref="c")
, Для каждого коэффициента каждого уровня категориальной переменной выполняется тест Вальда, чтобы проверить, отличается ли парная разница между коэффициентом эталонного класса и другим классом от нуля или нет. Это значения Z и п в таблице регрессии. Если значим только один категориальный класс, это не означает, что вся переменная не имеет смысла и должна быть удалена из модели. Вы можете проверить общий эффект переменной, выполняя тест отношения правдоподобия : подходят две модели, одна из которых и один без переменной и типа anova(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
, Вы также можете разместить модель без перехвата, добавив - 1
в формулу модели, чтобы увидеть все коэффициенты напрямую:
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
Обратите внимание, что перехват уже исчез, и что коэффициент rank1
является точно пересечением первой модели. Здесь тест Вальда проверяет не парную разницу между коэффициентами, а гипотезу о том, что каждый отдельный коэффициент равен нулю. Опять же, у нас есть доказательства того, что каждый коэффициент rank
отличается от нуля. Наконец, чтобы проверить, rank
улучшает ли целая переменная соответствие модели, мы подбираем одну модель с ( my.mod1
), а другую - без переменной rank
( my.mod2
) и проводим тест отношения правдоподобия. Это проверяет гипотезу о том, что все коэффициенты rank
равны нулю:
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
Проверка отношения правдоподобия очень важна, и мы пришли бы к выводу, что переменная rank
должна оставаться в модели.
Этот пост тоже очень интересный.
admit ~ 1
vsadmit ~ rank - 1
?