在R中,能处理缺失值的包有很多,比如VIM, mice, Amelia, missForest, Hmisc, mi,等等,那为什么本文偏偏选择missForest作为处理包呢?

这是因为missForest可以处理包含连续变量以及分类变量的缺失值,有很多软件或包在进行插补缺失值的时候,通常识别不了分类变量,如果你有一列二分变量是用“是”和“否”作为答案的,那么值通常是0和1,或1和2。这些软件或包在对这一列变量的缺失数据进行插补的时候,可能出现

  • 小数
  • 低于0或1的数值
  • 大于1或2的数值

而我们需要的仅仅是二分类的整数。missForest便可以很多的处理这些问题。

下面是关于missForest包的官方描述:

The function 'missForest' in this package is used toimpute missing values particularly in the case of mixed-typedata. It uses a random forest trained on the observed values ofa data matrix to predict the missing values. It can be used toimpute continuous and/or categorical data including complexinteractions and non-linear relations. It yields an out-of-bag(OOB) imputation error estimate without the need of a test setor elaborate cross-validation. It can be run in parallel to save computation time.

从以上描述中,能得到关于missForest的一些重要信息:

  • 可以处理混合类型的数据(mixed-type data)
  • 使用了随机森林的方法来预测缺失值
  • 可以对连续变量或类别变量的数据进行插补
  • 使用OOB来衡量插补误差

下面使用iris数据集举例对缺失值进行插补

用summary查看iris数据集,可以看到iris包含5个变量,其中Species是类别变量

summary(iris)Sepal.Length    Sepal.Width     Petal.Length    Petal.Width          Species  Min.   :4.300   Min.   :2.000   Min.   :1.000   Min.   :0.100   setosa    :50  1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.600   1st Qu.:0.300   versicolor:50  Median :5.800   Median :3.000   Median :4.350   Median :1.300   virginica :50  Mean   :5.843   Mean   :3.057   Mean   :3.758   Mean   :1.199                  3rd Qu.:6.400   3rd Qu.:3.300   3rd Qu.:5.100   3rd Qu.:1.800                  Max.   :7.900   Max.   :4.400   Max.   :6.900   Max.   :2.500 

使用missForest中的prodNa人为地在完整的iris数据集中插入一些缺失值

先看prodNa的用法:

prodNA(x, noNA = 0.1)
  1. x:带有缺失值的数据集
  2. noNA:缺失值的比例

在无缺失值的iris数据集中插入20%的缺失值,也就是将noNA设定为0.2

library(missForest)
miris <- prodNA(iris, noNA = 0.2)

将结果赋值给miris(missing iris dataset)

查看miris,最后一行NA's代表该变量缺失的数量,如Sepal.Length缺失了25个值

summary(miris)Sepal.Length    Sepal.Width     Petal.Length    Petal.Width          Species  Min.   :4.300   Min.   :2.200   Min.   :1.000   Min.   :0.100   setosa    :40  1st Qu.:5.100   1st Qu.:2.800   1st Qu.:1.500   1st Qu.:0.300   versicolor:38  Median :5.800   Median :3.000   Median :4.200   Median :1.300   virginica :39  Mean   :5.841   Mean   :3.077   Mean   :3.661   Mean   :1.196   NA's      :33  3rd Qu.:6.400   3rd Qu.:3.400   3rd Qu.:5.100   3rd Qu.:1.800                  Max.   :7.900   Max.   :4.400   Max.   :6.300   Max.   :2.500                  NA's   :25      NA's   :27      NA's   :33      NA's   :32    

利用missForest函数对含有缺失值的数据集miris进行插补

iiris <- missForest(miris, xtrue = iris, verbose = TRUE)

第一个参数是数据集,第二个xtrue的作用是使用完整数据集iris衡量插补的表现,通过verbose = TRUE可以查看迭代的过程以及插补误差,消耗时间等。

missForest iteration 1 in progress...done!error(s): 0.2499382 0.1212121 estimated error(s): 0.1813752 0.008547009 difference(s): 0.01295499 0.1466667 time: 1.09 secondsmissForest iteration 2 in progress...done!error(s): 0.2296085 0.1212121 estimated error(s): 0.1546088 0.008547009 difference(s): 0.0002750566 0 time: 0.44 secondsmissForest iteration 3 in progress...done!error(s): 0.2198678 0.1212121 estimated error(s): 0.1468334 0.01709402 difference(s): 8.633168e-05 0 time: 0.3 secondsmissForest iteration 4 in progress...done!error(s): 0.2149133 0.09090909 estimated error(s): 0.1467923 0 difference(s): 2.614443e-05 0.006666667 time: 0.31 secondsmissForest iteration 5 in progress...done!error(s): 0.2107928 0.09090909 estimated error(s): 0.1392262 0.008547009 difference(s): 6.956508e-05 0 time: 0.22 secondsmissForest iteration 6 in progress...done!error(s): 0.2108121 0.09090909 estimated error(s): 0.1371073 0.03418803 difference(s): 2.83551e-05 0 time: 0.2 secondsmissForest iteration 7 in progress...done!error(s): 0.2119592 0.09090909 estimated error(s): 0.1392409 0 difference(s): 1.827749e-05 0 time: 0.2 secondsmissForest iteration 8 in progress...done!error(s): 0.2103703 0.09090909 estimated error(s): 0.1376546 0.008547009 difference(s): 2.309659e-05 0 time: 0.22 seconds

经过8次迭代后,用str查看插补后的iiris列表

列表中包含了ximp, OOBerror两部分,ximp是插补后的数据集

str(iiris)
List of 2$ ximp    :'data.frame': 150 obs. of  5 variables:..$ Sepal.Length: num [1:150] 5.1 4.9 4.7 4.6 5 .....$ Sepal.Width : num [1:150] 3.5 3 3.2 3.23 3.6 .....$ Petal.Length: num [1:150] 1.4 1.4 1.3 1.5 1.4 .....$ Petal.Width : num [1:150] 0.2 0.2 0.202 0.2 0.2 .....$ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...$ OOBerror: Named num [1:2] 0.1412 0.0256..- attr(*, "names")= chr [1:2] "NRMSE" "PFC"- attr(*, "class")= chr "missForest"

OOBerror即Out of Box error,是测量我们的模型基于连续变量和分类变量上的表现的指标。

  • normalized root mean squared error computed (NRMSE) 归一化均方根误差计算,是连续变量的表现指标
  • proportion of falsely classified (PFC) 错分率,是类别变量的表现指标

比较不同插补方式的差异

取iris数据集的前4列变量,因为这4列变量都是连续变量,不涉及分类变量

miris <- miris[, 1:4]

用均值替换数据集中所有的缺失值

library(Hmisc)
iris_mean <- impute(miris, fun = mean)

用随机森林法替换数据集中所有的缺失值

iris_forest <- missForest(miris)

比较两个插补后的数据集和原数据集的相关来查看精确度,diag指的是查看相关矩阵的对角线

diag(cor(iris[,-5], iris_mean))Sepal.Length  Sepal.Width Petal.Length  Petal.Width 0.4870259    0.8700510    0.8922259    0.5795956 diag(cor(iris[,-5], iris_forest$ximp))Sepal.Length  Sepal.Width Petal.Length  Petal.Width 0.9740983    0.9315624    0.9893583    0.9814286 

结果显示,基于非参数随机森林方法的填补缺失值相较于简单的单变量均值替换具备更良好的性能,所有4个变量和原数据集的相关都很高,而靠均值替换的数据集表现就差了很多。这一点很值得重视,因为大多数人可能都没想过比较不同插补方式之间的效果。

参考文献:

Daroczi, G. (2015). Mastering Data Analysis with R. Packt Publishing.
Daniel J. Stekhoven (2013). missForest: Nonparametric Missing Value Imputationusing Random Forest. R package version 1.4.
Stekhoven D. J., & Buehlmann, P. (2012). MissForest - non-parametric missing valueimputation for mixed-type data. Bioinformatics, 28(1), 112-118.

missForest的R实现相关推荐

  1. 秀一下以前搜房soufun发贴机的发帖群发日志!!呵呵..

    秀一下以前搜房soufun论坛发贴机的发帖群发日志!!呵呵.. QQ 1163551688 "2009-11-28 18:00:06 562","qwerty00789& ...

  2. graphpad7.04多组比较p值_R语言缺失值处理(MICE/Amelia/missForest/Hmisc/mi)

    这是一篇对R语言中处理缺失值的整理,主要思路搬运自Medium上面一篇Harshitha Mekala写的文章Dealing with Missing Data using R,是我目前搜到的最全的关 ...

  3. R语言中插补缺失值的R包simputation

    R语言中有很多插补缺失值的R包,但是这些R包的使用语法都不一样,不利于学习和记忆. simputation包旨在简化缺失值插补的流程,提供了统一的使用语法,提供多种常见的插补缺失值的方法,可以和管道符 ...

  4. r语言查找是否存在空值_R语言-缺失值判断以及处理

    #####缺失值判断以及处理##### #举例1:向量类型判断缺失值is.na和缺失值的填补which (x is.na(x)  #返回一个逻辑向量,TRUE为缺失值,FALSE为非缺失值 table ...

  5. ##用R分析白葡萄酒(数据来源:http://archive.ics.uci.edu/ml/datasets/Wine+Quality)

    ##用R分析白葡萄酒 数据:葡萄酒http://archive.ics.uci.edu/ml/datasets/Wine+Quality 用R分析白葡萄酒: w=read.csv('winequali ...

  6. R语言处理缺失数据的5个常用包

    R语言处理缺失数据的5个常用包 1.常用缺失数据处理包 2. MICE 包 2.1基本介绍 2.2 实例展示 3.Amelia包 3.1基本介绍 3.2实例展示 4.missForest包 4.1基本 ...

  7. 93、R语言教程详解

    加载数据> w<-read.table("test.prn",header = T)> w X.. X...11 A 22 B 33 C 54 D 5> l ...

  8. 在R语言中进行缺失值填充:估算缺失值

    介绍 缺失值被认为是预测建模的首要障碍.因此,掌握克服这些问题的方法很重要.最近我们被客户要求撰写关于缺失值处理的研究报告,包括一些图形和统计输出. 估算缺失值的方法的选择在很大程度上影响了模型的预测 ...

  9. R语言数据缺失值处理(随机森林,多重插补)

    缺失值是指数据由于种种因素导致的数据不完整,可以分为机械原因和人为原因.对于缺失值我们通常采用以下几种方法来进行插补. 1.读取数据 通过read.csv函数导入文档,也可以用其他函数读入,如open ...

最新文章

  1. mysql 设置电脑时间设置_怎样设置mysql密码
  2. NLP:Transformer的简介(优缺点)、架构详解之详细攻略
  3. python zookeeper_ZooKeeper的安装以及客户端Kazoo(Python语言)的安装与使用
  4. IE下iframe跨域session和cookie失效问题的解决方案
  5. 麒麟信安:根植于openEuler,走操作系统自主创新之路
  6. Qt文档阅读笔记-Qt跨平台库(Qt基本库)
  7. 想转行,是要入坑Python还是Java?这问题还用问?
  8. 腾讯优图升级为计算机视觉研发中心,与《科学》宣布战略合作
  9. 提取已有的内核配置文件
  10. 在计算机中表示一个信息容量的基本单位是,微型计算机中,存储器容量的基本单位是()。...
  11. 数据科学家VS大数据专家VS数据分析师:有什么不同?
  12. 趋势科技2014校园招聘笔试题
  13. fits文件读取代码
  14. 【ESAPI】WEB安全ESAPI使用
  15. 《markdown》语雀导出markdown的图片外链问题
  16. 每周一计-自己动手做的电源
  17. 爬虫眼中的“周庄”长什么样?
  18. vim autoformat php,vim - 如何在VI中整理HTML文件的缩进?
  19. 电磁兼容八种测试的「实质」
  20. 信号、传输介质、数制转换

热门文章

  1. MFC多线程内存泄漏问题amp;解决方法
  2. C语言求两个数最大公约数和最小公倍数
  3. 说一说:年轻的资本到底是什么
  4. leetcode系列--454.四数之和Ⅱ
  5. Filament 渲染引擎剖析 之 FrameGraph 2 动态构建渲染管线
  6. QT调用百度地图显示,并去掉logo,可输入经纬度定位
  7. 腾讯TDW千台Spark千亿节点对相似度计算
  8. php连接数据库图文教程,mysql数据库如何连接(php连接数据库)
  9. codeforces 1399D
  10. 【解决方案】如何通过RTSP协议安防视频直播平台EasyNVR打造智慧校园监控联网解决方案?