2012-11-17 23 views
8

我想爲R中的階乘實驗創建一個無約束設計矩陣,下面的代碼給出了所需的矩陣。但是代碼需要單獨的model.matrix命令來處理每個因素以及攔截項。我很好奇是否可以通過單一班輪獲得相同的結果。由於用於階乘實驗的無約束設計矩陣R

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) 

回答

3

我覺得關鍵是所有對比設置爲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 
3

不是一個襯墊,但也許有些簡單:

contrasts(N, nlevels(N)) <- diag(nlevels(N)) 
contrasts(P, nlevels(P)) <- diag(nlevels(P)) 
Data2 <- data.frame(y, N, P) 
X2 <- model.matrix(y ~ 1 + N + P + N:P, data=Data2)