以模型為基礎的插補方法

在 R 中以插補處理遺漏值

Michal Oleszak

Machine Learning Engineer

模型式插補

  • 針對每個變數使用不同統計模型插補。
  • 能納入已知的資料關係。
在 R 中以插補處理遺漏值

模型式插補流程

  • 逐一處理變數。
  • 為每個變數建立解釋它的模型。
  • 用模型預測遺漏值。
  • 反覆在原本遺漏的位置進行插補。
在 R 中以插補處理遺漏值

模型式插補:步驟示意

一個含四個變數(A、B、C、D)與五列的資料框,填入示意資料。兩個變數(A 與 C)各有兩個遺漏值,且位於不同列。

在 R 中以插補處理遺漏值

模型式插補:步驟示意

一個含四個變數(A、B、C、D)與五列的資料框,填入示意資料。A 的遺漏值已被插補。

  1. 預測 A 的遺漏值。
在 R 中以插補處理遺漏值

模型式插補:步驟示意

一個含四個變數(A、B、C、D)與五列的資料框,填入示意資料。A 與 C 的遺漏值皆已被插補。

  1. 預測 A 的遺漏值。
  2. 將 A 的插補值視為觀測值,並預測 C 的遺漏值。
在 R 中以插補處理遺漏值

模型式插補:步驟示意

一個含四個變數(A、B、C、D)與五列的資料框,填入示意資料。C 的遺漏值已被插補。

  1. 預測 A 的遺漏值。
  2. 將 A 的插補值視為觀測值,並預測 C 的遺漏值。
  3. 將 C 的插補值視為觀測值,回頭在原本遺漏處再預測 A。
  4. 持續到收斂為止。
在 R 中以插補處理遺漏值

如何選擇模型

每個變數的模型取決於其型別:

  • 連續變數-線性迴歸
  • 二元變數-羅吉斯迴歸
  • 類別變數-多項羅吉斯迴歸
  • 計數變數-卜瓦松迴歸
在 R 中以插補處理遺漏值

單一線性迴歸插補

用線性模型在 nhanes 中插補 HeightWeight

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

針對 HeightWeight 迭代 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 變數。x 軸為迭代次數,y 軸為跨迭代的插補值平均絕對百分比變動。第一次迭代後兩者皆有變動;自第 2 次起不再變動。

在 R 中以插補處理遺漏值

一起來練習線性迴歸插補吧!

在 R 中以插補處理遺漏值

Preparing Video For Download...