基于模型的插补方法

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...