前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >R语言数据分析与挖掘(第一章):数据预处理(1)——缺失值处理

R语言数据分析与挖掘(第一章):数据预处理(1)——缺失值处理

作者头像
DoubleHelix
发布2019-09-25 10:09:01
4.2K0
发布2019-09-25 10:09:01
举报
文章被收录于专栏:生物信息云

导语:

今天开始新的R教程:R语言数据分析与挖掘,本教程是在掌握R基础语法和基本绘图的情况下学习,没有R基础的可先在网上找相关教程进行学习。当然,本公众号(bioinfo_cloud)也有基础的语法教程,也可参考学习!后台回复:R语言基础教程,即可获取,或者通过本公众号的菜单栏自己寻找!

在生信分析中,往往会处理很多数据,比如转录组的数据,在处理数据的过程中,样本往往会包含缺失值。我们有必要对缺失值进行处理,这样不但可以降低预测分析的数据偏差,而且还可以构建有效的模型。本文将简要介绍数据缺失值处理。

1.缺失值判断

在R中,缺失值通常以"NA"表示,判断数据是否存在缺失值,通常使用函数is.na(),该函数是判断缺失值的最基本函数,可用于判断不同的数据对象,比如向量,列表和数据框。如果存在缺失值,返回TRUE,反正为FALSE。我们以DMwR中的一个数据集algae来演示数据的缺失值处理过程。

代码语言:javascript
复制
# 安装并加载包
install.packages(DMwR)
library(DMwR)
# 载入algae数据集
data(algae)
sum(is.na(algae))
sum(!complete.cases(algae))

代码运行结果如下:

is.na()判断数据集中是否存在缺失值,sum()函数将缺失值个数求和,可以看到有33个缺失值。complete.cases()函数也可以判断数据集的缺失值。与is.na()不同。该函数判断数据集的每一行中是否有缺失值,如果不存在反回TRUE,存在返回FALSE。sum()函数对complete.cases()函数输出结果中的FALSE求和。所以sum(!complete.cases(algae))返回16表示有16行数据有缺失值。

代码语言:javascript
复制
> # 查看有缺失值的行的数据
> algae[!complete.cases(algae),]
    season   size  speed mxPH mnO2    Cl   NO3 NH4    oPO4     PO4  Chla
28  autumn  small   high 6.80 11.1 9.000 0.630  20   4.000      NA  2.70
38  spring  small   high 8.00   NA 1.450 0.810  10   2.500   3.000  0.30
48  winter  small    low   NA 12.6 9.000 0.230  10   5.000   6.000  1.10
55  winter  small   high 6.60 10.8    NA 3.245  10   1.000   6.500    NA
56  spring  small medium 5.60 11.8    NA 2.220   5   1.000   1.000    NA
57  autumn  small medium 5.70 10.8    NA 2.550  10   1.000   4.000    NA
58  spring  small   high 6.60  9.5    NA 1.320  20   1.000   6.000    NA
59  summer  small   high 6.60 10.8    NA 2.640  10   2.000  11.000    NA
60  autumn  small medium 6.60 11.3    NA 4.170  10   1.000   6.000    NA
61  spring  small medium 6.50 10.4    NA 5.970  10   2.000  14.000    NA
62  summer  small medium 6.40   NA    NA    NA  NA      NA  14.000    NA
63  autumn  small   high 7.83 11.7 4.083 1.328  18   3.333   6.667    NA
116 winter medium   high 9.70 10.8 0.222 0.406  10  22.444  10.111    NA
161 spring  large    low 9.00  5.8    NA 0.900 142 102.000 186.000 68.05
184 winter  large   high 8.00 10.9 9.055 0.825  40  21.083  56.091    NA
199 winter  large medium 8.00  7.6    NA    NA  NA      NA      NA    NA
      a1   a2  a3   a4  a5  a6  a7
28  30.3  1.9 0.0  0.0 2.1 1.4 2.1
38  75.8  0.0 0.0  0.0 0.0 0.0 0.0
48  35.5  0.0 0.0  0.0 0.0 0.0 0.0
55  24.3  0.0 0.0  0.0 0.0 0.0 0.0
56  82.7  0.0 0.0  0.0 0.0 0.0 0.0
57  16.8  4.6 3.9 11.5 0.0 0.0 0.0
58  46.8  0.0 0.0 28.8 0.0 0.0 0.0
59  46.9  0.0 0.0 13.4 0.0 0.0 0.0
60  47.1  0.0 0.0  0.0 0.0 1.2 0.0
61  66.9  0.0 0.0  0.0 0.0 0.0 0.0
62  19.4  0.0 0.0  2.0 0.0 3.9 1.7
63  14.4  0.0 0.0  0.0 0.0 0.0 0.0
116 41.0  1.5 0.0  0.0 0.0 0.0 0.0
161  1.7 20.6 1.5  2.2 0.0 0.0 0.0
184 16.8 19.6 4.0  0.0 0.0 0.0 0.0
199  0.0 12.5 3.7  1.0 0.0 0.0 4.9

我们可以利用函数summary()来判断数据集中分类变量是否含有缺失值。

代码语言:javascript
复制
> summary(algae)
    season       size       speed         mxPH            mnO2              Cl         
 autumn:40   large :45   high  :84   Min.   :5.600   Min.   : 1.500   Min.   :  0.222  
 spring:53   medium:84   low   :33   1st Qu.:7.700   1st Qu.: 7.725   1st Qu.: 10.981  
 summer:45   small :71   medium:83   Median :8.060   Median : 9.800   Median : 32.730  
 winter:62                           Mean   :8.012   Mean   : 9.118   Mean   : 43.636  
                                     3rd Qu.:8.400   3rd Qu.:10.800   3rd Qu.: 57.824  
                                     Max.   :9.700   Max.   :13.400   Max.   :391.500  
                                     NA's   :1       NA's   :2        NA's   :10       
      NO3              NH4                oPO4             PO4              Chla        
 Min.   : 0.050   Min.   :    5.00   Min.   :  1.00   Min.   :  1.00   Min.   :  0.200  
 1st Qu.: 1.296   1st Qu.:   38.33   1st Qu.: 15.70   1st Qu.: 41.38   1st Qu.:  2.000  
 Median : 2.675   Median :  103.17   Median : 40.15   Median :103.29   Median :  5.475  
 Mean   : 3.282   Mean   :  501.30   Mean   : 73.59   Mean   :137.88   Mean   : 13.971  
 3rd Qu.: 4.446   3rd Qu.:  226.95   3rd Qu.: 99.33   3rd Qu.:213.75   3rd Qu.: 18.308  
 Max.   :45.650   Max.   :24064.00   Max.   :564.60   Max.   :771.60   Max.   :110.456  
 NA's   :2        NA's   :2          NA's   :2        NA's   :2        NA's   :12       
       a1              a2               a3               a4               a5               a6        
 Min.   : 0.00   Min.   : 0.000   Min.   : 0.000   Min.   : 0.000   Min.   : 0.000   Min.   : 0.000  
 1st Qu.: 1.50   1st Qu.: 0.000   1st Qu.: 0.000   1st Qu.: 0.000   1st Qu.: 0.000   1st Qu.: 0.000  
 Median : 6.95   Median : 3.000   Median : 1.550   Median : 0.000   Median : 1.900   Median : 0.000  
 Mean   :16.92   Mean   : 7.458   Mean   : 4.309   Mean   : 1.992   Mean   : 5.064   Mean   : 5.964  
 3rd Qu.:24.80   3rd Qu.:11.375   3rd Qu.: 4.925   3rd Qu.: 2.400   3rd Qu.: 7.500   3rd Qu.: 6.925  
 Max.   :89.80   Max.   :72.600   Max.   :42.800   Max.   :44.600   Max.   :44.400   Max.   :77.600  
                                                                                                     
       a7        
 Min.   : 0.000  
 1st Qu.: 0.000  
 Median : 1.000  
 Mean   : 2.495  
 3rd Qu.: 2.400  
 Max.   :31.600

2.缺失模型判断

在处理缺失值之前,需要先对缺失模式进行判断,缺失模型主要有以下三种:完全随机缺失(MCAR)、随机缺失(MAR)和完全非随机缺失(MNAR)。

  (1)完全随机缺失属于较为理想的缺失状态,指数据的缺失不依赖于任何变量,统计意义上来说该缺失情况是独立的,但是过多的数据缺失也是一个不容忽视的问题。

  (2)随机缺失指数据的缺失依赖于其他变量,而不由含有缺失值的变量本身决定。

  (3)完全非随机缺失则属于较为严重的问题,指数据的缺失依赖于变量本身,我们往往需要去检查数据的搜集过程,较多的调查对象没有回答某一个问题,需要弄明白为什么他们不回答?是涉及隐私或者问题设置不清楚?然后根据数据的缺失情况采取不同的方法进行处理。

我们一般使用mice包来判断缺失数据的模式,该包提供了一个非常好用的函数: md.pattren(), 其函数的基本书写格式为:md.pattren(x),其中x表示缺失值的对象,一般为数据框或者矩阵。

代码语言:javascript
复制
#安装和加载包
install.packages("mice")
library(mice)
# 缺失模型判断
代码语言:javascript
复制
> md.pattern(algae)
    season size speed a1 a2 a3 a4 a5 a6 a7 mxPH mnO2 NO3 NH4 oPO4 PO4 Cl
184      1    1     1  1  1  1  1  1  1  1    1    1   1   1    1   1  1
3        1    1     1  1  1  1  1  1  1  1    1    1   1   1    1   1  1
1        1    1     1  1  1  1  1  1  1  1    1    1   1   1    1   1  0
7        1    1     1  1  1  1  1  1  1  1    1    1   1   1    1   1  0
1        1    1     1  1  1  1  1  1  1  1    1    1   1   1    1   0  1
1        1    1     1  1  1  1  1  1  1  1    1    1   0   0    0   0  0
1        1    1     1  1  1  1  1  1  1  1    1    0   1   1    1   1  1
1        1    1     1  1  1  1  1  1  1  1    1    0   0   0    0   1  0
1        1    1     1  1  1  1  1  1  1  1    0    1   1   1    1   1  1
         0    0     0  0  0  0  0  0  0  0    1    2   2   2    2   2 10
    Chla   
184    1  0
3      0  1
1      1  1
7      0  2
1      1  1
1      0  6
1      1  1
1      0  6
1      1  1
      12 33

上述输出结果表示:在200条观测记录中,一共有184条记录是完整的,不含任何缺失值,有一条记录缺失变量mxPH,一条记录缺失变量mnO2,其他类似。输出结果的最后一行中每个数字表示对应的变量的缺失值个数,如变量chla对应的最后一行,数字12表示该变量一共缺失12个数据,即12条记录,最后的数据33表示所有变量缺失数据的总个数。

函数md.pattren()主要从数值的角度判断缺失模型,我们还可以通过其他途径来描述缺失值,如利用包VIM中的函数aggr()来进行可视化描述,其函数的基本书写格式为:

代码语言:javascript
复制
aggr(x, delimiter = NULL, plot = TRUE,....)

参数介绍:

X:一个向量、矩阵或者数据框;

delimiter:一个特征向量,用于区分插补变量,如果赋值则表示变量的值己被插补,如果不赋值,则用于判断缺失模型,默认为NULL:

plot:逻辑值,指定是否绘制图形,默认值为TRUE。

下面我们将利用algae数据集进行实战战操作:

代码语言:javascript
复制
lbrary(VIM)
aggr(algae, numbor=TRUE, ylab = c("Histogram of missing data", "Pattern"))

运行结果:

在上述代码中,我们设置了参数number、ylab,这在上面的参数介绍中并没有提到,因为这2个参数属于plot()中的。当aggr()中的plot参数设置为TRUE(此处默认)时,相当于在该函数内嵌套了一个绘图函数plot()。因此可以使用函数plot()中的参数。此处我们设置numbor=TRUE,指定图形显示相关数据,ylab 指定图形的级坐标名称,由于输出结果为两个图形的拼凑结果, 故设置了两个纵坐标名称。

输出结果左图中,我们可以很直观地看到algae数据集中每一个变量的缺失数据比例,该直方图的横坐标显示了部分变量名称,按照数据中变量名称

的顺序。左边的条形图显示algae数据中各变量的缺失比例,C1和Chla的比例最高;右边的图显示了综合的缺失情况,浅色方框表示完整数据,深色方框表示缺失数据,可以看到,algae数据集中有92%的数据是完整的,将该

图形与函数md.pattren()的输出结果对照来看,可以发现变量Chla的缺失值比例最大,约为6%,也正好印证了左边的图形。

还有一种方法是利用函数marginplot()绘制散点图,该函数可以生成一幅散点图,变量的缺失信息被显示在图形的边界。

代码语言:javascript
复制
marginplot(algae[,4:5])

绘图结果所示。显然我们只能得到两变量间的缺失模型可视化。图形底部的红色箱线图表示变量mxPH在mnO2缺失下的数据分布,淡蓝色表示mnO2完整下的数据分布;左边的图含义相同,但由于变量mnO2只含有一个缺失值,故左边只有浅色箱线图。我们可以根据不同颜色的箱线图的比较得出一些结论,如果同一个变量的两个箱线图比较一致,则初步可以判定缺失数据类型为完全随机缺失(MCAR)。

此外,VIM包中还有很多绘图模式,比如直方图,气泡图等。可以自寻探索。画散点图矩阵的函数是matrixplot()。

代码语言:javascript
复制
matrixplot(algae)

颜色越深代表数值越大,红色代表缺失值部分。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 MedBioInfoCloud 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.缺失值判断
  • 2.缺失模型判断
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档