r - lm摘要未顯示所有因子水平



regression linear-regression (1)

這個問題一遍又一遍地提出,但是不幸的是,沒有令人滿意的答案可以作為適當的重複目標。 看起來我需要寫一個。

大多數人都知道這與“對比度”有關,但並不是每個人都知道為什麼需要它以及如何理解它的結果。 為了充分理解這一點,我們必須查看 模型矩陣

假設我們對具有兩個因素的模型感興趣: ~ f + g (數值協變量無關緊要,因此我不包含任何變量;響應未出現在模型矩陣中,因此也將其刪除)。 考慮以下可重現的示例:

set.seed(0)

f <- sample(gl(3, 4, labels = letters[1:3]))
# [1] c a a b b a c b c b a c
#Levels: a b c

g <- sample(gl(3, 4, labels = LETTERS[1:3]))
# [1] A B A B C B C A C C A B
#Levels: A B C

我們從完全沒有對比的模型矩陣開始:

X0 <- model.matrix(~ f + g, contrasts.arg = list(
                   f = contr.treatment(n = 3, contrasts = FALSE),
                   g = contr.treatment(n = 3, contrasts = FALSE)))

#   (Intercept) f1 f2 f3 g1 g2 g3
#1            1  0  0  1  1  0  0
#2            1  1  0  0  0  1  0
#3            1  1  0  0  1  0  0
#4            1  0  1  0  0  1  0
#5            1  0  1  0  0  0  1
#6            1  1  0  0  0  1  0
#7            1  0  0  1  0  0  1
#8            1  0  1  0  1  0  0
#9            1  0  0  1  0  0  1
#10           1  0  1  0  0  0  1
#11           1  1  0  0  1  0  0
#12           1  0  0  1  0  1  0

注意,我們有:

unname( rowSums(X0[, c("f1", "f2", "f3")]) )
# [1] 1 1 1 1 1 1 1 1 1 1 1 1

unname( rowSums(X0[, c("g1", "g2", "g3")]) ) 
# [1] 1 1 1 1 1 1 1 1 1 1 1 1

因此 span{f1, f2, f3} = span{g1, g2, g3} = span{(Intercept)} 在此完整規格中,無法識別2列。 X0 將具有列等級 1 + 3 + 3 - 2 = 5

qr(X0)$rank
# [1] 5

因此,如果我們使用此 X0 擬合線性模型,則7個參數中的2個係數將為 NA

y <- rnorm(12)  ## random `y` as a response
lm(y ~ X - 1)  ## drop intercept as `X` has intercept already

#X0(Intercept)           X0f1           X0f2           X0f3           X0g1  
#      0.32118        0.05039       -0.22184             NA       -0.92868  
#         X0g2           X0g3  
#     -0.48809             NA  

這實際上意味著,我們必須在7個參數上添加2個線性約束,才能獲得完整的秩模型。 這兩個約束到底是什麼並不重要,但是必須有2個線性獨立的約束。 例如,我們可以執行以下任一操作:

  • X0 刪除任意2列;
  • 在參數上添加兩個零和約束,例如我們要求 f1f2f3 sum的係數為0, g1g2g3 係數相同。
  • 使用正則化,例如,向 fg 添加嶺罰。

請注意,這三種方式最終產生了三種不同的解決方案:

  • 對比;
  • 約束最小二乘;
  • 線性混合模型或懲罰最小二乘法。

前兩個仍然在固定效果建模的範圍內。 通過“對比”,我們減少了參數的數量,直到獲得完整的秩模型矩陣為止。 而另外兩個並沒有減少參數的數量,而是有效地減少了有效的自由度。

現在,您肯定會遵循“對比”方式。 因此,請記住,我們必須刪除2列。 他們可以

  • f 一列和 g 一列,給出 ~ f + g 的模型,其中 fg 形成對比;
  • 截取,然後從 fg 一列,得到一個模型 ~ f + g - 1

現在您應該清楚,在刪除列的框架內,您無法獲得所需的內容,因為您希望僅刪除1列。 結果模型矩陣仍將是秩不足的。

如果您真的想在那裡擁有所有係數,請使用約束最小二乘法,或使用懲罰回歸/線性混合模型。

現在,當我們具有各種因素的相互作用時,事情變得更加複雜,但想法仍然相同。 但是鑑於我的回答已經足夠長了,所以我不想繼續。

我正在對多個屬性(包括兩個分類屬性 BF 進行線性回歸,但我沒有獲得每個係數水平的係數值。

B 有9個等級, F 有6個等級。 最初運行模型(帶有截距)時,我得到了 B 8個係數和 F 5個係數,我將其理解為每個係數都包含在截距中的第一級。

我想根據其係數對 BF 的級別進行排名,因此我在每個因子之後加 -1 ,以將截距鎖定為0,這樣我就可以獲得所有級別的係數。

Call:
lm(formula = dependent ~ a + B-1 + c + d + e + F-1 + g + h, data = input)

Coefficients:
       Estimate Std. Error t value Pr(>|t|)    
a     2.082e+03  1.026e+02  20.302  < 2e-16 ***
B1   -1.660e+04  9.747e+02 -17.027  < 2e-16 ***
B2   -1.681e+04  9.379e+02 -17.920  < 2e-16 ***
B3   -1.653e+04  9.254e+02 -17.858  < 2e-16 ***
B4   -1.765e+04  9.697e+02 -18.202  < 2e-16 ***
B5   -1.535e+04  1.388e+03 -11.059  < 2e-16 ***
B6   -1.677e+04  9.891e+02 -16.954  < 2e-16 ***
B7   -1.644e+04  9.694e+02 -16.961  < 2e-16 ***
B8   -1.931e+04  9.899e+02 -19.512  < 2e-16 ***
B9   -1.722e+04  9.071e+02 -18.980  < 2e-16 ***
c    -6.928e-01  6.977e-01  -0.993 0.321272    
d    -3.288e-01  2.613e+00  -0.126 0.899933    
e    -8.384e-01  1.171e+00  -0.716 0.474396    
F2    4.679e+02  2.176e+02   2.150 0.032146 *  
F3    7.753e+02  2.035e+02   3.810 0.000159 ***
F4    1.885e+02  1.689e+02   1.116 0.265046    
F5    5.194e+02  2.264e+02   2.295 0.022246 *  
F6    1.365e+03  2.334e+02   5.848 9.94e-09 ***
g     4.278e+00  7.350e+00   0.582 0.560847    
h     2.717e-02  5.100e-03   5.328 1.62e-07 ***

這部分起作用,導致顯示 B 的所有級別,但是仍然不顯示 F1 由於不再有截距,我很困惑為什麼 F1 不在線性模型中。

切換呼叫順序,以使 + F - 1+ B - 1 + F - 1 之前,會導致 F 的所有層的係數可見,但 B1 不可見。

是否有人知道如何顯示 BF 所有水平,或者如何從我的輸出中評估 F1 與其他水平的 F 的相對權重?





lm