Как игнорировать линейно коррелированные переменные, введенные с помощью кодирования эталонной ячейки
Предположим, у меня есть набор данных, содержащий две категориальные предикторные переменные (a, b) и двоичную целевую переменную (y).
> df <- data.frame(
> a = factor(c("cat1","cat2","cat3","cat1","cat2")),
> b = factor(c("cat1","cat1","cat3","cat2","cat2")),
> y = factor(c(T,F,T,F,T))
> )
В данных существуют следующие логические отношения:
if (a = cat3) then (b = cat3 and y = true)
else if (a = b) then (y = true) else y = false
Я хочу использовать glm
построить модель для моего набора данных.glm
автоматически применяет кодировку ссылочной ячейки к моим категориальным переменным a и b. Он также позаботится о том, чтобы найти правильное количество кодов для каждой переменной фактора, чтобы alias
переменные введены (объяснено здесь).
Однако, как и в случае с набором данных, приведенным выше, может случиться, что существует линейная зависимость между одним ссылочным кодом, сгенерированным для переменной a, и одним ссылочным кодом переменной b.
Смотрите вывод моей модели:
> model <- glm(y ~ ., family=binomial(link='logit'), data=df)
> summary(model)
...
Coefficients: (1 not defined because of singularities)
Estimate Std. Error z value Pr(>|z|)
(Intercept) 1.965e-16 1.732e+00 0.000 1.000
acat2 -2.396e-16 2.000e+00 0.000 1.000
acat3 1.857e+01 6.523e+03 0.003 0.998
bcat2 0.000e+00 2.000e+00 0.000 1.000
bcat3 NA NA NA NA # <- get rid of this?
Как мне справиться с этим делом? Есть ли способ сказать glm пропустить некоторые из сгенерированных ссылочных кодов? В настоящей проблеме мой "cat3"
значение соответствует NA
, У меня есть две значимые факторные переменные, которые NA
в точно таких же экземплярах моего набора данных.
РЕДАКТИРОВАТЬ:
Проверенный ответ решает вопрос, однако в данном конкретном случае особенности могут быть просто проигнорированы, как указано в комментариях.
1 ответ
Комментарии, сделанные по этому вопросу, уместны, но все же может быть полезно попытаться исключить столбцы матрицы модели NA, чтобы вы могли сравнить их с отсутствием такого исключения, чтобы убедиться в эквивалентности.
В частности, вы могли бы запустить glm
дважды удаляя лишние столбцы матрицы модели при втором запуске:
model <- glm(y ~ ., family=binomial(link='logit'), data=df) # as in question
mm <- model.matrix(model)[, !is.na(coef(model)) ]
df0 <- data.frame(y = df$y, mm[, -1])
update(model, data = df0)
давая:
Call: glm(formula = y ~ ., family = binomial(link = "logit"), data = df0)
Coefficients:
(Intercept) acat2 acat3 bcat2
1.965e-16 -2.396e-16 1.857e+01 0.000e+00
Degrees of Freedom: 4 Total (i.e. Null); 1 Residual
Null Deviance: 6.73
Residual Deviance: 5.545 AIC: 13.55
Обратите внимание, что если вы не хотите использовать тот факт, что мы знаем, что ответ называется y, то мы можем извлечь ответ и его имя, заменяя присвоение df0
выше с:
df0 <- data.frame(model.response(model.frame(model)), mm[, -1])
names(df0)[1] <- as.character(attr(terms(model), "variables")[[2]])