9

R で要因実験用の制約のない計画行列を作成したいのですが、次のコードで目的の行列が得られます。ただし、このコードではmodel.matrix、各要素と切片項に対して個別のコマンドが必要です。ライナー1本で同じ結果が得られるのか気になります。ありがとう

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)
4

2 に答える 2

4

重要なのは、すべてのコントラストを 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
于 2013-06-05T20:59:31.410 に答える
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)
于 2013-05-31T09:46:15.350 に答える