R公式()虚拟编码模型矩阵因子相互作用

R公式()虚拟编码模型矩阵因子相互作用,r,formula,model.matrix,R,Formula,Model.matrix,我正试图使用公式生成一个model.matrix对象,用于自定义优化器函数 它在大多数情况下都很有效,但是当涉及到因子交互时,我想将交互指定为虚拟编码,而不是效果编码 以以下数据集为例: set.seed(1987) myDF <- data.frame(Y = rnorm(100), X1 = factor(LETTERS[sample(1:3, 100, replace = TRUE)]), X2 = factor(LETTE

我正试图使用
公式
生成一个
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)
但我希望生成一个虚拟编码的模型矩阵,对于每个级别的
X2
,都会忽略第一级
X1
。产生这些术语(列):

X1B:X2A

X1C:X2A

X1B:X2B

X1C:X2B

X1B:X2C

X1C:X2C


有没有办法做到这一点?

你要找的是
~X1:X2-1

制作测试数据(如上所述):

set.seed(1987)

myDF下面是另一个试验

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
set.seed(1987)

myDF您在
mm0B
对象中拥有的正是我在寻找的输出。我想我希望在
公式
模型.matrix
调用中有一种直接实现这一点的方法,因为我不一定知道公式中RHS的变量将被命名为什么或它们将是什么类。正如您所演示的,放弃拦截是可行的。
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