エクセルのデータをRに読み込む。
エクセルで範囲選択して、Ctrl+C
でクリップボードにコピーした状態で、
data <- read.delim("clipboard",header=T)
を実行すると読み込める。
セルの中身が数式でも、数値として読み込んでくれる。便利。
グループ分け
変数 data$CL01
にグループ番号が入っているので、カテゴリ数量に変換した後、グループに分けたデータセットを作る。
# クラスタNoをカテゴリ数量に変換
data$CL01 <- factor(data$CL01)
# 4グループに分ける
df1 <- subset(data, CL01==1)
df2 <- subset(data, CL01==2)
df3 <- subset(data, CL01==3)
df4 <- subset(data, CL01==4)
重回帰分析
※データセット df1
に目的変数 Y
と説明変数 P01
~P10
が入っている。
1回だけ分析する場合
説明変数が固定されているときは、これでOK。
ans <- lm( Y ~ P01 + P02 + P03 + P04 + P05 + P06 + P07 + P08 + P09 + P10, data=df1)
変数選択する場合
説明変数のどれが有効か、影響度が大きいかわからないとき、step()
関数を使えば、AICを見ながら適切に選んだ変数を増減して、コンパクトなモデルを作ってくれる。
ans <- step( lm( Y ~ P01 + P02 + P03 + P04 + P05 + P06 + P07 + P08 + P09 + P10, data=df1))
変数増加法を使いたい場合
今回は、説明変数が多すぎて(>サンプル数)解けなかったため、増加法を使って有望な説明変数から順に追加する分析をやってみた。
手順は、1.最小のモデルを定義 2.最大のモデルを定義 3.step()
関数に初期モデル(=最小のモデル)と最大のモデル、step
数を指定して分析実行( ここでは steps=5
を指定。5回変数追加&効果検証のプロセスを回すということ)
model1 <- lm( Y ~ 1, data = df1)
model2 <- lm( Y ~ P01 + P02 + P03 + P04 + P05 + P06 + P07 + P08 + P09 + P10, data=df1)
ans <- step( model1, direction="forward", scope=list(upper=model2, lower=model1), steps=5)
参考にしたページ
結果の表示
最終的なモデル、係数、p値、R^2値などが出力される。
summary(ans)
予測値の書き出し(csv)
predict(ans)
で計算できる予測値を、ファイルに書き出す。
paste()
コマンドで、出力ファイル名を指定できる。
(2022.2.25追記)
コメントいただきましたが、ファイル名は ""
で文字列を指定すればできますね。
paste()
を使うのは、文字列をつないで使いたい場合でした。
※ファイルの場所は、現在のディレクトリ(フォルダ)
write.csv( predict(ans), "output.csv")
# 文字列をつないでファイル名にする場合
write.csv( predict(ans), paste("output",".csv"))
VIFの確認
多重共線性の確認。変数選択をした場合、多重共線性の低い変数が選ばれているはずだが、念のため確認。
アウトプットしたモデルについて、VIFを確認する。
library(car)
vif(ans)
相関行列のようなマトリクス形式で出力されるのかと思いきや、1変数にVIF値は1個。最大値が出力されている?
(2022.2.25追記)
コメントいただきましたが、データフレームでVIFを計算する場合と考え方が違うのですね。
(2022.3.1追記)追記の内容が間違っているようなので打消し線入れました。
データフレームからVIFを計算する場合。このときはマトリクスが出力される。
vif <- 1/(1-cor(df1)^2)
VIFと相関係数の目安
VIF | R^2 | R |
---|---|---|
10 | 0.9 | 0.95 |
5 | 0.89 | 0.89 |
3 | 0.67 | 0.8 |
参考にしたページ