[英]model.matrix(): why do I lose control of contrast in this case
假設我們有一個玩具數據框:
x <- data.frame(x1 = gl(3, 2, labels = letters[1:3]),
x2 = gl(3, 2, labels = LETTERS[1:3]))
我想構造一個模型矩陣
# x1b x1c x2B x2C
# 1 0 0 0 0
# 2 0 0 0 0
# 3 1 0 1 0
# 4 1 0 1 0
# 5 0 1 0 1
# 6 0 1 0 1
通過:
model.matrix(~ x1 + x2 - 1, data = x,
contrasts.arg = list(x1 = contr.treatment(letters[1:3]),
x2 = contr.treatment(LETTERS[1:3])))
但實際上我得到:
# x1a x1b x1c x2B x2C
# 1 1 0 0 0 0
# 2 1 0 0 0 0
# 3 0 1 0 1 0
# 4 0 1 0 1 0
# 5 0 0 1 0 1
# 6 0 0 1 0 1
# attr(,"assign")
# [1] 1 1 1 2 2
# attr(,"contrasts")
# attr(,"contrasts")$x1
# b c
# a 0 0
# b 1 0
# c 0 1
# attr(,"contrasts")$x2
# B C
# A 0 0
# B 1 0
# C 0 1
我在這里有些困惑:
那為什么我要得到一個5列的模型矩陣呢? 如何獲得所需的模型矩陣?
每當我們失去對R級別的控制時,在C級別必須有一些默認的,不變的行為。 可以在R源代碼包中找到model.matrix.default()
C代碼:
R-<release_number>/src/library/stats/src/model.c
我們可以在這里找到解釋:
/* If there is no intercept we look through the factor pattern */
/* matrix and adjust the code for the first factor found so that */
/* it will be coded by dummy variables rather than contrasts. */
讓我們用數據框對此做一個小測試
x <- data.frame(x1 = gl(2, 2, labels = letters[1:2]), x2 = sin(1:4))
如果我們在RHS上只有x2
,我們可以成功地丟棄攔截:
model.matrix(~ x2 - 1, data = x) # x2 #1 0.8414710 #2 0.9092974 #3 0.1411200 #4 -0.7568025
如果我們在RHS上只有x1
,則不應用對比度:
model.matrix(~ x1 - 1, data = x) # x1a x1b #1 1 0 #2 1 0 #3 0 1 #4 0 1
當我們同時擁有x1
和x2
,不應用對比度:
model.matrix(~ x1 + x2 - 1, data = x) # x1a x1b x2 #1 1 0 0.8414710 #2 1 0 0.9092974 #3 0 1 0.1411200 #4 0 1 -0.7568025
這意味着盡管兩者之間存在差異:
lm(y ~ x2, data = x)
lm(y ~ x2 - 1, data = x)
兩者之間沒有區別
lm(y ~ x1, data = x)
lm(y ~ x1 - 1, data = x)
要么
lm(y ~ x1 + x2, data = x)
lm(y ~ x1 + x2 - 1, data = x)
出現這種現象的原因不是為了確保數值穩定性,而是為了確保估計/預測的敏感性。 如果我們在對x1
施加對比度時確實放下了截距,則最終得到一個模型矩陣:
# x1b
#1 0
#2 0
#3 1
#4 1
結果是我們將級別a
估計限制為0。
在這篇文章中: 如何在此線性模型中強制下降截距或等效截距? ,我們有一個數據集:
# Y X1 X2
#1 1.8376852 TRUE TRUE
#2 -2.1173739 TRUE FALSE
#3 1.3054450 FALSE TRUE
#4 -0.3476706 TRUE FALSE
#5 1.3219099 FALSE TRUE
#6 0.6781750 FALSE TRUE
該數據集中沒有聯合存在(X1 = FALSE, X2 = FALSE)
。 但是從廣義上講, model.matrix()
必須做一些安全且明智的事情。 有偏頗的假設是,訓練數據集中沒有兩個因子水平的共同存在意味着不需要預測它們。 如果我們在應用對比度時確實丟棄了截距,則這種聯合存在被約束為0。但是,該職位的OP故意想要這種非標准行為(出於某種原因),在這種情況下,我的答案給出了一種可能的解決方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.