Clustering Resolution in Single-Cell RNA-Seq: Why the Number of Cell Types Is a Parameter You Choose, Not a Fact You Discover
Zetobit · Bioinformatics Insight Series
Clustering Resolution in Single-Cell RNA-Seq: Why the Number of Cell Types Is a Parameter You Choose, Not a Fact You Discover
Single-cell analysis answers "how many cell types are in this sample?" with a clustering step. But the answer is governed by a resolution dial that the analyst sets — turn it up and the same cells split into more groups, each with its own confident marker genes. The count is an input, dressed as a result.
After quality control and dimensionality reduction, nearly every single-cell RNA-seq pipeline arrives at the same pivotal step: unsupervised clustering to partition cells into groups that will be annotated as cell types. The dominant algorithms — Louvain and its successor Leiden, as implemented in Seurat and Scanpy — build a neighbor graph and detect communities of densely connected cells.1 The output is a set of clusters, and those clusters become the paper's cell types.
The uncomfortable truth is that the number of clusters is not something the data determines on its own. It is set, directly, by a resolution parameter the analyst chooses. Low resolution yields a few large clusters; high resolution splits the same cells into many small ones.2 There is no natural, correct number that the algorithm converges to. The analyst picks a value — the Seurat default is 0.8, but nothing about the biology privileges it — and the sample "has" however many cell types that value produces.3 Ask for more, and you will get more.
Over-clustering isn't a bug, it's the default behavior
Because turning the dial up always yields more clusters, and because finding a "new" subpopulation is publishable, the pressure runs toward over-clustering. The algorithms will happily oblige past the point of biological meaning. On very large datasets this becomes extreme: on a ten-million-cell dataset, Louvain and Leiden have been reported to unreasonably overestimate the number of clusters — producing as many as a million groups — a reductio that shows the methods do not have an internal sense of when to stop.4
The deeper issue is that graph-based community detection is a heuristic, not a statistical model. It is designed to partition a graph into densely connected modules; it is not designed to ask whether a partition is real. So when it divides a population of one true cell type into two clusters, it does so with the same mechanical confidence it uses to separate genuinely distinct types. The algorithm cannot tell you which of its splits reflect biology and which are just the resolution dial doing what you asked.5
The circularity that inflates every marker gene
The problem compounds at the next step. Once clusters are defined, the standard workflow tests for differentially expressed genes between those clusters to name each one's marker genes — and it runs that test on the same expression matrix used to form the clusters in the first place. This double use of data is known as double dipping or circular analysis, and it produces badly inflated p-values.6
The failure is not subtle. Because the clustering step actively seeks the axis of greatest separation, then the DE test evaluates significance along that same axis, spuriously "significant" markers appear even when there is only one true cell population and no real grouping at all.7 Seurat itself carries a warning that its marker p-values should be interpreted cautiously, because the genes used for clustering are the same genes tested for differential expression.8 A confident list of marker genes is therefore not evidence that a cluster is a real cell type — the markers are guaranteed to look significant by the way the analysis is built, and the effect is worst exactly when clusters are most ambiguous.7
A cluster with marker genes is a hypothesis, not a discovery. Split one homogeneous population in two at high resolution, and the pipeline will hand you two clusters, each with a ranked list of statistically "significant" markers distinguishing them. Nothing in that output tells you the split was meaningless — the marker list looks identical to one from a genuine cell-type boundary. Distinguishing real from spurious requires a test the standard workflow does not perform.
How to tell a real cluster from a manufactured one
The field has developed two complementary responses. The first is stability analysis: a real partition should be reproducible, so vary the resolution, random seed, and preprocessing and keep the groupings that persist. Tools like clustree visualize how clusters split and merge across a resolution sweep, and dedicated packages quantify how consistent cluster assignments are, flagging the ones that dissolve under perturbation.2 A cluster that appears only at one specific resolution and fragments when the seed changes is a weak candidate for a true cell type.
The second, more rigorous, is significance testing that breaks the circularity. A family of recent methods generates synthetic "null" data containing only a single population and runs the entire cluster-then-test procedure against it, so that markers must clear the bar set by clustering pure noise. ClusterDE, sc-SHC, callback, recall, and CHOIR each attack the double-dipping problem this way, controlling the false-discovery rate of marker genes regardless of how the clustering was done.9 An alternative avoids explicit clustering altogether, finding differentially expressed genes without first committing to a partition.10
What a defensible clustering analysis requires
Turning a cluster into a claimed cell type honestly means treating resolution as a decision to be justified, not a default to be accepted:
- Report resolution and its basis. State the resolution, algorithm, and seed, and show that the reported structure isn't an artifact of one lucky parameter value.3
- Test stability, not just appearance. Sweep resolution and seeds; keep clusters that persist and treat those that appear only at high resolution as provisional.2
- Break the double-dip for markers. Use a post-clustering DE method that controls FDR against a single-population null, rather than trusting raw Seurat/Scanpy marker p-values.9
- Validate splits externally. Confirm putative new subtypes with independent data, orthogonal markers, or a held-out sample — not with the same matrix that produced them.7
- Match resolution to the question. Broad lineages and fine states are different analyses; the right number of clusters depends on what you're asking, which is another way of saying there is no single right number.2
As with the other blind spots in this series, the honest analysis states the choices behind its conclusions: the resolution and why, the stability evidence, and the significance method used for markers. A cluster count reported as if the data simply revealed it — with marker p-values from the same data that drew the boundaries — looks like a finding but is partly a decision in disguise.
The takeaway
Clustering is where single-cell analysis turns a continuous cloud of expression into discrete cell types, and it is the step most easily mistaken for objective. The number of types is set by a resolution dial with no natural stopping point; the algorithms over-cluster by default and cannot self-assess; and the marker genes that seem to validate each cluster are inflated by testing the same data used to define it. None of this makes clustering unusable — it makes the surrounding discipline essential. The right question is never just "what clusters did I get?" but "which of these survive a change of parameters, and which markers survive a test that isn't circular?"
References
- Optimization of clustering parameters for single-cell RNA analysis (Louvain/Leiden as neighbor-graph community detection; Leiden the default in Seurat). Front Bioinform. 2025. frontiersin.org
- Cell Layers / multi-resolution structure — resolution parameter governs cluster count (low = few large, high = many small); clustree-style sweeps for stability. PMC. PMC9362878
- Significance analysis for clustering with scRNA-seq (Seurat default resolution 0.8; clustree-based resolution selection). bioRxiv. 2022. biorxiv.org
- Secuer — Louvain/Leiden unreliably overestimate cluster number on ultra-large data (up to ~1M clusters on 10M cells). arXiv. 2022. arxiv.org
- Significance analysis for clustering — Louvain/Leiden are heuristics not designed for statistical inference; over-partitioning of single populations. bioRxiv. 2022. biorxiv.org
- callback — over-clustering yields inflated p-values and false discoveries in post-clustering DE ("double dipping" / circular analysis). bioRxiv. 2024. biorxiv.org
- recall (artificial variables) — inflated p-values even in the null case with no true groupings; worst when clusters are ambiguous. Am J Hum Genet. 2025. cell.com
- ClusterDE / synthetic control — Seurat's own warning that marker p-values are suspect because clustering and DE use the same genes. PMC. PMC10401959
- ClusterDE — post-clustering DE controlling FDR via a single-cluster synthetic null; add-on to Seurat/Scanpy (family incl. sc-SHC, callback, recall, CHOIR). PMC. PMC10418557
- singleCellHaystack — clustering-independent detection of differentially expressed genes, avoiding arbitrary-clustering bias. Nat Commun. 2020. nature.com

