I would like to check the expression of a gene in different groups like Disease vs Normal samples. I want to make a plot out of that to check whether it is significant or not.

From this paper lncRNA I see that Figure 1C they used RPKM value. But, I'm using read counts data. My question is can I use log cpm to make a plot like that or should I need to use only RPKM?

  • 2
    $\begingroup$ To check if a gene is significantly differential expressed between groups, is not done with a plot but with linear models (e.g., limma trend or voom, edgeR, or DEseq2). Doing a t-test with RPKM data like in the paper is certainly not recommended (but reviewers are usually no statisticians or bioinformaticians, so that unsound statistics is still published). My advice is to keep count data for statistics in limma (or other tools I mention), and make violin plots with cpm. $\endgroup$
    – benn
    May 9, 2018 at 15:16
  • $\begingroup$ log-scale is very important for differential expression analysis but I think why we do this is best addressed as a separate question. $\endgroup$
    – Tom Kelly
    Jun 2, 2018 at 15:30

3 Answers 3


You should never use RPKM. It’s simply obsolete in the age of paired-end sequencing, and has been replaced by FPKM (which is, strictly speaking, a synonym).

The linked blog post explains more generally the problems that measures such as FPKM and CPM suffer from. A more robust measure is the TPM (transcripts per million), which scales CPM by the lengths of the transcripts.

Lastly, none of these measures perform very well for comparing gene expression across replicates. Since you have read count data, you should run DESeq2 or edgeR to perform differential expression analysis across all genes, and go from there.

As the comment noted, the paper you cite does not represent scientific best practice. In fact, a competent reviewer would have rejected this analysis.


For visualization purposes, using log(cpm) is fine. But plot don't check if differences are significant or not, statistical tests do. You can certainly add the results of a proper statistical test to a plot - like adding asterisks to denote a significant difference, for example.


You can use the raw counts to normalise your data. It is import to do so before doing a differential expression analysis: otherwise you will detect more reads from samples with higher coverage and from longer genes. A gene with longer mRNA molecules will produce more reads than a shorter one for the same number of transcript molecules. Samples will not produce the same number of reads due to variation in cDNA extraction, amplification, library preparation, etc.

This does not inherently mean that a sample expresses every gene more than another sample. Hence we compare samples by relative rather than absolute expression (for microarray and RNA-Seq data). This is in principle, very similar to using housekeeper genes in qPCR experiments except we adjust for total RNA or reads, gene length, and batch effects.

There are many ways to achieve this but I recommend using the limma package in R. This provides the “voom” normalisation procedure. “voom” is documented in a separate follow-up paper to the limma paper. It produces normalised data (on a log-scale) which is compatible with downstream analysis provided by the package (including built-in Venn diagram and volcano plot functions). See the package vignette for more details.

Of course, everything here only applies to bulk RNASeq experiments and procedures for single-cell analysis are different.


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.