How many RNA-seq replicates does a result need?

A reproduction of the subsampling experiment in Degen & Medo (2025, PLOS Computational Biology) on one of its data sets: TCGA breast tumours, Basal vs Luminal A, 126 vs 126 samples. Random small cohorts are drawn from the full data, analysed, and compared with each other and with the full-data result.

Figure gallery →

–

Reproduction vs the paper

Median values for this data set at the primary setting (|log2FC| > 1, 5 % FDR). "Published" is the authors' table; "Reproduction" is PyDESeq2 on 10 random cohorts per size, with precision and recall measured against the authors' full-data DESeq2 result.

Reference for precision and recall

Table view

Which genes get found?

Each dot is one gene called differentially expressed in the full data (|log2FC| > 1, 5 % FDR; genes). Height is the share of 100 random cohorts of the chosen size that also called it, using the fast engine. Small cohorts mostly find only the genes with the very largest fold changes.

The same measure across the paper's 18 data sets

Median replicability reported in the authors' results table (their repository), sorted. The marked row is the data set reproduced here; dots show this reproduction's estimates.

Cohort size
Table view

How much do results vary from cohort to cohort?

The same 100 random cohorts per size as above, one dot each. Boxes show the median, quartiles and whiskers (1.5 x IQR); violins show the shape of the spread with the median (white dot) and quartiles (black bar). Replicability uses every cohort pair (4,950 per size), with 100 random pairs drawn as dots. Fast engine (blue), primary setting. Orange squares are the 10 PyDESeq2 cohorts per size that were run (sizes 3, 5, 7, 10, 15 only).

Plot

Table view

The tumours themselves

All 252 samples projected from their 2,000 most variable genes (PCA to 50 components, then t-SNE and UMAP on those components). Basal and Luminal A tumours separate cleanly. PCA axes are in standardised log2 CPM units (z-scored expression summed over genes). t-SNE and UMAP coordinates are arbitrary units: they come from an optimisation that preserves neighbourhoods, not distances, so they have no physical scale and only relative position within a panel means anything. Gaps and cluster sizes should not be read quantitatively. Optionally overlay one of the random cohorts used above to see how a small study samples the population.

Projection
Colour by

Single genes: what a large effect looks like

The 40 reference genes with the largest standardised effect (full-data log2FC divided by its standard error), expression as log2 counts per million, one dot per tumour (126 per group). Names are HGNC gene symbols (Ensembl ID where no symbol exists); zero-count samples sit at the bottom of a panel.

Plot
Table view

Question

When a differential-expression study has few replicates, how much of what it reports would another study of the same size find again, and how much of the full truth does it recover? Degen & Medo (2025) answer this by repeatedly drawing small random cohorts from large RNA-seq data sets. This site reproduces that design on one of their data sets.

Methodology: what was actually done

Findings

Detailed results tables

Primary setting: |log2FC| > 1, 5 % FDR. Precision/recall vs authors' full-data DESeq2 unless noted.

Table 1 — Fast engine, 100 cohorts per size (medians)
NMedian genesNo callsPrecisionRecallReplicabilityRank agreement
3064 %0.860.000.000.61
4147 %1.000.000.000.72
52221 %0.960.010.020.75
6544 %0.960.030.130.80
7961 %0.960.050.210.82
81280 %0.950.060.240.84
91750 %0.950.080.280.85
102000 %0.950.090.320.86
123220 %0.950.150.370.89
154440 %0.950.210.440.91
Table 2 — PyDESeq2 anchor vs fast engine, same cohorts
NCohortsPyDESeq2 genesPyDESeq2 prec.PyDESeq2 rec.PyDESeq2 repl.Fast repl.
3104230.710.140.140.00
5103650.840.150.200.02
7105190.860.220.290.25
10104650.910.210.330.33
15107780.910.350.410.43
Table 3 — Authors' published values (row BSLA)
NPrecisionRecallReplicabilityRank agreement (mean)
50.840.140.190.59
100.900.250.300.73
Table 4 — Threshold sensitivity at N = 10 (fast engine, own reference)
FC thresholdFDRRef genesMedian calledPrecisionRecallReplicability
none1 %1214611001.000.090.30
none5 %1349826480.990.190.35
|log2FC| > 0.51 %43322761.000.060.29
|log2FC| > 0.55 %49286000.990.120.32
|log2FC| > 1.01 %16301021.000.060.28
|log2FC| > 1.05 %18522001.000.110.32

How well do the engines agree with the authors?

R is not available in the environment this was built in, so the paper's DESeq2 and edgeR could not be run. Two stand-ins were used, and both were checked against results the authors published in their repository.

What this does and does not show

Practical reading

For a study of this kind (a heterogeneous tumour comparison), 5 to 10 replicates per group yields gene lists that are mostly correct but cover only about a fifth to a quarter of the full signal, and a repeat study would find only about a fifth to a third of the same genes. The paper's bootstrap tool (pdegen/BootstrapSeq) is the authors' suggested way to estimate this for your own small data set.

Reproduce it

pip install numpy pandas scipy pyyaml pydeseq2
python workflow/run_sweep.py config/config.yaml           # ~1 min: 1,000 cohorts
python workflow/pydeseq2_crosscheck.py config/config.yaml --sizes 3 5 7 10 15 --k 10   # hours; resumable
python workflow/validate_engine.py config/config.yaml
python workflow/build_dashboard.py config/config.yaml     # writes docs/index.html