R語言缺失值處理

{因為文章好,所以轉載!!}R語言缺失值處理

2016-08-23 05:17砍柴問樵夫

數據缺失有多種原因,而大部分統計方法都假定處理的是完整矩陣、向量和數據框。

缺失數據的分類:

完全隨機缺失:若某變量的缺失數據與其他任何觀測或未觀測變量都不相關,則數據為完全隨機缺失(MCAR)。

隨機缺失:若某變量上的缺失數據與其他觀測變量相關,與它自己的未觀測值不相關,則數據為隨機缺失(MAR)。

非隨機缺失:若缺失數據不屬于MCAR或MAR,則數據為非隨機缺失(NMAR) 。

處理缺失數據的方法有很多,但哪種最適合你,需要在實踐中檢驗。

下面一副圖形展示處理缺失數據的方法:

處理數據缺失的一般步驟:

1、識別缺失數據

2、檢測導致數據缺失的原因

3、刪除包含缺失值的實例或用合理的數值代替(插補)缺失值。

1、識別缺失數據:

R語言中,NA代表缺失值,NaN代表不可能值,Inf-Inf代表正無窮和負無窮。

在這里,推薦使用is.na,is.nanis.finiteis.infinite4個函數去處理。

x<-c(2,NA,0/0,5/0)

#判斷缺失值

is.na(x)

#判斷不可能值

is.nan(x)

#判斷無窮值

is.infinite(x)

#判斷正常值

is.finite(x)

推薦一個函數:complete.case()可用來識別矩陣或數據框中沒有缺失值的行!

展示出數據中缺失的行(數據集sleep來自包VIM)

sleep[!complete.cases(sleep),]

判斷數據集中有多少缺失

針對復雜的數據集,怎么更好的探索數據缺失情況呢?

mice包中的md.pattern()函數可以生成一個以矩陣或數據框形式展示缺失值模式的表格。

備注:0表示變量的列中沒有缺失,1則表示有缺失值。

第一行給出了沒有缺失值的數目(共多少行)。

第一列表示各缺失值的模式。

最后一行給出了每個變量的缺失值數目。

最后一列給出了變量的數目(這些變量存在缺失值)。

在這個數據集中,總共有38個數據缺失。

圖形化展示缺失數據:

aggr(sleep,prop=F,numbers=T)

matrixplot(sleep)

淺色表示值小,深色表示值大,默認缺失值為紅色。

marginmatrix(sleep)

上述變量太多,我們可以選出部分變量展示:

x <- sleep[, 1:5]

x[,c(1,2,4)] <- log10(x[,c(1,2,4)])

marginmatrix(x)

為了更清晰,可以進行成對展示:

marginplot(sleep[c("Gest","Dream")])

在這里(左下角)可以看到,Dream和Gest分別缺失12和4個數據。

左邊的紅色箱線圖展示的是在Gest值缺失的情況下Dream的分布,而藍色箱線圖展示的Gest值不缺失的情況下Dream的分布。同樣的,Gest箱線圖在底部。

2、缺失值數據的處理

行刪除法:數據集中含有缺失值的行都會被刪除,一般假定缺失數據是完全隨機產生的,并且缺失值只是很少一部分,對結果不會造成大的影響。

即:要有足夠的樣本量,并且刪除缺失值后不會有大的偏差!

行刪除的函數有na.omit()complete.case()

newdata<-na.omit(sleep)

sum(is.na(newdata))

newdata<-sleep[complete.cases(sleep),]

sum(is.na(newdata))

均值/中位數等填充:這種方法簡單粗暴,如果填充值對結果影響不怎么大,這種方法倒是可以接受,并且有可能會產生令人滿意的結果。

方法1:

newdata<-sleep

mean(newdata$Dream,na.rm = T)

newdata[is.na(newdata$Dream),"Dream"]<-1.972

方法2:

Hmisc包更加簡單,可以插補均值、中位數等,你也可以插補指定值。

library(Hmisc)

impute(newdata$Dream,mean)

impute(newdata$Dream,median)

impute(newdata$Dream,2)

mice包插補缺失數據:鏈式方程多元插值,首先利用mice函數建模再用complete函數生成完整數據。

下圖展示mice包的操作過程:

mice():從一個含缺失值的數據框開始,返回一個包含多個完整數據集對象(默認可以模擬參數5個完整的數據集)

with():可依次對每個完整數據集應用統計建模

pool():將with()生成的單獨結果整合到一起

library(mice)

newdata<-sleep

data<-mice(newdata,m = 5,method='pmm',maxit=100,seed=1)

在這里,m是默認值5,指插補數據集的數量

插補方法是pmm:預測均值匹配,可以用methods(mice)查看其他方法

maxit指迭代次數,seed指設定種子數(和set.seed同義)

概述插補后的數據:

summary(data)

在這上面可以看到數據集中變量的觀測值缺失情況,每個變量的插補方法,VisitSequence從左至右展示了插補的變量,預測變量矩陣(PredictorMatrix)展示了進行插補過程的含有缺失數據的變量,它們利用了數據集中其他變量的信息。(在矩陣中,行代表插補變量,列代表為插補提供信息的變量,1

和0分別表示使用和未使用。)

查看整體插補的數據:

data$imp

查看具體變量的插補數據:

data$imp$Dream

最后,最重要的是生成一個完整的數據集

completedata<-complete(data)

判斷還有沒有缺失值,如果沒有,結果返回FLASE

anyNA(completedata)

針對以上插補結果,我們可以查看原始數據和插補后的數據的分布情況

library(lattice)

xyplot(data,Dream~NonD+Sleep+Span+Gest,pch=21)

圖上,插補值是洋紅點呈現出的形狀,觀測值是藍色點。

densityplot(data)

圖上,洋紅線是每個插補數據集的數據密度曲線,藍色是觀測值數據的密度曲線。

stripplot(data, pch = 21)

上圖中,0代表原始數據,1-5代表5次插補的數據,洋紅色的點代表插補值。

下面我們分析對數據擬合一個線性模型:

完整數據:

library(mice)

newdata<-sleep

data<-mice(newdata,m = 5,method='pmm',maxit=100,seed=1)

model<-with(data,lm(Dream~Span+Gest))

pooled<-pool(model)

summary(pooled)

fim指的是各個變量缺失信息的比例,lambda指的是每個變量對缺失數據的貢獻大小

缺失數據(在運行中,自動會行刪除):

lm.fit <- lm(Dream~Span+Gest, data = sleep,na.action=na.omit)

summary(lm.fit)

完整數據集和缺失數據集進行線性回歸后,參數估計和P值基本一直。缺失值是完全隨機產生的。如果缺失比重比較大的話,就不適合使用行刪除法,建議使用多重插補法。

kNN插值法:knnImputation函數使用k近鄰方法來填充缺失值。對于需要插值的記錄,基于歐氏距離計算k個和它最近的觀測。接著將這k個近鄰的數據利用距離逆加權算出填充值,最后用該值替代缺失值。

library(DMwR)

newdata<-sleep

knnOutput <- knnImputation(newdata)

anyNA(knnOutput)

head(knnOutput)


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 一.什么是缺失值,NA與NULL的區別 (1)NA表示數據集中的該數據遺失、不存在。在針對具有NA的數據集進行函數...
    雨一流閱讀 1,019評論 0 0
  • 缺失值簡介 造成數據缺失的原因 有些信息暫時無法獲取。例如小越現在在看哪個小姐姐 有些信息是被遺漏的。可能是因為輸...
    1想得美閱讀 18,510評論 1 12
  • 前提 在數據挖掘中,海量的原始數據中存在大量不完整(有缺失值)、不一致、有異常的數據,會嚴重影響到數據挖掘建模的執...
    神奇的考拉閱讀 2,009評論 0 3
  • https://zhuanlan.zhihu.com/p/30149571 這篇文章是介紹用R做信用(申請)評分卡...
    新星_點燈閱讀 3,692評論 0 3
  • 蜿蜒泥濘的小路, 蜻蜓親吻海棠的發梢, 知了和蛐蛐遙相調笑, 你在路的盡頭吹著口哨, 我在路的這邊眉頭緊皺, 初雪...
    8a192f04697e閱讀 117評論 1 3