我想在R中为因子实验创建一个无约束的设计矩阵,下面的代码给出了我想要的矩阵.但是代码需要model.matrix针对每个因素以及拦截术语单独命令.我很好奇是否可以通过单个衬垫获得相同的结果.谢谢
y <- c(55, 56, 57, 53, 54, 55, 51, 52, 53, 61, 62, 63)
N <- gl(n = 2, k = 6, length = 2 * 6
, labels = c("Low", "High")
, ordered = FALSE)
P <- gl(n = 2, k = 3, length = 2 * 6
, labels = c("Low", "High")
, ordered = FALSE)
Data <- data.frame(y, N, P)
X <-
cbind(
model.matrix(object = y ~ 1, data = Data)
, model.matrix(object = y ~ -1 + N, data = Data)
, model.matrix(object = y ~ -1 + P, data = Data)
, model.matrix(object = y ~ -1 + N:P, data = Data)
)
print(x = X)
Run Code Online (Sandbox Code Playgroud)
我认为关键是将所有对比设置为 FALSE。我想从技术上讲,这可能是一条单行线……这只是一条很长的线。
model.matrix(y ~ N +P + N:P, data=Data,
contrasts.arg = lapply(Data[,sapply(Data, is.factor)],
contrasts, contrasts=FALSE))
(Intercept) NLow NHigh PLow PHigh NLow:PLow NHigh:PLow NLow:PHigh NHigh:PHigh
1 1 1 0 1 0 1 0 0 0
2 1 1 0 1 0 1 0 0 0
3 1 1 0 1 0 1 0 0 0
4 1 1 0 0 1 0 0 1 0
5 1 1 0 0 1 0 0 1 0
6 1 1 0 0 1 0 0 1 0
7 1 0 1 1 0 0 1 0 0
8 1 0 1 1 0 0 1 0 0
9 1 0 1 1 0 0 1 0 0
10 1 0 1 0 1 0 0 0 1
11 1 0 1 0 1 0 0 0 1
12 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")$N
Low High
Low 1 0
High 0 1
attr(,"contrasts")$P
Low High
Low 1 0
High 0 1
Run Code Online (Sandbox Code Playgroud)