回帰分析をする機会は結構あるが、アウトカム(目的変数)の出力値が何なのかについて使い分けるのはもちろん重要だが、今回はそっちではなく、説明変数の値にアンケート項目の回答などのように数値として扱えないときにどう分析するのかを。
score <- c(49,37,56,40,46,65,40,15,92,58)
evalfac <- c("B","C","B","C","C","A","B","D","A","A")
のような仮想データでやってみる。
score
はある試験(100点満点)の得点として、evalfac
は試験後の自己評価としてみる。Aであると自己評価が高く、そこから順に評価が低くなるとする。このとき、自己評価と試験の得点の関係性をモデル化したい。
このとき説明変数evalfac
は数値データではなく評価項目となっている。こういう場合には各評価項目に対するダミー変数(該当するものに1を対応させて該当しない場合には0とする変数)を作る必要がある。
ちなみに上のコードの<-
はRでの代入演算子で他の言語だと=
を使う事が多いと思う。次のコードでわかるようにRはどちらでも大丈夫だが。
Bdam <- numeric() # numeric()で数字の入る空の箱を用意
for(i in 1:length(evalfac)){ # 1:length(evalfac)でfor文の範囲を指定
if(evalfac[i] == "B"){
Bdam[i] = 1 # 評価項目がBなら1を
}else{
Bdam[i] = 0 # 評価項目がBでないなら0を
}
}
仮に上のコードで作ったダミー変数を「Bダミー」と呼ぶと、これを他の項目に対しても作成していくがその際には合計4項目なので3つのダミーを作ればよい。なぜか?
以下の表で説明する。
評価項目 | Bダミー | Cダミー | Dダミー |
---|---|---|---|
A | 0 | 0 | 0 |
B | 1 | 0 | 0 |
C | 0 | 1 | 0 |
D | 0 | 0 | 1 |
のように、ダミー変数は3つ作れば他の一つは自動的に表現されることになる。この結果作成した3つのダミー変数を「Bdam」「Cdam」「Ddam」とすると、線形回帰モデルを作成するコードは |
result <- lm(score ~ Bdam + Cdam + Ddam)
として実行できる。lm
は「linear model(線形モデル)」の略だと思う。
結果を確認する際には
summary(result)
のようにすれば結果を確認できる。
とまぁ、しっかりやればこうなるが、Rにはこういうときのための便利な機能がある。実はダミーを作成しないでも以下のように実行すればいい。
result <- lm(score ~ evalfac)
え?
そうなの。ダミー変数作らなくても自動的に作成してくれるのよ。Rは。
まぁ、これやってくれる関数は限られているから両方出来るようにね。少なくともlm
は大丈夫。
とはいえ、今の場合は自己評価項目がアルファベットだったからよかったけど、これを数字で答えさせる状況もあるよね。よかったら4、よくなかったら1みたいな感じで。それが次のデータ。
score <- c(49,37,56,40,46,65,40,15,92,58)
evalnum <- c(3,2,3,2,2,4,3,1,4,4)
この場合はどうだろうか?
result <- lm(score ~ evalnum)
とするとこれはダメ。さっきダミー作ったのと同じ結果にならなきゃダメなのに違う結果になったよね?これは本当は数字じゃないのに、Rさんは数字に見えるから自己評価の1~4を数字だと認識しているの。でもこの1と2の差と2と3の差って同じ?というとおそらく違うよね。なのでこういう場合は数字に見えるけど数字じゃないんだよ!ってRさんに教えてあげればいい。
やり方は簡単でデータを読み込んだ後に
evalnum <- as.factor(evalnum)
result <- lm(score ~ evalnum)
とすればいい。as.factor
でこれは「これは因子(factor)なんだよ!」って教えているのです。これさえクリアすればあとはさっきの話からこれで解析は問題ないことがわかるね。
これは因子以外にもas.numeric()
(数値)、as.character()
(文字列)、as.matrix()
(行列)などもある。
扱ってる変数がこれだよってコンピュータに教えてあげるのはとても重要なんだね。こういうのを変数の型といってどの言語を使っても意識することではあります。