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

相关文章

来自专栏专知

【最新TensorFlow1.4.0教程02】利用Eager Execution 自定义操作和梯度 (可在 GPU 运行)

点击上方“专知”关注获取更多AI知识! 【导读】主题链路知识是我们专知的核心功能之一,为用户提供AI领域系统性的知识学习服务,一站式学习人工智能的知识,包含人工...

4266
来自专栏从流域到海域

How to Use the TimeDistributed Layer for Long Short-Term Memory Networks in Python 译文

How to Use the TimeDistributed Layer for Long Short-Term Memory Networks in Pyth...

40112
来自专栏CaiRui

基于MATLAB的多项式数据拟合方法研究-毕业论文

1243
来自专栏ATYUN订阅号

解决多标签分类问题(包括案例研究)

由于某些原因,回归和分类问题总会引起机器学习领域的大部分关注。多标签分类在数据科学中是一个比较令人头疼的问题。在这篇文章中,我将给你一个直观的解释,说明什么是多...

3956
来自专栏小红豆的数据分析

小蛇学python(4)利用SVM预测股票涨跌

最近接了一个私活,指导学妹完成毕业设计。核心思想就是利用SVM模型来预测股票涨跌,并完成策略构建,自动化选择最优秀的股票进行资产配置。

461
来自专栏PPV课数据科学社区

【学习】R语言与机器学习学习笔记(2)决策树算法

算法二:决策树算法 决策树定义 首先,我们来谈谈什么是决策树。我们还是以鸢尾花为例子来说明这个问题。 观察上图,我们判决鸢尾花的思...

3299
来自专栏磐创AI技术团队的专栏

基于word2vec训练词向量(二)

作者 | 荔枝boy 编辑 | 磐石 出品 | 磐创AI技术团队 ---- 【磐创AI导读】:前几篇文章中我们介绍了一些机器学习、深度学习入门资源项目合集,本篇...

3639
来自专栏Python数据科学

数据分析实战—北京二手房房价分析(建模篇)

本篇将继续上一篇数据分析之后进行数据挖掘建模预测,这两部分构成了一个简单的完整项目。结合两篇文章通过数据分析和挖掘的方法可以达到二手房屋价格预测的效果。

652
来自专栏人工智能LeadAI

机器学习实战 | 数据探索

数据的输入质量决定了输出的最后结果,数据的探索、预处理、特征选择、降维等特征工程占了项目的70%的时间。那么如果我们确定了商业目的,该如何一步一步渐进式进行特征...

3415
来自专栏从流域到海域

How To Implement The Decision Tree Algorithm From Scratch In Python (从零开始在Python中实现决策树算法)

How To Implement The Decision Tree Algorithm From Scratch In Python 原文作者:Jason B...

2159

扫描关注云+社区