表达矩阵的归一化和标准化,去除极端值,异常值
我们阅读量破万的综述:RNA-seq这十年(3万字长文综述)给粉丝朋友们带来了很多理解上的挑战,所以我们开辟专栏慢慢介绍其中的一些概念性的问题,上一期:
RNA-seq的counts值,RPM, RPKM, FPKM, TPM 的异同
在数据挖掘过程,数据的归一化和标准化是必须的。取log值就是一种归一化的方法,z-score是常用的标准正态分布化的方法。
归一化和标准化的区别
实际上口语里面通常是没办法很便捷的区分这两个概念。
归一化:将每个样本的特征值(在转录组中,特征值就是表达量)转换到同一量纲下,把表达量映射到特定的区间内,区间的上下限由表达量的极值决定,这种区间缩放法是归一化的常用方法。
标准化:按照表达矩阵中的一个基因在不同样本中的表达量处理数据,每个样本点都能对标准化产生影响,通过求z-score值,转换为标准正态分布,经过处理的数据的均值为0,标准差为1,因此z-score也称为零-均值规范化。
取log对表达量的影响
原始的raw counts矩阵是一个离散型的变量,离散程度很高。有的基因表达丰度比较高,counts数为10000,有些低表达的基因counts可能10,甚至在有些样本中为0。
即使经过了RPKM/FPKM等方法抵消了一些测序技术误差的影响,但高低丰度基因的表达量的差距依然很大。
如果对表达量去一下log10,发现10000变成了4,10变成了1,这样之前离散程度很大的数据就被集中了。
如上图,这些离散的表达量都汇聚到了不同底数的log函数线上,可以使绘制的热图、箱线图等图形更加美观。
有时当表达量为0时,取log会出现错误,可以log(counts+1)来取log值。当x=1时,所有的log系列函数值都为0。这样原本表达量为0的值,取log后仍为0。
这也就是UCSC的XENA下载到的表达矩阵的形式。
z-score对表达量的影响
log对每个样本的表达量的处理标准是一样,而z-score考虑到了不同样本对表达量的影响,计算z-score时,消除到了表达的平均水平和偏离度的影响。
转换后表达量符合正态分布分布,Z-score只是一个临界值,是标准化的结果,本身没有意义,有意义的在于在标准正态分布模型中它代表的概率值。
所以只要知道Z值, 查对应的正态分布表,就可以知道表达量偏离平均水平的程度。
表达量log归一化和z-score标准化的使用范围
如果对表达量的范围有要求,用归一化。
如果表达量较为稳定,不存在极端最大最小值,使用归一化。
如果表达量离散程度很大,存在异常值和较多噪音,用标准化可以避免异常值和极端值的影响。
在分类、聚类、PCA算法中,使用z-score值的结果更好。
数据不太符合正态分布时,可以使用归一化。
机器学习的算法(SVM、KNN、神经网络等)要求归一化/标准化
剔除异常值
大家看群主代码绘制热图,里面经常看到z-score以及去除极端值的:
希望你看清楚下面代码是如何进行z-score的
pheatmap(dat)
n=t(scale(t(dat)))
n[n>2]=2 #限定上限,使表达量大于2的等于2
n[n< -2]= -2 #限定下限,使表达量小于-2的等于-2
n[1:4,1:4]
pheatmap(n,show_colnames =F,show_rownames = F)
ac=data.frame(group=cluster)
rownames(ac)=colnames(n)
pheatmap(n,annotation_col = ac,
show_colnames =F,show_rownames = T)
n[n< -1]= -1 # 重新限定下限,使表达量小于-2的等于-2
n[1:4,1:4]
pheatmap(n,annotation_col = ac,
show_colnames =F,show_rownames = T)
总结
在一些公共数据库如TCGA、GEO中,会提供取log值、z-score后的表达量矩阵,这些值都是count矩阵的另一种表示形式。了解这些值背后的含义及应用范围,针对不同的数据挖掘模型,选取适合的表达量的表示形式来达到预期的结果。
那么,怎么样知道你的表达矩阵是否需要进行归一化或者标准化呢?下面的学习班可能会帮助你