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