处理方式:
1:将含有缺失值的案例剔除
2:根据变量之间的相互关系填补缺失值
3:根据案例之间的相似性填补缺失值
4:使用能够处理缺失值的工具
一、将缺失值剔除
合适选该方案:当含有缺失值的记录所占的比例在可用数据集中非常小的时候,选该方案比较合理
#complete.cases()产生一个布尔值,当数据框的相应的行中不含有NA值,函数返回TURE
#显示所有含有空值的数据行
algae[!complete.cases(algae),]
#统计空行的总数
nrow(algae[!complete.cases(algae),])
#删除空值所在的行
algae <- na.omit(algae)
#删除62,199行
algae <- algae[-c(62,199),]
nrow(algae)
data(algae)
#apply()元函数,可以在某些条件下对对象应用其他函数。此处使用一个临时函数,统计每一行记录中空值的个数
apply(algae, 1, function(x) sum(is.na(x)))
manyNAs(algae, 0.2)
algae <- [-manyNAs(algae, 0.2),]
二、填补缺失值
1 用最高频率值来填补缺失值
一种方式:使用一些代表中心趋势的值来代替缺失值
1:所有的观测值都较好地聚集在平均值周围,平均值就是最好的选择
2:对于偏态分布(大多聚集在变量分布的一侧)或者存在离群值(会扭曲平均值),中位数是最好的选择
#方法二:填充缺失值
#求mxPH的平均值,来替代algae数据集48行mXPH对应的空值
algae[48,"mxPH"] <- mean(algae$mxPH, na.rm = T)
#使用中位数来替代algae中Chla列中所有的空值
algae[is.na(algae$Chla),"Chla"] <- median(algae$Chla,na.rm = T)
#函数centralImputation()可以用数据的中心趋势值来填补数据集的所有缺失值
#对于数值型变量,该函数用中位值。对于名义变量,采用众数
data(algae)
#library(DMwR)
#algae <- algae[manyNAs(algae),]#manyNAs(algae,0.2)第一个参数数据框名称,默认第二个参数为0.2,意思:空值个数大于列数的20%
algae <- centralImputation(algae)
2 通过变量的相关关系来填充缺失值
#cor()的功能是产生变量之间的相关值矩阵 设定参数为use = "complete.obs"时,忽略含有NA的记录
cor(algae[,4:18], use = "complete.obs")
#由于cor()的输出不是很清晰,所有哦使用函数symnum()来改善结果的输出形式
symnum(cor(algae[,4:18], use = "complete.obs"))
library(DMwR)
data(algae)
algae <- algae[-manyNAs(algae), ]
#lm()函数获得PO4~oPO4的线性模型
lm(formula = PO4~oPO4, data=algae)
获得函数关系式:PO4 = 42.897 + 1.293 * oPO4
#对28行数据的处理
algae[28,"PO4"] <- 42.897 + 1.293 * algae[28, "oPO4"]
#函数批量处理
fillPO4 <- function(oP){
if(is.na(oP)){
return (NA)
}else{
return(42.897 + 1.293 * oP)
}
}
algae[is.na(algae$PO4), "PO4"] <- sapply(algae[is.na(algae$PO4),"oPO4"], fillPO4)
#sapply()函数的第一个参数是一个向量,第二个参数是一个函数。将函数应用到一个参数所指向量的每一个元素,处理后,将结果输出
#以下绘制的是:不同季节变量mxPH的直方图,如图1
library(DMwR)
data(algae)
#factor()函数,使algae$season按照时间顺序排序,即:春、夏、秋、冬
algae$season <- factor(algae$season, levels = c("spring", "summer", "autumn", "winter"))
histogram(~mxPH|season, data = algae)
#分析:收集样本时该年的季节对变量mxPH的值没有显著影响
#如果对于河流的大小(变量size)进行上面类似的分析,命令:
histogram(~mxPH | size, data = algae)
#下命令:说明河流大小和速度的所有组合的mxPH值的变化,如下图2
histogram(~mxPH | size * speed, data = algae)
图1 不同季节变量mxPH的直方图
图2 河流大小和速度的所有组合的mxPH值的变化
3 通过探索案例之间的相似性来填补缺失值
#用到知识:欧氏距离(判案例之间的相似性) 高斯核函数(从举例获得权重)
#函数knnImputation()用一个欧式距离的变种来找到距任何个案最近的k个邻居
data("algae")
algae <- knnImputation(algae, k=10)
#下代码,用中位数来填补
algae <- knnImputation(algae, k=10, meth="median")