2016-11-17 28 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,與我的數據集完全相同。

編輯:

選中的答案解決的問題,但是,在這種特定的情況下,奇點可以簡單地在評論中指出忽略。

+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係數的模型矩陣列的問題,並且無論模型框架中列的類型如何,上面的代碼都應該這樣做。 –