3

特定のカテゴリを可能なすべてのグループ化の組み合わせに分割するダミー変数を生成する方法を探しています。たとえば、3 つのカテゴリ (A、B、C など) がある場合、考えられるグループは 5 つあります。

Three groups: A / B / C
Two groups: A&B / C
Two groups: A&C / B
Two groups: A / B&C
One group: A&B&C

次に、各グループのダミー変数がデータ フレームの異なる列に出力されます。したがって、必要な最終出力は次の表のようになります。

sample_num  category    grouping1   grouping2   grouping3   grouping4   grouping5
                        A; B; C     A&B; C      A&C; B      A; B&C      A&B&C
-----------+---------+------------+-----------+-----------+-----------+----------
      1         A           1           1           1           1           1
      2         A           1           1           1           1           1
      3         A           1           1           1           1           1
      4         A           1           1           1           1           1
      5         B           2           1           2           2           1
      6         B           2           1           2           2           1
      7         B           2           1           2           2           1
      8         C           3           2           1           2           1
      9         C           3           2           1           2           1
     10         C           3           2           1           2           1
     11         C           3           2           1           2           1
     12         C           3           2           1           2           1
4

1 に答える 1

2

パッケージ内の model.matrix 関数stats(デフォルトでロードされる)は、「ダミー変数」を作成しますが、説明した種類のものではありません。最初の引数は R の「式」です。

>dat <- read.table(text="sample_num  category 
+       1         A      
+       2         A      
+       3         A      
+       4         A      
+       5         B      
+       6         B      
+       7         B      
+       8         C      
+       9         C      
+      10         C      
+      11         C      
+      12         C", header=TRUE)
> model.matrix( ~category, data=dat)

   (Intercept) categoryB categoryC
1            1         0         0
2            1         0         0
3            1         0         0
4            1         0         0
5            1         1         0
6            1         1         0
7            1         1         0
8            1         0         1
9            1         0         1
10           1         0         1
11           1         0         1
12           1         0         1
attr(,"assign")
[1] 0 1 1
attr(,"contrasts")
attr(,"contrasts")$category
[1] "contr.treatment"

ダミーの 4 列のグループは線形従属である必要があり、そのうちの 1 つが回帰関数によって拒否されるのではないかと (強く) 疑っています。他の対照的な議論が可能です。あなたは勉強すべきだ:

?model.matrix
?contrasts

これは、切片のない合計対比です。

> model.matrix(~category+0, data=dat, contrasts = list(category = "contr.sum"))
   categoryA categoryB categoryC
1          1         0         0
2          1         0         0
3          1         0         0
4          1         0         0
5          0         1         0
6          0         1         0
7          0         1         0
8          0         0         1
9          0         0         1
10         0         0         1
11         0         0         1
12         0         0         1
attr(,"assign")
[1] 1 1 1
attr(,"contrasts")
attr(,"contrasts")$category
[1] "contr.sum"

相互作用のさまざまなレベルの自動計算を調べたい場合は、3 つのレベルを持つ 1 つの変数ではなく、3 つの変数が必要になります。

> dat <- expand.grid(A=letters[1:3], B=letters[4:6], C=letters[7:9])
> str(model.matrix( ~ A*B*C))
Error in str(model.matrix(~A * B * C)) : 
  error in evaluating the argument 'object' in selecting a method for function 'str': Error in model.frame.default(object, data, xlev = xlev) : 
  invalid type (closure) for variable 'C'
> str(model.matrix( ~ A*B*C, data=dat))
 num [1:27, 1:27] 1 1 1 1 1 1 1 1 1 1 ...
 - attr(*, "dimnames")=List of 2
  ..$ : chr [1:27] "1" "2" "3" "4" ...
  ..$ : chr [1:27] "(Intercept)" "Ab" "Ac" "Be" ...
 - attr(*, "assign")= int [1:27] 0 1 1 2 2 3 3 4 4 4 ...
 - attr(*, "contrasts")=List of 3
  ..$ A: chr "contr.treatment"
  ..$ B: chr "contr.treatment"
  ..$ C: chr "contr.treatment"

model.matrix( ~ A*B*C, data=dat)

omitted output
于 2013-08-16T04:03:01.970 に答える