[英]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.