I am trying to access the normalized expression in both edgeR and DESeq2, yet the results are different. Does anyone know why?

How to get normalized expression using edgeR:

y <- DGEList(...)
y <- calcNormFactors(y, method = "TMM")
v <- voom(y, design, plot=FALSE)

# normalized expression

How to get normalized expression using DESeq2:

dds <- DESeqDataSetFromMatrix(...)
dds <- estimateSizeFactors(dds)

# normalized expression
normalized_counts <- counts(dds, normalized = TRUE)

Anyone know why the results are different? Aren't they both doing a version of log(cpm) under the hood? Or am I not comparing the right results from DESeq2?


1 Answer 1


First, and most obviously, two independent methods will never fully agree.

Second, while the DESeq2-related code in fact gets the normalized counts based on the size factors the edgeR/voom code extract the voom-transformed counts, but that is not the normalized counts itself. I would need to go back to the limma docs and paper to check what exactly the E slot stores, but I think (please edit for a definite answer) it's normalized counts after the voom transformation. In contrast, the edgeR normalized counts in the sense of what woul be most comparable to the DESeq2 normalized counts would be obtained with the edgeR::cpm() function. Check the manual. At no point of either the limma or edgeR manual it says that v$E should be used for anything outside of the linear modelling. It clearly recommends to use cpm(). Limma and edgeR are packages that have hundreds of forum questions and blog entries, many functions do exist and the packages change over time, so indeed it can be confusing what to do, but therefore I strongly recommend to consult the current manual at Bioconductor as the sole reliable reference on how to get values from the objects and how to run your analysis.

By the way, don't be surprised that the DESeq2 and edgeR normalized counts will be on different scales. DESeq2 gets the counts by dividing the raw counts by the size factors while edgeR first calculates naive per-million counts and then corrects these with the TMM factors calculated by calcNormFactors, so the magnitude of the counts can be quite different, simply by how it is calculated.


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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