数据价值-DataValues

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 510|回复: 0

[R语言] R语言-缺失值处理2_数据预处理与R语言

[复制链接]

1万

主题

1万

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
39797
发表于 2017-3-7 13:53:12 | 显示全部楼层 |阅读模式
数据预处理与R语言,前言,
最近正在学习数据挖掘方面知识,前前后后也查阅了不少资料。但是总是一个人学习,有点枯燥,所以就想着分享些资料。也是意在找点同道中人交流学习,亦或是大神指导下(这个当然更好>目录,
1. 数据缺失,
2. 将缺失部分剔除,
3. 用最高频率来填补缺失值,
4. 通过变量的相关关系来填补缺失值,
5. 通过探索案例之间的相似性来填补缺失值,1. 数据缺失,
当处理含有缺失值(NA)的数据时,可以运用以下几种最常见的策略:,
  • 将含有缺失值的案例剔除。
  • 根据变量之间的相关性关系填补缺失值。
  • 根据案例之间的相似性填补缺失值。
  • 使用能够处理缺失值数据的工具。
    ,
    下文的例子都用到了”DMwR”包,读取数据代码如下:,  library(DMwR)
      data(algae)
      head(algae),2. 将缺失部分剔除,
    将含有缺失值的案例剔除非常容易实现,尤其是当这些记录所占的比例在可用数据集中非常小的时候,这个选择就比较合理。因此,我们在选择这个方案时先检查观测值,或者至少得到这些观测值的个数。,
    例如:,    algae[!complete.case(algae),]
        ...
        ...
        nrow(algae[!complete.case(algae),])
        [1] 16,
    函数complete.case()产生一个布尔值向量,该向量的元素个数与algae数据框中的行数相同,如果数据框的相应行中不含NA值,则函数返回TRUE。如果直接删除所有含有至少一个NA的样本,我们可以输入:,    algae-na.omit(algae),
    然而这种办法太过极端,我们一般不采用。但是对于某些缺失值太多的样本我们可以直接剔除,因为他们几乎是无用的样本。观测方法可通过如下代码:,    apply(algae,1,function(x) sum(is.na(x))),
    然而之前我们加载的”DMwR”包中有相关处理函数,应用如下:,    algae-algae[-manyNAs(algae),],
    函数manyNAs()的功能是找出缺失值个数大于列数20%的行,第二个参数默认值是0.2。,3. 用最高频率来填补缺失值,
    填补含有缺失值记录的另一个方法是尝试找到这些缺失值最可能的值。这里也有多种策略可以选择,不同策略对逼近程度和算法复杂度的权衡不同。
    填补缺失数据最简便和快捷的方法是使用一些代表中心趋势的值。代表中心趋势的值反映了变量分布的最常见值,因此中心趋势值是最自然的选择。然而,中心趋势值也有很多种,如平均值、中位数、众数等。如何选择还要由变量的分布决定。对于接近正态分布来说,所有的观测值都较好地聚集在平均值周围,平均数就是最佳选择。然而对于偏态分布,平均值就不适用。另一方面,离群值(极值)的存在会扭曲平均值(这些可以通过箱式图观测到)。下面我们列举几个填补例子:,
    用平均值填补:,    algae[48,"mxPH"],
    用中位数填补:,    algae[is.na(algae$Chla),"Chla"],
    其中,na.rm是使计算时忽略缺失数据。当然,我们例子中用到的包下也提供了一个函数centralImputation()可以用数据的中心趋势值来填补缺失值。对数值型变量使用中位数,对名义变量使用众数。应用如下:,   data(algae)
       algae,
    上述方法虽然快捷方便,但是它可能导致较大的数据偏差,影响后期的数据分析工作。,4. 通过变量的相关关系来填补缺失值,
    另一种获得较少偏差填补缺失值的方法是探寻变量之间的相关关系。我们可以通过以下命令:,    symnum(cor(algae[,4:18],use="complete.obs")),
    函数cor()的功能是产生变量之间的相关值矩阵,设定参数use=”complete.obs”可以使R在计算相关值时忽略含有NA的纪录。而函数symnum()是用来改善结果的输出形式的。
    在找到相关性较高的两个变量后,我们开始寻找他们之间的线性相关关系,如下:,   data(algae)
       algaePO4~oPO4,data=algae),
    然后,我们通过线性关系计算缺失值的填补值。,
    如果PO4中存在多个缺失值,我们也可以通过构造一个函数来完成,如下:,   data(algae)
       algaefunction(oP){
         if(is.na(oP))
            return(NA)
         else return(42.897+1.293*oP)
        }
       algae[is.na(algae$PO4),"PO4"]"oPO4"],fillPO4),
    函数sapply()的第一个参数是一个向量,第二个参数是一个函数。作用是将函数结果应用到第一个参数中向量的每一个元素。,
    在上面的例子中由于我们使用的是相关值,所以只用到了数值变量而排除了名义变量与缺失值之间的关系。针对这个,我们可以通过直方图等形式进行观测(这里不多赘述,感兴趣的可以查阅原书)。,5. 通过探索案例之间的相似性来填补缺失值,
    除了变量之间的相关性外,多个样本(行)之间的相似性也可以用来填补缺失值。度量相似性的指标有很多,常用的是欧式距离,这个距离可以非正式的定义为任何两个案例之的观测值之差的平方和。书中提供的包的函数knnImputation()可以实现上述操作,这个函数用一个欧式距离的变种来找到任何个案最近的k个邻居。使用方法如下:,    algaealgae,k=10),
    用中位数来填补:,    algaealgae,k=10,meth="median"),小结,
    综合上述几个方法,各有优缺点,具体如何选择还应该根据分析领域的知识来确定。此外,根据个案之间的相似性来填补缺失值也有不合理处,例如可能存在不相关的变量扭曲相似性。对于这些大数据集问题,可以通过随机抽取样本的方法来计算它们之间的相似性。,
    转载请注明:数据分析 » R语言-缺失值处理2_数据预处理与R语言
  • 回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    小黑屋|Archiver|手机版|DataValues ( 赣ICP备16006919号-3 点击这里给我发消息 DataValues

    GMT+8, 2019-2-17 14:39 , Processed in 0.110385 second(s), 34 queries .

    Powered by Discuz! X3.2

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表