StatQuest生物统计学专题 - 分位数及其应用
分位数的概念分位数应用之一:QQ图分位数应用之二:分位数标准化
分位数的概念
分位数(quantile)的概念非常简单,就是将数据按照数量均分后的边界值。
具体来说,分位数就是指将数据均分成相同大小的不同组之间的边界值。举例来说,中位数是将数据按照数量均分为两份,所以中位数就是一个分位数,可以称为1/2分位数。同样的,如果将数据均分为四份,那么就有三个分位数:1/4分位数、中位数或1/2分位数或2/4分位数、3/4分位数。
分位数有多种叫法,比如1/4分位数,可以叫做0.25分位数,也可以叫做25%分位数。
此外有时候还会遇到到百分位数(percentile)的概念,其实百分位数也是一种分位数,只不过百分位数是将数据均分为100组的分位数。所以1/2分位数可以叫做第50百分位数,0.25分位数可以叫做第25百分位数,75%分位数可以叫做第75百分位数。
分位数应用之一:QQ图
QQ图(quantile-quantile图)最常见的场景就是用于数据正态性的可视化衡量。当然正态化检视是QQ图的重要功能,然而QQ并不只是可以检视正态化,它同样可以检视数据是否符合其他各种类型的分布,还可以进行两组数据之间的分布比较。
QQ图的计算和绘制方法
以下以正态分布QQ图为例,进行QQ图的实际计算和绘制:
将原始数据的每个点作为一个分位数。比如原始数据有40个数据,那么每个数据点是一个分位数,共有40个分位数(相当于将数据分成了40份?);
找到一个正态分布,任意正态分布都行,本例以标准正态分布为例;
求出与原始数据分位数等量的正态分布的分位数,也就是说,原始数据有40个分位数,那么就求出正态分布的40个四十分位数;
然后将相应的原始数据和正态分布的分位数绘图即可;
可以将上图的散点图绘制一个拟合曲线(线性拟合已经讲过)。
正态分布是连续分布,它无法按照数量均分进行计算分位数,它是按照概率均分进行计算分位数。
可以在R中实现上述思想:
# 1.获取一个原始数据,这里以从正态分布N(5,10^2)中随机抽取40个数据作为原始数据
originData <- rnorm(40,mean = 5, sd = 10)
originData <- sort(originData) # 排序后作为分位数
# 2.使用标准正态分布曲线求解分位数
# 将0-1均分为41份,去掉0和1后,剩余的数值刚好将概率均分为40份
normProb <- seq(0,1,by=1/(length(originData)+1))
normProb <- normProb[-1]
normProb <- normProb[-(length(originData)+1)]
# 将概率normProb转换为相应的分位数
normQuantile <- qnorm(normProb,mean = 0, sd=1)
# 3.绘制QQ图及拟合直线
# 绘制QQ散点图
plot(normQuantile,originData)
# line是R中进行拟合的函数
abline(line(normQuantile,originData))
R中模拟的结果如下图:
作为对比也可以绘制一下如果原始数据是均匀分布的情况,下例代表服从均匀分布U(-5,15)的40个数据的正态QQ图,将上述R脚本中的第一句更改为originData <- runif(40,min = -5, max = 15)
,其他不变,则可以得到如下QQ图:
QQ图检视其他分布
虽然QQ图最常用的场景是用于观察数据的正态性,然而QQ图的作用却并不限于观察正态性,它同样可以观察其他分布情况 。以均匀分布为例,从均匀分布U(-5,15)中获取100个数据作为原始数据(为了更好的观察区别,数据提高为100个),分别绘制此数据的正态分布QQ图和均匀分布QQ图。
#2张QQ图纵向排列
opar<-par(no.readonly=T)
par(mfrow=c(2,1))
#####正态分布QQ图####
#原始数据为均匀分布
originData <- runif(100,min = -5, max = 15)
originData <- sort(originData)
normProb <- seq(0,1,by=1/(length(originData)+1))
normProb <- normProb[-1]
normProb <- normProb[-(length(originData)+1)]
normQuantile <- qnorm(normProb,mean = 0, sd=1)
plot(normQuantile,originData, main="Normal QQ-plot")
abline(line(normQuantile,originData))
#####均匀分布QQ图####
#原始数据为均匀分布
originData <- runif(100,min = -5, max = 15)
originData <- sort(originData)
unifProb <- seq(0,1,by=1/(length(originData)+1))
unifProb <- unifProb[-1]
unifProb <- unifProb[-(length(originData)+1)]
unifQuantile <- qunif(unifProb,min = 0, max = 1)
plot(unifQuantile,originData,main="Uniform QQ-plot")
abline(line(unifQuantile,originData))
#还原绘制设置
par(opar)
结果如下图,可以发现此数据可以很好的贴合到均匀分布QQ图中的拟合直线上,但是却在正态分布QQ图中有较大的偏移,表明数据更符合均匀分布。
QQ图除了检视数据是否符合一个特定分布之外,还可以检视两个数据之间的分布是否相同。假如有两个数据集合A和B,数量分别为10和100,那么数据量较小的数据的每一个数据点作为一个分位数,也就是A的分位数的数目为10,数据量较大的数据则以数据量较小的数据的数据量计算分位数,也就是说B虽有100个数据,但是计算它的10个十分位数,然后将两者的分位数绘图即可。
以上过程只是为了说明QQ图的原理和计算方法,其实在R中是有专一的函数用于绘制QQ图的。
比如第一个例子中的从正态分布N(5,10^2)中随机抽取40个数据作为原始数据的正态分布QQ图为:
originData <- rnorm(40,mean = 5, sd = 10)
qqnorm(originData)
qqline(originData)
此外,qqplot函数可以用于其他分布或数据集之间的QQ图绘制。
分位数应用之二:分位数标准化
在芯片实验中,常常会遇到一种标准化方法——分位数标准化。这也是分位数的一种应用,先看一下分位数标准化要解决的问题是什么。
分位数标准化是为了去除仪器或技术误差
在一次芯片实验中,如果芯片质量较好或仪器的功率、发光较好等等情况下,那么这一个芯片的数值会整体偏高。然而这种数值偏高其实只是仪器或技术误差,和生物学意义并没有关系,因此为了对这种不同生物重复之间的基因表达数值进行标准化,则可以使用分位数标准化的方法。
分位数标准化的计算方法
分位数标准化非常简单,就是按照分位数求均值,并把均值作为标准化值。
如下图(左)所示的原始基因芯片表达值,共3个样本,每个样本有4个基因(不同颜色表示),他们整体的表达量是不同的,可以看出样本2#的表达量整体偏高。
分位数标准化的计算方法为:
将原始数据按照表达量排序,并作为分位数,如下图(左)所示,从上到下,表达量越来越小;
不同样本间相同分位数求均值,如下图(中)所示,样本1的蓝色、样本2的黄色、样本3的绿色是同一个分位数,因此计算三者的均值。其他类似,共4个均值;
将分位数均值作为各自的标准化值,如下图(右)所示,样本1的蓝色、样本2的黄色、样本3的绿色的标准化值是三者的平均值。其他类推。
比如对于以下数据,标准化之后则为:
Sample1 Sample2
geneA 1 4
geneB 2 5
geneC 3 6
Sample1 Sample2
geneA 2.5 2.5
geneB 3.5 3.5
geneC 4.5 4.5
专题以往文章
参考资料
StatQuest课程:https://statquest.org/video-index/
猜你喜欢
生信菜鸟团-专题学习目录(6)
生信菜鸟团-专题学习目录(7)
还有更多文章,请移步公众号阅读
▼ 如果你生信基本技能已经入门,需要提高自己,请关注下面的生信技能树,看我们是如何完善生信技能,成为一个生信全栈工程师。
▼ 如果你是初学者,请关注下面的生信菜鸟团,了解生信基础名词,概念,扎实的打好基础,争取早日入门。