数据清洗之缺失值——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"))