一、處理缺失值的步驟
一個完整的處理方法通常包含以下幾個步驟:
- 識別缺失數據
- 檢查導致數據缺失的原因
- 刪除包含缺失值的實例或用合理的數值代替(插補)缺失值
遺憾的是,往往只有識別缺失數據是清晰明確的步驟。明白數據為何缺失依賴於你對數據生成過程的理解,而決定如何處理缺失值則需要判斷那種方法的結果最為可靠和精確。
缺失數據的分類:統計學家通常將數據分為三類。盡管它們都采用概率術語進行描述,但思想都非常直觀。
- 完全隨機缺失(MCAR)。若某變量的缺失數據與其他任何觀測變量或未觀測變量都不相關,則數據為完全隨機缺失。注意,如果每個有缺失值的變量都是MACR,那么可以將數據完整的實例看作對更大數據集的一個簡單隨機抽樣。
- 隨機缺失(MAR)。若某變量上的缺失數據與其他觀測變量相關,與它自己的未觀測值不相關,則數據為隨機缺失。
- 非隨機缺失(NMAR)。若缺失數據不屬於MCAR和MAR,則數據為非隨機缺失(NMAR)。
二、識別缺失值
R使用NA代表缺失值,NaN代表不可能值,符號Inf和-Inf分別代表正無窮和負無窮。函數is.na()、is.nan()、和is.infinite()可分別用來識別缺失值、不可能值和無窮值。每個返回結果都是TRUE或FALSE。
由於邏輯值TRUE和FALSE分別等價於數值1和0,可用sum()和mean()函數來獲取關於缺失數據的有用信息。
> sum(is.na(sleep$Dream))
[1] 12
> mean(is.na(sleep$Dream))
[1] 0.19
> mean(!complete.cases(sleep))
[1] 0.32
結果表明變量Dream有12個缺失值,19%的實例在此變量上有缺失值。另外,數據集中32%的實例包含一個或多個缺失值。
對於識別確實值需要牢記兩點。第一,complete.cases()函數僅將NA和NaN識別為缺失值,無窮值(Inf和-Inf)被當作有效值。第二,必須使用與本文以上提到的類似函數來識別R數據對象中的缺失值。像myvar == NA 這樣的邏輯比較無法實現。
三、探索缺失值模式
知道數據為何缺失,這將為后續深入研究提供許多啟示。
- 列表顯示缺失值
mice包中的md.pattern()函數可生成一個以矩陣或數據框形式展示缺失值模式的表格。將函數應用到sleep數據集,可得到:
> library(mice) > md.pattern(sleep) BodyWgt BrainWgt Pred Exp Danger Sleep Span Gest Dream NonD 42 1 1 1 1 1 1 1 1 1 1 0 2 1 1 1 1 1 1 0 1 1 1 1 3 1 1 1 1 1 1 1 0 1 1 1 9 1 1 1 1 1 1 1 1 0 0 2 2 1 1 1 1 1 0 1 1 1 0 2 1 1 1 1 1 1 1 0 0 1 1 2 2 1 1 1 1 1 0 1 1 0 0 3 1 1 1 1 1 1 1 0 1 0 0 3 0 0 0 0 0 4 4 4 12 14 38
0表示缺失值,1表示非缺失值。每行表示一個可能的缺失值模式,左邊第一個數給出了該模式的數量,右邊第一個數給出了該模式有幾個缺失值,例如完整數據有42個,有2個觀測的Span缺失,有1個觀測同時缺失Span、Dream和NonD。最后一行給出了每個變量缺失值出現的次數,如Sleep變量共有4個缺失值,數據集一共有38個缺失值。
- 圖形探索缺失數據
library("VIM") aggr(sleep, prop=FALSE, numbers=TRUE)