以拔靴法進行多重插補

在 R 中以插補處理遺漏值

Michal Oleszak

Machine Learning Engineer

插補帶來的不確定性

  • 插補通常是分析或建模前的第一步。
  • 遺漏值的估計包含不確定性。
  • 對插補後資料進行的任何分析,都應納入這份不確定性。

Ranjit Lall 論文標題頁的頁首,標題為「How Multiple Imputation Makes a Difference.」

近半數研究中的關鍵結果會消失

在 R 中以插補處理遺漏值

拔靴法(Bootstrap)

拔靴法=以放回抽樣擷取列,得到與原始相同大小的資料

兩個模擬的資料框。左邊標示「original data」,每列顏色不同代表值不同。右邊標示「bootstrapped sample」,其中有些顏色的列出現多次,也有些完全未出現。

在 R 中以插補處理遺漏值

以拔靴法進行多重插補

一張示意圖顯示以拔靴法進行多重插補的五個階段。從「original data」三個箭頭指向三個「different bootstrap samples」。各自再指向「Imputation」,接著到「Modeling / analysis」,最後匯聚到「Distribution of results」。

在 R 中以插補處理遺漏值

拔靴式插補:優缺點

優點:

  • 可搭配任何插補方法。
  • 可近似難以解析計算的量。
  • 適用 MCAR 與 MAR 資料。

缺點:

  • 複本多或計算耗時時會很慢。
在 R 中以插補處理遺漏值

拔靴法實作

calc_correlation <- function(data, indices) {






  # Return the correlation coefficient
  return(corr_coeff)
}
在 R 中以插補處理遺漏值

拔靴法實作

calc_correlation <- function(data, indices) {
  # Get bootstrap sample
  data_boot <- data[indices, ]




  # Return the correlation coefficient
  return(corr_coeff)
}
在 R 中以插補處理遺漏值

拔靴法實作

calc_correlation <- function(data, indices) {
  # Get bootstrap sample
  data_boot <- data[indices, ]
  # Impute with kNN imputation
  data_imp <- kNN(data_boot)


  # Return the correlation coefficient
  return(corr_coeff)
}
在 R 中以插補處理遺漏值

拔靴法實作

calc_correlation <- function(data, indices) {
  # Get bootstrap sample
  data_boot <- data[indices, ]
  # Impute with kNN imputation
  data_imp <- kNN(data_boot)
  # Calculate correlation between Weight and TotChol
  corr_coeff <- cor(data_imp$Weight, data_imp$TotChol)
  # Return the correlation coefficient
  return(corr_coeff)
}
在 R 中以插補處理遺漏值

拔靴法實作

library(boot)
boot_results <- boot(nhanes, statistic = calc_correlation, R = 50)
print(boot_results)
ORDINARY NONPARAMETRIC BOOTSTRAP

Call:
boot(data = nhanes, statistic = calc_correlation, R = 50)

Bootstrap Statistics :
      original      bias    std. error
t1* 0.03028306 0.007385452  0.04207152
在 R 中以插補處理遺漏值

繪製拔靴結果

plot(boot_results)

一張直方圖與 Q-Q 圖,顯示拔靴結果的分布。兩者皆顯示分布接近常態。

在 R 中以插補處理遺漏值

拔靴法信賴區間

boot_ci <- boot.ci(boot_results, conf = 0.95, type = "norm")
print(boot_ci)
BOOTSTRAP CONFIDENCE INTERVAL CALCULATIONS
Based on 50 bootstrap replicates

CALL : 
boot.ci(boot.out = boot_results, conf = 0.95, type = "norm")

Intervals : 
Level      Normal        
95%   (-0.0596,  0.1054 )  
Calculations and Intervals on Original Scale
在 R 中以插補處理遺漏值

一起來練習吧!

在 R 中以插補處理遺漏值

Preparing Video For Download...