R - Управление порядком взаимодействия в матрице модели - PullRequest
1 голос
/ 16 марта 2019

Я хотел бы контролировать порядок фиктивных кодов взаимодействия в расчетной матрице отдельно от порядка фиктивных кодов основных эффектов. В частности, порядок, в котором циклы, которые делают взаимодействие циклически.

Например:

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

Спасибо!

...