FindAllMarkers / FindConservedMarkersNote
Why this matters. A cluster is a partition of a graph. A cell type is a biological claim. Going from one to the other is the most subjective step in the entire workflow — and the one reviewers will scrutinize most.
Note
Which do you reach for first?
For well-referenced model organisms (human, mouse), reference-based annotation (Lec 04 — Azimuth; other tools include SingleR and CellTypist) is increasingly the practical starting point, with manual markers used to confirm and to catch novel states.
For non-model systems — where no curated reference exists — manual, marker-driven annotation remains essential and is often the only option. This workshop teaches both so you can choose based on your system; the two lectures are a connected pair, not alternatives.
FindAllMarkers — every cluster vs. all othersThis step allows you to identify markers that differentiate a cluster against all other clusters:
only.pos = TRUE keeps just the up-regulated markers (what you’d actually use to name a cluster)min.pct = 0.25 requires the gene be detected in at least 25% of cells in either groupTip
Defaults that work for most 10x datasets. min.pct = 0.25, logfc.threshold = 0.25. Loosen them for very small clusters, tighten them only if results are overwhelming.
FindConservedMarkers — markers that hold across conditionsWhen your dataset has multiple conditions (e.g. stimulated vs. control PBMCs in the ifnb example), you usually want markers that define a cluster regardless of condition:
This runs the marker test inside each condition and reports genes that come up in both — protecting you from labelling a cluster by a treatment-induced gene rather than its lineage marker.
Warning
Don’t skip this step in case-control designs.
FindAllMarkers on a stim-vs-ctrl dataset will surface treatment-response genes as “cluster markers”, and you’ll mis-label populations.FindAllMarkers & FindConservedMarkers — what’s sharedBoth answer the same underlying question — “which genes mark this cluster?” — with the same machinery:
test.use applies to both)min.pct, logfc.threshold, only.posavg_log2FC, p_val, p_val_adj, and the detection rates pct.1 / pct.2Note
So the building block is identical — FindConservedMarkers is essentially FindMarkers run repeatedly. What changes is how condition is handled (next slide).
FindAllMarkers vs. FindConservedMarkers — what differsFindAllMarkers |
FindConservedMarkers |
|
|---|---|---|
| Question | What distinguishes a cluster? | What marks a cluster in every condition? |
| Condition | Pools all cells, ignores it | Splits by grouping.var, tests within each |
| Clusters | Loops over all automatically | One per call (ident.1) |
| Significance | Single test per gene | Per-condition tests combined (meta-analysis) |
| Output | One frame, has a cluster column |
Per-condition columns (CTRL_…, STIM_…) + combined p-values |
| Needs | — | metap; enough cluster cells in each group |
| Use when | Single condition, or just want identity | Case–control / multi-condition designs |
Tip
The trap it avoids. Pooling stim-vs-ctrl, FindAllMarkers can surface a treatment-response gene as a “cluster marker.” FindConservedMarkers keeps only genes that mark the cluster within both CTRL and STIM — so you label by lineage, not treatment.
Tutorial 03 walks through five canonical plots that are each best for a different question:
| Plot | What it shows | When to use it |
|---|---|---|
VlnPlot |
distribution per cluster, one gene at a time | Bimodality, outliers, comparing 4–8 candidate markers |
FeaturePlot |
one gene, every cell, on the UMAP | Spatial structure on the embedding |
DoHeatmap |
top-N markers across clusters, cell-by-cell | Eyeballing the global cluster ↔︎ marker structure |
RidgePlot |
density per cluster | Gradient / continuum genes |
DotPlot |
mean expr × % positive, per (cluster × gene) | Compact panel display — best for the publication figure |
FeaturePlot is the “geographic” view of a markerVlnPlot (4 candidates side-by-side)FeaturePlotDotPlotDoHeatmapRidgePlotWarning
Genes that are merely enriched on a Wilcoxon test are not always markers in the canonical sense. Cross-check at least two genes per cluster, and prefer ones that appear in published lineage panels (CellMarker 2.0, PanglaoDB).
Warning
On un-integrated data you will see more clusters than named cell types.
In Tutorial 03 (which follows Tutorial 02’s un-integrated clustering), a resolution of ≈ 0.5 on the ifnb dataset typically yields ~15–20 clusters even though the data contain roughly 13 annotatable PBMC cell types.
The excess clusters arise because each cell type appears as a CTRL version and a STIM version — two islands in the UMAP that get separate cluster IDs. - Attempting to find conserved markers for all of them and label every one can trigger downstream errors (too few cells in a condition slice). The practical solutions:
Use FindConservedMarkers only for clusters where both conditions are present in sufficient numbers.
Accept that some cluster pairs will be annotated as the same cell type and merged before further analysis.
Or move straight to integrated data (Tutorial 05) where CTRL and STIM cells of the same type co-cluster correctly.
slice_max)FeaturePlot / DotPlot of the canonical 2–3 markersTip
Reference panels worth bookmarking:
FindAllMarkers finds enriched genes; FindConservedMarkers finds condition-robust ones — use the latter in case-control designs.Single Cell RNA-seq Workshop · Lecture 03