OMICSDESKbioinformatics, delivered

scRNA-seq QC thresholds: what to actually use, and how to defend them

Why fixed cut-offs like "<5% mitochondrial" fail on some tissues, how to set data-driven thresholds, and what to report so reviewers stop asking.

Updated 2026-07-31

Every tutorial uses the same three filters: at least 200 genes per cell, fewer than 2,500 genes per cell, and under 5% mitochondrial reads. They are a reasonable starting point for PBMCs. They are wrong often enough elsewhere that copying them blindly is one of the most common causes of a rejected analysis.

Why fixed cut-offs fail

The mitochondrial fraction is tissue-dependent. Cardiomyocytes, hepatocytes, and skeletal muscle are packed with mitochondria; healthy cells there can sit at 20–40%. Apply a 5% filter and you delete your cell type of interest, then report that it is rare. In the other direction, gently dissociated lymphocytes can look fine at 2% while being stressed in ways the mitochondrial fraction does not capture.

The upper gene count is meant to catch doublets, but a plasma cell or a megakaryocyte legitimately expresses far more genes than a resting T cell. A single global ceiling systematically removes large, transcriptionally active cells.

What to do instead

Set thresholds per sample, from the data. Compute the median absolute deviation of each QC metric within each sample and exclude cells beyond three MADs. This adapts to tissue and to run quality, and it is straightforward to justify because it is a stated rule rather than a taste.

Handle doublets with a doublet detector, not a gene ceiling. Tools such as scDblFinder, DoubletFinder or Scrublet model the expected doublet rate from cell loading and score each barcode. Expect roughly 0.8% doublets per 1,000 cells loaded on droplet platforms — 10,000 cells means about 8% doublets, which is far too many to leave in.

Treat ambient RNA separately. High mitochondrial content and a "background" signature are different problems. SoupX or CellBender estimate and remove ambient contamination; this matters most in tissues with fragile cells, where free RNA leaks into every droplet and makes every cluster look slightly like the most abundant cell type.

Look at the joint distribution. Plot mitochondrial fraction against UMI count. Dying cells sit in a characteristic corner: low counts, high mitochondrial. Big healthy cells sit at high counts, moderate mitochondrial. A single-axis filter cannot separate them; a two-dimensional look often can.

The order of operations matters

Remove empty droplets first (they are not cells), then ambient RNA, then doublets, then low-quality cells. Running doublet detection after aggressive filtering distorts the model's expectation of what a doublet looks like, because you have already removed part of the population it needs to see.

What to report

A short table, per sample: cells before QC, cells after, percentage removed, median genes per cell, median UMIs, median mitochondrial percentage, and the thresholds used. If removal exceeds about 20% in any sample, add one sentence explaining why — usually a dissociation problem, and saying so is far better than letting a reviewer discover it.

Finally, run your main conclusion at one alternative threshold set and state that it holds. That single sentence pre-empts the most common review comment in the field, and it costs an afternoon.

A worked reference

Our sample deliverable shows this on a public dataset: 2,700 cells in, 2,638 after QC (2.3% removed), with per-cell distributions and the exact thresholds shown alongside the downstream clustering, so the effect of every filter can be traced.

Need this done rather than explained?

We do analysis only — send a count matrix, an h5ad/Seurat object or a public accession and get publication-ready results with the code that produced them. Fixed price agreed before work starts.

→ Get a fixed quote  ·  See a full sample deliverable

More guides