主要用到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()函數的傳回值樣本
x is.na(x) is.nan(x) is.infinite(x) x<-NA TRUE FALSE FALSE x<-0/0 TRUE TRUE FALSE x<-1/0 FALSE FALSE TRUE
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)的文檔中