您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 其它办公文档 > R语言学习系列15-缺失值处理方法
15.缺失值处理方法目录:一.直接删除法二.用均值/中位数/众数填补三.探索变量的相关性插补四.探索样本的相似性填补五.分类树与回归树预测法插补(rpart包)六.多重插补法(mice包)正文:一、直接删除法即直接删除含有缺失值的样本,有时最为简单有效,但前提是缺失数据的比例较少,且缺失数据是随机出现的,这样删除缺失数据后对分析结果影响不大。1.向量删除缺失值x-c(1,2,3,NA,5)mean(x)#默认不忽略NA值或NaN值,注意与NULL的区别[1]NAmean(x,na.rm=TRUE)#忽略缺失值[1]2.75x1-x[!is.na(x)]#去掉向量中的NA值x1[1]1235x2-na.omit(x)#返回去掉NA值的向量x2[1]1235attr(,na.action)[1]4attr(,class)[1]omitna.fail(x)#若向量有NA值,则返回ErrorErrorinna.fail.default(x):对象里有遺漏值na.fail(x1)#若向量不含NA值,则返回该向量[1]1235attr(na.omit(x),na.action)#返回向量中NA值的下标[1]4attr(,class)[1]omitx[is.na(x)]-0#将向量x中的NA值替换为0x[1]123052.删除含缺失值的样本数据用DMwR包实现。library(DMwR)#用自带数据集algae,18个变量,200个观测值library(VIM)sum(!complete.cases(algae))#查看含有缺失值的样本个数[1]16algae1-na.omit(algae)#直接删除所有含缺失值的样本sum(!complete.cases(algae1))[1]0#只删除缺失值过多的样本:缺失值个数大于列数的20%algae2-algae[-manyNAs(algae,0.2),]#数据框的“删除行”操作sum(!complete.cases(algae2))[1]14其中,函数manyNAs(x,nORp)用来查找数据框x中缺失值过多(≥缺失比例nORp)的行;nORp默认为0.2,即缺失值个数≥列数的20%注:当删除缺失数据会改变数据结构时,通过对完整数据按照不同的权重进行加权,可以降低删除缺失数据带来的偏差。3.删除变量若数据的某变量(列)有较多的缺失值且对研究目标影响不大时,可以将整列删除,这需要在变量的重要性和观测的数量之间做权衡。4.做统计分析时排除缺失值例如,做线性回归时,设置na.action=na.omit即可:lm(medv~ptratio+rad,data=BostonHousing,na.action=na.omit)二、用均值/中位数/众数填补其优点在于不会减少样本信息,处理简单;其缺点在于当缺失数据不是随机出现时会产成偏误。若某自变量对因变量的影响比较小,那么这种粗略的估计是可以接受的,且有可能会产生令人满意的结果。使用mlbench包中的BostonHousing数据集作为演示数据。由于BostonHousing数据集没有缺失值,为了演示需要,在数据集中随机插入缺失值。通过这种方法,不仅可以评估由数据缺失带来的精度损失,也可以比较不同处理方式的效果好坏。#初始化数据集library(mlbench)data(BostonHousing,package=mlbench)treated-BostonHousing#14个变量,506个观测值#填充缺失值(随机替换两个变量各40个NA)set.seed(100)treated[sample(1:nrow(treated),40),rad]-NAtreated[sample(1:nrow(treated),40),ptratio]-NA#查看缺失状况sum(!complete.cases(treated))#查看缺失值数目[1]75library(mice)md.pattern(treated)#查看缺失模式crimzninduschasnoxrmagedistaxblstatmedvradptratio43111111111111111035111111111111011351111111111111015111111111111002000000000000404080用均值/中位数/众数填补的代码实现:library(Hmisc)treated$ptratio=impute(treated$ptratio,mean)#插补均值treated$ptratio=impute(treated$ptratio,median)#插补中位数treated$ptratio=impute(treated$ptratio,20.2)#填充特定值treated$ptratio[is.na(treated$ptratio)]-mean(treated$ptratio,na.rm=T)#手动插补均值#计算均值和中位数插补的准确度library(DMwR)actuals-BostonHousing$ptratio[is.na(treated$ptratio)]predicteds1-rep(mean(treated$ptratio,na.rm=TRUE),length(actuals))regr.eval(actuals,predicteds1)maemsermsemape1.623240344.193060712.047696440.09545664predicteds2-rep(median(treated$ptratio,na.rm=TRUE),length(actuals))regr.eval(actuals,predicteds2)maemsermsemape1.635000004.786000002.187692850.09933331注1:R语言中没有直接求众数的函数,可用sort(table(x))先求频数再排序观察到,再用特定值填充。注2:函数regr.eval()用来返回真实值与预测值差异的若干统计量:mae为平均绝对误差;mse为均方误差;rmse为均方根误差;mape为平均绝对百分误差。另外,DMwR包中提供了函数centralImputation(),可以用数据的中心趋势值来填补缺失值:数值型变量使用中位数,名义变量使用众数。三、探索变量的相关性插补探寻变量之间的相关关系,找到相关性较高的两个变量后,再寻找他们之间的线性回归关系,最后通过线性回归关系计算缺失值进行填补。1.探寻变量之间的相关关系使用上一篇中的方法,或者library(DMwR)symnum(cor(algae[,4:18],use=complete.obs))mPmOClNONHoPCha1a2a3a4a5a6a7mxPH1mnO21Cl1NO31NH4,1oPO4..1PO4..*1Chla.1a1...1a2..1a31a4...1a51a6...1a71attr(,legend)[1]0‘’0.3‘.’0.6‘,’0.8‘+’0.9‘*’0.95‘B’1注:函数cor()的用来产生变量之间的相关值矩阵,设定参数use=complete.obs可以使R在计算相关值时忽略含有NA值的样本。函数symnum()是用来改善结果的输出形式的。可见变量oPO4和PO4,a1和a4可能有较强的线性相关关系。2.先得到回归关系lm(PO4~oPO4,data=algae,na.action=na.omit)Coefficients:(Intercept)oPO442.8971.293可见变量PO4与oPO4之间的线性回归关系为:PO4=1.293*oPO4+42.8973.利用回归关系计算缺失值进行插补#构造函数计算缺失值fillPO4-function(x){if(is.na(x))return(NA)elsereturn(1.293*x+42.897)}#使用sapply函数对缺失值进行插补algae[is.na(algae$PO4),PO4]-sapply(algae[is.na(algae$PO4),oPO4],fillPO4)四、探索样本的相似性填补利用多个样本(行)之间的相似性填补缺失值。度量相似性的指标有很多,常用的是欧氏距离。DMwR包中的函数knnImputation()使用k近邻方法来填充缺失值。具体过程如下:对于需要插值的记录,基于欧氏距离计算k个和它最近的观测;再将这k个近邻的数据利用距离逆加权算出填充值,最后用该值替代缺失值。该方法的优点是只需调用一次函数就能对所有缺失值进行填充。该函数的参数是除了因变量之外所有变量组成的数据框,因为你无法对未知的因变量进行插值。函数knnImputation()的基本格式:knnImputation(data,k=10,meth=weighAvg,...)其中,data为数据框格式的数据集;k设定近邻数,默认为10;meth指定计算缺失值的方法,默认为weighavg(加权平均),也可选median(中位数)。knnOutput-knnImputation(treated[,!names(treated)%in%medv])#KNN插值,剔除因变量medvsum(is.na(knnOutput))#检查是否插补所有NA值[1]0actuals-BostonHousing$ptratio[is.na(treated$ptratio)]predicts-knnOutput[is.na(treated$ptratio),ptratio]regr.eval(actuals,predicts)maemsermsemape1.001887151.979101831.406805540.05859526可见,与均值插补法相比,mape值从0.095降到0.059,降低了约38%.knn插值法的缺点是,对因子类变量的插补效果不好。rpart包和mice包提供了更灵活的解决方案:五、分类树与回归树预测法插补——rpart包rpart的优点是只需一个未缺失值就可以填充整个数据样本。对因子型变量,rpart函数可把method设为class(分类树);对数值型变量就设定method=anova(回归树)。当然,也要剔除因变量。函数rpart()的基本格式为:rpart(formula,data,na.action,method,parms,...)其中,formula为回归方程的形式,如y~x1+x2;data为数据框;na.action指定缺失值处理方式,默认为na.rpart;method根据树的末端的数据类型选择相应变量分割方法,有四种取值:连续型取anova,离散型取class,计数型取poisson,生存分析型取exp;parms用来设置三个参数:先验概率、损失矩阵、分类纯度的度量方法。library(rpart)#rad为因子型变量class_mod-rpart(rad~.-medv,data=treated[!is.na(treated$rad),],na.action=na.omit,method=class)#ptratio为数值型变量anova_mod-rpart(ptratio~.-medv,data=treated[!is.na(treated$ptratio),],na.action=na.omit,method=anova)#预测插补值rad_pred-predict(class_mod,treated[is.na(treated$rad),])ptratio_pred-predict(anova_mod,treated[is.na(treated$ptratio),])#计算ptratio的插补精度ptratio_actu-BostonHousing$ptratio[is.na(treated$ptratio)]regr.eval(ptratio_actu,
本文标题:R语言学习系列15-缺失值处理方法
链接地址:https://www.777doc.com/doc-3887895 .html