處理缺失數據的高級方法
缺失數據的傳統方法和現代方法,主要使用VIM和mice包。使用VIM包提供的哺乳動物睡眠數據(sleep,注意不要將其與基礎安裝中描述葯效的sleep數據集混淆)。數據來源於Allison和Chichetti(1976)的研究,他們研究了62種哺乳動物的睡眠、生態學變量和體質變量間的關系。他們對動物的睡眠需求為什么會隨着物種變化很感興趣。睡眠數據是因變量,生態學變量和體質變量是自變量或預測變量。
睡眠變量包含睡眠中做夢時長(Dream)、不做夢時長(NonD)以及它們的和(Sleep)。體質變量包含體重(BodyWgt,單位為千克)、腦重(BrainWgt,單位為克)、壽命(Span,單位為年)和妊娠期(Gest,單位為天)。生態學變量包含物種被捕食的程度(Pred)、睡眠時的暴露程度(Exp)和面臨的總危險度(Danger)。生態學變量以從1(低)到5(高)的5分制進行測量。
1 處理缺失值的步驟
(1) 識別缺失數據;
(2) 檢查導致數據缺失的原因;
(3) 刪除包含缺失值的實例或用合理的數值代替(插補)缺失值。
缺失數據的分類:
(1) 完全隨機缺失 若某變量的缺失數據與其他任何觀測或未觀測變量都不相關,則數據
為完全隨機缺失(MCAR)
(2) 隨機缺失 若某變量上的缺失數據與其他觀測變量相關,與它自己的未觀測值不相關,
則數據為隨機缺失(MAR)。
(3) 非隨機缺失 若缺失數據不屬於MCAR和MAR,則數據為非隨機缺失(NMAR)。
處理缺失數據的方法有很多,但不能保證都生成一樣的結果。下圖列出了一系列可用來處理不完整數據的方法,以及相應的R包:
2 識別缺失值
R使用NA(不可得)代表缺失值,NaN(不是一個數)代表不可能值。另外,符號Inf和-Inf分別代表正無窮和負無窮。函數is.na()、is.nan()和is.infinite()可分別用來識別缺失值、不可能值和無窮值。每個返回結果都是TRUE或FALSE。 下表給出了一些示例:
is.na()、is.nan()和is.infinite()函數的返回值示例
注:這些函數返回的對象與其自身參數的個數相同。
函數complete.cases()可以用來識別矩陣或數據框中沒有缺失值的行。若每行都包含完整的實例,則返回TRUE的邏輯向量;若每行有一個或多個缺失值,則返回FALSE。
以睡眠數據集為例:
data(sleep, package="VIM")
sleep[complete.cases(sleep),]
結果分析:輸出結果顯示42個實例為完整數據(截圖未完整)。
sleep[!complete.cases(sleep),]
結果分析:輸出結果顯示20個實例含一個或多個缺失值(截圖完整)。
由於邏輯值TRUE和FALSE分別等價於數值1和0,可用sum()和mean()函數來獲取關於缺失數據的有用信息。如:
sum(is.na(sleep$Dream))
mean(is.na(sleep$Dream))
mean(!complete.cases(sleep))
結果分析:結果表明變量Dream有12個缺失值,19%的實例在此變量上有缺失值。另外,數據集中32%的實例包含一個或多個缺失值。
對於識別缺失值,有兩點需要牢記。第一,complete.cases()函數僅將NA和NaN識別為缺失值,無窮值(Inf和-Inf)被當作有效值。第二,必須使用與上述中類似的缺失值函數來識別R數據對象中的缺失值,像myvar == NA這樣的邏輯比較無法實現。