R语言处理缺失数据的高级方法

主要用到VIM和mice包

[plain] view plain

  1. install.packages(c("VIM","mice"))

1.处理缺失值的步骤

步骤:

(1)识别缺失数据;

(2)检查导致数据缺失的原因;

(3)删除包含缺失值的实例或用合理的数值代替(插补)缺失值

缺失值数据的分类:

(1)完全随机缺失:若某变量的缺失数据与其他任何观测或未观测变量都不相关,则数据为完全随机缺失(MCAR)。

(2)随机缺失:若某变量上的缺失数据与其他观测变量相关,与它自己的未观测值不相关,则数据为随机缺失(MAR)。

(3)非随机缺失:若缺失数据不属于MCAR或MAR,则数据为非随机缺失(NIMAR)。

2.识别缺失值

NA:代表缺失值;

NaN:代表不可能的值;

Inf:代表正无穷;

-Inf:代表负无穷。

is.na():识别缺失值;

is.nan():识别不可能值;

is.infinite():无穷值。

is.na()、is.nan()和is.infinte()函数的返回值示例

x

is.na(x)

is.nan(x)

is.infinite(x)

x<-NA

TRUE

FALSE

FALSE

x<-0/0

TRUE

TRUE

FALSE

x<-1/0

FALSE

FALSE

TRUE

complete.cases()可用来识别矩阵或数据框中没有缺失值的行,若每行都包含完整的实例,则返回TRUE的逻辑向量,若每行有一个或多个缺失值,则返回FALSE;

3.探索缺失值模式

(1)列表显示缺失值

mice包中的md.pattern()函数可以生成一个以矩阵或数据框形式展示缺失值模式的表格

[plain] view plainco

  1. library(mice)
  2. data(sleep,package="VIM")
  3. md.pattern(sleep)

(2)图形探究缺失数据

VIM包中提供大量能可视化数据集中缺失值模式的函数:aggr()、matrixplot()、scattMiss()

[plain] view plaincopy

  1. library("VIM")
  2. aggr(sleep,prop=FALSE,numbers=TRUE)

[plain] view plaincopy

  1. library("VIM")
  2. aggr(sleep,prop=TRUE,numbers=TRUE)#用比例代替了计数

matrixplot()函数可生成展示每个实例数据的图形

[plain] view plaincopy

  1. matrixplot(sleep)

浅色表示值小,深色表示值大;默认缺失值为红色。 marginplot()函数可生成一幅散点图,在图形边界展示两个变量的缺失值信息。

[plain] view plaincopy

  1. library("VIM")
  2. marginplot(sleep[c("Gest","Dream")],pch=c(20),col=c("darkgray","red","blue"))

(3)用相关性探索缺失值

影子矩阵:用指示变量替代数据集中的数据(1表示缺失,0表示存在),这样生成的矩阵有时称作影子矩阵。

求这些指示变量间和它们与初始(可观测)变量间的相关性,有且于观察哪些变量常一起缺失,以及分析变量“缺失”与其他变量间的关系。

[plain] view plaincopy

  1. head(sleep)
  2. str(sleep)
  3. x<-as.data.frame(abs(is.na(sleep)))
  4. head(sleep,n=5)
  5. head(x,n=5)
  6. y<-x[which(sd(x)>0)]
  7. cor(y)
  8. cor(sleep,y,use="pairwise.complete.obs")

4.理解缺失值数据的来由和影响

识别缺失数据的数目、分布和模式有两个目的:

(1)分析生成缺失数据的潜在机制;

(2)评价缺失数据对回答实质性问题的影响。

即:

(1)缺失数据的比例有多大?

(2)缺失数据是否集中在少数几个变量上,抑或广泛存在?

(3)缺失是随机产生的吗?

(4)缺失数据间的相关性或与可观测数据间的相关性,是否可以表明产生缺失值的机制呢?

若缺失数据集中在几个相对不太重要的变量上,则可以删除这些变量,然后再进行正常的数据分析;

若有一小部分数据随机分布在整个数据集中(MCAR),则可以分析数据完整的实例,这样仍可得到可靠有效的结果;

若以假定数据是MCAR或MAR,则可以应用多重插补法来获得有铲的结论。

若数据是NMAR,则需要借助专门的方法,收集新数据,或加入一个相对更容易、更有收益的行业。

5.理性处理不完整数据

6.完整实例分析(行删除)

函数complete.cases()、na.omit()可用来存储没有缺失值的数据框或矩阵形式的实例(行):

[plain] view plaincopy

  1. newdata<-mydata[complete.cases(mydata),]
  2. newdata<-na.omit(mydata)

[plain] view plaincopy

  1. options(digits=1)
  2. cor(na.omit(sleep))
  3. cor(sleep,use="complete.obs")

[plain] view plaincopy

  1. fit<-lm(Dream~Span+Gest,data=na.omit(sleep))
  2. summary(fit)

7.多重插补

多重插补(MI)是一种基于重复模拟的处理缺失值的方法。

MI从一个包含缺失值的数据集中生成一组完整的数据集。每个模拟数据集中,缺失数据将使用蒙特卡洛方法来填补。

此时,标准的统计方法便可应用到每个模拟的数据集上,通过组合输出结果给出估计的结果,以及引入缺失值时的置信敬意。

可用到的包Amelia、mice和mi包

mice()函数首先从一个包含缺失数据的数据框开始,然后返回一个包含多个完整数据集的对象。每个完整数据集都是通过对原始数据框中的缺失数据进行插而生成的。

with()函数可依次对每个完整数据集应用统计模型

pool()函数将这些单独的分析结果整合为一组结果。

最终模型的标准误和p值都将准确地反映出由于缺失值和多重插补而产生的不确定性。

基于mice包的分析通常符合以下分析过程:

[plain] view plaincopy

  1. library(mice)
  2. imp<-mice(mydata,m)
  3. fit<-with(imp,analysis)
  4. pooled<-pool(fit)
  5. summary(pooled)

[plain] view plaincopy

  1. mydata是一个饮食缺失值的矩阵或数据框;

[plain] view plaincopy

  1. imp是一个包含m个插补数据集的列表对象,同时还含有完成插补过程的信息,默认的m=5

[plain] view plaincopy

  1. analysis是一个表达式对象,用来设定应用于m个插补的统计分析方法。方法包括做线回归模型的lm()函数、做广义线性模型的glm()函数、做广义可加模型的gam()、及做负二项模型的nbrm()函数。

[plain] view plaincopy

  1. fit是一个包含m个单独统计分析结果的列表对象;

[plain] view plaincopy

  1. pooled是一个包含这m个统计分析平均结果的列表对象。

[plain] view plaincopy

  1. </pre><pre name="code" class="plain">library(mice)
  2. data(sleep,package="VIM")
  3. imp<-mice(sleep,seed=1234)

[plain] view plaincopy

  1. fit<-with(imp,lm(Dream~Span+Gest))
  2. pooled<-pool(fit)
  3. summary(pooled)

[plain] view plaincopy

  1. imp

[plain] view plaincopy

  1. imp$imp$Dream

利用complete()函数可观察m个插补数据集中的任意一个,格式为:complete(imp,action=#)

eg:

[plain] view plaincopy

  1. dataset3<-complete(imp,action=3)
  2. dataset3

8.处理缺失值的其他方法

处理缺失数据的专业方法

软件包

描述

Hmisc

包含多种函数,支持简单插补、多重插补和典型变量插补

mvnmle

对多元正态颁数据中缺失值的最大似然估计

cat

对数线性模型中多元类别型变量的多重插补

arrayImpute\arraryMissPattern、SeqKnn

处理微阵列缺失值数据的实用函数

longitudinalData

相关的函数列表,比如对时间序列缺失值进行插补的一系列函数

kmi

处理生存分析缺失值的Kaplan-Meier多重插补

mix

一般位置模型中混合类别型和连续型数据的多重插补

pan

多元面板数据或聚类的多重插补

(1)成对删除

处理含缺失值的数据集时,成对删除常作为行删除的备选方法使用。对于成对删除,观测只是当它含缺失数据的变量涉及某个特定分析时才会被删除。

[plain] view plaincopy

  1. cor(sleep,use="pairwise.complete.obs")

虽然成对删除似乎利用了所有可用数据,但实际上每次计算只用了不同的数据集,这将会导致一些扭曲,故建议不要使用该方法。

(2)简单(非随机)插补

简单插补,即用某个值(如均值、中位数或众数)来替换变量中的缺失值。注意,替换是非随机的,这意味着不会引入随机误差(与多重衬托不同)。

简单插补的一个优点是,解决“缺失值问题”时不会减少分析过程中可用的样本量。虽然 简单插补用法简单,但对于非MCAR的数据会产生有偏的结果。若缺失数据的数目非常大,那么简单插补很可能会低估标准差、曲解变量间的相关性,并会生成不正确的统计检验的p值。应尽量避免使用该方法。

9.R中制作出版级品质的输出

常用方法:Sweave和odfWeave。

Sweave包可将R代码及输出嵌入到LaTeX文档中,从而得到 PDF、PostScript和DVI格式的高质量排版报告。

odfWeave包可将R代码及输出嵌入到ODF(Open Documents Format)的文档中

原文发布于微信公众号 - 大数据挖掘DT数据分析(datadw)

原文发表时间:2016-01-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏企鹅号快讯

机器学习——SVM实战

机器学习(十八) ——SVM实战 (原创内容,转载请注明来源,谢谢) 一、概述 本篇主要用python来实现SVM算法,并用SVM算法进行预测分类结果。对于SM...

1988
来自专栏有趣的Python

TensorFlow应用实战-8-训练神经网络

2173
来自专栏决胜机器学习

机器学习(十八) ——SVM实战

机器学习(十八)——SVM实战 (原创内容,转载请注明来源,谢谢) 一、概述 本篇主要用python来实现SVM算法,并用SVM算法进行预测分类结果。对于SM...

3355
来自专栏卢欣的专栏

更快更准的异常检测?交给分布式的 Isolation Forest 吧

在异常检测的众多算法中,Isolation Forest 算法有着非常重要的地位。这种从异常点的定义出发构建的检测模型往往在工业界更实用,除了带来令人惊喜的检测...

4901
来自专栏黄成甲

数据分析之数据处理

数据处理是根据数据分析目的,将收集到的数据,用适当的处理方法进行加工、整理,形成适合数据分析的要求样式,它是数据分析前必不可少的工作,并且在整个数据分析工作量中...

972
来自专栏CDA数据分析师

R语言预处理之异常值问题

>>>> 一、问题 什么是异常值?如何检测异常值?请伙伴们思考或者留言讨论。 >>>> 二、解决方法 1. 单变量异常值检测 2. 使用局部异常因子进行异常值...

22910
来自专栏PaddlePaddle

【排序学习】基于Pairwise和Listwise的排序学习

导语 PaddlePaddle提供了丰富的运算单元,帮助大家以模块化的方式构建起千变万化的深度学习模型来解决不同的应用问题。这里,我们针对常见的机器学习任务,提...

1.2K8
来自专栏MyBlog

教你用java实现时序数据异常检测(1)LOF-ICAD方法

我们这次着重介绍的是时序数据的异常检测, 我们来讨论讨论LOF方法, 并且给出相应的代码实现

683
来自专栏ATYUN订阅号

【教程】OpenCV—Node.js教程系列:用Tensorflow和Caffe“做游戏”

? 今天我们来看看OpenCV的深度神经网络模块。如果你想要释放神经网络的awesomeness来识别和分类图像中的物体,但完全不知道深度学习如何工作,也不知...

4368
来自专栏大数据文摘

手把手 | 用Python语言模型和LSTM做一个Drake饶舌歌词生成器

1184

扫码关注云+社区