データセットをRにインポートしやすくする:
dat <-
structure(list(A = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("a",
"b", "c"), class = "factor"), B = structure(c(1L, 2L, 3L, 4L,
1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L,
1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L
), .Label = c("a", "b", "c", "d"), class = "factor"), C = c(0.47,
0.88, 2.32, 3.26, 0.93, 1.86, 3.22, 0.92, 0.45, 0.92, 2.31, 3.24,
0.91, 1.84, 3.27, 0.86, 0.47, 0.9, 2.33, 3.19, 0.92, 1.84, 3.25,
0.93, 0.45, 0.92, 2.33, 3.08, 0.93, 1.86, 3.25, 0.93, 0.47, 0.9,
2.26, 3.09)), .Names = c("A", "B", "C"), class = "data.frame", row.names = c(NA,
-36L))
グループ処理によるSASの多くは、split-apply-combineメソッドにマップされます(データをパーツに分割し、各パーツで何かを実行し、それらのパーツを何らかの方法で元に戻します)。この場合、モデルの結果はオブジェクト(リスト)であり、複数のモデルを「組み合わせる」自然な方法は、それらをリストに入れることです。
library("plyr")
models <- dlply(dat, .(B), function(DF) glm(C~A, data=DF))
models
はリストになり、その各要素はglm
のサブセットのaの結果ですdim
。
> models
$a
Call: glm(formula = C ~ A, data = DF)
Coefficients:
(Intercept) Ab Ac
6.167e-01 1.500e-01 6.799e-17
Degrees of Freedom: 8 Total (i.e. Null); 6 Residual
Null Deviance: 0.472
Residual Deviance: 0.427 AIC: 6.107
$b
Call: glm(formula = C ~ A, data = DF)
Coefficients:
(Intercept) Ab Ac
1.220000 0.306667 0.006667
Degrees of Freedom: 8 Total (i.e. Null); 6 Residual
Null Deviance: 1.99
Residual Deviance: 1.806 AIC: 19.09
$c
Call: glm(formula = C ~ A, data = DF)
Coefficients:
(Intercept) Ab Ac
2.616667 0.333333 -0.003333
Degrees of Freedom: 8 Total (i.e. Null); 6 Residual
Null Deviance: 1.958
Residual Deviance: 1.733 AIC: 18.72
$d
Call: glm(formula = C ~ A, data = DF)
Coefficients:
(Intercept) Ab Ac
2.4733 -0.8133 -0.1067
Degrees of Freedom: 8 Total (i.e. Null); 6 Residual
Null Deviance: 11.4
Residual Deviance: 10.23 AIC: 34.69
attr(,"split_type")
[1] "data.frame"
attr(,"split_labels")
B
1 a
2 b
3 c
4 d
すべてのモデルから一度に情報を抽出することは、同じパラダイムに従います。
> ldply(models, coefficients)
B (Intercept) Ab Ac
1 a 0.6166667 0.1500000 6.798700e-17
2 b 1.2200000 0.3066667 6.666667e-03
3 c 2.6166667 0.3333333 -3.333333e-03
4 d 2.4733333 -0.8133333 -1.066667e-01