Как игнорировать линейно коррелированные переменные, введенные с помощью кодирования эталонной ячейки

Предположим, у меня есть набор данных, содержащий две категориальные предикторные переменные (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]])
Другие вопросы по тегам