Sophia私人书库 / 待分类 / 衡量RNA




2017-02-27  Sophia私...

衡量RNA-Seq基因表达水平的方法:RPKM, FPKM and TPM详解


    近年来RNA-Seq被的广泛应用,衡量基因表达水平的方法也比较多,例如RPK, RPKM, FPKM, TPM等。 他们之间的关系是什么?如何定义?小编找到一个网络搜集的视频和资料供大家学习。

It used to be when you did RNA-seq, youreported your results in RPKM (Reads Per Kilobase Million) or FPKM(FragmentsPer Kilobase Million). However, TPM (Transcripts Per Kilobase Million) is now becoming quite popular. Since there seems to be a lot of confusion about theseterms, I thought I’d use a StatQuest to clear everything up.

These three metrics attempt to normalizefor sequencing depth and gene length. Here’s how you do it for RPKM:

Count up the total reads in a sample anddivide that number by 1,000,000 – this is our “per million” scaling factor.

Divide the read counts by the “per million”scaling factor. This normalizes for sequencing depth, giving you reads permillion (RPM)

Divide the RPM values by the length of thegene, in kilobases. This gives you RPKM.

FPKM is very similar to RPKM. RPKM was madefor single-end RNA-seq, where every read corresponded to a single fragment thatwas sequenced. FPKM was made for paired-end RNA-seq. With paired-end RNA-seq,two reads can correspond to a single fragment, or, if one read in the pair did not map, one read can correspond to a single fragment. The only differencebetween RPKM and FPKM is that FPKM takes into account that two reads can map toone fragment (and so it doesn’t count this fragment twice).

TPM is very similar to RPKM and FPKM. Theonly difference is the order of operations. Here’s how you calculate TPM:

Divide the read counts by the length of each gene in kilobases. This gives you reads per kilobase (RPK).

Count up all the RPK values in a sample anddivide this number by 1,000,000. This is your “per million” scaling factor.

Divide the RPK values by the “per million”scaling factor. This gives you TPM.

So you see, when calculating TPM, the only difference is that you normalize for gene length first, and then normalize forsequencing depth second. However, the effects of this difference are quite profound.

When you use TPM, the sum of all TPMs in each sample are the same. This makes it easier to compare the proportion ofreads that mapped to a gene in each sample. In contrast, with RPKM and FPKM,the sum of the normalized reads in each sample may be different, and this makesit harder to compare samples directly.

Here’s an example. If the TPM for gene A in Sample 1 is 3.33 and the TPM in sample B is 3.33, then I know that the exactsame proportion of total reads mapped to gene A in both samples. This isbecause the sum of the TPMs in both samples always add up to the same number(so the denominator required to calculate the proportions is the same, regardlessof what sample you are looking at.)

With RPKM or FPKM, the sum of normalizedreads in each sample can be different. Thus, if the RPKM for gene A in Sample 1is 3.33 and the RPKM in Sample 2 is 3.33, I would not know if the sameproportion of reads in Sample 1 mapped to gene A as in Sample 2. This isbecause the denominator required to calculate the proportion could be differentfor the two samples.


What the FPKM? A review of RNA-Seq expression units

The first thing one should remember is that without between sample normalization (a topic for a later post), NONE of these units are comparable across experiments. This is a result of RNA-Seq being a relative measurement, not an absolute one.


Throughout this post “read” refers to both single-end or paired-end reads. The concept of counting is the same with either type of read, as each read represents a fragment that was sequenced.

When saying “feature”, I’m referring to an expression feature, by which I mean a genomic region containing a sequence that can normally appear in an RNA-Seq experiment (e.g. gene, isoform, exon).

Finally, I use the random variable Xi to denote the counts you observe from a feature of interest i. Unfortunately, with alternative splicing you do not directly observe Xi, so often E[Xi] is used, which is estimated using the EM algorithm by a method likeeXpress, RSEM, Sailfish, Cufflinks, or one of many other tools.


“Counts” usually refers to the number of reads that align to a particular feature. I’ll refer to counts by the random variable Xi. These numbers are heavily dependent on two things: (1) the amount of fragments you sequenced (this is related to relative abundances) and (2) the length of the feature, or more appropriately, the effective length. Effective length refers to the number of possible start sites a feature could have generated a fragment of that particular length. In practice, the effective length is usually computed as:


where uFLDis the mean of the fragment length distribution which was learned from the aligned read. If the abundance estimation method you’re using incorporates sequence bias modeling (such as eXpress or Cufflinks), the bias is often incorporated into the effective length by making the feature shorter or longer depending on the effect of the bias.

Since counts are NOT scaled by the length of the feature, all units in this category are not comparable within a sample without adjusting for the feature length. This means you can’t sum the counts over a set of features to get the expression of that set (e.g. you can’t sum isoform counts to get gene counts).

Counts are often used by differential expression methods since they are naturally represented by a counting model, such as a negative binomial (NB2).

Effective counts

When eXpress came out, they began reporting “effective counts.” This is basically the same thing as standard counts, with the difference being that they are adjusted for the amount of bias in the experiment. To compute effective counts:

.effCountsi=Xi ·li Li

The intuition here is that if the effective length is much shorter than the actual length, then in an experiment with no bias you would expect to see more counts. Thus, the effective counts are scaling the observed counts up.

Counts per million

Counts per million (CPM) mapped reads are counts scaled by the number of fragments you sequenced (N) times one million. This unit is related to the FPKM without length normalization and a factor of :

CPMi=Xi N /1000000=Xi / N ·1000000 

I’m not sure where this unit first appeared, but I’ve seen it used with edgeR and talked about briefly in the limma voom paper.

Within sample normalization

As noted in the counts section, the number of fragments you see from a feature depends on its length. Therefore, in order to compare features of different length you should normalize counts by the length of the feature. Doing so allows the summation of expression across features to get the expression of a group of features (think a set of transcripts which make up a gene).

Again, the methods in this section allow for comparison of features with different length WITHIN a sample but not BETWEEN samples.


Transcripts per million (TPM) is a measurement of the proportion of transcripts in your pool of RNA.

Since we are interested in taking the length into consideration, a natural measurement is the rate, counts per base (Xi / Li). As you might immediately notice, this number is also dependent on the total number of fragments sequenced. To adjust for this, simply divide by the sum of all rates and this gives the proportion of transcripts  in your sample. After you compute that, you simply scale by one million because the proportion is often very small and a pain to deal with. In math:


TPM has a very nice interpretation when you’re looking at transcript abundances. As the name suggests, the interpretation is that if you were to sequence one million full length transcripts, TPM is the number of transcripts you would have seen of type , given the abundances of the other transcripts in your sample. The last “given” part is important. The denominator is going to be different between experiments, and thus is also sample dependent which is why you cannot directly compare TPM between samples. While this is true, TPM is probably the most stable unit across experiments, though you still shouldn’t compare it across experiments.

I’m fairly certain TPM is attributed to Bo Li et. al. in the original RSEM paper.


Reads per kilobase of exon per million reads mapped (RPKM), or the more generic FPKM (substitute reads with fragments) are essentially the same thing. Contrary to some misconceptions, FPKM is not 2 * RPKM if you have paired-end reads. FPKM == RPKM if you have single-end reads, and saying RPKM when you have paired-end reads is just weird, so don’t do it.

A few years ago when the Mortazavi et. al. paper came out and introduced RPKM, I remember many people referring to the method which they used to compute expression (termed the “rescue method”) as RPKM. This also happened with the Cufflinks method. People would say things like, “We used the RPKM method to compute expression” when they meant to say they used the rescue method or Cufflinks method. I’m happy to report that I haven’t heard this as much recently, but I still hear it every now and then. Therefore, let’s clear one thing up: FPKM is NOT a method, it is simply a unit of expression.

FPKM takes the same rate we discussed in the TPM section and instead of dividing it by the sum of rates, divides it by the total number of reads sequenced () and multiplies by a big number (). In math:


The interpretation of FPKM is as follows: if you were to sequence this pool of RNA again, you expect to see  fragments for each thousand bases in the feature for every  fragments you’ve sequenced. It’s basically just the rate of fragments per base multiplied by a big number (proportional to the number of fragments you sequenced) to make it more convenient.

Relationship between TPM and FPKM

The relationship between TPM and FPKM is derived by Lior Pachter in a review of transcript quantification methods () in equations 10 – 13. I’ll recite it here:

If you have FPKM, you can easily compute TPM:

Wagner et. al. discuss some of the benefits of TPM over FPKM here and advocate the use of TPM.

I hope this clears up some confusion or helps you see the relationship between these units. In the near future I plan to write about how to use sequencing depth normalization with these different units so you can compare several samples to each other.

R code

I’ve included some R code below for computing effective counts, TPM, and FPKM. I’m sure a few of those logs aren’t necessary, but I don’t think they’ll hurt.





    请遵守用户 评论公约

    类似文章 更多
    喜欢该文的人也喜欢 更多