1. 程式人生 > >Rstudio-處理缺失值的方法

Rstudio-處理缺失值的方法

1. 剔除含有缺失值的案例(行)

algae[!complete.case(algae),]%找出algae資料集中具有缺失值的全部案例

剔除分兩種:一種是剔除具有缺失值的全部案例;另一種是剔除缺失值較多的案例。

(1)刪除algae資料集中具有缺失值的全部案例algae <- na.omit(algae) 

(2) 剔除algae資料集中缺失值較多的案例

Step1manyNAs<- manyNAs(algae,0.2) 

%給出algae資料集缺失值較多案例所在的行數,其中0.2表示一個案例中缺失的屬性佔總屬性的20%,為預設值,使用者可根據自己的需求進行設定。

Step2algae1 <- 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檢驗法),具體步驟:

Step1algae<- na.omit(algae)  

  %刪除algae資料集中具有缺失值的案例

Step2:shapiro.test(algae$mxPH) % 判斷algae資料集的mxPH屬性是否服從正態分佈,結果如圖1所示,將結果中的p-value與α(一般為0.05)進行比較,若p-value > α,則服從正態分佈,否則不服從。

1 Shapiro-Wilk檢驗法

(2) 根據變數之間的相關關係填充

Step1cor(algae[,4:18],use= "complete.obs") 

          % 計算algae資料集第4列至第18列屬性的相關性,引數use="complete.obs"可以使R在計算相關值時忽略含有NA的紀錄。

 Step2symnum(cor(algae[,4:18],use = "complete.obs")) 

          % 將數值形式的結果轉化為圖2的形式。由圖2可知po4與OPO4成強相關性,相關係數介於0.9~0.95。

algae資料集第4列至第18列屬性的相關性

 Step3:lm(PO4~OPO4,data=algae)

% 建立PO4與OPO4之間的線性關係,結果如圖3所示,由圖3可知:PO4 = 45.602 + 1.278×oPO4

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