R формула () фиктивного кодирования модели матричного фактора взаимодействия

Я пытаюсь использовать formula генерировать model.matrix объект, который будет использоваться в пользовательской функции оптимизатора.

По большей части это прекрасно работает, но когда дело доходит до взаимодействия фактор-фактор, я бы хотел указать взаимодействие как фиктивно, а не как эффекты.

Возьмем для примера следующий набор данных:

set.seed(1987)
myDF <- data.frame(Y = rnorm(100),
               X1 = factor(LETTERS[sample(1:3, 100, replace = TRUE)]),
               X2 = factor(LETTERS[sample(1:3, 100, replace = TRUE)]))

head(myDF)

Оба : а также / операторы создают матрицу кодированных эффектов эффектов (я думаю, что последняя является аддитивной структурой эффектов).

head(model.matrix(formula(Y ~ X1 : X2), data = myDF))
head(model.matrix(formula(Y ~ X1 / X2), data = myDF))

Но я хочу сгенерировать фиктивную матрицу модели, которая будет иметь первый уровень X1 опущен для каждого уровня X2, В результате в этих условиях (столбцы):

X1B: X2A

X1C: X2A

X1B: X2B

X1C: X2B

X1B: x2c

X1C: x2c

Есть ли способ добиться этого?

2 ответа

Является ~X1:X2-1 что ты ищешь?

Сделайте тестовые данные (как указано выше):

set.seed(1987)
myDF <- data.frame(Y = rnorm(100),
          X1 = factor(LETTERS[sample(1:3, 100, replace = TRUE)]),
          X2 = factor(LETTERS[sample(1:3, 100, replace = TRUE)]))

Сгенерировать матрицу модели:

mm1 <- model.matrix(formula(Y ~ X1 : X2 - 1), data = myDF)
head(mm1)
##   X1A:X2A X1B:X2A X1C:X2A X1A:X2B X1B:X2B X1C:X2B X1A:X2C X1B:X2C X1C:X2C
## 1       0       0       0       0       1       0       0       0       0
## 2       1       0       0       0       0       0       0       0       0
## 3       0       0       0       0       0       0       0       1       0
## 4       0       0       0       0       0       1       0       0       0
## 5       0       0       0       1       0       0       0       0       0
## 6       0       0       0       0       0       0       1       0       0

Или, возможно, вы действительно хотите исключить некоторые столбцы:

mm0 <- model.matrix(formula(Y ~ X1 : X2), data = myDF)
mm0B <- mm0[,!grepl("(Intercept|^X1A:)",colnames(mm0))]
##   X1B:X2A X1C:X2A X1B:X2B X1C:X2B X1B:X2C X1C:X2C
## 1       0       0       1       0       0       0
## 2       0       0       0       0       0       0
## 3       0       0       0       0       1       0
## 4       0       0       0       1       0       0
## 5       0       0       0       0       0       0
## 6       0       0       0       0       0       0

Я подумал, что вас также могут заинтересовать контрасты с суммой в ноль:

 mm2 <- model.matrix(formula(Y ~ X1 : X2 - 1), data = myDF,
                     contrasts.arg=list(X1=contr.sum,X2=contr.sum))

Ниже еще одно испытание.

set.seed(1987)
myDF <- data.frame(Y = rnorm(100),
                   X1 = factor(LETTERS[sample(1:3, 100, replace = TRUE)]),
                   X2 = factor(LETTERS[sample(1:3, 100, replace = TRUE)]))
# row subsetting to exclude A
modelMat <- model.matrix(formula(Y ~ X1 : X2), data = myDF[myDF$X1 != 'A',])
# column subsetting to eliminate all columns including X1A
modelMat <- modelMat[,substring(colnames(modelMat), 1, 3) != "X1A"]
head(modelMat)
   (Intercept) X1B:X2A X1C:X2A X1B:X2B X1C:X2B X1B:X2C X1C:X2C
1            1       0       0       1       0       0       0
3            1       0       0       0       0       1       0
4            1       0       0       0       1       0       0
8            1       0       0       0       0       1       0
10           1       0       0       0       0       0       1
11           1       0       0       0       0       0       1
Другие вопросы по тегам