R語言處理缺失數據的高級方法


一、處理缺失值的步驟

  一個完整的處理方法通常包含以下幾個步驟:

  1. 識別缺失數據
  2. 檢查導致數據缺失的原因
  3. 刪除包含缺失值的實例或用合理的數值代替(插補)缺失值

  遺憾的是,往往只有識別缺失數據是清晰明確的步驟。明白數據為何缺失依賴於你對數據生成過程的理解,而決定如何處理缺失值則需要判斷那種方法的結果最為可靠和精確。

  缺失數據的分類:統計學家通常將數據分為三類。盡管它們都采用概率術語進行描述,但思想都非常直觀。

  1. 完全隨機缺失(MCAR)。若某變量的缺失數據與其他任何觀測變量或未觀測變量都不相關,則數據為完全隨機缺失。注意,如果每個有缺失值的變量都是MACR,那么可以將數據完整的實例看作對更大數據集的一個簡單隨機抽樣。
  2. 隨機缺失(MAR)。若某變量上的缺失數據與其他觀測變量相關,與它自己的未觀測值不相關,則數據為隨機缺失。
  3. 非隨機缺失(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 這樣的邏輯比較無法實現。

三、探索缺失值模式

  知道數據為何缺失,這將為后續深入研究提供許多啟示。

  1. 列表顯示缺失值
    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個缺失值。

  2. 圖形探索缺失數據
    library("VIM")
    aggr(sleep, prop=FALSE, numbers=TRUE)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM