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

相关文章

来自专栏人工智能LeadAI

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

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

5795
来自专栏机器之心

爆款论文提出简单循环单元SRU:像CNN一样快速训练RNN(附开源代码)

选自arXiv 机器之心编译 机器之心编辑部 近日,一篇题为《Training RNNs as Fast as CNNs》的 arXiv 论文通过有意简化状...

33611
来自专栏算法channel

TensoFlow 实战 3层网络求解嵌入词向量,附代码详解

已经介绍了Word2Vec中的Skip-Gram模型的基本原理,以及训练过程的3个策略,详细请参考:

812
来自专栏有趣的Python

0- 深度学习之神经网络核心原理与算法-课程介绍

课程导学 计算机计算能力不断攀升。 阿尔法狗击败李世石 人工智能ai。无人驾驶汽车。机器狗。 不会咬人,能自己调整重心(被踢一脚) 人工智能(深度学习) 智能音...

3775
来自专栏新智元

中国团队夺得MegaFace百万人脸识别冠军,精度98%再创记录,论文代码+数据全开源

MegaFace数据集 网络结构 首先,我们尝试在人脸识别的任务上找到一个优秀的网络结构。 3.1 网络输入设定 在我们所有的实验当中,都根据人脸的 5 个...

88710
来自专栏数据派THU

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

3806
来自专栏ATYUN订阅号

RNN示例项目:详解使用RNN撰写专利摘要

我第一次尝试研究RNN时,我试图先学习LSTM和GRU之类的理论。在看了几天线性代数方程之后(头疼的要死),我在Python深度学习中发生了以下这段话:

721
来自专栏人工智能LeadAI

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

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

3675
来自专栏iOSDevLog

《Julia 数据科学应用》总结

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

894
来自专栏数据派THU

手把手教线性回归分析(附R语言实例)

本文为你介绍线性回归分析。 通常在现实应用中,我们需要去理解一个变量是如何被一些其他变量所决定的。 回答这样的问题,需要我们去建立一个模型。一个模型就是一个公式...

6892

扫码关注云+社区