簡體   English   中英

model.matrix():在這種情況下為什么我無法控制對比度

[英]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))
  1. 如果我們在RHS上只有x2 ,我們可以成功地丟棄攔截:

     model.matrix(~ x2 - 1, data = x) # x2 #1 0.8414710 #2 0.9092974 #3 0.1411200 #4 -0.7568025 
  2. 如果我們在RHS上只有x1 ,則不應用對比度:

     model.matrix(~ x1 - 1, data = x) # x1a x1b #1 1 0 #2 1 0 #3 0 1 #4 0 1 
  3. 當我們同時擁有x1x2 ,不應用對比度:

     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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM