可以指定 R 中 lm() 中主效应与交互作用项的顺序吗?

Can the order of main effect vs interaction terms in lm() in R be specified?

我有一个线性模型,按特定顺序输入项很重要,因为我打算使用 I 型方差分析。我希望模型在第三个主效应之前包括前两个主效应及其相互作用。

然而,当我将其作为公式输入 lm() 时,它仍然首先为我提供包含所有三个主要影响的输出,然后是交互作用。这可以更改吗?

## Example data:
df <- structure(list(x1 = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 3L, 3L,3L, 3L, 3L, 3L, 3L), 
.Label = c("A", "B", "C"), class = "factor"), 
x2 = c(0L, 1L, 0L, 1L, 1L, 1L, 0L, 0L, 0L, 1L, 1L, 0L, 1L, 1L, 0L, 0L, 1L,
 0L, 1L, 0L, 1L, 1L, 0L, 0L),
x3 = c(1L, 3L, 4L, 5L, 2L, 3L, 3L, 4L, 5L, 1L, 3L, 4L, 5L, 6L, 4L, 3L, 4L,
 1L, 2L, 2L, 1L, 1L, 3L, 2L),
y = c(49.5, 62.8, 46.8, 57, 59.8, 58.5, 55.5, 56, 62.8, 55.8, 69.5, 55, 62,
 48.8, 45.5, 44.2, 52, 51.5, 49.8, 48.8, 57.2, 59, 53.2, 56)), 
class = "data.frame", row.names = c(NA, -24L))

## formula using desired order:
mod1 <- lm(y ~ x1 + x2 + x1:x2 + x3 + x1:x3 + x2:x3 + x1:x2:x3, data=df)

## standard formula:
mod2 <- lm(y ~ x1*x2*x3, data=df)

## same order in anova output:
anova(mod1)
anova(mod2)

## test to show coefficient order affects outputs:
## (but can only change main effects around)  
anova(mod2 <- lm(y ~ x1*x2*x3, data=df))
anova(mod3 <- lm(y ~ x1*x3*x2, data=df))

事实证明可以使用 terms 对象:

mod_terms<-terms(y ~ x1 + x2 + x1:x2 + x3 + x1:x3 + x2:x3 + x1:x2:x3, keep.order=T)
mod3 <- lm(mod_terms, data=df)
anova(mod3)