Rstudio-處理缺失值的方法
1. 剔除含有缺失值的案例(行)
algae[!complete.case(algae),]%找出algae資料集中具有缺失值的全部案例
剔除分兩種:一種是剔除具有缺失值的全部案例;另一種是剔除缺失值較多的案例。
(1)刪除algae資料集中具有缺失值的全部案例:algae <- na.omit(algae)
(2) 剔除algae資料集中缺失值較多的案例
Step1:manyNAs<- manyNAs(algae,0.2)
%給出algae資料集缺失值較多案例所在的行數,其中0.2表示一個案例中缺失的屬性佔總屬性的20%,為預設值,使用者可根據自己的需求進行設定。
Step2:algae1 <- algae[-manyNAs,]
%刪除algae資料集中缺失值較多的案例,並將結果儲存在algae1中。
2. 填充有缺失值的案例
(1) 用集中趨勢值填充
填補缺失資料最簡潔的方法是選用代表集中趨勢的值,而集中趨勢值有平均值、中位數、眾數等多種,具體選擇哪一種得因具體情況而定。對於服從正態分佈的資料,選擇平均值最佳。對偏態分佈或者有離群值的分佈而言,中位數是更好的代表資料中心趨勢的指標。對偏態分佈或者有離群值的分佈而言,中位數是更好的代表資料中心趨勢的指標。
algae[48,"mxPH"] <- mean(algae$mxPH, na.rm=T) % algae資料集中第48
algae[is.na(algae$Chla),"Chla"] <- median(algae$Chla,na.rm=T) % algae資料集中Chla屬性的缺失值用Chla屬性的中位數填充(填充一列缺失值)
注:R中檢測資料服從正態分佈的方法可參考-使用R檢測資料是否符合正態分佈一文(http://blog.csdn.net/S_gy_Zetrov/article/details/69488483)。本文僅給出夏皮羅-威爾克(Shapiro-Wilk)檢驗法(也稱W檢驗法),具體步驟:
Step1:algae<- na.omit(algae)
Step2:shapiro.test(algae$mxPH) % 判斷algae資料集的mxPH屬性是否服從正態分佈,結果如圖1所示,將結果中的p-value與α(一般為0.05)進行比較,若p-value > α,則服從正態分佈,否則不服從。
圖1 Shapiro-Wilk檢驗法
(2) 根據變數之間的相關關係填充
Step1:cor(algae[,4:18],use= "complete.obs")
% 計算algae資料集第4列至第18列屬性的相關性,引數use="complete.obs"可以使R在計算相關值時忽略含有NA的紀錄。
Step2:symnum(cor(algae[,4:18],use = "complete.obs"))
% 將數值形式的結果轉化為圖2的形式。由圖2可知po4與OPO4成強相關性,相關係數介於0.9~0.95。
圖2 algae資料集第4列至第18列屬性的相關性
Step3:lm(PO4~OPO4,data=algae)
% 建立PO4與OPO4之間的線性關係,結果如圖3所示,由圖3可知:PO4 = 45.602 + 1.278×oPO4
圖3 PO4與oPO4線性關係
Step4:根據PO4與OPO4線性關係式,用OPO4填充PO4。
> algae<-algae[-manyNAs(algae),] %刪除algae資料集中缺失值較多的案例
> fillPO4<-function(oP){
+ if(is.na(oP))
+ return(NA)
+ else return(45.602+1.278*oP)
+ }
> algae[is.na(algae$PO4),"PO4"]<-sapply(algae[is.na(algae$PO4),"oPO4"],fillPO4)
> algae
(3)根據案例之間的相似性填充
R中常用函式knnImputation()實現通過案例(行)之間的相似性來填充缺失值的目的。它根據KNN演算法找到任何案例最近的k個鄰居,在K在最近鄰案例中通過設定函式值(一般會選取均值、中位數、眾數等)來填充缺失值。使用方法如下:
algae<-knnImputation(algae,k=10,meth="median") % 選取10個最近鄰案例,用這10個案例的中位數填充缺失值。