R語言 處理缺失值資料

主要用到VIM和mice包

install.packages(c("VIM","mice"))

1.處理缺失值的步驟

步驟:

(1)識別缺失資料;

(2)檢查導致資料缺失的原因;

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

缺失值資料的分類:

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

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

(3)非隨機缺失:若缺失資料不屬於MCAR或MAR,則資料為非隨機缺失(NIMAR)。

2.識別缺失值

NA:代表缺失值;

NaN:代表不可能的值;

Inf:代表正無窮;

-Inf:代表負無窮。

is.na():識別缺失值;

is.nan():識別不可能值;

is.infinite():無窮值。

is.na()、is.nan()和is.infinte()函式的返回值示例

xis.na(x)is.nan(x)is.infinite(x)
x<-NATRUEFALSEFALSE
x<-0/0TRUETRUEFALSE
x<-1/0FALSEFALSETRUE
    

complete.cases()可用來識別矩陣或資料框中沒有缺失值的行,若每行都包含完整的例項,則返回TRUE的邏輯向量,若每行有一個或多個缺失值,則返回FALSE;

3.探索缺失值模式 

(1)列表顯示缺失值

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

library(mice)
data(sleep,package="VIM")
md.pattern(sleep)

(2)圖形探究缺失資料

VIM包中提供大量能視覺化資料集中缺失值模式的函式:aggr()、matrixplot()、scattMiss()

library("VIM")
aggr(sleep,prop=FALSE,numbers=TRUE)

library("VIM")
aggr(sleep,prop=TRUE,numbers=TRUE)#用比例代替了計數

matrixplot()函式可生成展示每個例項資料的圖形

matrixplot(sleep)

淺色表示值小,深色表示值大;預設缺失值為紅色。

marginplot()函式可生成一幅散點圖,在圖形邊界展示兩個變數的缺失值資訊。

library("VIM")
marginplot(sleep[c("Gest","Dream")],pch=c(20),col=c("darkgray","red","blue"))

(3)用相關性探索缺失值

影子矩陣:用指示變數替代資料集中的資料(1表示缺失,0表示存在),這樣生成的矩陣有時稱作影子矩陣。

求這些指示變數間和它們與初始(可觀測)變數間的相關性,有且於觀察哪些變數常一起缺失,以及分析變數“缺失”與其他變數間的關係。

head(sleep)
str(sleep)
x<-as.data.frame(abs(is.na(sleep)))
head(sleep,n=5)
head(x,n=5)
y<-x[which(sd(x)>0)]
cor(y)
cor(sleep,y,use="pairwise.complete.obs")

4.理解缺失值資料的來由和影響

識別缺失資料的數目、分佈和模式有兩個目的:

(1)分析生成缺失資料的潛在機制;

(2)評價缺失資料對回答實質性問題的影響。

即:

(1)缺失資料的比例有多大?

(2)缺失資料是否集中在少數幾個變數上,抑或廣泛存在?

(3)缺失是隨機產生的嗎?

(4)缺失資料間的相關性或與可觀測資料間的相關性,是否可以表明產生缺失值的機制呢?

若缺失資料集中在幾個相對不太重要的變數上,則可以刪除這些變數,然後再進行正常的資料分析;

若有一小部分資料隨機分佈在整個資料集中(MCAR),則可以分析資料完整的例項,這樣仍可得到可靠有效的結果;

若以假定資料是MCAR或MAR,則可以應用多重插補法來獲得有鏟的結論。

若資料是NMAR,則需要藉助專門的方法,收集新資料,或加入一個相對更容易、更有收益的行業。

5.理性處理不完整資料

6.完整例項分析(行刪除)

函式complete.cases()、na.omit()可用來儲存沒有缺失值的資料框或矩陣形式的例項(行):

newdata<-mydata[complete.cases(mydata),]
newdata<-na.omit(mydata)

options(digits=1)
cor(na.omit(sleep))
cor(sleep,use="complete.obs")

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

7.多重插補

多重插補(MI)是一種基於重複模擬的處理缺失值的方法。

MI從一個包含缺失值的資料集中生成一組完整的資料集。每個模擬資料集中,缺失資料將使用蒙特卡洛方法來填補。

此時,標準的統計方法便可應用到每個模擬的資料集上,通過組合輸出結果給出估計的結果,以及引入缺失值時的置信敬意。

可用到的包Amelia、mice和mi包

mice()函式首先從一個包含缺失資料的資料框開始,然後返回一個包含多個完整資料集的物件。每個完整資料集都是通過對原始資料框中的缺失資料進行插而生成的。

with()函式可依次對每個完整資料集應用統計模型

pool()函式將這些單獨的分析結果整合為一組結果。

最終模型的標準誤和p值都將準確地反映出由於缺失值和多重插補而產生的不確定性。


基於mice包的分析通常符合以下分析過程:

library(mice)
imp<-mice(mydata,m)
fit<-with(imp,analysis)
pooled<-pool(fit)
summary(pooled)
mydata是一個飲食缺失值的矩陣或資料框;
imp是一個包含m個插補資料集的列表物件,同時還含有完成插補過程的資訊,預設的m=5
analysis是一個表示式物件,用來設定應用於m個插補的統計分析方法。方法包括做線迴歸模型的lm()函式、做廣義線性模型的glm()函式、做廣義可加模型的gam()、及做負二項模型的nbrm()函式。
fit是一個包含m個單獨統計分析結果的列表物件;
pooled是一個包含這m個統計分析平均結果的列表物件。
</pre><pre name="code" class="plain">library(mice)
data(sleep,package="VIM")
imp<-mice(sleep,seed=1234)

fit<-with(imp,lm(Dream~Span Gest))
pooled<-pool(fit)
summary(pooled)

 

imp

imp$imp$Dream

利用complete()函式可觀察m個插補資料集中的任意一個,格式為:complete(imp,action=#)

eg:

dataset3<-complete(imp,action=3)
dataset3

8.處理缺失值的其他方法

處理缺失資料的專業方法

軟體包描述
Hmisc包含多種函式,支援簡單插補、多重插補和典型變數插補
mvnmle對多元正態頒資料中缺失值的最大似然估計
cat對數線性模型中多元類別型變數的多重插補
arrayImpute\arraryMissPattern、SeqKnn處理微陣列缺失值資料的實用函式 
longitudinalData相關的函式列表,比如對時間序列缺失值進行插補的一系列函式
kmi處理生存分析缺失值的Kaplan-Meier多重插補
mix一般位置模型中混合類別型和連續型資料的多重插補
pan多元面板資料或聚類的多重插補

(1)成對刪除

處理含缺失值的資料集時,成對刪除常作為行刪除的備選方法使用。對於成對刪除,觀測只是當它含缺失資料的變數涉及某個特定分析時才會被刪除。
cor(sleep,use="pairwise.complete.obs")

雖然成對刪除似乎利用了所有可用資料,但實際上每次計算只用了不同的資料集,這將會導致一些扭曲,故建議不要使用該方法。

(2)簡單(非隨機)插補

簡單插補,即用某個值(如均值、中位數或眾數)來替換變數中的缺失值。注意,替換是非隨機的,這意味著不會引入隨機誤差(與多重襯托不同)。
簡單插補的一個優點是,解決“缺失值問題”時不會減少分析過程中可用的樣本量。雖然 簡單插補用法簡單,但對於非MCAR的資料會產生有偏的結果。若缺失資料的數目非常大,那麼簡單插補很可能會低估標準差、曲解變數間的相關性,並會生成不正確的統計檢驗的p值。應儘量避免使用該方法。

9.R中製作出版級品質的輸出

常用方法:Sweave和odfWeave。

Sweave包可將R程式碼及輸出嵌入到LaTeX文件中,從而得到 PDF、PostScript和DVI格式的高質量排版報告。

odfWeave包可將R程式碼及輸出嵌入到ODF(Open Documents Format)的文件中