I have two bulk RNA-Seq samples, already tpm-normalized.

I would like to know what is a reasonable normalization procedure to enable downstream log fold-change estimation.

The distribution of the two samples using the common set of genes looks similar:

TPM distribution

However, the two samples have only been tpm-normalized, is it enough to guarantee reliable fold-change estimation? Should I use another normalization procedure, e.g. Quantile Normalization, before comparison?

My objective is to define a signature using the genes that are up-regulated in Sample1 with respect to Sample0, and vice versa. I'm using log fold-changes, but I'm concerned that their value may be affected by each sample distribution.

Do you also have suggestions for the definition of up-regulated genes with these data?



3 Answers 3


You have only two samples?

You aren't going to be able to draw strong conclusions from that no matter what you do. Clever statistics don't work without replicates.


What I have generally done in the past is to process the data using voom in the limma package for bulk RNASeq. Inside voom you can call for different normalization methods to be used - "TMM" works fine for me and, is advocated by many in the field.

voom will output an object containing the normalized expression values in a log2 scale, which, also in my experience, has worked out just fine for calculating log fold changes.

Check out this link for more info on the package as well as normalization methods: https://www.bioconductor.org/packages/devel/workflows/vignettes/RNAseq123/inst/doc/limmaWorkflow.html It is a very thorough introduction to the package and all of its capabilities.

Good luck!


It's not a good idea to do tpm normalisation prior to differential expression analysis, because the actual read counts are useful to determine shot noise and statistical significance. DESeq2 includes read normalisation as part of its methods for differential expression analysis.

I think shot noise is best explained in terms of shooting photons at a target, as found on Wikipedia:

Shot noise exists because phenomena such as light and electric current consist of the movement of discrete (also called "quantized") 'packets'. Consider light—a stream of discrete photons—coming out of a laser pointer and hitting a wall to create a visible spot. The fundamental physical processes that govern light emission are such that these photons are emitted from the laser at random times; but the many billions of photons needed to create a spot are so many that the brightness, the number of photons per unit of time, varies only infinitesimally with time. However, if the laser brightness is reduced until only a handful of photons hit the wall every second, the relative fluctuations in number of photons, i.e., brightness, will be significant, just as when tossing a coin a few times. These fluctuations are shot noise.

Sequencing also has shot noise effects because the sequencing process is a random sampling method. For low-abundance targets, the likelihood of sampling a target is low, so the effect of a single hit is amplified. This reduces the statistical significance when comparing different low-abundance expression values, because the variation in expression is highly dependent on which targets won the sampling lottery. The shot noise variation / expression curve can be seen in Figure 7 of this paper.

  • $\begingroup$ I agree with TPM for a lot of reasons, unfortunately the data was already in TPM. Can you explain more about how read counts are useful to determine shot noise and statistical significance? Thanks $\endgroup$
    – gc5
    Commented Feb 28, 2019 at 22:17

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.