Rstudio-处理缺失值的方法

来源:互联网 发布:中印陆军对比知乎 编辑:程序博客网 时间:2024/05/21 17:32

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

注:知识点的整理一是为了深入理解问题,二是方便后续查找资料。若对您的疑惑能有所帮助,是我的荣幸。 
本文参考资料http://www.cnblogs.com/cloudtj/articles/5508367.html