Comparison · differential expression
DESeq2 vs edgeR: Which One Should You Use?
Same negative-binomial model family, different normalization and dispersion philosophy, and that difference decides which one protects you when replicate numbers are small.
By Ming "Tommy" Tang, Director of Bioinformatics in Big Pharma · Updated 2026-09-13 · 4 min read
The verdict
Default to DESeq2 for the RNA-seq experiment most readers of this site actually run: small-to-moderate replicate counts, a straightforward two- or few-group comparison. It's the tool named as the recommended default for typical studies, it ships lfcShrink()/apeglm for stable fold-change estimates you can actually rank and plot, and if your counts came through Salmon or kallisto and tximport, it's the best-documented path from quantification to results table.
Switch to edgeR when FDR control itself is the constraint, not just getting a result: very small replicate numbers where you need the quasi-likelihood F-test's explicit handling of dispersion uncertainty, complex multi-factor designs, datasets dominated by low-count or near-zero genes (edgeR v4's bias-adjusted deviances target exactly that), or fractional/probabilistic counts that DESeq2 doesn't model natively. Neither tool is the right answer for a large cohort, hundreds of samples per group is where DESeq2's FDR is documented to inflate, and the fix in the source material is Wilcoxon or limma-voom, not edgeR by default. Don't let "the other DE tool" be your answer to a large-n problem without checking that it actually holds up there too.
Both tools fit the same class of model, a negative binomial GLM on raw counts, so the marketing difference ("which is more accurate") is mostly noise. The real difference is upstream and downstream of the model. DESeq2 normalizes with median-of-ratios (RLE): it computes a size factor per sample from the median of gene-wise count ratios to a pseudo-reference, correcting for library size and RNA composition in one step. edgeR normalizes with TMM: it computes a normalization factor from a trimmed set of log fold-change ratios between each sample and a reference, then applies that on top of library size. Both are considered current standard practice for composition-bias correction, not one legacy and one modern.
The bigger source of divergence is dispersion estimation, not normalization. DESeq2 takes the maximum of a gene's individual dispersion estimate and the fitted mean-dispersion trend, a conservative choice that protects against underestimating variance for any single gene. edgeR instead moderates (shrinks) the gene-wise estimate toward the trend. Those are two different bias/variance tradeoffs applied to the same data, and they alone explain most of the gene-list mismatch you'll see between the tools on identical counts.
Testing framework is the third difference. DESeq2 runs a Wald test (or LRT for multi-level factors) on the fitted coefficient. edgeR runs a quasi-likelihood F-test, which explicitly folds in uncertainty about the dispersion estimate itself, rather than treating it as known. That's why edgeR is the one named specifically for situations where FDR control has to hold up with very few replicates.
Head to head
| Criterion | DESeq2 | edgeR | Edge |
|---|---|---|---|
| Normalization method | Median-of-ratios (RLE): computes a per-sample size factor from the median of gene-wise count ratios to a reference, correcting for library size and RNA composition (DESeq2::estimateSizeFactors). | TMM (Trimmed Mean of M-values): computes a normalization factor per sample from trimmed log fold-change ratios against a reference sample, applied on top of library size (edgeR::calcNormFactors). | Tie Lesson 124 treats both as the current standard for composition-bias correction, not one obsolete and one modern. |
| Dispersion estimation | Takes the maximum of the gene-wise dispersion estimate and the fitted mean-dispersion trend, which guards against underestimating variance for individual genes. | Moderates (shrinks) the gene-wise dispersion estimate toward the fitted trend, a different bias/variance tradeoff. | Tie This, not normalization, is the documented primary source of divergent DE calls between the two tools. |
| Statistical test | Wald test on the GLM coefficient (or a likelihood ratio test for multi-level factors). | Quasi-likelihood F-test, which explicitly models uncertainty in the genewise dispersion estimate. | edgeR The QL F-test is documented to be more conservative and to maintain better FDR control. |
| Default for typical small-to-moderate bulk RNA-seq | Named as the recommended default for typical studies; ships with automatic independent filtering and LFC shrinkage as part of the standard workflow. | Works for this case too, but is not the one singled out as the default in the typical scenario. | DESeq2 |
| FDR control when replicate numbers are very small or the design is complex | Wald test does not explicitly model uncertainty in the dispersion estimate itself. | Quasi-likelihood F-tests are purpose-built to keep FDR calibrated when few replicates make dispersion estimation noisy. | edgeR |
| Behavior on large cohorts (hundreds of samples per group) | Documented FDR inflation at this scale (e.g., TCGA LUAD vs LUSC) because negative-binomial assumptions break down; shown in a 2022 Genome Biology benchmark. | Not documented in the sources used here as sharing this failure mode, but also not confirmed as a safe substitute at this scale. | Tie The actual fix recommended in the source material is neither tool: switch to a Wilcoxon rank-sum test or limma-voom for hundreds of samples. |
| Fold-change shrinkage | Built-in adaptive shrinkage via apeglm (lfcShrink(), default since v1.28.0), giving stable log fold-change estimates for low-count genes, useful for ranking and volcano plots. | No equivalent built-in shrinkage workflow described in the sources used here. | DESeq2 |
| Outlier handling | Cook's distance filtering (cooksCutoff) flags and can exclude single-sample outliers on a per-gene basis. | Robust dispersion estimation (estimateGLMRobustDisp) down-weights outliers when fitting dispersion. | Tie |
| Low-count and near-zero genes | No dedicated low-count correction beyond independent filtering, which removes rather than corrects low-count genes. | edgeR v4 (October 2023) adds bias-adjusted deviances that specifically improve quasi-dispersion estimates for genes with average counts below 1. | edgeR |
| Fractional or probabilistically-assigned counts | Expects integer counts; fractional counts from probabilistic read assignment are not natively modeled. | edgeR v4 introduced a continuous generalization of the negative binomial that handles fractional counts directly. | edgeR |
| Speed at large scale | No runtime benchmark figure for large cohorts is given in the sources used here. | edgeR v4's revised quasi-likelihood pipeline processes 1,000 samples by 10,000 genes in about 30 seconds on a laptop. | edgeR |
Use DESeq2 when
- You're running a typical bulk RNA-seq experiment with small-to-moderate replicate counts (2 vs 2, 3 vs 3, up to maybe 10 per group), the exact design point DESeq2 was built around.
- You need shrunken log fold changes for ranking genes or building volcano/MA plots that don't have exploding LFCs from low-count, noisy genes, run lfcShrink() with type='apeglm'.
- Your pipeline already reads Salmon or kallisto quantifications through tximport and you want the most widely documented, tutorial-heavy path from counts to results.
- You want automatic independent filtering to remove genes that can't realistically reach significance, buying back power on the multiple-testing correction for the genes that remain.
Use edgeR when
- FDR control is the top priority and your replicate number per group is small, the quasi-likelihood F-test is built to stay calibrated exactly in that situation.
- Your design is complex: multiple factors, batch terms, and continuous covariates, where you want a GLM framework field-tested for that flexibility.
- You're analyzing a large cohort (hundreds of samples) and have already ruled out Wilcoxon or limma-voom, edgeR at least doesn't share DESeq2's documented FDR-inflation problem at that scale, though it hasn't been shown to be the ideal fix either.
- Your data has many low-count or near-zero genes; edgeR v4's bias-adjusted deviances specifically target genes with average counts below 1.
- You're working with fractional or probabilistically-assigned counts from a quantifier that outputs non-integer values, edgeR v4 added a continuous NB model for exactly this case.
- Runtime at scale matters: edgeR v4's quasi-likelihood pipeline handles 1,000 samples by 10,000 genes in roughly 30 seconds on a laptop.
Switching between them
Switching direction matters more than people expect. DESeq2 stores everything in a DESeqDataSet (built from DESeqDataSetFromMatrix), edgeR in a DGEList, you rebuild the object, you don't convert it in place. Size factors and TMM factors are not the same numbers and aren't interchangeable; don't copy DESeq2's normalized counts into an edgeR workflow or vice versa, recompute normalization natively in each tool.
Significance thresholds don't transfer either. Because dispersion estimation differs (DESeq2 takes the max of gene-wise and trend estimates, edgeR moderates toward the trend), the same FDR cutoff selects a different gene set in each tool, expect roughly 70-80% concordance, not identity. DESeq2's default independent filtering removes low-count genes from the results table entirely, changing both the gene count and the effective multiple-testing burden; if you're trying to compare the two tools on the same data, set independentFiltering=FALSE in DESeq2 and apply identical pre-filtering to both. Neither tool works without biological replicates, so that requirement doesn't change when you migrate.
Pitfalls with either
- Copying a p-value or FDR cutoff straight from a DESeq2 run into an edgeR run (or vice versa) and expecting the same gene list. Fix: re-tune the threshold per tool and check the actual overlap instead of assuming the numbers mean the same thing.
- Running DESeq2 on a TCGA-scale cohort with default settings and trusting the reported FDR. Fix: for hundreds of samples per group, switch to a Wilcoxon rank-sum test or limma-voom, per the 2022 Genome Biology benchmark showing DESeq2's FDR inflation at scale.
- Attempting differential expression with one sample per condition because the experiment already ran that way. Fix: neither DESeq2 nor edgeR can estimate dispersion without biological replicates, get replicates before you run anything, not after.
- Comparing DESeq2 and edgeR gene lists without matching filtering settings, then treating the mismatch as a tool bug. Fix: set `independentFiltering=FALSE` in DESeq2 and apply the same pre-filtering threshold to both tools before comparing.
- Using DESeq2's raw, unshrunken `log2FoldChange` column for ranking genes or building a volcano plot. Fix: run `lfcShrink()` with `type='apeglm'` and use the shrunken estimate for ranking and visualization; keep the raw LFC for the Wald test itself.
Questions people ask
- Does DESeq2 or edgeR call more genes significant?
In comparative studies reported on the Bioconductor support forum, edgeR tends to be more liberal (more significant genes) while DESeq2 tends to be more conservative. That pattern isn't guaranteed on every dataset, it depends on your count distribution and design, so treat it as a tendency to check for, not a rule to assume.
- Why do DESeq2 and edgeR give different results on the same counts?
Three things differ: normalization (median-of-ratios vs TMM), dispersion estimation (DESeq2 takes the max of gene-wise and trend estimates, edgeR moderates toward the trend), and the test itself (Wald vs quasi-likelihood F-test). Expect roughly 70-80% concordance between the two, not identical gene lists.
- Can I use DESeq2 on a large cohort like TCGA with hundreds of samples per group?
Not as a default. A 2022 Genome Biology study documents inflated FDR in DESeq2 at that scale because its negative-binomial assumptions break down. For large cohorts, a Wilcoxon rank-sum test or limma-voom is the recommended alternative.
- Do I need replicates for edgeR the same way I do for DESeq2?
Yes. Both tools model biological variation to estimate dispersion, and without replicates there's no variation to model. Single-sample-per-condition data cannot produce a valid differential expression result in either tool.
- Which tool is faster on large data?
edgeR v4 has a published benchmark: about 30 seconds for 1,000 samples by 10,000 genes on a laptop using its revised quasi-likelihood pipeline. There's no equivalent published DESeq2 runtime figure in the sources checked for this comparison, so a direct speed claim for DESeq2 at that scale isn't something to assert without benchmarking it yourself.
Related pages
Related reading on the blog
Sources
- Analyzing RNA-seq data with DESeq2 — Independent filtering default and apeglm shrinkage since v1.28.0
- edgeR Users Guide — TMM normalization, quasi-likelihood F-tests, support for complex designs
- edgeR v4: powerful differential analysis of sequencing data — v4 bias-adjusted deviances, fractional counts, and the 1000-sample speed benchmark
- DESeq2 and edgeR getting very different results — Wald vs QL F-test, liberal-vs-conservative tendency, independentFiltering=FALSE for comparability
- Differential expression analysis: comparison of DESeq2 and edgeR robust results — Dispersion estimation and outlier-handling differences between the tools
- Benchmark study on FDR inflation in large datasets — 2022 study behind the DESeq2 large-cohort FDR inflation claim