我想控制设计矩阵中交互虚拟代码的顺序,与主效应虚拟代码的顺序分开。特别是进行交互的术语的循环顺序。
例如:
df <- expand.grid(X1 = letters[1:3],
X2 = LETTERS[24:26])
当写公式为时~X1+X2+X1:X2
,交互设计X2
循环往复X1
。
model.matrix(~X1+X2+X1:X2, df)
#> (Intercept) X1b X1c X2Y X2Z X1b:X2Y X1c:X2Y X1b:X2Z X1c:X2Z
#> 1 1 0 0 0 0 0 0 0 0
#> 2 1 1 0 0 0 0 0 0 0
#> 3 1 0 1 0 0 0 0 0 0
#> 4 1 0 0 1 0 0 0 0 0
#> 5 1 1 0 1 0 1 0 0 0
#> 6 1 0 1 1 0 0 1 0 0
#> 7 1 0 0 0 1 0 0 0 0
#> 8 1 1 0 0 1 0 0 1 0
#> 9 1 0 1 0 1 0 0 0 1
#> attr(,"assign")
#> [1] 0 1 1 2 2 3 3 3 3
#> attr(,"contrasts")
#> attr(,"contrasts")$X1
#> [1] "contr.treatment"
#>
#> attr(,"contrasts")$X2
#> [1] "contr.treatment"
当我将公式中的交互项翻转为 时~X1+X2+X2:X1
,交互设计仍然会先循环X2
再循环X1
。
model.matrix(~X1+X2+X2:X1, df)
#> (Intercept) X1b X1c X2Y X2Z X1b:X2Y X1c:X2Y X1b:X2Z X1c:X2Z
#> 1 1 0 0 0 0 0 0 0 0
#> 2 1 1 0 0 0 0 0 0 0
#> 3 1 0 1 0 0 0 0 0 0
#> 4 1 0 0 1 0 0 0 0 0
#> 5 1 1 0 1 0 1 0 0 0
#> 6 1 0 1 1 0 0 1 0 0
#> 7 1 0 0 0 1 0 0 0 0
#> 8 1 1 0 0 1 0 0 1 0
#> 9 1 0 1 0 1 0 0 0 1
#> attr(,"assign")
#> [1] 0 1 1 2 2 3 3 3 3
#> attr(,"contrasts")
#> attr(,"contrasts")$X1
#> [1] "contr.treatment"
#>
#> attr(,"contrasts")$X2
#> [1] "contr.treatment"
我最终想要的是以下设计矩阵:
#> (Intercept) X1b X1c X2Y X2Z X1b:X2Y X1b:X2Z X1c:X2Y X1c:X2Z
#> 1 1 0 0 0 0 0 0 0 0
#> 2 1 1 0 0 0 0 0 0 0
#> 3 1 0 1 0 0 0 0 0 0
#> 4 1 0 0 1 0 0 0 0 0
#> 5 1 1 0 1 0 1 0 0 0
#> 6 1 0 1 1 0 0 0 1 0
#> 7 1 0 0 0 1 0 0 0 0
#> 8 1 1 0 0 1 0 1 0 0
#> 9 1 0 1 0 1 0 0 0 1
谢谢!