让我们看看这里发生了什么。
(dd <- expand.grid(f1=letters[1:2],f2=LETTERS[1:2]))
## f1 f2
## 1 a A
## 2 b A
## 3 a B
## 4 b B
添加响应变量:
dd2 <- data.frame(dd,y=c(1,2,3,5))
使用model.matrix() 查看构造了哪些虚拟变量。
data.frame(dd,model.matrix(~f1*f2,data=dd),check.names=FALSE)
## f1 f2 (Intercept) f1b f2B f1b:f2B
## 1 a A 1 0 0 0
## 2 b A 1 1 0 0
## 3 a B 1 0 1 0
## 4 b B 1 1 1 1
所以基线(截距)是a:A 组合; f1b 参数是a-b 当f2==A 时的对比; f2B 参数是A-B 当f1==a 时的对比;在给定加性期望的情况下,相互作用是bB-aA 之间的对比。
如果我们显式添加交互,R 不知道删除截距列。在这个过度参数化的模型矩阵中,实际上并没有“基线”级别,但是当存在秩不足时,R 默认会删除 last 列,因此您最终会有效地得到bB作为您的基线(因为矩阵的bB 行是[1 0 0 0],如果我们删除最后一列)。
data.frame(dd,X3 <- model.matrix(~f1:f2,data=dd),check.names=FALSE)
## f1 f2 (Intercept) f1a:f2A f1b:f2A f1a:f2B f1b:f2B
## 1 a A 1 1 0 0 0
## 2 b A 1 0 1 0 0
## 3 a B 1 0 0 1 0
## 4 b B 1 0 0 0 1
如果要使用指定的模型矩阵,可以直接作弊。你要记住,如果你没有在公式中指定-1,R会自动重新添加一个intercept列,所以这里我们去掉前两列(y~.说“使用所有的变量在数据框,除了响应变量,作为预测变量”)。
dd3 <- data.frame(y=dd2$y,X3[,-(1:2)])
coef(lm(y~.,data=dd3))
查看上面的模型矩阵但省略了第二列,我们将其解释为:
-
(Intercept) ([1 0 0 0]) 是a-A 的值
-
f1b:f2A ([1 1 0 0]) 是a-b 对比f2=A
-
f1a:f2B ([1 0 1 0]) 是A-B 对比f1=a
- 现在的交互是
b-B 和a-A 之间的直接对比,但未校正加性效果。这真的是你想要的吗?