RNA-seq 表达量归一化在线计算:RPKM / FPKM / TPM 互算
把 RNA-seq 的原始 read 计数换算成 RPKM、FPKM 或 TPM。 粘贴「基因名 read数 长度」三列即可,TPM 需要全部基因才能算,所以尽量整张表一起贴。
三个量分别在做什么
原始 read 数不能直接比较,因为它同时受两件事影响:基因越长,落上去的 read 越多; 测序越深,所有基因的 read 都越多。三种归一化都是在依次除掉这两个因素, 区别只在除的顺序。
RPK = read数 ÷ (基因长度 / 1000) 先除长度
RPKM = RPK ÷ (总read数 / 1e6) 再除深度
TPM = RPK ÷ Σ(所有基因的 RPK) × 1e6 先除长度,再按长度归一化后的总量归一
FPKM 与 RPKM 公式完全相同,只是把 read(单端)换成 fragment(双端)。 双端测序里一对 read 属于同一个片段,只应计一次——这就是两个名字的全部区别。
为什么 TPM 更适合跨样本比较
TPM 在每个样本里必定加总为 100 万,RPKM 不是。 这不是巧合,是定义决定的: TPM 是先把长度效应除掉、再对除完之后的总量做归一,所以分母对样本内所有基因是同一个数。 RPKM 的分母是总 read 数,它在不同样本里对应的「长度归一化后总量」并不相同。
后果是:同一个基因在两个样本里 RPKM 相等,真实的转录本占比却可能不同。 Wagner、Kin 与 Lynch 在 Theory Biosci. (2012) 就是以此指出 RPKM 在样本间不一致, 并提出了 TPM。
上面的计算框会同时给出两者的合计,可以直接看到这个差别。
一个必须说清楚的边界
TPM 更适合跨样本比较,不等于它适合做差异表达。 它们都是组成型数据 (一个样本内加总为常数),少数高表达基因的变化会挤压其余所有基因的数值。 做差异表达要用 DESeq2、edgeR 这类基于原始计数的方法,它们估计的是文库大小因子, 不是简单地除以总数。这一点在《Misuse of RPKM or TPM normalization when comparing across samples》(RNA, 2020)里讲得很直接。
RPKM / TPM 的正当用途是:同一样本内不同基因之间比高低,或者做热图、聚类这类 需要可比尺度的展示。
常见问题
RPKM 和 FPKM 有什么区别?
公式完全相同,区别只在计数单位:RPKM 数 read(单端),FPKM 数 fragment(双端)。双端测序里一对 read 来自同一个片段,只应计一次。用双端数据却按 read 计数,结果会偏大约一倍。
为什么 TPM 一定加总为 100 万?
因为它的分母是「样本内所有基因长度归一化后的总量」,对样本内每个基因都是同一个数。把所有基因的 TPM 相加,分子刚好等于分母,比值为 1,再乘 1e6 就是 100 万。RPKM 的分母是总 read 数,与长度归一化后的总量并不成固定比例,所以合计不是常数。
我只贴了几个基因,结果准吗?
TPM 准不准取决于你想表达什么——它的分母就是你贴进来的这些基因,所以只贴一部分时,得到的是「在这几个基因里的相对占比」,不是全转录组 TPM。RPKM 更敏感:它的分母应该是全部比对 read 数,只贴部分基因又不手动填总数,会系统性偏大。
能直接拿 TPM 做差异表达吗?
不能。TPM 和 RPKM 都是组成型数据,样本内加总为常数,少数高表达基因的变化会挤压其余所有基因。DESeq2、edgeR 从原始计数出发估计文库大小因子,并对计数的离散性建模,这是它们和「除以总数」的根本区别。