R语言中的特殊值及缺失值NA的处理方法

Python029

R语言中的特殊值及缺失值NA的处理方法,第1张

R语言中存在一些空值(null-able values),当我们进行数据分析时,理解这些值是非常重要的。

通常来说,R语言中存在:

这四种数据类型在R中都有相应的函数用以判断。

NA即Not available,是一个 长度为1的逻辑常数 ,通常代表缺失值。NA可以被强制转换为任意其他数据类型的向量。

可以采用is.na()进行判断。另外,NA和“NA”不可以互换。

NULL是一个 对象(object) ,当 表达式或函数产生无定义的值 或者 导入数据类型未知的数据 时就会返回NULL。

可以采用is.null()进行判断。

NaN即Not A Number,是一个 长度为1的逻辑值向量

可以采用is.nan()进行判断。另外,我们可以采用is.finite()或is.infinite()函数来判断元素是有限的还是无限的,而对NaN进行判断返回的结果都是False。

Inf即Infinity无穷大,通常代表一个很大的数或以0为除数的运算结果,Inf说明数据并没有缺失(NA)。

可以采用is.finite()或is.finite()进行判断。

理解完四种类型数值以后,我们来看看该采取什么方法来处理最最常见的缺失值NA。

小白学统计在推文《有缺失值怎么办?系列之二:如何处理缺失值》里说“ 处理缺失值最好的方式是什么?答案是:没有最好的方式。或者说,最好的方式只有一个,预防缺失,尽量不要缺失。

在缺失数很少且数据量很大的时候,直接删除法的效率很高,而且通常对结果的影响不会太大。

如数据框df共有1000行数据,有10行包含NA,不妨直接采用函数na.omit()来去掉带有NA的行,也可以使用tidyr包的drop_na()函数来指定去除哪一列的NA。

用其他数值填充数据框中的缺失值NA。

使用tidyr包的replace_na()函数。

使用tidyr包的fill()函数将上/下一行的数值填充至选定列中NA。

除此之外,类似原理的填充法还有均值填充法(用该变量的其余数值的均值来填充)、LOCF(last observation carried forward)、BOCF(baseline observation carried forward)、WOCF(worst observation carried forward)等。

当分类自变量出现NA时,把缺失值单独作为新的一类。

在性别中,只有男和女两类,虚拟变量的话以女性为0,男性为1。如果出现了缺失值,可以把缺失值赋值为2,单独作为一类。由于将缺失值赋值,在统计时就不会把它当做缺失值删除,避免了由于这一个变量缺失而导致整个观测值被删除的情况。

假定有身高和体重两个变量,要填补体重的缺失值,我们可以把体重作为因变量,建立体重对身高的回归方程,然后根据身高的非缺失值,预测体重的缺失值。

参考资料:

在问卷数据或实验数据中,经常会包含由于未作答、设备故障或误编码数据的缘故出现缺失值。在R中,缺失值以符号NA(Not Available,不可用)表示。不可能出现的值(例如,被0除的结果) 通过符号NaN(Not a Number,非数值)来表示。

首先我们来安装两个R包,VIM和mice包。

函数 is.na( ) 允许你检测缺失值是否存在,作用于一个对象上,也将返回一个相同大小的对象,如果某个元素是缺失值,相应的位置将被改写为TRUE,不是缺失值的位置则为FALSE。

由图可以看出,所有显示TRUE的地方都是缺失值。

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

可以看出1、3、4行存在缺失值。

mice包中的md.pattern,形成缺失表。

aggr ( ) 是VIM包中的函数,可以形成缺失图。

根据变量之间的关系来填补或恢复缺失值,通过推理,数据的恢复可能是准确的或近似的。

把包含一个或多个缺失值的行删除,称作行删除法,或个案删除,大部分统计软件包默认采用的是行删除法。

通过函数 na.omit( ) 移除所有含有缺失值的观测。na.omit( ) 可以删除所有含有缺失数据的行。

当然,我们有时并不想把缺失的行直接删除,因为这样难以避免造成了数据的损失。简单插补是用均值,中位数或众数来替换变量中缺失的值。将初始数据集中的属性分为数值属性和非数值属性来分别进行处理。

对缺失值的高级处理方式有很多,大致有回归插补、多重插补、热卡插补,K最近距离邻法等等,现在只介绍多重插补的原理:

多重插补(MI)是一种基于重复模拟的处理缺失值的方法,它从一个包含缺失值的数据集中生成一组数据完整的数据集(即不包含缺失值的数据集,通常是3-10个)。每个完整数据集都是通过对原始数据中的缺失数据进行插补而生成的。在每个完整的数据集上引用标准的统计方法,最后,把这些单独的分析结果整合为一组结果。

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

现在我们尝试插补之前的sleep数据:

完全按照上面的抄就可以,summary之后可以看到:

可以通过检查分析过程所创建的对象来获取更多的插补信息。例如,来看imp对象的汇总信息:

从输出结果可以看到,五个数据集同时被创建,预测均值(pmm)匹配法被用来处理每个含 缺失数据的变量。BodyWgt、BrainWgt、Pred、Exp和Danger没有进行插补(" "),因为它们并没有缺失数据。VisitSequence从左至右展示了插补的变量,从NonD开始,以Gest结束。最后,预测变量矩阵(PredictorMatrix)展示了进行插补过程的含有缺失数据的变量,它们利 用了数据集中其他变量的信息.(在矩阵中,行代表插补变量,列代表为插补提供信息的变量,1 和0分别表示使用和未使用。)

从网上找了一下,整理如下:

NA:缺失数据

NaN:无意义的数,比如sqrt(-2), 0/0。

Inf:正无穷大

-Inf:负无穷大

NULL:不存在

下面是用程序来看:

rm是remove的意思,例如你指定na.rm=T,就会移除na数据