最近学习了一个适用于CUT&RUN
和 CUT&Tag
文库大小矫正的方法,数据标准化过程用到了Quantile Normalization
,记忆力有限需要动手记录一下。
Quantile Normalization
(分位数标准化) 可以将样本间的不同分布映射到同一种分布,从而消除分布差异便于样本间的比较。
其主要思想是通过对每个样本进行排序、均值、映射,使得所有样本在每个位置上都具有相同的分布。下面来看看具体的过程。
从原始矩阵出发:
首先,样本基因表达值排序并保留排序位置:
这一步相当于生成了两个新的矩阵,左边是样本内基因排序的矩阵,右边是基因在排序后的位置矩阵。
接着,对表达值排序矩阵的每一行求平均值:
最后,根据位置矩阵和行均值生成最终的结果矩阵:
填充时根据基因在样本内的排序位置,从行均值里面找到对应行的值做为基因的表达值,如gene2
在样本sample1
的排序位置为5,则行均值的第5行的18.6即为gene2
的表达值。
当然,quantile normalization
的过程无需自己动手写代码来实现,在R里面有可用的包来做这个事,如下面用preprocessCore
包的函数来完成:
>library(preprocessCore)
>data
sample1 sample2 sample3 sample4 sample5
gene1 3 16 13 4 18
gene2 17 2 11 13 2
gene3 14 10 8 11 5
gene4 4 20 3 18 17
gene5 15 11 20 16 12
>normalize.quantiles(as.matrix(data))
[,1] [,2] [,3] [,4] [,5]
[1,] 2.8 15.4 15.4 2.8 18.6
[2,] 18.6 2.8 12.2 12.2 2.8
[3,] 12.2 7.6 7.6 7.6 7.6
[4,] 7.6 18.6 2.8 18.6 15.4
[5,] 15.4 12.2 18.6 15.4 12.2
搞懂了Quantile Normalization
的原理及作用,下一个重要的问题就是适用于什么场景?没有最适合只有更适合,也许只有通过实践才知道答案。