This is a test version of Biostars. For the public version, visit https://www.biostars.org.
Tool: Run edgeR, limma, and clusterProfiler from Python - pandas in, pandas out

We kept running into the same problem: pipelines are in Python, but the stats we needed (edgeR, limma-voom, clusterProfiler) are in R. Writing rpy2 boilerplate for every analysis got old fast, so we built a wrapper library.

pip install rosetta-bioc

edgeR:

from rosetta import edger
results = edger(counts=counts_df, metadata=meta_df, design="~ condition")

limma-voom:

from rosetta import limma_voom
results = limma_voom(counts=counts_df, metadata=meta_df, design="~ batch + condition")

GO enrichment:

from rosetta import enrich_go
go = enrich_go(gene_list=sig_genes, org_db="org.Hs.eg.db")

These call the real R packages (not reimplementations) - results match what you'd get in an R console. Supports contrasts, LFC thresholds, shrinkage, multi-factor designs.

Requires R 4.0+ with the Bioconductor packages installed. MIT licensed. GSoC 2026.

Code: https://github.com/rosetta-bioc/rosetta

Happy to hear feedback or feature requests.

python enrichment edger limma deseq2

This approach is amazing and maybe it is the dawn of a paradigm shift. Why can't we run an already implemented functionality that works in one programming language in any other language ... that used to look impossible but slowly the times are changing.

Python may be the English language of programming.

Thank you so much for your comment, it means the world to me!

1 answer

For the edgeR QL pipeline, I suggest you get the full benefit of the edgeR v4 speed and functionality by skipping out the:

dge = edger_pkg.estimateDisp(dge, r_design_matrix)

step from your wrapper code. estimateDisp() is by far most time consuming step, and is used only for diagnostic plots in the edgeR v4 QL pipeline.

Omitting estimateDisp() does require a recent version of R that supports edgeR v4, such as 4.5 or 4.6.

For the limma-voom pipeline, I suggest you use the latest version with enhancements, which is called by voomLmFit rather than voom and lmFit.

Done - skipped estimateDisp() for the QL pipeline and switched to voomLmFit(). Thank you for the guidance. Updated in 81fb89e

Log in to answer this question.