R语言缺失值处理

Python015

R语言缺失值处理,第1张

2016-08-23 05:17 砍柴问樵夫

数据缺失有多种原因,而大部分统计方法都假定处理的是完整矩阵、向量和数据框。

缺失数据的分类:

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

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

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

处理缺失数据的方法有很多,但哪种最适合你,需要在实践中检验。

下面一副图形展示处理缺失数据的方法:

处理数据缺失的一般步骤:

1、识别缺失数据

2、检测导致数据缺失的原因

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

1、识别缺失数据:

R语言中, NA 代表缺失值, NaN 代表不可能值, Inf 和 -Inf 代表正无穷和负无穷。

在这里,推荐使用 is.na , is.nan , is.finite , is.infinite 4个函数去处理。

x<-c(2,NA,0/0,5/0)

#判断缺失值

is.na(x)

#判断不可能值

is.nan(x)

#判断无穷值

is.infinite(x)

#判断正常值

is.finite(x)

推荐一个函数: complete.case() 可用来识别矩阵或数据框中没有缺失值的行!

展示出数据中缺失的行 (数据集sleep来自包VIM)

sleep[!complete.cases(sleep),]

判断数据集中有多少缺失

针对复杂的数据集,怎么更好的探索数据缺失情况呢?

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

备注:0表示变量的列中没有缺失,1则表示有缺失值。

第一行给出了没有缺失值的数目(共多少行)。

第一列表示各缺失值的模式。

最后一行给出了每个变量的缺失值数目。

最后一列给出了变量的数目(这些变量存在缺失值)。

在这个数据集中,总共有38个数据缺失。

图形化展示缺失数据:

aggr(sleep,prop=F,numbers=T)

matrixplot(sleep)

浅色表示值小,深色表示值大,默认缺失值为红色。

marginmatrix(sleep)

上述变量太多,我们可以选出部分变量展示:

x <- sleep[, 1:5]

x[,c(1,2,4)] <- log10(x[,c(1,2,4)])

marginmatrix(x)

为了更清晰,可以进行成对展示:

marginplot(sleep[c("Gest","Dream")])

在这里(左下角)可以看到,Dream和Gest分别缺失12和4个数据。

左边的红色箱线图展示的是在Gest值缺失的情况下Dream的分布,而蓝色箱线图展示的Gest值不缺失的情况下Dream的分布。同样的,Gest箱线图在底部。

2、缺失值数据的处理

行删除法: 数据集中含有缺失值的行都会被删除,一般假定缺失数据是完全随机产生的,并且缺失值只是很少一部分,对结果不会造成大的影响。

即:要有足够的样本量,并且删除缺失值后不会有大的偏差!

行删除的函数有 na.omit() 和 complete.case()

newdata<-na.omit(sleep)

sum(is.na(newdata))

newdata<-sleep[complete.cases(sleep),]

sum(is.na(newdata))

均值/中位数等填充: 这种方法简单粗暴,如果填充值对结果影响不怎么大,这种方法倒是可以接受,并且有可能会产生令人满意的结果。

方法1:

newdata<-sleep

mean(newdata$Dream,na.rm = T)

newdata[is.na(newdata$Dream),"Dream"]<-1.972

方法2:

Hmisc包更加简单,可以插补均值、中位数等,你也可以插补指定值。

library(Hmisc)

impute(newdata$Dream,mean)

impute(newdata$Dream,median)

impute(newdata$Dream,2)

mice包插补缺失数据: 链式方程多元插值,首先利用mice函数建模再用complete函数生成完整数据。

下图展示mice包的操作过程:

mice():从一个含缺失值的数据框开始,返回一个包含多个完整数据集对象(默认可以模拟参数5个完整的数据集)

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

pool():将with()生成的单独结果整合到一起

library(mice)

newdata<-sleep

data<-mice(newdata,m = 5,method='pmm',maxit=100,seed=1)

在这里,m是默认值5,指插补数据集的数量

插补方法是pmm:预测均值匹配,可以用methods(mice)查看其他方法

maxit指迭代次数,seed指设定种子数(和set.seed同义)

概述插补后的数据:

summary(data)

在这上面可以看到数据集中变量的观测值缺失情况,每个变量的插补方法, VisitSequence 从左至右展示了插补的变量, 预测变量矩阵 (PredictorMatrix)展示了进行插补过程的含有缺失数据的变量,它们利用了数据集中其他变量的信息。(在矩阵中,行代表插补变量,列代表为插补提供信息的变量,1

和0分别表示使用和未使用。)

查看整体插补的数据:

data$imp

查看具体变量的插补数据:

data$imp$Dream

最后,最重要的是生成一个完整的数据集

completedata<-complete(data)

判断还有没有缺失值,如果没有,结果返回FLASE

anyNA(completedata)

针对以上插补结果,我们可以查看原始数据和插补后的数据的分布情况

library(lattice)

xyplot(data,Dream~NonD+Sleep+Span+Gest,pch=21)

图上,插补值是洋红点呈现出的形状,观测值是蓝色点。

densityplot(data)

图上,洋红线是每个插补数据集的数据密度曲线,蓝色是观测值数据的密度曲线。

stripplot(data, pch = 21)

上图中,0代表原始数据,1-5代表5次插补的数据,洋红色的点代表插补值。

下面我们分析对数据拟合一个线性模型:

完整数据:

library(mice)

newdata<-sleep

data<-mice(newdata,m = 5,method='pmm',maxit=100,seed=1)

model<-with(data,lm(Dream~Span+Gest))

pooled<-pool(model)

summary(pooled)

fim指的是各个变量缺失信息的比例,lambda指的是每个变量对缺失数据的贡献大小

缺失数据(在运行中,自动会行删除):

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

summary(lm.fit)

完整数据集和缺失数据集进行线性回归后,参数估计和P值基本一直。 缺失值是完全随机产生的 。如果缺失比重比较大的话,就不适合使用行删除法,建议使用多重插补法。

kNN插值法: knnImputation函数使用k近邻方法来填充缺失值。对于需要插值的记录,基于欧氏距离计算k个和它最近的观测。接着将这k个近邻的数据利用距离逆加权算出填充值,最后用该值替代缺失值。

library(DMwR)

newdata<-sleep

knnOutput <- knnImputation(newdata)

anyNA(knnOutput)

head(knnOutput)

运行 (“cmd.exe /k ipconfig|find /i ” + #引号 + “ip address” + #引号, 真, )

常量 常量值 描 述

#引号 “"” 半角双引号。

#左引号 ““” 全角左双引号。

#右引号 “”” 全角右双引号。

#换行符 “字符(13)+字符(10)” 一个回车符(13)和一个换行符(10)的组合。

#pi 3.1415926535

#e 2.718282

#黑色 0 常用颜色值。

#藏青 8388608

#墨绿 32768

#深青 8421376

#红褐 128

#紫红 8388736

#褐绿 32896

#浅灰 12632256

#灰色 8421504

#蓝色 16711680

#绿色 65280

#艳青 16776960

#红色 255

#品红 16711935

#黄色 65535

#白色 16777215

#蓝灰 16744576

#藏蓝 14692440

#嫩绿 57472

#青绿 8445952

#黄褐 24768

#粉红 16754943

#嫩黄 55512

#银白 15527148

#紫色 16711824

#天蓝 16746496

#灰绿 8429696

#青蓝 12607488

#橙黄 33023

#桃红 8409343

#芙红 12615935

#深灰 6316128

#透明 -16777216

#隐藏窗口 1

#普通激活 2

#最小化激活 3

#最大化激活 4

#普通不激活 5

#最小化不激活 6

#读入 1

#写出 2

#读写 3

#重写 4

#改写 5

#改读 6

#无限制 1

#禁止读 2

#禁止写 3

#禁止读写 4

#文件首 1

#文件尾 2

#现行位置 3

#只读文件 1

#隐藏文件 2

#系统文件 4

#子目录 16

#存档文件 32

#无属性文件 128

#字节型 1

#短整数型 2

#整数型 3

#长整数型 4

#小数型 5

#双精度小数型 6

#逻辑型 7

#日期时间型 8

#子程序指针型 9

#文本型 10

#年份 1

#季度 2

#月份 3

#周 4

#自年首周数 4

#日 5

#小时 6

#分钟 7

#秒 8

#星期几 9

#自年首天数 10

#确认钮 0 “信息框”命令使用。

#确认取消钮 1

#放弃重试忽略钮 2

#取消是否钮 3

#是否钮 4

#重试取消钮 5

#错误图标 16

#询问图标 32

#警告图标 48

#信息图标 64

#默认按钮一 0

#默认按钮二 256

#默认按钮三 512

#默认按钮四 768

#程序等待 0

#系统等待 4096

#位于前台 65536

#文本右对齐 524288

#取消钮 1

#放弃钮 2

#重试钮 3

#忽略钮 4

#是钮 5

#否钮 6

#首拼及全拼 1

#双拼 2

#自动判别 3

#Ctrl键状态 1

#Shift键状态 2

#Alt键状态 4

#键0 48 按键代码值。

#键1 49

#键2 50

#键3 51

#键4 52

#键5 53

#键6 54

#键7 55

#键8 56

#键9 57

#A键 65

#B键 66

#C键 67

#D键 68

#E键 69

#F键 70

#G键 71

#H键 72

#I键 73

#J键 74

#K键 75

#L键 76

#M键 77

#N键 78

#O键 79

#P键 80

#Q键 81

#R键 82

#S键 83

#T键 84

#U键 85

#V键 86

#W键 87

#X键 88

#Y键 89

#Z键 90

#F1键 112

#F2键 113

#F3键 114

#F4键 115

#F5键 116

#F6键 117

#F7键 118

#F8键 119

#F9键 120

#F10键 121

#F11键 122

#F12键 123

#F13键 124

#F14键 125

#F15键 126

#F16键 127

#Break键 3

#退格键 8

#Tab键 9

#回车键 13

#Shift键 16

#Ctrl键 17

#Alt键 18

#Pause键 19

#CapsLock键 20

#NumLock键 144

#ScrollLock键 145

#Esc键 27

#空格键 32

#PageUp键 33

#PageDown键 34

#Home键 36

#End键 35

#左光标键 37

#上光标键 38

#右光标键 39

#下光标键 40

#Ins键 45

#Del键 46

#分号键 186

#等号键 187

#逗号键 188

#减号键 189

#圆点键 190

#除号键 191

#反撇号键 192

#左中括号键 219

#右中括号键 221

#斜杠键 220

#单引号键 222

#顶层 1 在窗口 Z 顺序的最前面。

#底层 2 在窗口 Z 顺序的最后面。

#最高层 3 在所有现行窗口的最前面并一直保持此位置。

#次高层 4 在最高层窗口的下面但在其他窗口的前面。

#全部转换 1

#日期部分 2

#时间部分 3

#输入文本 1

#输入整数 2

#输入小数 3

#拷贝 1

#翻转拷贝 2

#位异或 3

#位或 4

#位与 5

#从上到下 1

#从左到右 2

#从左上到右下 3

#从右上到左下 4

#从下到上 5

#从右到左 6

#从右下到左上 7

#从左下到右上 8

#字节集型 11 可以存储大量的不定长字节数据。

#备注型 12 文本型的扩充,可以存储大量的不定长文本数据。

#通常索引 1

#读音索引 2

#南方读音索引 3

#不区分大小写 1

#忽略所有空格 2

#取平均值 1

#求和 2

#取最大值 3 取最大数值及日期。

#取最小值 4 取最小数值及日期。

#禁止修改 1 如果禁止修改,则自动禁止添加和删除。

#禁止添加 2

#禁止删除 4

#禁止自动判断 8

#根类 1

#现行设置 2

#现行用户 3

#本地机器 4

#所有用户 5

#单击左键 1

#双击 2

#单击右键 3

#默认色 -16777216

#文本 1

#图片文件名 2

#图片数据 3

#字节集数据 4

#上左 1

#上中 2

#上右 3

#中左 4

#中中 5

#中右 6

#下左 7

#下中 8

#下右 9

#缩放图片 10

#居中图片 11

#缩放居中图片 12

#平铺图片 13

#缩放平铺图片 14

#粗体 1

#斜体 2

#下划线 4

#删除线 8

#通常型 0

#左边框 1

#上边框 2

#右边框 4

#下边框 8

#水平线 16

#垂直线 32

#单斜线 64

#双斜线 128

#交叉线 256

#左单元格 1

#上单元格 2

#右单元格 3

#下单元格 4

#无页号 0

#上左页号 1

#上中页号 2

#上右页号 3

#下左页号 4

#下中页号 5

#下右页号 6

#全部页 0

#仅打印奇数页 1

#仅打印偶数页 2

#页范围 1

#行范围 2

#纵向 0

#横向 1

#默认纸 0

#A3纸 1 297 x 420 毫米。

#A4纸 2 210 x 297 毫米。

#A5纸 3 148 x 210 毫米。

#B4纸 4 250 x 354 毫米。

#B5纸 5 182 x 257 毫米。

#四开 6 215 x 275 毫米。

#十六开 7 146 x 215 毫米。

#三十二开 8 97 x 151 毫米。

#信纸 9 216 x 279 毫米。

#法律用纸 10 216 x 355 毫米。

#行政用纸 11 184 x 266 毫米。

#声明 12 140 x 216 毫米。

#小报 13 279 x 432 毫米。

#笔记 14 216 x 279 毫米。

#帐本 15 432 x 279 毫米。

#对开纸 16 216 x 330 毫米。

#输入密码 4

#缩放到纸宽 -1

#限定到纸宽 -2

#常量 0

#资源 1

#清除信号 1

#发送或置位 2

#DTR信号 1

#RTS信号 2

#Break信号 3

#GBK中文 1

#英文 2

#BIG5中文 3

#标准输出设备 1

#标准错误设备 2

这两款工具的使用方法截然不同。使用Excel时,可以通过鼠标点击完成大部分工作,你可以访问界面内不同位置的各种工具。因此Excel非常便于使用(熟能生巧),但是用Excel处理数据非常费时,而且如果接手一个新项目,你必须单调地重复这些流程。使用R时,则通过代码完成所有操作。你把数据载入内存,然后运行脚本来研究并处理数据。这个工具可能不够人性化,但是有以下几点好处。我认为,从概念上来说,R更便于使用。如果你在处理多列数据,虽然你只是在处理单个任务,但是却会看到所有的数据。而使用R时,数据都在内存中,只有调出数据才能看到。如果你在转换或计算,你会处理相关列或行的子集,其他所有数据都在后台。我觉得这样更便于关注手头的任务。完成任务后,可将其保存在某个数据帧中,其中只包含所需的列或行数据。你建立了正确的数据集,可解决当前的问题。这样做看似无关紧要,但实际上大受裨益。借助R,就可以对其他数据集轻松重复相同的操作。因为所有数据都是通过代码进行处理和研究,因此对新的数据集执行相同的操作也就轻而易举了。使用Excel时,大多数操作都是通过鼠标点击实现,虽然用户体验不错,但对新的数据重复操作却非常费时而枯燥。而R只需载入新的数据集,然后再次运行脚本即可。实际上,用代码操作也便于诊断并共享你的分析结果。使用Excel时,大多数的分析结果都基于内存(数据透视表在这里,公式编辑器在另一个表格上等)。而在R中,通过代码执行所有操作,一目了然。如果你在修正一个错误,你很清楚在哪里操作,而如果你需要共享分析结果,只需复制粘贴代码即可。在线查找帮助时,你能准确说明所用数据,并提出具体的问题。事实上,大多数时候,你在线提问时,人们都是直接贴出准确的代码,来解决你的问题。R中的项目组织更简单。在Excel中,我要准备一系列表格,可能还要准备多个工作簿,然后适当命名,而且各文件名不得重复。我的项目备注分别保存在各个文件中。我的R语言项目组织单独设有一个文件夹,我处理过的所有内容都放在其中。清理数据、探索性图表及模型。这样便于我理解和查找,也为与我一起工作的其他人提供方便。当然,Excel也能做到井井有条。我觉得R的简洁性更便于使用。上述几点只能说是锦上添花,而并不是必不可少。在没有这些功能之前,我也用了好几年Excel,你应该也一样。现在,我想讲讲R和Excel真正的区别。我想说的是,除了以上那些花哨的小优势之外,R更适合用于数据分析。原因如下。你可以把任何数据载入R。数据的保存位置或保存形式并不重要。你可以载入CSV文件,也可以读取JSON,或者执行SQL查询,抑或提取网站。你甚至还可以在R中通过Hadoop处理大数据。R是一个完整的工具集,使用的是数据包。在分析数据时,R比Excel更实用。你可使用R执行数据管理、分类和回归,也可以处理图片,并执行其他所有操作。如果机器学习是你的专业,那能想到的任何算法都是小菜一碟。目前,R可用的数据包逾5,000个,因此无论你要处理什么类型的数据,R都能应付自如。