数据清洗之缺失值——R语言

缺失值处理步骤:

1)识别缺失数据;
2)检查导致数据缺失的原因;
3)删除包含缺失值的实例或用合理的数值代替(插补)缺失值

缺失值数据的分类:

1)完全随机缺失:若某变量的缺失数据与其他任何观测或未观测变量都不相关,则数据为完全随机缺失(MCAR)。
2)随机缺失:若某变量上的缺失数据与其他观测变量相关,与它自己的未观测值不相关,则数据为随机缺失(MAR)。
3)非随机缺失:若缺失数据不属于MCAR或MAR,则数据为非随机缺失(NMAR)
识别缺失数据的数目、分布和模式有两个目的:
(1)分析生成缺失数据的潜在机制;
(2)评价缺失数据对回答实质性问题的影响。
即:
(1)缺失数据的比例有多大?
(2)缺失数据是否集中在少数几个变量上,抑或广泛存在?
(3)缺失是随机产生的吗?
(4)缺失数据间的相关性或与可观测数据间的相关性,是否可以表明产生缺失值的机制呢?
若缺失数据集中在几个相对不太重要的变量上,则可以删除这些变量,然后再进行正常的数据分析;
若有一小部分数据随机分布在整个数据集中(MCAR),则可以分析数据完整的实例,这样仍可得到可靠有效的结果;
若以假定数据是MCAR或MAR,则可以应用多重插补法来获得有效的结论。
若数据是NMAR,则需要借助专门的方法,收集新数据,或加入一个相对更容易、更有收益的行业。

识别缺失值

缺失值情况
NA:代表缺失值;
NaN:代表不可能的值;
Inf:代表正无穷;
-Inf:代表负无穷。
识别代码
is.na():识别缺失值;
is.nan():识别不可能值;
is.infinite():无穷值。
is.na()、is.nan()和is.infinte()函数的返回值示例

x is.na(x) is.nan(x) is.infinte()
NA T F F
NAN T T F
inf F F T

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

缺失值处理方法

1)删除法:可分为删除观测样本与删除变量。
  删除观测样本通过na.omit()函数移除所有含有缺失数据的行,属于以减少样本量来换取信息完整性的方法,适用于缺失值所含比例较小的情况。
  删除变量通过data[,-p]函数移除含有缺失数据的列,适用于变量有较大缺失且对研究目标影响不大的情况。
  缺点:会存在信息浪费的问题,且数据结构会发生变动,以致最后得到有偏的统计结构
2)替换法:变量按属性可分为数值型和非数值型
  缺失数据为数值型的一般用该变量在其他对象的取值均值来替换变量的缺失值
  缺失数据为非数值型的一般用其他全部有效观测值的中位数或者众数来替换
  缺点:会存在信息浪费的问题,且数据结构会发生变动,以致最后得到有偏的统计结构
3)插补法:常用的插补方法有回归插补,多重插补
  回归插补:利用回归模型,将需要插补的变量作为因变量,其他相关变量作为自变量,通过回归函数lm()预测出因变量的值来对缺失变量进行补缺
  多重插补:是从一个包含缺失值的数据集中生成一组完整的数据,如此多次,从而产生缺失值的一组随机样本,R中的mice()函数可以用来进行多重插补。

实例探索

本文需要安装VIM包和mice包

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

(1)加载数据,检查数据

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

library(mice)
data(sleep,package="VIM")
head(sleep)
md.pattern(sleep)

(2)可视化分析,识别缺失值

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

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

左图显示了每个变量的缺失值个数,右图显示了变量组合缺失值数值

aggr(sleep,prop=TRUE,numbers=TRUE)#用比例代替了计数

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


上图表示每行数据是否缺失,从位置1道位置62,红色代表该位置数据缺失。浅色表示值小,深色表示值大;默认缺失值为红色。

marginplot()函数可生成一幅散点图,在图形边界展示两个变量的缺失值信息。
marginplot(sleep[c("Gest","Dream")],pch=c(20),col=c("darkgray","red","blue"))

(3)用相关性探索缺失值产生原因

影子矩阵:用指示变量替代数据集中的数据(1表示缺失,0表示存在),这样生成的矩阵有时称作影子矩阵。
求这些指示变量间和它们与初始(可观测)变量间的相关性,有且于观察哪些变量常一起缺失,以及分析变量“缺失”与其他变量间的关系。

library(corrplot)
str(sleep)
cordata<-as.data.frame(abs(is.na(sleep)))
head(cordata)
sddata<-NULL
for(i in 1:length(cordata)){sddata<-c(sddata,sd(cordata[,i])>0)
}
sddata
cor1<-cor(cordata[,sddata])#去除没有缺失值的列
corrplot(cor1,method = "pie",type="lower")


上图红色表示负相关,蓝色表示正相关,颜色越深,相关性越强

(4)处理方法——直接删除行数据

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

newdata<-mydata[complete.cases(mydata),]
newdata<-na.omit(mydata)#same

研究删除数据后的相关性

options(digits=1)
cor1<-cor(na.omit(sleep))
cor2<-cor(sleep,use="complete.obs")
corrplot(cor1,method = "number",type="upper")
corrplot(cor2,method = "number",type="upper")


简单建立线性分析

fit<-lm(Dream~.,data=na.omit(sleep))
step(fit)
fit<-lm(Dream~BrainWgt + NonD + Sleep + Exp,data=na.omit(sleep))
summary(fit)

(5)处理方法——多重插补

多重插补(MI)是一种基于重复模拟的处理缺失值的方法。
MI从一个包含缺失值的数据集中生成一组完整的数据集。每个模拟数据集中,缺失数据将使用蒙特卡洛方法来填补。
此时,标准的统计方法便可应用到每个模拟的数据集上,通过组合输出结果给出估计的结果,以及引入缺失值时的置信敬意。
可用到的包Amelia、mice和mi包
mice()函数首先从一个包含缺失数据的数据框开始,然后返回一个包含多个完整数据集的对象。每个完整数据集都是通过对原始数据框中的缺失数据进行插而生成的。
with()函数可依次对每个完整数据集应用统计模型
pool()函数将这些单独的分析结果整合为一组结果。
最终模型的标准误和p值都将准确地反映出由于缺失值和多重插补而产生的不确定性。

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

imp<-mice(sleep,seed=1)
complete(imp,action = 3)
fit<-with(imp,lm(Dream~BrainWgt + NonD + Sleep + Exp))
pooled<-pool(fit)
summary(pooled)

(6)处理方法——简单插补

简单插补,即用某个值(如均值、中位数或众数)来替换变量中的缺失值。注意,替换是非随机的,这意味着不会引入随机误差(与多重衬托不同)。
简单插补的一个优点是,解决“缺失值问题”时不会减少分析过程中可用的样本量。虽然 简单插补用法简单,但对于非MCAR的数据会产生有偏的结果。若缺失数据的数目非常大,那么简单插补很可能会低估标准差、曲解变量间的相关性,并会生成不正确的统计检验的p值。应尽量避免使用该方法。

(7)处理方法——其他处理手段

软件包 描述
Hmisc 包含多种函数,支持简单插补、多重插补和典型变量插补
mvnmle 对多元正态颁数据中缺失值的最大似然估计
cat 对数线性模型中多元类别型变量的多重插补
arrayImpute\arraryMissPattern、SeqKnn 处理微阵列缺失值数据的实用函数
longitudinalData 相关的函数列表,比如对时间序列缺失值进行插补的一系列函数
kmi 处理生存分析缺失值的Kaplan-Meier多重插补
mix 一般位置模型中混合类别型和连续型数据的多重插补
pan 多元面板数据或聚类的多重插补

R语言——数据清洗之缺失值处理相关推荐

  1. R语言 数据清洗(缺失值处理、异常值处理)

    关注微信公共号:小程在线 关注CSDN博客:程志伟的博客 详细内容为 <R语言游戏数据分析与挖掘>第五章学习笔记之数据清洗 5.2.1 缺失值处理  5.2.2 异常值处理: setwd( ...

  2. r语言中mpg数据_零基础生信入门第一课——R语言数据清洗,超详细讲解,建议收藏!...

    小伙伴们大家好!今天我要用一篇推文精要概括数据清洗中的最基本最关键的步骤,对于零基础的学员一定会有很大收获!数据清洗是完成一篇生信文章最基本但也是最终要的准备工作,如果不会数据清洗,就要错过很多优质数 ...

  3. R语言删除包含缺失值的行并将字符数据列(character)转化为因子列(factor)实战

    R语言删除包含缺失值的行并将字符数据列(character)转化为因子列(factor)实战 目录

  4. R语言-数据清洗-缺失值处理

    缺失值处理包括两个步骤,即缺失数据的识别和缺失值处理.在R语言总缺失值以NA表示,可以使用函数is.na()判断缺失值是否存在,函数complete.cases()可识别样本数据是否完整从而判断缺失情 ...

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

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

  6. R语言 数据清洗 重复值所在的行 重复 的筛选与去除,唯一ID出现重复 no重复处理

    住院号 姓名 等唯一值变量的检查与筛选 重复值所在的行 使用本地数据 鸢尾花(yuān wěi huā)做示例 [R语言][数据清洗]重复ID数据获取比对 #加载内置数据 data(iris) dat ...

  7. R语言数据清洗与规整-回归模型为例

    数据清洗和规整是进行数据分析的前提条件,数据的清洗和规整通常会花费比进行数据分析更多的时间,正所谓"清洗一小时,分析五秒钟". 数据清洗和规整要依据实际数据的特征进行,其包括缺失值 ...

  8. R语言中的缺失值处理

    作者 Selva Prabhakaran 译者 钱亦欣 在处理一些真实数据时,样本中往往会包含缺失值(Missing values).我们需要对缺失值进行适宜的处理,才能建立更为有效的模型,使得后续预 ...

  9. R语言扩展包dplyr——数据清洗和整理

    R语言扩展包dplyr--数据清洗和整理 标签: 数据R语言数据清洗数据整理 2015-01-22 18:04 7357人阅读 评论(0) 收藏 举报  分类: R Programming(11)  ...

最新文章

  1. VMware安装Win7虚拟机
  2. jsPlumb.jsAPI阅读笔记(官方文档翻译)
  3. 嵌入式系统存储(RAM、ROM、Flash)
  4. ITK:使用二进制阈值对图像阈值
  5. Android魔法(第四弹)—— 一步步实现百叶窗效果
  6. cmd怎么进入linux系统时间,Linux怎么更改命令提示符信息
  7. 一个想法(续四):IT技术联盟创业众筹进度公示
  8. 数据结构与算法python—14.排序之九种排序详解
  9. [BZOJ1999][codevs1167][Noip2007]Core树网的核
  10. spring中的ioc解决程序的耦合入门
  11. 2005年7月19日
  12. 教你制作一个自动发摩斯电码的PYTHON小程序
  13. 碧桂园+电子签章系统,打造印控中台,实现集团印章管控一体化
  14. [2017湖南集训7-8]暗牧 虚树+最短路
  15. NOIP2010导弹拦截
  16. ios 获取芝麻信用分
  17. CC2530基础实验:(1)按键控制LED跑马灯
  18. css3实现字体从左到右渐变(原理与思路)
  19. sphinx(斯芬克斯)mysql全文搜索引擎
  20. C/C++ 学习笔记:结构体中最后一个成员为[0]或[1]长度数组(柔性数组成员)的用法

热门文章

  1. 后半生,你越活越好的7个迹象
  2. 搭建表白墙 公众号_韶大表白墙 第十季 第75期 | 篮球共青杯决赛体教1班穿黑色衣服的0号...
  3. Linux管道命令grep 和 wc
  4. 学大伟业 Day 3 培训总结
  5. [1] OPC UA基础知识简介
  6. WIN32 2048游戏
  7. Linux:rsyslog 日志丢失 messages lost due to rate-limiting
  8. 向大家隆重介绍Impel计划
  9. 用Python制作一条五彩蟒蛇
  10. C51单片机的电子时钟(数码管显示)