DESeq2归一化算法详解

2020-05-08 16:43:45 浏览数 (1)

欢迎关注”生信修炼手册”!

对于RNA_Seq而言,得到基因/转录本的定量结果仅仅是第一步, 只是对测序数据的汇总, 相同的工作也可以通过芯片直接得到。

无论是芯片也好,测序也罢,定量只不过是量化生物体内转录本的表达丰度,仅仅一个定量的结果并不能得到有效的生物学结论。为了回答生物学问题,还需要进行后续的差异分析。

由于定量的方式有很多种,比如raw count, TPM, RPKM/FPKM 等,不同的定量方式其表达量的分布是不同的,所以差异分析时采用的软件与算法也会不同。本文介绍DESeq2这个R包,主要是针对raw count的定量结果,进行差异分析。

软件的官网如下

https://bioconductor.org/packages/release/bioc/html/DESeq2.html

DESeq2要求输入的定量结果为raw count形式,raw count其实是根据reads数计算得到,所以要求必须全部是整数。

由于不同样本的测序量不完全相同,所以raw count无法在样本间直接比较,就是说同一个基因在样本A中的raw count大于样本B中的raw count , 并不意味这在A中的表达量就高,数值大可能是由于样本A测序的reads 总数大造成的。

为了在样本间进行差异分析,首先就需要对原始的raw count 表达量数据进行归一化。在DESeq2中,通过estimateSizeFactors函数为每个样本计算一个系数,称之为sizefactor, 示意如下

代码语言:javascript复制
> dds <- makeExampleDESeqDataSet(n=1000, m=4)
> dds <- estimateSizeFactors(dds)
> sizeFactors(dds)
sample1  sample2  sample3  sample4
1.010543 1.033960 1.023026 1.001038

具体的计算过程如下:

原始的表达量矩阵每一行代表一个基因,每一列代表一个样本,用counts表示,先进行log转换,转换之后,计算每个基因在所有样本中的均值,代码如下

代码语言:javascript复制
loggeomeans <- rowMeans(log(counts))

计算单个样本的sizafactor时,将该样本中每个基因的表达量减去对应的所有样本中的均值,然后取中位数。由于开始进行了log转换,最后在转换回来。 假定一个样本中所有基因的表达量为cnts, 代码如下

代码语言:javascript复制
exp(median((log(cnts) - loggeomeans)[is.finite(loggeomeans) & cnts > 0]))

需要注意的时,在计算中位数时,对基因进行了过滤,需要满足以下两个条件 1.在该样本中该基因的表达量大于0 2.在所有样本中该基因的表达量都大于0,而且取log之后的和不为0

实际上第二个条件已经包含第一个条件了,在原始的表达量矩阵中,肯定会有基因在部分样本表达量为0的情况,所以最终计算中位数时,只会用到部分基因。

计算出每个样本的sizefactor之后,将该样本原始的表达量除以该样本的sizefactor, 就得到了归一化之后的表达量。

对于raw count 的归一化,本质是消除不同样本测序总量不同的影响,反应到表达量矩阵上,就是每列的总和不同。DESeq2计算得到的sizefactor和每列的总和之间是一个线性关系,示意如下

所以sizefactors 能够用来进行归一化。

·end·

—如果喜欢,快分享给你的朋友们吧—

0 人点赞