假设我们有一个玩具数据帧:model.matrix():为什么我失去的对比度控制在这种情况下
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列的模型矩阵?我怎样才能得到我想要的模型矩阵?
我认为这样做是正确的。你不能只有只有零的行。 –
正如你在答案中所说的那样,总是可以自己创建虚拟变量。用这种方法,你可以得到你想要的精确模型矩阵。然而,如果你有只包含零的行,矩阵将是单数的(用统计学的话来说,你有“完美的共线性”),这意味着无法获得参数估计值。请参阅:https://stats.stackexchange.com/questions/70899/ –
如果您确实需要破碎的模型矩阵,让它有一个截距,然后放下列:'model.matrix(〜x1 + x2,data = x)[,-1]'。虽然我无法真正想象这会对...有用... – Gregor