在R中构建广义线性模型时,如何设置交互项的基本级别?

时间:2016-08-12 17:42:32

标签: r

当我包括因子1,因子2及其相互作用时,交互项将每个基本级别的组合作为其基本级别。但是,如果我仅包括交互项(因子1:因子2而不是因子1 *因子2),则将两者的最后一级的组合用作参考(即,该行具有用于估计的“NA”,std错误等)。在构建模型之前,我已经多次检查过每个因素都配置了正确的基本级别。有没有办法让每个第一级的组合作为参考?谢谢!

1 个答案:

答案 0 :(得分:0)

让我们来看看这里发生了什么。

(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不知道丢弃拦截列。在这个过度参数化的模型矩阵中,并没有真正的&#34;基线&#34;级别,但是当存在排名缺陷时,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会自动重新添加拦截列,因此我们在此处删除前两列(y~.表示& #34;使用数据框中的所有变量(响应变量除外)作为预测变量&#34;)。

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-Ba-A之间的直接对比,但未校正的加性效果。这真的是你想要的吗?