limma::voom vs edgeR::voomLmFit - when to use?
1
0
Entering edit mode
@78889942
Last seen 18 months ago
Switzerland

I am currently learning to do differential expression analysis on bulk and pseudobulk RNAseq data with limma::voom. In the function documentation it says

Note that edgeR::voomLmFit is now recommended over voom for sparse counts with a medium to high proportion of zeros.

However, edgeR::voomLmFit does not seem to be very often used by the community (yet?), is not included in the standard limma tutorials, and is not an option in the pseudo-bulk differential state analysis function of the muscat package (muscat::pbDS), which makes me a bit hesitant.

Is there a specific reason to not use voomLmFit at least if the data is sparse, if not always, instead of limma::voom + limma::lmFit? The paper and the documentation don't mention any downsides.

edgeR limma voom RNASeq muscat • 4.5k views
ADD COMMENT
6
Entering edit mode
@james-w-macdonald-5106
Last seen 4 days ago
United States

The workflow you reference was written in 2018, and hasn't been updated since 2020, except for version bumps (it's meant to parallel an F1000 paper). So I wouldn't take that as an indication of how many people use the function.

I use voomLmFit all the time. I actually can't remember the last time I used the canonical voom/lmFit pipeline. In the case where you don't have many zeros, don't want to fit a gls (e.g., use duplicateCorrelation), and don't want to include sample weights, I think it's identical to the usual limma-voom pipeline.

But in cases where you do have a high proportion of zeros it more accurately estimates the residual df. And if you want to fit a gls, or you do want to include sample weights, it's analogous to doing a bunch of extra work that you won't have to do instead. Because it's no different from limma-voom in some cases, and better in others, it's easier to just default to voomLmFit.

You should also not worry if other packages are not yet using it. Both edgeR and limma are actively updated, likely at a rate that is far higher than most if not all other Bioconductor packages. The canonical limma-voom pipeline still works, and will likely continue to work far into the future, and unless something actively breaks a package it's not super likely that the maintainer will want to go back and make changes.

ADD COMMENT
5
Entering edit mode

Reitering James' answer, there is no reason not to use voomLmFit if you were planning to follow voom by lmFit. The reason why voomLmFit isn't more widely used is because it is relatively new, because we haven't yet publicized it in a publication and because it is in the edgeR package rather than limma and therefore a bit hidden. The muscat package and the limma tutorials were all written before voomLmFit existed.

ADD REPLY
0
Entering edit mode

Just wondering--why was this function put into edgeR rather than limma? Maybe a bit technical, but it is a little confusing from an outside perspective. Also wondering why it isn't mentioned in the edgeR v4 publication in Nucleic Acids Research (I suppose because it's more part of the limma workflow than edgeR?)

ADD REPLY
1
Entering edit mode

voomLmFit() is in edgeR instead of limma because it needs to call edgeR::glmFit() internally to determine which of the zero observations also correspond to zero fitted values. If we put the function in limma with an import of glmFit(), then it would make limma dependent on edgeR, meaning that everyone who used limma for any purpose would have to install edgeR as well. I have always tried to keep the limma load as lightweight as possible, so that people installing it for a particular purpose don't have to install lots of dependencies unrelated to their application.

An alternative strategy would have been to put voomLmFit() in limma but with an internal check and load of edgeR::glmFit availability, which would make edgeR a suggested package for limma. I am still seriously considering doing it that way. In this approach, the voomLmFit() function would do the load of edgeR::glmFit() itself, and would give an error message if edgeR was not an installed package. (limma used to treat the statmod package in this way, although I converted that to a preemptive import a few years ago.)

voomLmFit() is not mentioned in the edgeR v4 paper because it is not part of any edgeR pipeline.

See also this paper, which is the first to voomLmFit explicitly: https://www.biorxiv.org/content/10.1101/2025.04.07.647659v1

ADD REPLY
0
Entering edit mode

Thank you for the context and the preprint!

ADD REPLY

Login before adding your answer.

Traffic: 1360 users visited in the last hour
Help About
FAQ
Access RSS
API
Stats

Use of this site constitutes acceptance of our User Agreement and Privacy Policy.

Powered by the version 2.3.6