一、簡介
在實際工作中,遇到資料中帶有缺失值是非常常見的現象,簡單粗暴的做法如直接删除包含缺失值的記錄、删除缺失值比例過大的變量、用0填充缺失值等,但這些做法會很大程度上影響原始資料的分布或者浪費來之不易的資料資訊,是以怎樣妥當地處理缺失值是一個持續活躍的領域,貢獻出衆多巧妙的方法,在不浪費資訊和不破壞原始資料分布上試圖尋得一個平衡點,在R中用于處理缺失值的包有很多,本文将對最為廣泛被使用的mice和VIM包中常用的功能進行介紹,以展現處理缺失值時的主要路徑;
二、相關函數介紹
2.1 缺失值預覽部分
在進行缺失值處理之前,首先應該對手頭資料進行一個基礎的預覽:
1、matrixplot
效果類似matplotlib中的matshow,VIM包中的matrixplot将資料框或矩陣中資料的缺失及數值分布以色彩的形式展現出來,下面是利用matrixplot對R中自帶的airquality資料集進行可視化的效果:
紅色部分即代表資料缺失值所在位置,通過這個方法,可以在最開始對資料整體的缺失情況有一個初步認識,如通過上圖可以一眼看出變量Ozone缺失情況較為嚴重;
2、marginplot與marginmatrix
缺失值是否符合完全随機缺失是在對資料進行插補前要着重考慮的事情,VIM中的marginplot包可以同時分析兩個變量互動的缺失關系,依然以airquality資料為例:
如上圖所示,通過marginplot傳入二維資料框,這裡選擇airquality中包含缺失值的前兩列變量,其中左側對應變量Solar.R的紅色箱線圖代表與Ozone缺失值對應的Solar.R未缺失資料的分布情況,藍色箱線圖代表與Ozone未缺失值對應的Solar.R未缺失資料的分布情況,下側箱線圖同理,當同一側紅藍箱線圖較為接近時可認為其對應考察的另一側變量缺失情況比較貼近完全随機缺失,這種情況下可以放心大膽地進行之後的插補,否則就不能冒然進行插補;
與marginplot功能相似,marginmatrix在marginplot隻能展現兩個變量的基礎上推廣到多個變量兩兩之間,效果類似相關性矩陣圖:
3、自編函數計算各個變量缺失比例
為了計算出每一列變量具體的缺失值比例,可以自編一個簡單的函數來實作該功能:
通過自編的函數miss.prop,可以對每個變量中缺失值所占比例有個具體的了解;
2.2 mice函數
mice包中最核心的函數是mice(),其主要參數解釋如下:
data: 傳入待插補的資料框或矩陣,其中缺失值應表示為NA
m: 生成插補矩陣的個數,mice最開始基于gibbs采樣從原始資料出發為每個缺失值生成初始值以供之後疊代使用,而m則控制具體要生成的完整初始資料框個數,在整個插補過程最後需要利用這m個矩陣融合出最終的插補結果,若m=1,則唯一的矩陣就是插補的結果;
method: 這個參數控制了傳入資料框中每一個變量對應的插補方式,無缺失值的變量對應的為空字元串,帶有缺失值的變量預設方法為"pmm",即均值插補
predictorMatrix: 因為mice中絕大部分方法是用拟合的方式以含缺失值變量之外的其他變量為自變量,缺失值為因變量建構回歸或分類模型,以達到預測插補的目的,而參數predictorMatrix則用于控制在對每一個含缺失值變量的插補過程中作為自變量的有哪些其他變量,具體用法下文示例中會詳細說明
maxit: 整數,用于控制每個資料框疊代插補的疊代次數,預設為5
seed: 随機數種子,控制随機數水準
在對缺失值插補過程中,非常重要的是為不同的變量選擇對應的方法,即method中對應的輸入,下表是每種算法對應的參數代号、适用資料類型和算法名稱:
<code>方法代号</code>
适用數值類型
對應的具體算法名稱
<code>pmm</code>
any
Predictive mean matching
<code>midastouch</code>
Weighted predictive mean matching
<code>sample</code>
Random sample from observed values
<code>cart</code>
Classification and regression trees
<code>rf</code>
Random forest imputations
<code>mean</code>
numeric
Unconditional mean imputation
<code>norm</code>
Bayesian linear regression
<code>norm.nob</code>
Linear regression ignoring model error
<code>norm.boot</code>
Linear regression using bootstrap
<code>norm.predict</code>
Linear regression, predicted values
<code>quadratic</code>
Imputation of quadratic terms
<code>ri</code>
Random indicator for nonignorable data
<code>logreg</code>
binary
Logistic regression
<code>logreg.boot</code>
Logistic regression with bootstrap
<code>polr</code>
ordered
Proportional odds model
<code>polyreg</code>
unordered
Polytomous logistic regression
<code>lda</code>
Linear discriminant analysis
<code>2l.norm</code>
Level-1 normal heteroscedastic
<code>2l.lmer</code>
Level-1 normal homoscedastic, lmer
<code>2l.pan</code>
Level-1 normal homoscedastic, pan
<code>2l.bin</code>
Level-1 logistic, glmer
<code>2lonly.mean</code>
Level-2 class mean
<code>2lonly.norm</code>
Level-2 class normal
在面對資料集具體情況時,對插補方法進行微調是很必要的步驟,在上面鋪墊了這麼多之後,下面在具體示例上進行示範,并引入其他的輔助函數;
2.3 利用mice進行缺失值插補——以airquality資料為例
因為前面對缺失值預覽部分已經利用airquality進行示範,這裡就不再贅述,直接進入正式插補部分,首先,我們将data傳入mice函數,注意這裡設定maxit為0以取得未開始疊代的初始模型參數:
下面我們來看看取得的需要進行調整的重要參數的初始情況:
可以看到對應缺失變量Ozone和Solar.R的插補拟合方法為pmm,下面我們把它們改成CART決策樹回歸:
接着我們來檢視predictorMatrix參數:
> #取得對每一個變量進行拟合用到的變量矩陣,0代表不用到,1代表用到
> predM <- init$predictorMatrix
> predM
Ozone Solar.R Wind Temp Month Day
Ozone 0 1 1 1 1 1
Solar.R 1 0 1 1 1 1
Wind 1 1 0 1 1 1
Temp 1 1 1 0 1 1
Month 1 1 1 1 0 1
Day 1 1 1 1 1 0
這裡我們認為變量Month和Day是日期,與缺失變量無相關關系,是以将其在矩陣中對應位置修改為0使它們不參與拟合過程:
這樣我們就完成了兩個重要參數的初始化,下面我們進行正式的拟合插補:
随着程式運作完,我們需要的結果便呼之欲出,但在取得最終插補結果前,為了嚴謹起見,需要對模型的統計學意義進行分析,下面以Ozone為例:
1、檢視模型中Ozone對應的拟合公式:
可以看到,Ozone對應的公式與前面predictorMatrix參數中經過修改的保持一緻;
2、基于上述公式為合成出的m=5個資料框分别進行拟合:
3、将上述5個拟合模型融合并檢視融合後的顯著性水準
可以看到從截距項,到每一個變量的p值都遠遠小于0.05,至少在0.05顯著性水準下每個參數都具有統計學意義;
4、對5個合成出的資料框在缺失值位置進行融合,這裡需要用到新的函數complete,其主要有下面三個參數:
data: 前面mice函數輸出的結果
action: 當隻希望從合成出的m個資料框中取得某個單獨的資料框時,可以設定action參數,如action=3便代表取得m個資料框中的第3個
mild: 邏輯型變量,當為TRUE時,會輸出包含全部m個合成資料框的清單
獲悉上列參數意義後,若隻想抽取某個資料框如第3個:
可以看到,取回第3個資料框,每個缺失值都已被補全,若希望得到5個合成資料框的融合結果,則需要自編函數:
以上就是本文的全部内容,如有錯誤之處望斧正。
參考資料:
https://stefvanbuuren.name/Winnipeg/Lectures/Winnipeg.pdf
https://www.rdocumentation.org/packages/mice/versions/3.5.0/topics/mice