最近在看差异分析当中原始read counts是如何被校正的,自然就不会放过差异分析的经典之一 —— edgeR.
edgeR使用的校正方法称为trimmed mean of M values (TMM),其前提假设为样本对照组和处理组间绝大多数基因表达不发生差异。
如何界定绝大多数基因这一点我个人还没有看到一个量化的指标,是50%还是80%才算绝大多数。
edgeR的TMM校正方法其实在其分析流程中就是一句命令而已
| 1 | y <- calcNormFactors(y) | 
但由于我十分好奇其背后计算的原理和计算过程,我便搜索一番,才发现无论是中文还是英文的帖子对于TMM的具体运算步骤及代码都没有很好的整理。因此,本文记录我通过阅读TMM提出的原文和edgeR源码所了解到的TMM校正。
TMM校正示例
我们通过airway数据展示实际TMM校正的过程
| 1 | # TMM normalization | 
Step 1: 选择参考样本
TMM normalization首先需要选择一个参考样本,以它为基准进行校正。
默认下,参考样本的选择是通过比较每个样本的CPM (counts per million)的上四分位数与所有样本CPM的平均上四分位数之间的差值,找出差值最小的样本作为参考样本。
| 1 | # library size of each samples | 
在这个例子中refColumn是SRR1039512
在
edgeR::calcNormFactors()中,我们也可以通过refColumn=参数指定参考样本
Step 2: calculation of sample-reference pairwise M and A
接着,在参考样本和非参考样本间两两计算校正因子(normalization factors)。
我们首先需要计算参考样本和非参考样本间的Fold change (M)和平均表达量 (A)
$M = log2\frac{non-reference\ sample\ count}{reference\ sample\ count}$
$A=\frac{log2(non-reference\ sample\ count)\ +\ log2(reference\ sample\ count)}{2}$
注意这里使用的count都是校正过文库大小的
以下代码用到的变量名含义:
obs: 非参考样本的原始count
ref: 参考样本的原始count
libsize.obs: 非参考样本的原始文库大小
libsize.ref: 参考样本的原始文库大小
| 1 | # 第一列是非参考样本 | 
分别计算M value和A value,为了对M value加权,我们还需要通过delta method估计渐近方差
| 1 | # M value: log ratio of expression, accounting for library size | 
保留M和A值均为有限值的基因,并过滤极低表达量的基因
| 1 | Acutoff = -1e10 | 
Step 3: trimmed mean of M values
接着,我们对M和A值进行双重截值,截掉M值排在前30%和后30%,A值排在前5%和后5%的基因,计算中间这部分基因M值的加权平均值
| 1 | logratioTrim <- 0.3 | 
上述步骤是计算第一个样本与参考样本的校正因子,下面我们通过一个循环计算所有样本的校正因子.
以下循环在选取refColumn后开始
| 1 | nsamples <- ncol(counts1) | 
我们与edgeR::calcNormFactors()比较一下
| 1 | library(edgeR) | 
Step 4: TMM normalized counts
最后,我们获取TMM校正后的read counts。实际上,上述计算的校正因子是对文库大小的校正,edgeR再利用校正后的文库大小对read counts进行校正。
${TMM\ Normalized\ Counts = \frac{Raw \ Count\ *\ 10^6}{Library\ size\ *\ NormFactor}}$
| 1 | # TMM normalized counts | 
| SRR1039508 | SRR1039509 | SRR1039512 | SRR1039513 | |
|---|---|---|---|---|
| ENSG00000260166 | 0.0000 | 0.0000 | 0.000 | 0.000 | 
| ENSG00000266931 | 0.0000 | 0.0000 | 0.000 | 0.000 | 
| ENSG00000104774 | 1375.7505 | 1510.2195 | 1431.252 | 1301.323 | 
| ENSG00000267583 | 0.0000 | 0.7924 | 0.000 | 0.000 | 
| ENSG00000227581 | 0.7095 | 0.0000 | 0.000 | 0.000 | 
| ENSG00000227317 | 0.0000 | 0.0000 | 0.000 | 0.000 | 
使用edgeR::calcNormFactors()计算校正因子后,我们可以使用edgeR::cpm()提取校正后的counts矩阵
| 1 | # by edgeR | 
以上就是TMM校正的计算过程。
完。
Ref:
A scaling normalization method for differential expression analysis of RNA-seq data: https://doi.org/10.1186/gb-2010-11-3-r25
calcNormFactors.R: https://rdrr.io/bioc/edgeR/src/R/calcNormFactors.R
Gene expression units explained: RPM, RPKM, FPKM, TPM, DESeq, TMM, SCnorm, GeTMM, and ComBat-Seq: https://www.reneshbedre.com/blog/expression_units.html
edgeR提供的TMM归一化算法详解: https://cloud.tencent.com/developer/article/1625225