在公式对象中使用*运算符时model.matrix的行为

时间:2019-01-25 00:55:57

标签: r

由于某些原因,我尝试重新实现model.matrix函数(C ++)。在一些测试中,我观察到了我不了解的行为。

cand.list = expand.grid(x1 = c(0.0, 0.2, 0.4, 0.6,0.8,1.0),
                    x2 = c(0.0, 0.2, 0.4, 0.6,0.8,1.0),
                    x3 = c("A", "B","C"))
data=cand.list
frml1<-~quad(x1)*quad(x2)*x3
frml2<-~quad(x1)*x3*quad(x2)
frml3<-~x3*quad(x1)*quad(x2)

X1<-model.matrix(frml1,data)
X2<-model.matrix(frml2,data)
X3<-model.matrix(frml3,data)

所有x的行数相同,因为数据提供的组合数相同。但是,X1和X3有10列,X2有14列。而且,X1和X3的元素不同。

> X1
(Intercept)  x1 I(x1^2)  x2 I(x2^2) x3B x3C I(x1^2):x2 I(x2^2):x3B I(x2^2):x3C
> X2
(Intercept)  x1 I(x1^2) x3B x3C  x2 I(x2^2) I(x1^2):x3B I(x1^2):x3C I(x1^2):x2 x3B:x2 x3C:x2 I(x1^2):x3B:x2
> X3
(Intercept) x3B x3C  x1 I(x1^2)  x2 I(x2^2) x3B:x1 x3C:x1 I(x1^2):x2

因此,显然乘法的顺序很重要。这很令人困惑,因为没有quad()的顺序并不重要。

frml4<-~x1*x2*x3
frml5<-~x1*x3*x2
frml6<-~x3*x1*x2

X4<-model.matrix(frml4,data)
X5<-model.matrix(frml5,data)
X6<-model.matrix(frml6,data)

所有模型矩阵均由12列组成。为什么这些模型比frml1和frml3包含更多的模型项。 我是否缺少特定的规则?是否有相应算法的参考。

0 个答案:

没有答案