ちょっとわけあって,欠損値の処理について勉強するソルジャー業務機会がありました。そこで,多重代入法(MI: Multiple Imputation)という方法をRで実行する方法を少しかじったのでメモ代わりに残しておきます。
ちなみに,欠損値の分析をどうするかという話は全部すっ飛ばしますのでそのあたりは下記リンクなどをご参照ください。
多重代入法に関してはこのあたりの資料をどうぞ。
#まずはデータセットの下準備。こんな仮想データだとします。
#id =参与者ID, reading = 読解テストの得点,grammar = 文法テストの得点,vocab = 語彙テストの得点
#id列はいらないのでid列を抜いたデータセットを作る
dat1 <-dat[,-1]
#欠損を可視化するにはVIMというパッケージが便利
install.packages(“VIM”)
library(VIM)
#欠損情報を入手
m <-aggr(dat1)
#うまくいくとこんな感じで欠損情報を可視化してくれます
#数値で確認する場合はmの中身を見る
#Multiple Imputation by a bootstrappted EM algorithm (Amelia Package)
#パッケージのインストール
install.packages(“Amelia”)
library(Amelia)
#amelia()関数をまずは使います
#引数は以下のとおり
#x = data.frame
#m = 何個のデータセットを作るかの指定
#dat1.outという変数に,多重代入した結果を入れます
dat1.out <-amelia(x = dat1,m = 5)
#中身はsummaryで確認します
summary(dat1.out)
#補完データの分散共分散行列をみる
dat1.out$covMatrices
#補完データを書き出し
#separate =Fと指定すると,データが1つのファイルに書きだされます
#separate = Tにすると,データセット1つにつき1ファイルで書きだされます
#dat1.ameria.csv, dat1.ameria1.csv, … dat1.ameria5.csvみたいな感じで番号をつけてくれます
#orig.data=Tで,オリジナルのデータを出力する際に含めるかどうかの指定ができます
write.amelia(obj = dat1.out,“dat1.amechan”,separate=T,orig.data = F)
#AmeliaView()を使うと,GUIで操作できます(重いです)
AmeliaView()
#多重代入した結果得られた補完データをまとめる作業をします
#例として重回帰分析をやってみます
#独立変数 = grammar, vocab
#従属変数 = reading
m =5
b.out <-NULL
se.out <-NULL
for(i in 1:m){
ols.out <-lm(reading ~ grammar+vocab,data=dat1.out$imputations[[i]])
b.out <-rbind(b.out, ols.out$coef)
se.out <-rbind(se.out, coef(summary(ols.out))[,2])
}
#b.outにはbetaが5つ入っています
b.out
#se.outには標準誤差(SE)が入っています
se.out
#mi.meld()で,5つのbetaとSEをまとめます
combined.results<-mi.meld(q = b.out, se = se.out)
combined.results
というわけで,まとめる段階が手動で関数書いていますが,それ以外は割りと簡単にできます。ファイルの書き出しなんかもできますし。
補足
miceパッケージを使うともっと簡単に多重代入->分析->統合ができるようです。
参考:install.packages(“mice”)
library(mice)
imp_data<-mice(dat1,m = 5)
fit <-with(imp_data,lm(reading ~ grammar + vocab))
summary(pool(fit))
なんかmiceパッケージの方が使い勝手が良さそうですね(アレレ
ちょっとまた時間があったらもう少し勉強してみたいと思います。
今日はこのへんで。
なにをゆう たむらゆう
おしまい。















