现实中的数据集经常会遇到缺失值的情况,在模型分析之前往往需要对其进行适当的处理,其方法无外乎删除与填补。
但无论是删除还是填补,均应该先查看缺失值情况,以algae数据集为例:
>ld<-algae[!complete.cases(algae),]#取数的思路就是先定位到缺失值,再提取出来,记住R中所有操作皆是函数
>nrow(ld)
(一)直接删除缺失值
与有效观察值相比,如果缺失值占比较少,则可直接将其删除。
>algae<-na.omit(algae)#或者algae<-algae[complete.cases(algae),]
(二)填补缺失值
填补的方法有很多,需要根据不同的情况做出科学合理的选择。
(1)集中值填补(Central values)
很容易理解,缺失值有更大的概率离集中值尽可能的小。
如果是接近于正态分布,那么可以采用均值法填补:
>algae[is.na(algae$mxPH),"mxPH"]<-mean(algae$mxPH,na.rm = T)
如果是有偏的,则采用中位数法更合适:
>algae[is.na(algae$Chla),"mxPH"]<-median(algae$Chla,na.rm = T)
(2)利用变量间的强相关性关系填补
首先找到与缺失值所在变量相关性最强的其他变量
>cor(algae[,4:18],use = "complete.obs)
或者更直观的表述:
>symnum(cor(algae[,4:18],use="complete.obs"))
找到后建立模型:
>ft<-lm(PO4~oPO4 ,data=algae)
写填补函数:
> fillPO4 <- function(oP) {
+ if (is.na(oP)) return(NA)#NA一定要大写,否则报错
+ else return(fit)
+ }
> algae[is.na(algae$PO4),’PO4’] <-
+ sapply(algae[is.na(algae$PO4),“oPO4”],fillPO4)