Advertisement

R语言实战笔记--第十五章 处理缺失数据

阅读量:

R语言实战笔记–第十五章 处理缺失数据

标签(空格分隔): R语言 处理缺失数据 VIM mice


缺失值标记(NA),是造成计算出现错误的重要原因之一;对于处理缺失数据的方法而言,在实际应用中具有关键性的作用

基本方法

在函数体内预设了_missing_value_处理机制:像_sum_这样的通用计算函数通常都包含了_na_rm=TRUE/FALSE_这一参数设置以控制是否跳过__missing values__,默认情况下未被跳过。如果设置为跳过缺失值(na_rm = TRUE),则会先剔除这些缺失数据后再进行计算。
通过调用_naomit_() 函数进行操作:该功能能够去除向量、矩阵或数据框中包含__missing values(即 NA)__的所有元素或行。
对于向量和矩阵来说,在执行完移除非 missing values 操作后会得到一个 named object(即 _omit 对象),并会标注被移除的具体索引信息或行号;而对于数据框来说,则会直接输出移除这些含有 missing values 行后的数据框对象。
具体操作可参考示例代码:
example(na.omit)

高级方法

在数据分析流程中涉及的主要步骤包括:
第一步是检测_data_incompleteness_;
接着是对missing_data_causes_的分析;
最后是处理含有missing_values_的数据,
即通过删除或插补的方法来处理。
在实际操作中发现,
其中,在选择是否删除或者采用哪种插补方法时必须依赖于专业知识,
了解_data_collection_background_有助于判断其可能的原因,
能够帮助我们确定最合适的替代方案,
可靠准确。

识别缺失值

对于缺失值(NA)、不可能值(NaN)以及无穷大(-Inf, Inf)的检测,则分别使用is.na()、is.nan()和is.infinite()这三个函数。这些函数会对每个元素进行检测,并返回相应的布尔结果。通过调用sum()和mean()函数,则可分别统计缺失数据的数量及其占总数据的比例。在R语言环境中,默认的数据处理操作中,默认情况下将对向量中的所有元素进行运算处理,在这种情况下,默认情况下将对向量中的所有元素进行运算处理,在这种情况下,默认情况下将对向量中的所有元素进行运算处理,在这种情况下,默认地将对向量中的所有元素执行运算处理,在这种情况下,默认地将对向量中的所有元素执行运算处理,在这种情况下,默认地将对向量中的所有元素执行运算处理,在这种情况下,默认地将对向量中的所有元素执行运算处理。在这种上下文中,默认地将对向量中的所有元素执行运算处理,在这种上下文中,默认地将对向量中的所有元素执行运算处理,在这种上下文中,默认地将对向量中的所有元素执行运算处理,在这种上下文中,默认地将对向量中的所有元素执行运算处理的情况下

探索缺失值模式

识别_missing_values不仅仅在于知道哪里存在_missing_values_还关注着不同类型的_missing_pattern_这有助于我们更好地完成下一步分析。方法主要有以下三种类型:基于表格的形式、图形化的展示以及基于变量间相关性的分析。具体来说:借助mice包中的md.pattern()函数_生成一个详细的模式说明表_该表由三部分组成:第一列为符合对应模式的行数_最后一列为missing的数量_中间各列依次列出原有变量(按missing数量排序)。其中用1标记非missing的数据位置_0则表示missing的位置。如上图所示模式说明表_第二行数据表明只有Span变量存在2次missing的情况。

这里写图片描述

图形
使用VIM包来进行图形解释,最新版的VIM包已不包含GUI,需要界面的需要另外安装VIMGUI包来使用。
图形样式涉及aggr()、matrixplot()和scatteMiss()(实际上,R语言实战中并没有介绍此函数,而去讲了marginplot()这个函数)三个函数,各函数语法如下:
aggr(dataframe,prop=T/F,numbers=T/F),其中prop参数为是否以比例显示缺失数,T显示比例,F显示数值;numbers参数为是否显示数值标签,aggr图显示一个缺失数量的;

这里写图片描述

matrixplot(dataframe),该矩阵图可直观观察数据框中各变量之间是否存在的关联。例如,在一些情况下某类别的遗漏可能与另一类别存在特定特征相关联。红色单元格代表缺失值,并且从浅到深颜色依次表示数值从小到大

这里写图片描述

该函数用于绘制散点图(ScatterMiss),其中输入x是一个仅包含两列数据的数据框(DataFrame),生成的是两个变量之间的散点图(Scatter plot)。在横坐标轴上缺失值的位置用竖直线表示(Vertical lines),从个人角度来看(From my perspective),此图表可以帮助观察横坐标轴上缺失值之间的数据分布情况(The distribution of data between the missing values on the x-axis)。

这里写图片描述

绘图函数marginplot绘制x参数对应的可视化结果,默认生成一个完整的可视化的图形结构。其中x参数是一个仅包含峡谷列数据的数据框结构,默认与scattMiss的数据源保持一致性。该可视化的图形界面主要由两部分组成:第一部分是基础的散点图展示;第二部分则包括三个子模块:1)缺失值对应的位置显示箱线图;2)缺失值对应的位置清晰标注数据点;3)完整的散点分布情况。

这里写图片描述

相关性
在图形分析中进行相关性探索会更加深入,这一过程不仅揭示了数据间的具体关联关系,还能够帮助我们识别出缺失数据的具体类型.接下来我们将介绍缺失数据的主要三种类型:完全随机缺失(MCAR)、随机缺失(MAR)以及非随机缺失(NMAR).
MCAR是指某个变量的缺失值与其观测到的数据无关.
MAR则是指该变量的缺失值与其观测到的数据存在关联,但与自身未观测值之间无关联.
NMAR则表示上述两种情况都不符合.

检查相关性代码如下:

将原始数据框转换为由指示变量替代的矩阵(有时被称为影子矩阵),其中缺失数据表示为1而非缺失表示为0

x <- as.data.frame(abs(is.na(sleep)))

展示前5个观测样本

head(sleep, n = 5)
head(x, n = 5)

筛选出既有缺失值也有完整观测的数据字段

y <- x[which(colMeans(x) > 0)]

分析各存在缺失值的数据字段之间的相互关联程度

cor(y)

进一步评估这些指标与完整观测样本之间的关联程度

cor(sleep, y, use = "pairwise.complete.obs")

最后所得的数据表实质上涉及了缺失值变量与其他观测变量之间的关系。可以忽略其中的NA值及其后面发出的警告信息。例子中提到的相关数值并不算特别大,并不算很小;因此可以说已经排除了MCAR的可能性,并且也有可能属于MAR的情况

缺失值的来由及影响

辨识缺失数据的数量、分布情况及特征模式旨在实现两个目标:其一是探究生成缺失数据潜在形成机制;其二是评估缺少数据对解答实质研究问题的影响程度。具体而言,则围绕以下几个核心问题展开探讨:其一,则关注缺少数据所占的比例规模;其次,则考察缺少数据主要集中在少数关键变量中还是普遍存在于多个变量中;再次,则探究缺少值是否具有随机性特征;最后,则分析缺少变量之间的相互关联性或与观测到的数据之间的关联程度是否能揭示出导致缺少值出现的原因机制

理性处理缺失值

数据的存在必然赋予其价值,在面对缺失值时不宜采取简单粗暴的态度直接予以删除。完全剔除可能导致信息的重要损失与数据失真现象的发生。目前在数据分析领域内有三种当前较为流行的处理方法:一种是通过推断恢复丢失的数据特征;另一种是基于现有数据进行分析的传统扣除缺失值的方法;第三种则是采用模拟技术构建完整的数据分析框架。我们的目标始终未变:即使在面临不完整信息的情况下也应努力实现尽可能精确的数据分析结果以解决研究的核心问题。

推理方法

该方法通过变量间的数据关联或逻辑联系来填补或恢复缺失值。
例如,在sleep数据中,Sleep等于NonD加上Dream。
从而使得这三个指标中的任何一个缺失时都可以利用这一数学公式进行还原。
前面两个案例主要依赖于数学关系来进行数据填补与恢复。
接着举例说明基于逻辑关联进行数据填充的方式:在调查问卷中存在性别字段出现缺失的情况。
这种方法既可能基于明确的数学关联(精确的关系)也可能基于模糊的逻辑联系(近似的关系)。
选择合适的填充方法通常需要创造性的思考与深入的理解能力,
因为这些潜在的关系并不是直接可见,
只有通过对已有数据的研究才能逐步揭示这些隐含的关系,
并据此建立合理的关系模型来进行填补。

行删除法

行删除法也是一种基于完整实例的数据处理方法(即一种基于完整实例的数据处理方法),其核心思想是将所有存在缺失数据的样本排除在外(将所有存在缺失数据的样本排除在外),从而得到一个完整的子集(从而得到一个完整的子集)。需要注意的是,在这种情况下(在MCAR假设下且缺失比例不高时),这种方法能够有效维持统计效力(在MCAR假设下且缺失比例不高时),但如果遇到MAR情况或者缺失比例过高,则可能导致统计效力下降(或者导致统计效力下降)。
通过以下代码实现对sleep数据集中的缺失值处理,并进一步探索潜在的线性关系(通过以下代码实现对sleep数据集中的缺失值处理,并进一步探索潜在的线性关系)。这些替代方法本质上是等价的(这些替代方法本质上是等价的)。

复制代码
    cor(na.omit(sleep))
    cor(sleep[complete.cases(sleep),])
    cor(sleep,use="complete.obs")
    #回归分析Dream与Span、Gest的关系
    fit<-lm(Dream~Span+Gest,data=na.omit(sleep)
    summary(fit)
    
    
      
      
      
      
      
      
    
    代码解读

多重插补(MI)

在R语言实战中对mice包的多重插补方法进行了简要介绍。想要更深入地了解这一技术,则需参考更多相关的文献资料。

复制代码
    library(mice)  #载入mice包
    data(sleep,package=VIM)    #载入sleep数据
    imp<-mice(sleep,m=5,seed=1234) #插补并划分子集
    fit<-with(imp,lm(Dream~Span+Gest))  #对每个子集使用统计分析方法
    pooled<-pool(fit)  #组合结果
    summary(pooled)  #显示组合结果,fmi栏给出引入缺失而引起的变异占整体不确定性的比例
    imp  #查看插补并划分之后各子集的汇总情况,可以看到缺失情况、插补使用的方法、以及预测变量矩阵(PredictorMatrix,行代表插补变量,列代表所使用的变量,1代表已使用)
    imp$imp$Dream  #查看Dream变量的5次插补值信息,检查该数据可以判断插补值是否合理
    complete(imp,action=#)  #action后的“#”代表第几个划分子集,本函数用于查看第几个子集的数据明细。
    
    
      
      
      
      
      
      
      
      
      
    
    代码解读

处理缺失值的其它方法

先看一下处理缺失值的包的列表:

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

各个包的使用需后续自行查找相关资料以理解其使用方法,并需注意两种虽仍被采用但不推荐使用的处理缺失值策略:成对删除与简单(非随机)插补法。
成对删除法是在分析数据集中变量间相关性后应用的一种处理方式。
基于之前对缺失数据集相关性的分析已经应用了该方法。

复制代码
    cor(sleep,use="pairwise.complete.obs")
    
    
      
    
    代码解读

在该方法中

因此也需谨慎应用

全部评论 (0)

还没有任何评论哟~