2016-11-17 13 views
1

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

Однако, как и для набора данных выше, может существовать линейная связь между одним ссылочным кодом, сгенерированным для переменной 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 в точно таких же экземплярах моего набора данных.

EDIT:

Проверенный ответ решает этот вопрос, однако, в данном конкретном случае особенности могут быть просто проигнорированы, как указано в комментариях.

+0

@ZheyuanLi: Спасибо, что подняли вопрос. Я не был уверен, что особенности могут иметь какое-либо негативное влияние на модель (или, например, скорость конвергенции алгоритма), поэтому, если я правильно вас понимаю, я могу просто игнорировать эти особенности и использовать созданную модель для предсказаний, как есть? – fab

ответ

0

Замечания, сделанные по этому вопросу, уместны, но может быть полезно попытаться устранить столбцы матрицы модели 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]]) 
+0

Я не знал model.matrix. Это также используется glm внутри? Если мой df содержит еще несколько числовых переменных (чтобы их сохранить как есть), я должен был бы исключить их из model.matrix правильно? – fab

+0

Как я понимаю, вопрос, который вы хотите исключить столбцам матрицы модели, которые имеют коэффициенты NA и код выше, должен делать это независимо от типа столбца в рамке модели. –