corn_bunting
corn_bunting

Reputation: 381

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

I have a linear model and it is important the terms are entered in a specific order because I plan to use a type I ANOVA. I would like the model to include the first two main effects and their interaction before the third main effect.

However when I enter this as a formula into lm(), it still gives me the output with all three main effects first and then the interactions. Can this be changed?

## 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))

Upvotes: 1

Views: 754

Answers (1)

corn_bunting
corn_bunting

Reputation: 381

Turns out it is possible using a terms object:

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)

Upvotes: 0

Related Questions