1. 程式人生 > >R語言:缺失值的處理

R語言:缺失值的處理

一.什麼是缺失值,NA與NULL的區別

(1)NA表示資料集中的該資料遺失、不存在。在針對具有NA的資料集進行函式操作的時候,該NA不會被直接剔除。如x<-c(1,2,3,NA,4),取mean(x),則結果為NA,如果想去除NA的影響,需要顯式告知mean方法,如 mean(x,na.rm=T);NA是沒有自己的mode的,在vector中,它會“追隨”其他資料的型別,比如剛剛的x,mode(x)為numeric,mode(x[4])亦然

(2) NULL表示未知的狀態。它不會在計算之中,如x<-c(1,2,3,NULL,4),取mean(x),結果為2.5。NULL是不算數的,length(c(NULL))為0,而length(c(NA))為1。可見NA“佔著”位置,它存在著,而NULL沒有“佔著”位置,或者說,“不知道”有沒有真正的資料。

二.識別缺失值NA

在R語言中缺失值通常以NA表示,判斷是否缺失值的函式是is.na。
另一個常用到的函式是complete.cases,它對資料框進行分析,判斷某一觀測樣本是否完整。
下面我們讀取VIM包中的sleep資料作為例子,它的樣本數為62,變數數為10,由complete.cases函式計算可知完整的樣本個數為42。

data(sleep, package=”VIM”)
dim(sleep)
sum(complete.cases(sleep))

可以使用vim包的aggr函式以圖形方式描述缺失資料

aggr(sleep)

上面的左圖顯示各變數缺失資料比例,右圖顯示了各種缺失模式和對應的樣本數目,顯示nond和dream經常同時出現缺失值。

三、識別缺失資料的模式

存在缺失資料情況下,需進一步判斷缺失資料的模式是否隨機。在R中是利用mice包中的md.pattern函式。

library(mice)
md.pattern(sleep)
上表中的1表示沒有缺失資料,0表示存在缺失資料。第一列第一行的42表示有42個樣本是完整的,第一列最後一行的1表示有一個樣本缺少了span、dream、nond三個變數,最後一行表示各個變數缺失的樣本數合計。

四、處理缺失資料

對於缺失資料通常有三種應付手段:
(1)當缺失資料較少時直接刪除相應樣本
刪除缺失資料樣本,其前提是缺失資料的比例較少,而且缺失資料是隨機出現的,這樣刪除缺失資料後對分析結果影響不大。

(2)對缺失資料進行插補
用變數均值或中位數來代替缺失值,其優點在於不會減少樣本資訊,處理簡單。但是缺點在於當缺失資料不是隨機出現時會產成偏誤。
多重插補法(Multiple imputation):多重插補是通過變數間關係來預測缺失資料,利用蒙特卡羅方法生成多個完整資料集,再對這些資料集分別進行分析,最後對這些分析結果進行彙總處理。可以用mice包實現。

(3)使用對缺失資料不敏感的分析方法,例如決策樹。

基本上缺失資料處理的流程是首先判斷其模式是否隨機,然後找出缺失的原因,最後對缺失值進行處理。

exp 1

library(mice)
imp=mice(sleep,seed=1234)
fit=with(imp,lm(Dream~Span+Gest))
pooled=pool(fit)
summary(pooled)

在R語言中實現方法是使用mice包中的mice函式,生成多個完整資料集存在imp中,再對imp進行線性迴歸,最後用pool函式對迴歸結果進行彙總。彙總結果的前面部分和普通迴歸結果相似,nmis表示了變數中的缺失資料個數,fmi表示fraction of missing information,即由缺失資料貢獻的變異