【问题标题】:How do I set the base level for an interaction term when building a generalized linear model in R?在 R 中构建广义线性模型时,如何设置交互项的基本级别?
【发布时间】:2016-12-19 20:17:24
【问题描述】:

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

【问题讨论】:

  • 请添加reproducible example,其中包含示例数据和您正在运行的代码,以便我们更清楚地看到问题并测试可能的解决方案。

标签: r


【解决方案1】:

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

(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-bf2==A 时的对比; f2B 参数是A-Bf1==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-Ba-A 之间的直接对比,但未校正加性效果。这真的是你想要的吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    • 2014-07-17
    相关资源
    最近更新 更多