在构建模型矩阵时,我注意到在处理具有2个以上值的变量时,模型矩阵似乎随机选择要用作列的变量:
在示例1中:
diet <- factor(c('high','high','control','control','low','low'))
sex <- factor(c("f","f","m","f","m","m"))
model.matrix(~ diet + sex)
(Intercept) diethigh dietlow sexm
1 1 1 0 0
2 1 1 0 0
3 1 0 0 1
4 1 0 0 0
5 1 0 1 1
6 1 0 1 1
饮食=控制,性别= f被推断。在饮食的情况下,控制被省略,所以我对矩阵感到满意。
在示例2中:
diet <- factor(c('high','high','med','med','low','low'))
sex <- factor(c("f","f","m","f","m","m"))
model.matrix(~ diet + sex)
(Intercept) dietlow dietmed sexm
1 1 0 0 0
2 1 0 0 0
3 1 0 1 1
4 1 0 1 0
5 1 1 0 1
6 1 1 0 1
diet = high是缺失的变量。现在我知道这可能是迂腐的,因为我知道R不关心。但有没有办法指定哪些变量应该被遗漏(在这种情况下,我希望饮食= med作为控制,因此被遗漏)
答案 0 :(得分:3)
选择不是随机的。它遗漏了因素的第一个层次。在您的示例中,请观察
# from example 1
levels(factor(c('high','high','control','control','low','low')))
# [1] "control" "high" "low"
# from example 2
levels(factor(c('high','high','med','med','low','low')))
# [1] "high" "low" "med"
默认情况下,它们按字母顺序排序。所以在第一种情况下,&#34;控制&#34;在第二种情况下用作参考&#34;高&#34;用作参考。如果你有相同的水平是两个因素,这不会是一个问题。您可以通过在创建因子时将因子设置为具有相同级别的显式来调整,或者可以使用relevel()
命令。例如
diet <- relevel(diet,"med")
model.matrix(~ diet + sex)
另外,请记住,他们不是&#34;被排除在外&#34 ;;默认对比度是参考水平,因此参考水平会在拦截它们时结束。如果你适合没有拦截的模型,那就是
model.matrix(~ diet -1)
# dietmed diethigh dietlow
# 1 0 1 0
# 2 0 1 0
# 3 1 0 0
# 4 1 0 0
# 5 0 0 1
# 6 0 0 1
答案 1 :(得分:1)
sex <- factor(c("f","f","m","f","m","m"))
diet <- factor(c('high','high','control','control','low','low'))
diet <- relevel(diet, "high")
model.matrix(~ diet + sex)
# (Intercept) dietcontrol dietlow sexm
# 1 1 0 0 0
# 2 1 0 0 0
# 3 1 1 0 1
# 4 1 1 0 0
# 5 1 0 1 1
# 6 1 0 1 1