R formula()虚拟编码模型矩阵因子交互

时间:2015-04-20 20:05:51

标签: r formula model.matrix

我正在尝试使用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 个答案:

答案 0 :(得分: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))

答案 1 :(得分:0)

以下是另一项试验。

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