Interpret GO Enrichment: FDR & Background
11 min read · Updated September 11, 2026
A GO enrichment table does not prove that a pathway is active. It asks a narrower question: among the genes that could have been selected, does the submitted list contain more genes annotated to a term than expected by chance? The answer depends as much on the background universe and list-selection rule as on the overlap itself.
This guide explains over-representation analysis, the hypergeometric p-value, Benjamini–Hochberg FDR, fold enrichment and GO hierarchy. A five-gene DNA-repair example shows why a tiny q-value can be arithmetically correct while still reflecting a deliberately chosen demonstration rather than an independent discovery.
First identify the analysis: ORA is not GSEA
Over-representation analysis, or ORA, takes a discrete query set: selected versus not selected. It tests whether annotated genes occur unusually often in that set compared with a background. The magnitude and rank of every gene outside the selected set are discarded.
Gene set enrichment analysis, or GSEA, starts from a ranked list such as a statistic for every tested gene and asks whether members of a set accumulate toward one end. It can detect coordinated modest shifts that never pass a hard differential-expression cutoff. ORA cannot recover information removed by that cutoff.
Use ORA when the list itself is the object of interest, such as genes from a screen, a curated hit list or variants passing a defined filter. Use a ranked method when the full ordered signal is scientifically meaningful. Calling either output simply “pathway analysis” hides the selection assumptions.
The background universe defines the null question
The background should contain genes that could realistically have entered the query list. For RNA-seq, that is usually the genes tested after the analysis's expression and quality filters, not every human gene. For an affinity-purification experiment, it may be proteins detectable by that workflow. For a targeted panel, it is the panel, not the genome.
Using the whole genome when only 5,000 genes were measurable treats 15,000 impossible selections as available outcomes. Terms associated with highly detectable genes can then look enriched because of assay design rather than biology. A custom background is not an optional cosmetic setting; it changes N, term sizes, expected overlaps, p-values and fold enrichment together.
When no experiment-specific universe is supplied, SeqBench defaults to every human gene present in its bundled GO plus Reactome data. That “annotated genes” universe is a reproducible generic fallback, not a substitute for the actual tested set.
Four counts determine each hypergeometric test
Let N be the number of genes in the background, K the number of background genes annotated to the term, n the number of matched query genes, and k the overlap between the query and the term. All four counts must come from the same universe after identifier matching and deduplication.
The expected overlap under random sampling is n × K/N. The one-sided hypergeometric p-value is the probability of observing k or more term genes in a random query of size n drawn without replacement from N. It measures over-representation; it is not a test for depletion unless a separate lower-tail analysis is performed.
A p-value is conditional on the list and universe. It is not the probability that the term is true, the fraction of false genes in the overlap, or an effect size.
Fold enrichment is the effect size, but overlap gives it scale
Fold enrichment equals (k/n) divided by (K/N): the observed fraction of query genes in the term divided by the background fraction. A value of 2 means the term occupies twice as much of the query as expected from the background.
Very small terms can produce spectacular fold enrichment from one or two genes. A 100× result with one overlapping gene may be less persuasive and less stable than a 3× result supported by forty genes. Always read fold enrichment beside k, n, K and the actual overlap-gene names.
Fold enrichment below 1 describes depletion relative to the background, but a one-sided over-representation p-value should not be interpreted as evidence for that depletion. The direction of the statistical test and the direction of the effect must agree.
Use the BH-adjusted q-value for a table of many terms
Testing hundreds or thousands of terms creates small raw p-values by chance. The Benjamini–Hochberg procedure sorts the p-values and adjusts them to control the expected false discovery rate among rejected hypotheses under its assumptions. The resulting q-value is the field normally used to apply an FDR threshold.
A q-value of 0.04 does not mean there is a 4% chance that this individual term is false. It means the rejection procedure is calibrated so that, across the called set, the expected false-discovery proportion is controlled around the chosen level under the model and dependence conditions.
The correction family must match the analysis. SeqBench applies BH once across the terms it tests from all selected GO namespaces and Reactome collections, after the term-size window and at-least-one-overlap filter. Selecting fewer collections or changing the term-size bounds changes the tested family and therefore the q-values.
That overlap filter depends on the observed query: size-eligible terms with zero overlap and p = 1 are excluded before adjustment. SeqBench's q-values are therefore BH adjustments within the overlap-filtered result set; they do not by themselves establish FDR control across every size-eligible GO and Reactome hypothesis.
The original procedure is Benjamini and Hochberg (J R Stat Soc B 1995;57:289–300, doi:10.1111/j.2517-6161.1995.tb02031.x). “FDR corrected” is incomplete reporting unless the method and the family of hypotheses corrected together are also stated.
Identifier handling changes the effective list size
Duplicates do not provide independent evidence and should be collapsed. SeqBench compares submitted symbols case-insensitively, deduplicates them, counts in n only query symbols present in the selected background and lists inputs absent from that background as unmatched. With a custom background, presence there does not prove that a symbol has any bundled term annotation.
A large unmatched fraction is a warning about species, identifier type, outdated aliases or parsing. Converting Ensembl, Entrez or UniProt IDs to current symbols before analysis is safer than silently dropping them. Preserve one-to-many mappings and decide how duplicates should be handled rather than selecting an arbitrary target.
The same rule applies to the background. A query gene absent from the custom universe cannot be sampled under that null and is excluded. If this happens because the background was assembled incorrectly, fix the universe rather than interpreting the smaller list.
GO hierarchy creates related significant terms
Gene Ontology is a directed acyclic graph, not a flat list. A specific term has broader ancestors, and annotations propagate upward under the true-path rule. Genes annotated to a specific homologous-recombination process therefore also contribute to broader DNA-repair and cellular-process terms.
Several significant parent and child rows usually reflect one biological signal viewed at several resolutions, not independent pathways. Group terms by shared overlap genes and ancestry, then choose a representative level that is specific enough to be informative without resting on one fragile annotation.
SeqBench's bundled GO gene sets are propagated through is_a and part_of ancestors and deduplicated. Reactome also contains nested pathway levels. Ranking the first ten rows without grouping can repeat the same gene module ten times.
Worked example: five deliberately chosen repair genes
The built-in example contains BRCA1, BRCA2, RAD51, PALB2 and BARD1. In the current bundled data all five match a 19,693-gene annotated background. With the default 3–500 term-size window and all four collections selected, 307 terms with at least one overlap are tested.
For GO:0006281 “DNA repair,” K = 436 background genes and k = 5 of n = 5 query genes. The expected overlap is 5 × 436/19,693 = 0.111. Fold enrichment is (5/5)/(436/19,693) = 45.17×. The one-sided p-value is 5.20e-9 and the BH q-value is 5.32e-8 in this data snapshot.
Those numbers are internally coherent, and the five overlap names support the label. They are not an independent discovery: the example genes were intentionally selected because they are known DNA-repair genes. Enrichment quantifies that construction against the background; it does not validate the list-selection process.
The top rows also include narrower Reactome disease and repair pathways with the same five genes and much larger fold values because their K is smaller. Reading the hierarchy and overlap reveals one concentrated repair module rather than dozens of unrelated findings. Monthly database updates can change term membership, N and the exact statistics.
Term-size filters trade breadth for specificity
Tiny terms can be unstable and dominated by one annotation; enormous terms can be statistically significant but biologically vague. A minimum and maximum term size define which hypotheses enter the analysis. SeqBench defaults to 3–500 genes after restricting each term to the chosen background.
There is no universally correct window. Change it for a scientific reason and report it. Tightening the window after seeing which setting produces the desired term is selective analysis, and because it changes the BH family it can move q-values even for rows that remain.
A sensitivity check across plausible backgrounds and term windows is often more informative than quoting extra decimal places. A robust theme should retain related terms and core overlap genes under defensible alternatives.
Interpret the overlap before writing the conclusion
- Confirm the organism, identifiers, matched query size and unmatched genes.
- Verify that the background represents genes that could have been selected by the experiment.
- Read q-value, fold enrichment, overlap count and term size together.
- Inspect the actual overlap genes for one multifunctional driver or circular selection criteria.
- Group parent, child and sibling terms that share the same genes.
- Compare the result under plausible background and term-size choices.
- Describe the result as over-representation in the submitted list, then seek independent expression, functional or perturbation evidence before claiming pathway activity.
Know the data and method boundaries
SeqBench currently analyzes human gene symbols against bundled Gene Ontology and Reactome data. It does not include KEGG, and it does not perform ranked GSEA. GO annotations are propagated to ancestors; Reactome pathway mappings include hierarchy levels.
Annotations are incomplete and uneven across genes. Well-studied genes have more terms, and absence from a term is not proof that a gene lacks that role. Database releases also change. Preserve the release or analysis date and avoid treating one tool's exact q-value as a permanent property of a gene list.
ORA tests annotation concentration. It does not model gene–gene dependence, pathway topology, effect direction, fold change, cell composition or causal pathway activation. Those require the original measurements and methods designed for the relevant question.
Frequently asked questions
What does a GO enrichment p-value mean?
It is the probability, under random sampling from the stated background, of observing at least as many genes annotated to that term as the query contains. It is not the probability that the term is biologically true and not an effect size.
Should I report the p-value or the FDR-adjusted q-value?
Report the adjusted q-value together with the raw p-value, effect size and overlap. SeqBench adjusts only terms with at least one observed overlap, so its q-values rank that displayed family but do not establish FDR control across every size-eligible hypothesis. Report that filter, the selected collections and term-size bounds; recompute over the full planned family if that broader FDR claim is required.
What background should I use for GO enrichment?
Use genes that could realistically have entered the query: all genes tested after filtering for an RNA-seq analysis, all detectable proteins for a proteomics workflow, or all genes on a targeted panel. A whole-genome or annotated-gene default is only a generic fallback.
What does fold enrichment mean?
It is (overlap/query size) divided by (term size/background size). A value of 2 means the term's gene fraction is twice as high in the query as in the background. Interpret it with the overlap count because tiny terms can produce large folds from one or two genes.
Why are many similar GO terms significant?
GO is hierarchical, and annotations propagate from specific terms to broader ancestors. Parent and child terms therefore share genes. Group rows by ancestry and overlap rather than counting each significant term as an independent pathway.
Why were some of my genes unmatched?
Common causes are non-human genes, Ensembl or Entrez IDs supplied where symbols are expected, obsolete aliases, spreadsheet corruption and genes absent from the custom background. Map identifiers explicitly and inspect one-to-many cases before rerunning.
Is GO over-representation analysis the same as GSEA?
No. ORA tests a selected gene set and discards the ranking of all other genes. GSEA uses a ranked full list and can detect coordinated shifts below a hard cutoff. Choose based on the data and question, not on which method returns more significant terms.
Does a significant GO term prove that a pathway is activated?
No. It shows that annotations to the term are over-represented in the submitted list under the chosen universe. It does not use effect direction, pathway topology or causal measurements. Check the overlap and original data, then validate activity with independent evidence.
Related tools
Test a gene list for enriched GO terms and Reactome pathways with hypergeometric p-values and BH-FDR correction.
Convert gene symbols, Ensembl, Entrez GeneID, RefSeq and UniProt accessions in batch, and find cross-species orthologs.
Plot log2 fold-change vs. significance from a DESeq2/edgeR/limma table, with draggable thresholds.
Cluster and visualize a gene x sample expression matrix with row/column dendrograms.