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 条评论
登录 后参与评论

相关文章

来自专栏IT派

终于,Geoffrey Hinton那篇备受关注的Capsule论文公开了

Geoffrey Hinton 等人备受关注的 NIPS 2017 论文《Dynamic Routing Between Capsules》已于数小时前公开。 ...

42810
来自专栏华章科技

终于,Geoffrey Hinton那篇备受关注的Capsule论文公开了

Geoffrey Hinton 等人备受关注的 NIPS 2017 论文《Dynamic Routing Between Capsules》已于数小时前公开。

812
来自专栏iOSDevLog

《Julia 数据科学应用》总结

3.假设你想创建一个列表,保存在一段文本中遇到的不同的(唯一的)词以及词的数量,你应该使用哪种数据结构来保存它们,可以最容易地进行随后的数据存取?

1474
来自专栏人工智能头条

如何用70行代码实现深度学习(Java,极易移植)

1932
来自专栏人工智能LeadAI

基于朴素贝叶斯的自然语言分类器

概述 自然语言分类是指按照预先定义的主题类别,为文档集合中的每个文档确定一个类别。本文将介绍一个限定类别的自然语言分类器的原理和实现。采用Python作为编程语...

3775
来自专栏大数据挖掘DT机器学习

如何做特征选择

1.数据挖掘与聚类分析概述 数据挖掘一般由以下几个步骤: (l)分析问题:源数据数据库必须经过评估确认其是否符合数据挖掘标准。以决定预期结果,也就选择了这项工作...

3595
来自专栏企鹅号快讯

Python数据分析与实战挖掘

基础篇 书推荐:《用python做科学计算》 ? 扩展库 简介 Numpy数组支持,以及相应的高效处理函数 Scipy矩阵支持,以及相应的矩阵数值计算模块 Ma...

5055
来自专栏人工智能LeadAI

BAT机器学习面试1000题系列(第1~75题)

今17年,近期和团队整理BAT机器学习面试1000题系列,侧重机器学习、深度学习。我们将通过这个系列索引绝大部分机器学习和深度学习的笔试面试题、知识点,它将更是...

7015
来自专栏大数据文摘

没有完美的数据插补法,只有最适合的

数据缺失是数据科学家在处理数据时经常遇到的问题,本文作者基于不同的情境提供了相应的数据插补解决办法。没有完美的数据插补法,但总有一款更适合当下情况。

1205
来自专栏数据派THU

收藏 | 精选11篇AI领域论文(附代码、数据集链接)

4356

扫码关注云+社区