Glossary · Statistics, Artifacts and Pitfalls
False discovery rate (FDR)
The number that decides whether your "significant genes" list is mostly real or mostly noise dressed up as signal.
By Ming "Tommy" Tang, Director of Bioinformatics in Big Pharma · Updated 2026-09-13 · 3 min read
Also: false discovery rate, padj, adjusted p-value
Definition
False discovery rate (FDR) is the expected proportion of false positives among all the results you call significant: formally E(V/R), where V is the number of true nulls incorrectly rejected and R is the total number of rejections (FDR = 0 when R = 0). It answers a different question than a p-value does: a p-value gives the chance of seeing one gene's result under the null, while FDR describes what fraction of your entire significant gene list is expected to be wrong. In tools like DESeq2 and edgeR, the FDR-controlled value lives in the padj column, most often computed with the Benjamini-Hochberg (BH) procedure. BH is not the only way to estimate FDR, Storey's q-value is a related but mathematically distinct method, and the two get used interchangeably in lab conversation even though they aren't the same number.
You meet FDR the moment you open a DESeq2 or edgeR results table and see a padj column sitting next to pvalue. That column, not the raw p-value, is what decides which genes go into your volcano plot highlights, your pathway enrichment input, and the list you hand to the wet lab for qPCR validation.
The reason it exists: bulk RNA-seq and single-cell experiments test thousands of genes at once, not one. Screen 10,000 genes at a raw p < 0.05 cutoff with no correction and you get roughly 500 false positives before you've even looked at a fold change. FDR is the tool that keeps that number honest, and how you set its threshold decides whether your downstream candidate list is a handful of real hits or a pile of noise.
Why it matters
Get the threshold right and your candidate list is small enough to validate and mostly real. Set FDR at 0.05 and call 200 genes significant, and you're accepting that roughly 10 of them are false positives, that's the deal you're making, not a guarantee that all 200 are true. Tighten it to 0.01 and you cut false positives further, but you also lose real, smaller-effect genes, so the right threshold depends on whether you're running an exploratory screen or a confirmatory experiment.
Get it wrong in the other direction and you inherit method-specific failure modes. DESeq2's negative binomial model was built for the small designs common in early RNA-seq (2 vs 2, 3 vs 3 samples), and its FDR control can inflate on datasets with hundreds of samples, comparing TCGA LUAD vs LUSC, for instance, because its variance assumptions break down at that scale. On cohorts that large, a Wilcoxon rank-sum test or limma-voom holds up better and runs faster; sticking with DESeq2 out of habit there means your padj column is quietly less trustworthy than it looks.
Where people get it wrong
The mix-up that costs people the most: treating padj (a Benjamini-Hochberg FDR) and a q-value (Storey's pi0-based FDR estimate) as the same number. Both estimate FDR, both get called "the FDR" in casual talk, and DESeq2's default output even labels its BH-adjusted column padj, but Storey's q-value uses an estimated proportion of true nulls (pi0) and is less conservative when many genes really are differentially expressed, so a q-value cutoff and a BH padj cutoff on the same data will not select the same gene list. A second common mistake is filtering a results table on the raw pvalue column instead of padj because it happens to sit first in the output, that silently reintroduces the exact multiple-testing problem FDR correction exists to fix. A third: reading "FDR = 0.05" as "each gene has a 95% chance of being real," when it actually describes the expected error rate across the whole list, not a per-gene probability.
A concrete example
In a DESeq2 results table, filter on padj, not pvalue, it's already Benjamini-Hochberg corrected across every gene tested. You can reproduce the same correction by hand from raw p-values with base R's p.adjust(), which is useful when you need to re-derive FDR outside DESeq2 or check what a tool did under the hood.
res <- results(dds)
# padj is already BH-corrected; filter on this, not pvalue
sig_genes <- subset(res, padj < 0.05)
# Reproducing BH correction by hand from raw p-values:
raw_p <- res$pvalue
padj_manual <- p.adjust(raw_p, method = "BH")Related terms
Questions people ask
- What is FDR in bioinformatics?
FDR is the expected proportion of false positives among the results you call significant, not among all the tests you ran. In an RNA-seq experiment, if you call 200 genes significant at FDR 0.05, you're accepting that about 10 of those 200 are expected to be false discoveries.
- What's the difference between FDR and a p-value?
A p-value is about one test: the chance of seeing that gene's result if the null hypothesis were true. FDR is about your whole significant list at once: the expected fraction of that list that's wrong. Testing thousands of genes on raw p-values alone, with no FDR correction, is how you end up with hundreds of false positives hiding in your hit list.
- Is padj in DESeq2 the same thing as a q-value?
They're both FDR estimates but they're computed differently, so treat them as related, not identical. DESeq2's
padjis a Benjamini-Hochberg adjusted p-value; a q-value from Storey's method additionally estimates the proportion of true nulls (pi0), which usually makes it less conservative. A BH cutoff and a q-value cutoff on the same dataset can return different gene lists.- What FDR threshold should I use for RNA-seq?
0.05 is the most common default for screening differentially expressed genes, with 0.1 used for looser exploratory screens and 0.01 for stricter, more confirmatory lists. There's no universally correct number, pair whatever FDR cutoff you choose with a log2 fold change cutoff, since statistical significance and biological significance are not the same thing.
- Why not just use Bonferroni correction instead of FDR?
Bonferroni controls the chance of even one false positive across all tests, which for 10,000 genes means dividing 0.05 by 10,000, a bar so strict it buries real signal along with the noise. FDR methods like Benjamini-Hochberg are less conservative and more powerful for the same significance threshold, which is why RNA-seq tools default to BH and GWAS studies with millions of variants tend to be the main place Bonferroni still makes sense.
Related reading on the blog
Sources
- Understanding p value, multiple comparisons, FDR and q value — Supports the q-value definition and its relationship to FDR.
- Normalization, testing, and false discovery rate estimation for RNA-sequencing data — Supports the Benjamini-Hochberg procedure description and its power advantage over Bonferroni.
- Bioconductor Support: FDR, adjusted p-value, and Q-values — Supports the distinction between BH adjusted p-values and Storey's q-value.