モデルベース補完のアプローチ

R による欠損データの補完処理

Michal Oleszak

Machine Learning Engineer

モデルベース補完

  • 各変数を異なる統計モデルで補完する。
  • データ内の既知の関係性を考慮できる。
R による欠損データの補完処理

モデルベース補完の手順

  • 変数をループ処理する。
  • 各変数に対して、それを説明するモデルを作成する。
  • モデルを使って欠損値を予測する。
  • 元々欠損していた箇所を補完しながら変数を繰り返し処理する。
R による欠損データの補完処理

モデルベース補完:ステップごとの説明

4つの変数(A、B、C、D)と5行からなるデータフレーム。AとCの2変数にそれぞれ2つの欠損値があり、異なる行に存在する。

R による欠損データの補完処理

モデルベース補完:ステップごとの説明

4つの変数(A、B、C、D)と5行からなるデータフレーム。Aの欠損値が補完されている。

  1. Aの欠損値を予測する。
R による欠損データの補完処理

モデルベース補完:ステップごとの説明

4つの変数(A、B、C、D)と5行からなるデータフレーム。AとCの両方の欠損値が補完されている。

  1. Aの欠損値を予測する。
  2. Aの補完値を観測値として扱い、Cの欠損値を予測する。
R による欠損データの補完処理

モデルベース補完:ステップごとの説明

4つの変数(A、B、C、D)と5行からなるデータフレーム。Cの欠損値が補完されている。

  1. Aの欠損値を予測する。
  2. Aの補完値を観測値として扱い、Cの欠損値を予測する。
  3. Cの補完値を観測値として扱い、元々欠損していた箇所のAを再度予測する。
  4. 収束するまで繰り返す。
R による欠損データの補完処理

モデルの選択方法

各変数のモデルは変数の型に依存します:

  • 連続変数 - 線形回帰
  • 二値変数 - ロジスティック回帰
  • カテゴリ変数 - 多項ロジスティック回帰
  • カウント変数 - ポアソン回帰
R による欠損データの補完処理

単一線形回帰による補完

nhanesのHeightとWeightを線形モデルで補完する:

library(simputation)
nhanes_imp <- impute_lm(nhanes, Height + Weight ~ .)

補完が実施されたか確認する:

nhanes_imp %>% 
  is.na() %>% 
  colSums()
Age     Gender     Weight     Height   Diabetes    TotChol      Pulse PhysActive 
  0          0         32         30          1         85         32         26
R による欠損データの補完処理

線形回帰補完の実践

hotdeckで欠損値を初期化し、欠損箇所を保存する:

nhanes_imp <- hotdeck(nhanes)
missing_height <- nhanes_imp$Height_imp
missing_weight <- nhanes_imp$Weight_imp

元々欠損していた箇所のHeightとWeightを5回繰り返して補完する:

for (i in 1:5) {
  nhanes_imp$Height[missing_height] <- NA
  nhanes_imp <- impute_lm(nhanes_imp, Height ~ Age + Gender + Weight)
  nhanes_imp$Weight[missing_weight] <- NA
  nhanes_imp <- impute_lm(nhanes_imp, Weight ~ Age + Gender + Height)
}
R による欠損データの補完処理

収束の検出



for (i in 1:5) {

  nhanes_imp$Height[missing_height] <- NA
  nhanes_imp <- impute_lm(nhanes, Height ~ Age + Gender + Weight)
  nhanes_imp$Weight[missing_weight] <- NA
  nhanes_imp <- impute_lm(nhanes, Weight ~ Age + Gender + Height)


}
R による欠損データの補完処理

収束の検出

diff_height <- c()
diff_weight <- c()
for (i in 1:5) {

  nhanes_imp$Height[missing_height] <- NA
  nhanes_imp <- impute_lm(nhanes, Height ~ Age + Gender + Weight)
  nhanes_imp$Weight[missing_weight] <- NA
  nhanes_imp <- impute_lm(nhanes, Weight ~ Age + Gender + Height)


}
R による欠損データの補完処理

収束の検出

diff_height <- c()
diff_weight <- c()
for (i in 1:5) {
  prev_iter <- nhanes_imp
  nhanes_imp$Height[missing_height] <- NA
  nhanes_imp <- impute_lm(nhanes, Height ~ Age + Gender + Weight)
  nhanes_imp$Weight[missing_weight] <- NA
  nhanes_imp <- impute_lm(nhanes, Weight ~ Age + Gender + Height)


}
R による欠損データの補完処理

収束の検出

diff_height <- c()
diff_weight <- c()
for (i in 1:5) {
  prev_iter <- nhanes_imp
  nhanes_imp$Height[missing_height] <- NA
  nhanes_imp <- impute_lm(nhanes, Height ~ Age + Gender + Weight)
  nhanes_imp$Weight[missing_weight] <- NA
  nhanes_imp <- impute_lm(nhanes, Weight ~ Age + Gender + Height)
  diff_height <- c(diff_height, mapc(prev_iter$Height, nhanes_imp$Height))
  diff_weight <- c(diff_weight, mapc(prev_iter$Weight, nhanes_imp$Weight))
}
R による欠損データの補完処理

収束の検出

PulseとTotCholの2本の折れ線グラフ。x軸は反復回数、y軸は反復間の補完値の平均絶対パーセント変化を示す。1回目の反復後に両変数で変化が見られるが、2回目以降は変化がなくなる。

R による欠損データの補完処理

線形回帰補完を練習しましょう!

R による欠損データの補完処理

Preparing Video For Download...