Следующее объяснение не ограничивается логистической регрессией, но в равной степени применимо к нормальной линейной регрессии и другим 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
rank1rankrank1rankrank1rank2- 0,675rank1rank2- 3,99 - 0,675 = - 4,67rank1rank1, Вы также можете разместить модель без перехвата, добавив - 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 ~ 1vsadmit ~ rank - 1?