导语:
今天开始新的R教程:R语言数据分析与挖掘,本教程是在掌握R基础语法和基本绘图的情况下学习,没有R基础的可先在网上找相关教程进行学习。当然,本公众号(bioinfo_cloud)也有基础的语法教程,也可参考学习!后台回复:R语言基础教程,即可获取,或者通过本公众号的菜单栏自己寻找!
在生信分析中,往往会处理很多数据,比如转录组的数据,在处理数据的过程中,样本往往会包含缺失值。我们有必要对缺失值进行处理,这样不但可以降低预测分析的数据偏差,而且还可以构建有效的模型。本文将简要介绍数据缺失值处理。
在R中,缺失值通常以"NA"表示,判断数据是否存在缺失值,通常使用函数is.na(),该函数是判断缺失值的最基本函数,可用于判断不同的数据对象,比如向量,列表和数据框。如果存在缺失值,返回TRUE,反正为FALSE。我们以DMwR中的一个数据集algae来演示数据的缺失值处理过程。
# 安装并加载包
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行数据有缺失值。
> # 查看有缺失值的行的数据
> 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()来判断数据集中分类变量是否含有缺失值。
> 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
在处理缺失值之前,需要先对缺失模式进行判断,缺失模型主要有以下三种:完全随机缺失(MCAR)、随机缺失(MAR)和完全非随机缺失(MNAR)。
(1)完全随机缺失属于较为理想的缺失状态,指数据的缺失不依赖于任何变量,统计意义上来说该缺失情况是独立的,但是过多的数据缺失也是一个不容忽视的问题。
(2)随机缺失指数据的缺失依赖于其他变量,而不由含有缺失值的变量本身决定。
(3)完全非随机缺失则属于较为严重的问题,指数据的缺失依赖于变量本身,我们往往需要去检查数据的搜集过程,较多的调查对象没有回答某一个问题,需要弄明白为什么他们不回答?是涉及隐私或者问题设置不清楚?然后根据数据的缺失情况采取不同的方法进行处理。
我们一般使用mice包来判断缺失数据的模式,该包提供了一个非常好用的函数: md.pattren(), 其函数的基本书写格式为:md.pattren(x),其中x表示缺失值的对象,一般为数据框或者矩阵。
#安装和加载包
install.packages("mice")
library(mice)
# 缺失模型判断
> 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()来进行可视化描述,其函数的基本书写格式为:
aggr(x, delimiter = NULL, plot = TRUE,....)
参数介绍:
X:一个向量、矩阵或者数据框;
delimiter:一个特征向量,用于区分插补变量,如果赋值则表示变量的值己被插补,如果不赋值,则用于判断缺失模型,默认为NULL:
plot:逻辑值,指定是否绘制图形,默认值为TRUE。
下面我们将利用algae数据集进行实战战操作:
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()绘制散点图,该函数可以生成一幅散点图,变量的缺失信息被显示在图形的边界。
marginplot(algae[,4:5])
绘图结果所示。显然我们只能得到两变量间的缺失模型可视化。图形底部的红色箱线图表示变量mxPH在mnO2缺失下的数据分布,淡蓝色表示mnO2完整下的数据分布;左边的图含义相同,但由于变量mnO2只含有一个缺失值,故左边只有浅色箱线图。我们可以根据不同颜色的箱线图的比较得出一些结论,如果同一个变量的两个箱线图比较一致,则初步可以判定缺失数据类型为完全随机缺失(MCAR)。
此外,VIM包中还有很多绘图模式,比如直方图,气泡图等。可以自寻探索。画散点图矩阵的函数是matrixplot()。
matrixplot(algae)
颜色越深代表数值越大,红色代表缺失值部分。
本文分享自 MedBioInfoCloud 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!