如何利用R语言处理 缺失值 数据

时间:2024-05-23 08:28:35

主要用到VIM和mice包

[plain] view plain copy
  1. install.packages(c("VIM","mice"))  

1.处理缺失值的步骤

步骤:

(1)识别缺失数据;

(2)检查导致数据缺失的原因;

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

缺失值数据的分类:

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

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

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

2.识别缺失值

NA:代表缺失值;

NaN:代表不可能的值;

Inf:代表正无穷;

-Inf:代表负无穷。

is.na():识别缺失值;

is.nan():识别不可能值;

is.infinite():无穷值。

is.na()、is.nan()和is.infinte()函数的返回值示例

x is.na(x) is.nan(x) is.infinite(x)
x<-NA TRUE FALSE FALSE
x<-0/0 TRUE TRUE FALSE
x<-1/0 FALSE FALSE TRUE
       

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

3.探索缺失值模式 

(1)列表显示缺失值

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

[plain] view plain copy
  1. library(mice)  
  2. data(sleep,package="VIM")  
  3. md.pattern(sleep)  
如何利用R语言处理 缺失值 数据

(2)图形探究缺失数据

VIM包中提供大量能可视化数据集中缺失值模式的函数:aggr()、matrixplot()、scattMiss()

[plain] view plain copy
  1. library("VIM")  
  2. aggr(sleep,prop=FALSE,numbers=TRUE)  

如何利用R语言处理 缺失值 数据

[plain] view plain copy
  1. library("VIM")  
  2. aggr(sleep,prop=TRUE,numbers=TRUE)#用比例代替了计数  
如何利用R语言处理 缺失值 数据

matrixplot()函数可生成展示每个实例数据的图形

[plain] view plain copy
  1. matrixplot(sleep)  
如何利用R语言处理 缺失值 数据

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

marginplot()函数可生成一幅散点图,在图形边界展示两个变量的缺失值信息。

[plain] view plain copy
  1. library("VIM")  
  2. marginplot(sleep[c("Gest","Dream")],pch=c(20),col=c("darkgray","red","blue"))  
如何利用R语言处理 缺失值 数据

(3)用相关性探索缺失值

影子矩阵:用指示变量替代数据集中的数据(1表示缺失,0表示存在),这样生成的矩阵有时称作影子矩阵。

求这些指示变量间和它们与初始(可观测)变量间的相关性,有且于观察哪些变量常一起缺失,以及分析变量“缺失”与其他变量间的关系。


[plain] view plain copy
  1. head(sleep)  
  2. str(sleep)  
  3. x<-as.data.frame(abs(is.na(sleep)))  
  4. head(sleep,n=5)  
  5. head(x,n=5)  
  6. y<-x[which(sd(x)>0)]  
  7. cor(y)  
  8. cor(sleep,y,use="pairwise.complete.obs")  

4.理解缺失值数据的来由和影响

识别缺失数据的数目、分布和模式有两个目的:

(1)分析生成缺失数据的潜在机制;

(2)评价缺失数据对回答实质性问题的影响。

即:

(1)缺失数据的比例有多大?

(2)缺失数据是否集中在少数几个变量上,抑或广泛存在?

(3)缺失是随机产生的吗?

(4)缺失数据间的相关性或与可观测数据间的相关性,是否可以表明产生缺失值的机制呢?


若缺失数据集中在几个相对不太重要的变量上,则可以删除这些变量,然后再进行正常的数据分析;

若有一小部分数据随机分布在整个数据集中(MCAR),则可以分析数据完整的实例,这样仍可得到可靠有效的结果;

若以假定数据是MCAR或MAR,则可以应用多重插补法来获得有铲的结论。

若数据是NMAR,则需要借助专门的方法,收集新数据,或加入一个相对更容易、更有收益的行业。

5.理性处理不完整数据

6.完整实例分析(行删除)

函数complete.cases()、na.omit()可用来存储没有缺失值的数据框或矩阵形式的实例(行):

[plain] view plain copy
  1. newdata<-mydata[complete.cases(mydata),]  
  2. newdata<-na.omit(mydata)  

[plain] view plain copy
  1. options(digits=1)  
  2. cor(na.omit(sleep))  
  3. cor(sleep,use="complete.obs")  
如何利用R语言处理 缺失值 数据


[plain] view plain copy
  1. fit<-lm(Dream~Span+Gest,data=na.omit(sleep))  
  2. summary(fit)  
如何利用R语言处理 缺失值 数据

7.多重插补

多重插补(MI)是一种基于重复模拟的处理缺失值的方法。

MI从一个包含缺失值的数据集中生成一组完整的数据集。每个模拟数据集中,缺失数据将使用蒙特卡洛方法来填补。

此时,标准的统计方法便可应用到每个模拟的数据集上,通过组合输出结果给出估计的结果,以及引入缺失值时的置信敬意。

可用到的包Amelia、mice和mi包

mice()函数首先从一个包含缺失数据的数据框开始,然后返回一个包含多个完整数据集的对象。每个完整数据集都是通过对原始数据框中的缺失数据进行插而生成的。

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

pool()函数将这些单独的分析结果整合为一组结果。

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


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

[plain] view plain copy
  1. library(mice)  
  2. imp<-mice(mydata,m)  
  3. fit<-with(imp,analysis)  
  4. pooled<-pool(fit)  
  5. summary(pooled)  
[plain] view plain copy
  1. mydata是一个饮食缺失值的矩阵或数据框;  
[plain] view plain copy
  1. imp是一个包含m个插补数据集的列表对象,同时还含有完成插补过程的信息,默认的m=5  
[plain] view plain copy
  1. analysis是一个表达式对象,用来设定应用于m个插补的统计分析方法。方法包括做线回归模型的lm()函数、做广义线性模型的glm()函数、做广义可加模型的gam()、及做负二项模型的nbrm()函数。  
[plain] view plain copy
  1. fit是一个包含m个单独统计分析结果的列表对象;  
[plain] view plain copy
  1. pooled是一个包含这m个统计分析平均结果的列表对象。  
[plain] view plain copy
  1. </pre><pre name="code" class="plain">library(mice)  
  2. data(sleep,package="VIM")  
  3. imp<-mice(sleep,seed=1234)  

如何利用R语言处理 缺失值 数据

[plain] view plain copy
  1. fit<-with(imp,lm(Dream~Span+Gest))  
  2. pooled<-pool(fit)  
  3. summary(pooled)  
如何利用R语言处理 缺失值 数据

 

[plain] view plain copy
  1. imp  
如何利用R语言处理 缺失值 数据


[plain] view plain copy
  1. imp$imp$Dream  
如何利用R语言处理 缺失值 数据

利用complete()函数可观察m个插补数据集中的任意一个,格式为:complete(imp,action=#)

eg:

[plain] view plain copy
  1. dataset3<-complete(imp,action=3)  
  2. dataset3  
如何利用R语言处理 缺失值 数据

8.处理缺失值的其他方法

处理缺失数据的专业方法

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

(1)成对删除

处理含缺失值的数据集时,成对删除常作为行删除的备选方法使用。对于成对删除,观测只是当它含缺失数据的变量涉及某个特定分析时才会被删除。
[plain] view plain copy
  1. cor(sleep,use="pairwise.complete.obs")  
如何利用R语言处理 缺失值 数据
虽然成对删除似乎利用了所有可用数据,但实际上每次计算只用了不同的数据集,这将会导致一些扭曲,故建议不要使用该方法。

(2)简单(非随机)插补

简单插补,即用某个值(如均值、中位数或众数)来替换变量中的缺失值。注意,替换是非随机的,这意味着不会引入随机误差(与多重衬托不同)。
简单插补的一个优点是,解决“缺失值问题”时不会减少分析过程中可用的样本量。虽然 简单插补用法简单,但对于非MCAR的数据会产生有偏的结果。若缺失数据的数目非常大,那么简单插补很可能会低估标准差、曲解变量间的相关性,并会生成不正确的统计检验的p值。应尽量避免使用该方法。

9.R中制作出版级品质的输出

常用方法:SweaveodfWeave

Sweave包可将R代码及输出嵌入到LaTeX文档中,从而得到 PDF、PostScript和DVI格式的高质量排版报告。

odfWeave包可将R代码及输出嵌入到ODF(Open Documents Format)的文档中