在lm中写交互术语的不同方法?

机器算法验证 r 回归 相互作用
2022-02-05 09:09:30

我有一个问题,即在回归模型中指定交互的最佳方式是哪种。考虑以下数据:

d <- structure(list(r = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
     1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("r1","r2"),
     class = "factor"), s = structure(c(1L, 1L, 1L, 1L, 1L, 
     2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L), 
    .Label = c("s1","s2"), class = "factor"), rs = structure(c(1L, 1L,
     1L,1L, 1L,2L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 4L, 4L, 4L, 4L, 4L),
    .Label = c("r1s1","r1s2", "r2s1", "r2s2"), class = "factor"), 
     y = c(19.3788027518437, 23.832287726332, 26.2533235300492,
     15.962906892112, 24.2873740664331, 28.5181676764727, 25.2757801195961,
     25.3601044326474, 25.3066440027202, 24.3298865128677, 32.5684219007394,
     31.0048406654209, 31.671238316086, 34.1933764518288, 36.8784821769123,
     41.6691435168277, 40.4669714825801, 39.2664137501106, 39.4884849591932,
     49.247505535468)), .Names = c("r","s", "rs", "y"), 
     row.names = c(NA, -20L), class = "data.frame")

指定具有交互作用的模型的两种等效方法是:

lm0 <- lm(y ~ r*s, data=d)
lm1 <- lm(y ~ r + s + r:s, data=d)

我的问题是我是否可以指定考虑具有相同交互级别的新变量(rs)的交互:

lm2 <- lm(y ~ r + s + rs, data=d)

这种方法有什么优点/缺点?为什么这两种方法的结果不同?

summary(lm1)

lm(formula = y ~ r + s + r:s, data = d, x = TRUE)
            coef.est coef.se
(Intercept) 21.94     1.46  
rr2         11.32     2.07  
ss2          3.82     2.07  
rr2:ss2      4.95     2.92  
---
n = 20, k = 4
residual sd = 3.27, R-Squared = 0.87


summary(lm2)

lm(formula = y ~ r + s + rs, data = d, x = TRUE)
            coef.est coef.se
(Intercept) 21.94     1.46  
rr2         11.32     2.07  
ss2          8.76     2.07   # ss2 coef is different from lm1
rsr1s2      -4.95     2.92  
---
n = 20, k = 4
residual sd = 3.27, R-Squared = 0.87
3个回答

结果是不同的,因为 lm 设置具有交互的模型的方式与您自己设置时的设置方式不同。如果您查看残差 sd,它是相同的,这表明(不是明确地)底层模型是相同的,只是表达方式不同(对 lm 内部)。

如果您将交互定义为paste(d$s, d$r)而不是paste(d$r, d$s)您的参数估计将再次以有趣的方式发生变化。

请注意,在 lm1 的模型摘要中,ss2 的系数估计值比 lm2 的摘要中低 4.94,而 rr2:ss2 的系数为 4.95(如果打印到小数点后 3 位,则差异消失)。这是术语内部重新排列的另一个迹象。

我想不出自己做这件事有什么好处,但可能有一个模型更复杂,你不想要一个完整的交互项,而是只需要两个或多个因素之间的“交叉”中的一些项。

如果您查看模型矩阵,您可能会更好地理解这种行为。

 model.matrix(lm1 <- lm(y ~ r*s, data=d))
 model.matrix(lm2 <- lm(y ~ r + s + rs, data=d))

当您查看这些矩阵时,您可以将 的星座s2=1与其他变量进行比较(即,何时s2=1,其他变量取哪些值?)。您会看到这些星座略有不同,这仅意味着基本类别不同。其他一切都基本相同。特别要注意,在您的lm1中,系数ss2等于 的系数ss2+rsr1s2lm2即 3.82=8.76-4.95,没有舍入误差。

例如,执行以下代码会得到与使用 R 的自动设置完全相同的输出:

  d$rs <- relevel(d$rs, "r1s1")
  summary(lm1 <- lm(y~ factor(r) + factor(s) + factor(rs), data=d))

这也为您的问题提供了一个快速的答案:改变因子设置方式的真正唯一原因是提供说明性的清晰度。考虑以下示例:假设您在与表明您是否属于少数群体的因素相互作用的情况下,对完成高中的虚拟人的工资进行回归。

即:wage=α+β edu+γ eduminority+ϵ

如果您确实属于少数人,则如果所述少数人因素取值为 1,则系数可以解释为已完成高中的非少数人的工资差异。如果这是您感兴趣的系数,那么您应该这样编码。否则,如果您不属于少数人,则假设少数人因子取值为 1。然后,为了查看非少数族裔在完成高中时能赚多少,您必须“手动”计算请注意,尽管所有信息都包含在估计中,但实质性结果不会因设置不同的因素而改变!ββ+γ

我认为有充分的理由不使用 lm(y ~ r + s + rs, data=d)

当您创建 rs 并将其放入公式时,R 会将 rs 视为另一个变量,它无法知道它是 r 和 s 的交互。如果您使用 drop1() 或逐步回归,这很重要。在公式中保持与 x 交互的同时删除变量 x 是无效的。R 知道这一点,因此 drop1() 只会删除导致有效公式的变量。如果公式包含 rs,则无法知道尝试删除 r(或 s)是无效的。

d$rs <- paste(d$r, d$s)
lm1 <- lm(y ~ r + s + r:s, data=d)
lm3 <- lm(y ~ r + s + rs, data=d)

drop1(lm1)
Single term deletions

Model:
y ~ r + s + r:s
       Df Sum of Sq    RSS    AIC
<none>              171.05 50.924
r:s     1    30.619 201.67 52.218 # only the interaction term can be dropped

drop1(lm3)
Single term deletions

Model:
y ~ r + s + rs
       Df Sum of Sq    RSS    AIC
<none>              171.05 50.924
r       0     0.000 171.05 50.924 # invalid
s       0     0.000 171.05 50.924 # invalid
rs      1    30.619 201.67 52.218

顺便说一句,我相信以下都是等价的

lm0 <- lm(y ~ r*s, data=d)
lm1 <- lm(y ~ r + s + r:s, data=d)
lm2 <- lm(y ~ r + s + r*s, data=d)

公式部分都转换为相同的公式。