缺失值处理

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

缺失值
1. is.na 确实值位置判断
注意: 缺失值被认为是不可比较的,即便是与缺失值自身的比较。

这意味着无法使用比较运算
符来检测缺失值是否存在。

例如,逻辑测试myvar == NA的结果永远不会为TRUE。

作为替代,你只能使用处理缺失值的函数(如本节中所述的那些)来识别出R数据对象中的缺失值。

2. na.omit() 删除不完整观测
manyNAs
library(DMwR)
manyNAs(data, nORp = 0.2)
Arguments
data
A data frame with the data set.
nORp
A number controlling when a row is considered to have too many NA values (defaults to
0.2, i.e. 20% of the columns). If no rows satisfy the constraint indicated by the user, a
warning is generated.
按照比例判断缺失.
3. knnImputation K 近邻填补
library(DMwR)
knnImputation(data, k = 10, scale = T, meth = "weighAvg", distData = NULL)

1 ∙ 2
Arguments
Arguments
data
A data frame with the data set k
The number of nearest neighbours to use (defaults to 10) scale Boolean setting if the data should be scale before finding the nearest neighbours (defaults to
T)
meth
String indicating the method used to calculate the value to fill in each NA. Available values are ‘median’ or ‘weighAvg’ (the default).
distData Optionally you may sepecify here a data frame containing the data set that should be used to find the neighbours. This is usefull when filling in NA values on a test set, where you
should use only information from the training set. This defaults to NULL, which means that
the neighbours will be searched in data
Details
This function uses the k-nearest neighbours to fill in the unknown (NA) values in a data set. For each case with any NA value it will search for its k most similar cases and use the values of these cases to fill in the unknowns.
If meth=’median’ the function will use either the median (in case of numeric variables) or the most frequent value (in case of factors), of the neighbours to fill in the NAs. If
meth=’weighAvg’ the function will use a weighted average of the values o f the neighbours. The weights are given by exp(-dist(k,x) where dist(k,x) is the euclidean distance between the case with NAs (x) and the neighbour k
例子:
#首先读入程序包并对数据进行清理
library(DMwR)
data(algae)
algae <- algae[-manyNAs(algae), ]
clean.algae <- knnImputation(algae[,1:12],k=10)
∙ 1
∙ 2
∙ 3
∙ 4
∙ 5
> head(clean.algae)
season size speed mxPH mnO2 Cl NO3 NH4 oPO4 PO4 Chla a1
1 winter small medium 8.00 9.8 60.800 6.238 578.000 105.000 170.000 50.0 0.0
2 spring small medium 8.35 8.0 57.750 1.288 370.000 428.750 558.750 1.
3 1.4
3 autumn small medium 8.10 11.
4 40.020 5.330 346.667 125.667 187.057 15.6
3.3
4 spring small medium 8.07 4.8 77.364 2.302 98.182 61.182 138.700 1.4 3.1
5 autumn small medium 8.0
6 9.0 55.350 10.416 233.700 58.222 97.580 10.5 9.2
6 winter small high 8.25 13.1 65.750 9.248 430.000 18.250 56.66
7 28.4 15.1
∙ 1
∙ 2
∙ 3
∙ 4
∙ 5
∙ 6
∙7
∙8
4. centralImputation()中心插值
用非缺失样本的中位数(median)对缺失数据进行插值
data(algae)
cleanAlgae <- centralImputation(algae)
summary(cleanAlgae)
∙ 1
∙ 2
∙ 3
5. complete.cases() 寻找完整数据集
x <- airquality[, -1] # x is a regression design matrix
y <- airquality[, 1] # y is the corresponding response
#验证是否complete.cases结果与is.na一样
stopifnot(complete.cases(y) != is.na(y))
#x,y共同的非缺失行的bool结果
ok <- complete.cases(x, y)
#共有几个缺失样本
sum(!ok) # how many are not "ok" ?
#得到非缺失样本
x <- x[ok,]
y <- y[ok]
∙ 1
∙ 2
∙ 3
∙ 4
∙ 5
∙ 6
∙7
∙8
∙9
∙10
∙11
6. na.fail()是否有遗漏值
DF <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA)) na.fail(DF)
Error in na.fail.default(DF) : 对象里有遺漏值
∙ 1
∙ 2
∙ 3
∙ 4
2016四月
27
R语言︱缺失值处理之多重插补——mice包
(253)(0)
笔者寄语:缺失值是数据清洗过程中非常重要的问题(其他方法可见:R语言︱异常值检验、离群点分析、异常值处理),笔者在进行mice包的多重插补过程中遇到相当多的问题。

大致的步骤简介如下:
缺失数据集——MCMC估计插补成几个数据集——每个数据集进行插补建模(glm、lm模型)——将这些模型整合到一起(pool)——评价插补模型优劣(模型系数的t统计量)——输出完整数据集(compute)
步骤详细介绍:
函数mice()首先从一个包含缺失数据的数据框开始,然后返回一个包含多个(默认为5个)完整数据集的对象。

每个完整数据集都是通过对原始数据框中的缺失数据进行插补而生成的。

由于插补有随机的成分,因此每个完整数据集都略有不同。

然后, with()函数可依次对每个完整数据集应用统计模型(如线性模型或广义线性模型),
最后, pool()函数将这些单独的分析结果整合为一组结果。

最终模型的标准误和p 值都将准确地反映出由于缺失值和多重插补而产生的不确定性。

1.#多重插补法处理缺失,结果转存
2.library(lattice) #调入函数包
3.library(MASS)
4.library(nnet)
5.library(mice) #前三个包是mice的基础
6.imp=mice(inputfile,m=4) #4重插补,即生成4个无缺失数据集
7.fit=with(imp,lm(sales~date,data=inputfile))#选择插补模型
8.pooled=pool(fit)
9.summary(pooled)
10.result4=complete(imp,action=3)#选择第三个插补数据集作为结果
结果解读:
(1)imp对象中,包含了:每个变量缺失值个数信息、每个变量插补方式(PMM,预测均值法常见)、插补的变量有哪些、预测变量矩阵(在矩阵中,行代表插补变量,列代表为插补提供信息的变量,1和0分别表示使用和未使用);
同时利用这个代码imp$imp$sales 可以找到,每个插补数据集缺失值位置的数据补齐具体数值是啥。

[plain]view plain copy
1.> imp$imp$sales
2. 1 2 3 4
3.9 361
4.7 3393.1 4060.3 3393.1
4.15 2332.1 3614.7 329
5.5 3614.7
(2)with对象。

插补模型可以多样化,比如lm,glm都是可以直接应用进去,详情可见《R语言实战》第十五章;
(3)pool对象。

summary之后,会出现lm模型系数,可以如果出现系数不显著,那么则需要考虑换插补模型;
(4)complete对象。

m个完整插补数据集,同时可以利用此函数输出。

————————————————————————————————————————————————————
1、缺失值模式——可视化(md.pattern())
mice包提供了一个很好的函数md.pattern(),用它可以对缺失数据的模式有个更好的理解。

还有一些可视化的界面,通过VIM、箱型图、lattice来展示缺失值情况。

可见博客:在R中填充缺失数据—mice包
————————————————————————————————————————————————————
2、mice函数详解
mice函数主要参数有mice(数据集,m=5,meth=”PMM“)
m为默认插补数据集数量,5为默认值;meth为默认插补方式,PMM为默认方式预测均值匹配。

还有一些其他methods插补方法,比如贝叶斯线性回归(norm)、基于bootstrap 的线性回归(norm.boot)、线性回归预测值(norm.predict)、分类回归树(cart)、随机森林(rf)等等。

(详情可help(mice)获取信息)
使用这些插补方法对数据有严格的要求,比如贝叶斯线性回归等前三个模型都需要数据符合numeric格式,而PMM、cart、rf任意格式都行。

使用以上模型遇见的问题有:
1、PMM相当于某一指标的平均值作为插补,会出现插补值重复的问题;
2、cart以及rf是挑选某指标中最大分类的那个数字,是指标中的某一个数字,未按照规律;
3、要使用norm.predict,必须先对数据进行格式转换,这个过程中会出现一些错误,比如以下错误警告:
Error in solve.default(xtx + diag(pen)) :
Imputation method norm.boot is not for factors with three or more levels.
————————————————————————————————————————————————————
3、with-pool函数的作用
在使用Mice包的过程中会出现以下的疑惑:
已经有mice函数补齐了缺失值,可以直接用compete直接调出,为啥还要用with,pool?
mice函数中默认插补5个数据集,那么哪个数据集最好,值得选出?
笔者认为with-pool的作用是用来选择数据集的。

with函数中有5个插补数据集的回归模型~数据集T检验~某数据集是否合格;
pool函数把5个回归模型汇总~数据集F检验~整个方法是否合格。

在R中填充缺失数据—mice包
发布时间: 2015-12-31 阅读数: 1913
当我们在分析一个数据集以及做计算的时候,通常没那么简单。

缺失数据是个很重要的问题。

如果缺失的数据量相对数据集的大小来讲比较小并且为了不偏离分析,忽略少量的样本或许是最后的策略。

然而,忽略一些数据点的同时也会丢失数据的一些信息量,并且这也取决于你所遇到的情况。

你或许应该考虑在删除一些潜在有用的数据点之前对数据集做一些修复。

在某些情况下,一些快速修复如均值替代或许是不错的办法。

对于这种简单的办法,经常会给数据带来偏差。

例如,均值代替法对数据的平均值不会产生变化(这是我们所希望的)。

但会减小数据的方差,这不是我们所希望的。

R中的mice包通过合理的数据值可以帮助我们填充缺失值。

这些合理的数据值都是从一个分布中得到的,这个分布是根据缺失数据点的特定情况设计的。

在本篇文章,我们使用R中的airquality数据集来做数据填充。

为了达到这篇文章的目的,我会从数据集中删除一些数据点。

对于分类变量而言,代替分类变量通常是不可取的。

一些通用的做法是根据观察到的模式来代替缺失的分类变量。

然而,这种做法是值得怀疑。

在这个案例中没有缺失的分类变量数据,我们把它从数据集中移除了,通过summary()来查看下数据。

显然,Qzone变量的数据点缺失最多。

下面我们要深入挖掘丢失数据的模式。

对缺失数据快速分类
缺失的数据有两种类型:
1.MCAR:完全随机缺失,这是数据缺失的理想状况。

2.MNAR:非随机缺失,这是一个比较严重的问题。

在这种情况下,你可能需要去检查
数据的收集过程并且试着理解数据为什么会丢失。

例如,大多数人在一项调查中不回答某个问题,为什么他们这样做呢?是问题不清楚吗?
假设数据缺失的类型是MCAR,过多的数据丢失也是一个问题。

通常,一个可靠的最大阈值是数据集总数的5%。

如果某些特征或样本缺失的数据超过了5%,你可能需要忽略掉这些特征或样本。

因此,我们用一个简单的函数来检查下哪些特征(列)和样本(行)的数据缺失超过了5%。

我们看到,Qzone列的数据点缺失大约25%。

因此,我们可能会考虑从分析中剔除它或者是对它做更多的收集。

其他变量都低于5%的阈值,我们可以保留它们。

对于样本而言,只需缺少一个特征就会导致一个样本25%的数据缺失。

当缺失2个或更多特征的时候应当尽可能的丢弃。

使用mice包来寻找丢失数据的模式
mice包提供了一个很好的函数md.pattern(),用它可以对缺失数据的模式有个更好的理解。

输出结果显示,有104个样本是完整的,34个样本仅缺失Qzone观测值,4个样本样本仅缺失Solar.R值等等。

利用VIM包可以帮助我们得到一个很好的视觉展现,如下所示:
这幅图帮助我们了解到,将近70%的样本不缺失任何信息,22%的样本缺失Qzone值,其余的显示其他缺失模式。

通过这种方法对缺失模式有更清晰的了解。

另一个很有帮助的可视化方法是绘制一个箱形图。

显然,在这里我们被限定一次只能绘制两个变量。

然而,我们也可以得到一些有趣的思考。

左边的红色箱线图展示的是在Qzone值缺失的情况下Solar.R的分布,而蓝色箱线图展示的Qzone值不缺失的情况下Solar.R的分布。

同样的,Qzone 箱线图在底部。

如果对数据缺失假定为MCAR类型正确的话,那么我们预期的红色箱线图和蓝色箱线图应该是非常相似的。

插补缺失数据
mice函数通过链式方程生成多元插补,详见文档
参数注解:1. m=5指的是插补数据集的数量,5是默认值 2. meth='pmm'指的是插补方法。

在这里,我们使用预测均值匹配(Predictive mean matching )作为插补方法。

其他插补方法可以通过methods(mice)来查看。

如果你想查看插补的数据,例如Qzone变量,输入下面的代码行即可。

输出显示了每个插补数据集(顶部第一行)中每个观测值(左侧第一列)的插补数据。

如果需要查看每个变量所用的插补方法,mice可以很容易的做到。

现在,我们可以使用complete()函数返回完整的数据集。

缺失的值被五个数据集的第一个数据集做了替换。

如果希望使用另一个数据集,只需更改complete()函数的第二个参数。

查看初始数据和插补数据的分布情况
我们利用一些有用的图对初始数据和插补后的数据分布做对比
我们希望看到的是洋红点呈现出的形状(插补值)跟蓝色点(观测值)呈现出的形状是匹配的。

从图中可以看到,插补的值的确是“近似于实际值”。

另一个有用的图是密度图:
洋红线是每个插补数据集的数据密度曲线,蓝色是观测值数据的密度曲线。

再次根据我们之前的假定,我们希望这些分布是相似的。

另一个有用的可视化是由stripplot()函数得到的包含个别点的变量分布图。

R中数据缺失值的处理--基于mice包Elara · 20 小时前
简介
缺失值是一个实际数据处理中常见的问题。

其缺失机制大致可以分为完全随机缺失(MCAR),非随机缺失(MNAR)
缺失的例子说明:假设一个数据集有3个变量X1 , X2 , Y ,假设X1 , X2 是完全变量, Y存在缺失值,那么
1.当 Y 以0.5概率缺失,为MCAR
2.当 X1<0 或者当 Y<0 , Y 发生缺失,为MNAR
对于完全随机缺失,直接剔除一般不会带来偏误,而对于非完全随机缺失,由于缺失值出现的位置可能和其他变量有关联,带来的后果则相对复杂得多。

常见处理方法
删除法
1.直接删除有缺失值的样本
2.删除存在大面积缺失值的变量。

或完全变量分析:如果研究的问题只涉及到全部
变量中的一部分变量,这部分变量是完整的,那么可以只分析这几个完整变量之间的关系
填补法
单变量填补
1.简单随机填补:对于每一个缺失值,从已有的该变量数据中随机抽样作为填补值,
填补进缺失位置。

仅仅考虑到了缺失变量本身,而并没有考虑到相关变量的信息。

因此,信息量的利用少。

2.均值/中位数/分位数填补:用存在缺失值的变量的已有值的均值/中位数/分位数,
作为填补值。

这种方法显然会导致方差偏小。

3.回归填补:将缺失变量作为因变量,相关变量(其他变量)作为自变量,进行回
归拟合,用预测值作为填补值。

用于作为自变量的变量最好是具有完全数据(无缺失)。

4.热平台和冷平台:热平台法又称匹配插补法,思路是在完全数据样本中,找到一
个和具有缺失值的样本相似的完全数据样本,用完全数据样本值作为填充值,其过程有点类似于K阶近邻的思想。

冷平台法又称条件均值插补法,思路是先将总体分层(聚类),采用样本所在层(类)的完全数据的均值来替代缺失值。

多变量填补
回归插补法:对缺失变量和完全数据变量拟合多元回归模型来预测缺失值。

是多重填补法的一种应用。

多重填补法(Multiple Imputation Missing Data)的具体技术方法众多且相对复杂,限于篇幅此处不一一展开。

基于mice包的缺失值填补方法
mice即是基于多重填补法构造的。

基本思想是对于一个具有缺失值的变量,用其他变量的数据对这个变量进行拟合,再用拟合的预测值对这个变量的缺失值进行填补。

数据准备(可跳过)
set.seed(2016)
data <- airquality
data[sample(nrow(data),7),3] <- NA
data[sample(nrow(data),7),4] <- NA
data <- data[-c(5,6)]
采用R自带的airquality数据,其第一和第二列数据已经有很多缺失值,现在我们再人为地在第三个第四列中加入随机的7个缺失值。

由于最后两列是月份和日期,不适合作为自变量,所以在缺失值填充中先剔除掉。

一个简单可用的版本
以下代码起到一个初始化的作用,使用时只需要改data为你自己需要填补缺失值的数据集名称
library(mice)
init = mice(data, maxit=0)
meth = init$method
predM = init$predictorMatrix
如果不想要使全部变量都参与拟合,比如排除掉Ozone变量,加入以下代码:predM[, c("Ozone")]=0
当然,即使你排除了拟合变量,并不意味着简单的将其排除,他只是不作为拟合变量,但仍然会作为被拟合变量,进行缺失值填充。

如果你想要跳过某个变量,如Temp,不对其填补,加入以下代码:
meth[c("Temp")]=""
在这种情况下,虽然这个变量不会被作为被拟合变量进行填充,但仍然会作为拟合变量用于拟合其他变量的缺失值。

对于每个变量的拟合,可以指定所用的拟合方法:
meth[c("Ozone")]="norm"
meth[c("Solar.R")]="logreg"
meth[c("Wind")]="polyreg"
=后面的双引号内的即为方法的名字,=前面的双引号中的为所需指定的变量。

norm代表贝叶斯线性回归,logreg代表logit回归拟合,polyreg代表多项式拟合。

设定完成后执行填充:
imputed = mice(data, method=meth, predictorMatrix=predM, m=5)
##
## iter imp variable
## 1 1 Ozone Solar.R Wind Temp
## 1 2 Ozone Solar.R Wind Temp
## 1 3 Ozone Solar.R Wind Temp
## 1 4 Ozone Solar.R Wind Temp
## 1 5 Ozone Solar.R Wind Temp
...
这里我们选择让所有变量都进入拟合,每个变量的方法用默认方法(即不运行前面的设定代码),注意变量拟合时采用方法需要根据不同变量的情况选择,否则可能导致效果不佳或者算法无法计算。

这需要事先对数据情况有一定了解。

另外作为一个例子,本例仅仅作为代码演示,并不代表正确的参数选择方法。

输出填充结果到imputed:
imputed <- complete(imputed)
检查是否存在缺失值
sapply(imputed, function(x) sum(is.na(x)))
## Ozone Solar.R Wind Temp
## 0 0 0 0
到这里就已经可以解决大部分缺失值问题了,如果想继续深入了解mice包的用法,请看下一节。

进阶版本
对分类变量的填充效果一般不是非常好,不建议对分类变量(categorical variables )做填充,本例中只对连续变量进行填充。

假设数据是MCAR的,一般数据量的5%的样本存在缺失值是相对安全的比例。

计算数据的缺失率
miss <- function(x){sum(is.na(x))/length(x)*100}
apply(data,2,miss)
## Ozone Solar.R Wind Temp
## 24.183007 4.575163 4.575163 4.575163
apply(data,1,miss)
## [1] 25 0 0 0 50 25 0 0 25 25 25 0 0 0 0 0 0 25 0 0 25 25 0
## [24] 0 25 25 50 25 0 0 0 25 50 25 25 25 25 0 25 0 25 25 25 0 25 25
## [47] 0 0 0 0 0 25 25 25 25 25 25 25 50 25 25 0 0 0 25 0 0 0 0
## [70] 0 0 50 0 0 25 0 0 0 0 0 0 0 25 25 0 0 0 0 0 0 25 0
## [93] 0 0 0 25 25 25 0 0 0 25 25 0 0 0 25 0 0 0 0 0 0 0 25
## [116] 0 0 0 25 0 0 0 0 0 0 0 0 25 25 0 0 0 0 0 0 0 25 0
## [139] 0 0 0 0 0 0 0 0 0 0 0 25 0 0 0
从变量角度看,可以看到Qzone的缺失率高达25%,因此我们可能需要剔除这个变量。

对于样本,由于只有4个变量,缺失一个就有高达25%的缺失率,权衡一下样本量,我们可以选择剔除缺失高达50%和以上的样本。

使用mice判断缺失情况
对于上述缺失率等缺失情况的计算,在mice包中还有更简便的函数:
md.pattern(data)
## Solar.R Wind Temp Ozone
## 100 1 1 1 1 0
## 32 1 1 1 0 1
## 5 0 1 1 1 1
## 6 1 0 1 1 1
## 5 1 1 0 1 1
## 2 0 1 1 0 2
## 1 1 0 1 0 2
## 2 1 1 0 0 2
## 7 7 7 37 58
最左边一列是样本数,右边的0-1矩阵的1代表列对应的变量没有缺失,0代表有缺失。

最右边一列是对应模式累计缺失值个数,最下面一列是变量累积存在的缺失模式个数。

假如第三行的数据410111,表示有4个样本满足这行的缺失模式,1011表示这行的缺失模式是缺失了Solar.R变量,最右边的1表示这种缺失模式缺失了1个变量数据。

可以用VIM包获得缺失值的可视化表示
library(VIM)
aggr_plot <- aggr(data, col=c('navyblue','red'), numbers=TRUE, labels=names(data), cex.axis=.7, gap=3, ylab=c("Histogram of missing data","Pattern"))
marginplot(data[c(1,2)])
marginplot(data[c(1,2)])一次只表示2个变量的缺失情况,这里表示了第一和第二列变量。

左边的红色箱线图表示有Ozone缺失的样本的Solar.R的分布,蓝色的箱线图表示的是剩下的数据点的分布。

下方的2个箱线图的含义类似。

在MCAR的假设下,蓝色和红色的箱线图应该非常接近。

填充缺失值
这次我们详细介绍mice函数的用法
tempData <- mice(data,m=5,maxit=50,meth='pmm')
summary(tempData)
## Multiply imputed data set
## Call:
## mice(data = data, m = 5, method = "pmm", maxit = 50) ## Number of multiple imputations: 5
## Missing cells per column:
## Ozone Solar.R Wind Temp
## 37 7 7 7
## Imputation methods:
## Ozone Solar.R Wind Temp
## "pmm" "pmm" "pmm" "pmm"
## VisitSequence:
## Ozone Solar.R Wind Temp
## 1 2 3 4
## PredictorMatrix:
## Ozone Solar.R Wind Temp
## Ozone 0 1 1 1
## Solar.R 1 0 1 1
## Wind 1 1 0 1
## Temp 1 1 1 0
## Random generator seed value: NA
mice()函数用于生成填充矩阵tempData,其中的参数有:
∙data,需要填充的数据集
∙m,多重填补法的填补矩阵数。

默认为5
∙method,填补用的方法,pmm代表预测均值匹配(predictive mean matching),用methods(mice) 可以看到有哪些可用的方法
∙maxit,迭代次数,默认50次
如果想要查看填充的是那些值可以用以下代码:
tempData$imp$Temp
## 1 2 3 4 5
## 1 83 85 84 79 83
## 9 72 77 72 57 80
## 33 68 93 82 68 84
## 41 87 78 81 82 78
## 59 82 82 68 75 58
## 129 82 79 71 76 76
## 137 69 75 56 73 81
最左边的一列表示的是被填充样本序号,之后的5列是多重填补法生成的5个填补矩阵对这个变量产生的填充数。

调用meth值可以查看每个变量用的是什么方法(前面我们指定了pmm方法)
tempData$meth
## Ozone Solar.R Wind Temp
## "pmm" "pmm" "pmm" "pmm"
当然也可以如前一节一样对每个变量指定各自的拟合方法。

最后生成完全数据集:
completedData <- complete(tempData,1)
1表示用tempData$imp中的第一个矩阵来填充,如果想要用其他矩阵则可以改成2,3,4等等。

Reference。

相关文档
最新文档