您需要与factors
并设置contrasts
to FALSE
。尝试这个:
n <- 10
temp.data <- data.frame('x'=sample(c('A', 'B'), n, replace=TRUE),
'y'=factor(sample(c('J', 'D'), n, replace=TRUE)))
model.matrix( ~ 0 + x + y, data=temp.data,
contrasts=list(y=contrasts(temp.data$y, contrasts=FALSE)))
# xA xB yD yJ
# 1 0 1 1 0
# 2 1 0 0 1
# 3 0 1 1 0
# 4 1 0 0 1
# 5 0 1 0 1
# 6 1 0 1 0
# 7 1 0 1 0
# 8 0 1 1 0
# 9 0 1 0 1
# 10 0 1 1 0
# attr(,"assign")
# [1] 1 1 2 2
# attr(,"contrasts")
# attr(,"contrasts")$x
# [1] "contr.treatment"
#
# attr(,"contrasts")$y
# D J
# D 1 0
# J 0 1
要了解为什么会发生这种情况,请尝试:
contrasts(temp.data$y)
# J
# D 0
# J 1
contrasts(temp.data$y, contrasts=F)
# D J
# D 1 0
# J 0 1
和你的x
变量这通过设置自动发生0 +
删除拦截。 (实际上x
也应该编码为factor
).
原因是,在线性回归中,因子变量的水平通常与参考水平进行比较(您可以使用relevel
)。在您的模型矩阵中,0 +
您删除第一个变量的截距,但不删除以下变量(尝试model.matrix( ~ 0 + y + x, data=temp.data)
你只得到一个x
but to y
)。这是标准中确定的contrasts
默认情况下使用处理对比设置。
您可能想阅读相关帖子罗丝·梅尔 (2015)详细解释这一点: