Rstudio-處理缺失值的方法

NO IMAGE

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個案例的mxPH屬性值用mxPH屬性的平均值(刪除缺失值記錄)填充(填充一個缺失值)

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)    %刪除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個案例的中位數填充缺失值。

注:知識點的整理一是為了深入理解問題,二是方便後續查詢資料。若對您的疑惑能有所幫助,是我的榮幸。 
本文參考資料http://www.cnblogs.com/cloudtj/articles/5508367.html