2
2

More than 5 years have passed since last update.

model.matrix() でダミー変数化と相互作用項

Last updated at Posted at 2018-01-04

ダミー変数化(カラムの横持ち変換)と相互作用項の作成について。

適当なデータフレームを作成しておく

> # データフレームの生成
> df <- data.frame(x=c('a', 'b', 'c'),
+                  y=c(1, 2, 3),
+                  z=c('aa','bb','cc')
+                  )

作成したデータは以下のような構成

> df
  x y  z
1 a 1 aa
2 b 2 bb
3 c 3 cc

> str(df)
'data.frame':   3 obs. of  3 variables:
 $ x: Factor w/ 3 levels "a","b","c": 1 2 3
 $ y: num  1 2 3
 $ z: Factor w/ 3 levels "aa","bb","cc": 1 2 3

x,y列が今回はfactor型であることに注意。
data.matrix()で展開するとfactor型の列内の要素をそれぞれの列へ展開できないが、
model.matrix()を使用するとできる。

ダミー変数化する

> #上で作成したdfをダミー変数化、展開するカラムはx,y,z
> matrix_df <- model.matrix(as.formula(~0+x+y+z),
+                           data = df)

> matrix_df
  xa xb xc y zbb zcc
1  1  0  0 1   0   0
2  0  1  0 2   1   0
3  0  0  1 3   0   1
attr(,"assign")
[1] 1 1 1 2 3 3
attr(,"contrasts")
attr(,"contrasts")$x
[1] "contr.treatment"

attr(,"contrasts")$z
[1] "contr.treatment"

factor型であるx列とz列は展開され、ダミー変数化されている。
numeric型であるy列は展開されずそのまま残っている。

※as.formula()内の"0+"について、
例えば、x列を展開する際、a,bの要素を展開すればcの要素は確定する。
(a=0,b=0ならc=1。など)
このような場合でも、cを展開するというオプションを"0+"で指定できる。

交互作用項の追加

> matrix_df2 <- model.matrix(as.formula(~0 +x +y +x*y +x*y*z),
+                            data = df)
> matrix_df2
  xa xb xc y zbb zcc xb:y xc:y xb:zbb xc:zbb xb:zcc xc:zcc y:zbb y:zcc xb:y:zbb xc:y:zbb
1  1  0  0 1   0   0    0    0      0      0      0      0     0     0        0        0
2  0  1  0 2   1   0    2    0      1      0      0      0     2     0        2        0
3  0  0  1 3   0   1    0    3      0      0      0      1     0     3        0        0
  xb:y:zcc xc:y:zcc
1        0        0
2        0        0
3        0        3
attr(,"assign")
 [1] 1 1 1 2 3 3 4 4 5 5 5 5 6 6 7 7 7 7
attr(,"contrasts")
attr(,"contrasts")$x
[1] "contr.treatment"

attr(,"contrasts")$z
[1] "contr.treatment"

x,y,xとyの相互作項,xとyとzの相互作用項列を生成している。
factor型であるx列とz列の相互作用項にはダミー変数が格納されるが、
factor型であるx列とnumeric型であるy列の相互作用項には、numeric型のy列の値が格納される。

その他

caret dummuyVars()での方法はこっち

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2