在 model.matrix 中定义控制值
defining the control value in a model.matrix
构建模型矩阵时,我注意到在处理具有 2 个以上值的变量时,模型矩阵似乎随机 select 将哪些变量用作列:
在示例 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 不关心。但是有没有办法指定哪些变量应该被排除在外(在这种情况下,我希望 diet = med 成为控制,因此被排除在外)
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
选择不是随机的。它忽略了因素的第一级是什么。在你的例子中,观察
# 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"
默认情况下,它们按字母顺序排序。因此,在第一种情况下,"control" 用作参考,而在第二种情况下,"high" 用作参考。如果两个因素的水平相同,这就不是问题。您可以通过在创建因子时将因子设置为具有相同的显式水平来调整它,或者您可以使用 relevel()
命令。例如
diet <- relevel(diet,"med")
model.matrix(~ diet + sex)
此外,请记住它们不是 "left out";默认对比度是参考水平,因此参考水平最终会截取它们。如果你在没有截距的情况下拟合模型,那么它们都在那里
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
构建模型矩阵时,我注意到在处理具有 2 个以上值的变量时,模型矩阵似乎随机 select 将哪些变量用作列:
在示例 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 不关心。但是有没有办法指定哪些变量应该被排除在外(在这种情况下,我希望 diet = med 成为控制,因此被排除在外)
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
选择不是随机的。它忽略了因素的第一级是什么。在你的例子中,观察
# 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"
默认情况下,它们按字母顺序排序。因此,在第一种情况下,"control" 用作参考,而在第二种情况下,"high" 用作参考。如果两个因素的水平相同,这就不是问题。您可以通过在创建因子时将因子设置为具有相同的显式水平来调整它,或者您可以使用 relevel()
命令。例如
diet <- relevel(diet,"med")
model.matrix(~ diet + sex)
此外,请记住它们不是 "left out";默认对比度是参考水平,因此参考水平最终会截取它们。如果你在没有截距的情况下拟合模型,那么它们都在那里
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