ダミー変数化(カラムの横持ち変換)と相互作用項の作成について。
#適当なデータフレームを作成しておく
.r
> # データフレームの生成
> 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()での方法はこっち