| name | seuratclustering |
| description | Performs unsupervised clustering on single-cell RNA-seq data using Seurat. This process finds nearest neighbors, computes UMAP for visualization, and applies Louvain/Leiden algorithms to identify cell clusters. Clusters can be explored at multiple resolutions to balance granularity and biological relevance. |
SeuratClustering Process Configuration
Purpose
Performs unsupervised clustering on single-cell RNA-seq data using Seurat. This process finds nearest neighbors, computes UMAP for visualization, and applies Louvain/Leiden algorithms to identify cell clusters. Clusters can be explored at multiple resolutions to balance granularity and biological relevance.
When to Use
- After SeuratPreparing: Standard workflow after QC and normalization
- T/B cell selection: After SeuratClusteringOfAllCells (if TOrBCellSelection enabled)
- Reference-based annotation: Alternative to SeuratMap2Ref or CellTypeAnnotation
- Standard clustering: When you need unsupervised cell type discovery
- Multi-resolution exploration: When unsure of optimal cluster granularity
Configuration Structure
Process Enablement
[SeuratClustering]
cache = true
Input Specification
[SeuratClustering.in]
srtobj = ["SeuratPreparing"]
Environment Variables
Core Parameters
[SeuratClustering.envs]
ncores = 1
ident = "seurat_clusters"
cache = "/tmp"
FindNeighbors Parameters
[SeuratClustering.envs.FindNeighbors]
k.param = 20
reduction = "pca"
dims = 30
prune.SNN = 0.067
nn.method = "annoy"
graph.name = ["pca_nn", "pca_snn"]
Full FindNeighbors Parameter List:
k.param (int): Number of nearest neighbors (default: 20)
reduction (str): Dimensional reduction to use (default: "pca")
dims (int): Number of dimensions to use (default: 1:10)
assay (str): Assay to use when dims is NULL
features (list): Features to use when dims is NULL
compute.SNN (bool): Compute shared nearest neighbor graph (default: TRUE)
prune.SNN (float): SNN pruning threshold (default: 1/15)
nn.method (str): NN algorithm - "annoy" or "rann" (default: "annoy")
n.trees (int): Annoy tree count (default: 50)
annoy.metric (str): Distance metric - "euclidean", "cosine", "manhattan", "hamming" (default: "euclidean")
graph.name (list): Names for NN and SNN graphs
verbose (bool): Print output (default: TRUE)
RunUMAP Parameters
[SeuratClustering.envs.RunUMAP]
reduction = "pca"
dims = 30
features = 30
n.neighbors = 30
min.dist = 0.3
spread = 1
n.components = 2
metric = "cosine"
learning.rate = 1
seed.use = 42
Full RunUMAP Parameter List:
dims (int): Dimensions to use (default: NULL, uses reduction)
reduction (str): Reduction to use (default: "pca")
features (list/int): Features to use instead of dims
n.neighbors (int): Neighborhood size (default: 30)
n.components (int): Embedding dimensions (default: 2)
metric (str): Distance metric (default: "cosine")
min.dist (float): Cluster tightness (default: 0.3)
spread (float): Scale of embedding (default: 1.0)
learning.rate (float): Initial learning rate (default: 1.0)
n.epochs (int): Training epochs (default: auto: 200 large, 500 small)
set.op.mix.ratio (float): Fuzzy set operation ratio (default: 1.0)
local.connectivity (int): Local connectivity (default: 1)
seed.use (int): Random seed (default: 42)
reduction.name (str): Name for UMAP reduction (default: "umap")
verbose (bool): Print output (default: TRUE)
FindClusters Parameters
[SeuratClustering.envs.FindClusters]
resolution = 0.8
algorithm = 4
leiden_method = "leidenbase"
leiden_objective_function = "modularity"
random.seed = 0
n.start = 10
n.iter = 10
graph.name = "pca_snn"
cluster.name = "seurat_clusters"
group.singletons = TRUE
Full FindClusters Parameter List:
resolution (float): Cluster granularity (default: 0.8)
algorithm (int): 1=Louvain, 2=Louvain multilevel, 3=SLM, 4=Leiden (default: 1)
leiden_method (str): "leidenbase" or "igraph" (default: "leidenbase")
leiden_objective_function (str): "modularity" or "CPM" (default: "modularity")
random.seed (int): Random seed (default: 0)
n.start (int): Random starts (default: 10)
n.iter (int): Max iterations (default: 10)
graph.name (str): SNN graph name to use
cluster.name (str): Metadata column for clusters
modularity.fxn (int): Modularity function (default: 1)
group.singletons (bool): Group singletons (default: TRUE)
verbose (bool): Print output (default: TRUE)
External References
FindNeighbors (Seurat v5)
https://satijalab.org/seurat/reference/findneighbors
- Constructs shared nearest neighbor (SNN) graph
- Computes k-nearest neighbors and Jaccard index for neighborhood overlap
- Pruning controls graph connectivity (higher = stricter)
RunUMAP (Seurat v5)
https://satijalab.org/seurat/reference/runumap
- Uniform Manifold Approximation and Projection for visualization
n.neighbors: Global structure vs local detail trade-off (5-50)
min.dist: Cluster tightness (0.001-0.5)
spread: Scale of embedding (works with min.dist)
FindClusters (Seurat v5)
https://www.rdocumentation.org/packages/Seurat/versions/5.3.1/topics/FindClusters
- Louvain (1-3) vs Leiden (4) clustering algorithms
- Leiden preferred: Better community detection, improved over Louvain
- Resolution: >1.0 = more clusters, <1.0 = fewer clusters
Algorithm Comparison: Leiden vs Louvain
Integration Method Support
When using SeuratData integration workflows, use integrated reduction:
- CCA integration:
reduction = "integrated.cca"
- RPCA integration:
reduction = "integrated.rpca"
- Harmony integration:
reduction = "integrated.harmony"
Configuration Examples
Minimal Configuration
[SeuratClustering]
[SeuratClustering.in]
srtobj = ["SeuratPreparing"]
Result: Uses defaults (PCA, 30 dims, resolution 0.8, Louvain algorithm)
Standard Resolution Sweep
[SeuratClustering]
[SeuratClustering.in]
srtobj = ["SeuratPreparing"]
[SeuratClustering.envs.FindClusters]
resolution = [0.4, 0.6, 0.8, 1.0]
Result: Creates seurat_clusters_0.4, seurat_clusters_0.6, etc. Final = 1.0
Range Syntax for Resolution Sweep
[SeuratClustering.envs.FindClusters]
resolution = "0.2:1.0:0.1"
Leiden Algorithm with Custom Parameters
[SeuratClustering]
[SeuratClustering.envs.FindNeighbors]
k.param = 30
prune.SNN = 0.05
graph.name = ["pca_nn", "pca_snn"]
[SeuratClustering.envs.FindClusters]
algorithm = 4
resolution = 1.2
random.seed = 42
graph.name = "pca_snn"
Integrated Data (CCA/RPCA)
[SeuratClustering]
[SeuratClustering.envs.FindNeighbors]
reduction = "integrated.cca"
dims = 30
[SeuratClustering.envs.RunUMAP]
reduction = "integrated.cca"
dims = 30
reduction.name = "umap.cca"
[SeuratClustering.envs.FindClusters]
resolution = 1.0
Custom UMAP Parameters for Better Separation
[SeuratClustering]
[SeuratClustering.envs.RunUMAP]
n.neighbors = 15
min.dist = 0.1
spread = 1.5
seed.use = 123
Using Top Markers for UMAP
[SeuratClustering]
[SeuratClustering.envs.RunUMAP]
features = {order = "desc(abs(avg_log2FC))", n = 30}
Multi-Process with Custom Cluster Names
[SeuratClustering]
[SeuratClustering.envs]
ident = "my_clusters"
[CellTypeAnnotation]
[CellTypeAnnotation.envs]
newcol = "cell_types"
[SeuratMap2Ref]
[SeuratMap2Ref.envs]
name = "ref_clusters"
Common Patterns
Pattern 1: Single Resolution (Standard)
[SeuratClustering]
[SeuratClustering.envs.FindClusters]
resolution = 0.8
Pattern 2: Resolution Sweep for Exploration
[SeuratClustering]
[SeuratClustering.envs.FindClusters]
resolution = "0.4:1.2:0.2"
Pattern 3: Leiden with High Resolution (Fine-grained)
[SeuratClustering]
[SeuratClustering.envs.FindNeighbors]
k.param = 25
[SeuratClustering.envs.FindClusters]
algorithm = 4
resolution = 1.5
Pattern 4: Integrated Data (Post-Integration)
[SeuratClustering]
[SeuratClustering.envs.FindNeighbors]
reduction = "integrated.cca"
dims = 30
[SeuratClustering.envs.RunUMAP]
reduction = "integrated.cca"
dims = 30
[SeuratClustering.envs.FindClusters]
resolution = 1.0
Pattern 5: Sparse UMAP for Large Datasets
[SeuratClustering]
[SeuratClustering.envs.FindNeighbors]
nn.method = "annoy"
n.trees = 50
[SeuratClustering.envs.RunUMAP]
n.neighbors = 50
Dependencies
Upstream Processes
- Required:
SeuratPreparing (or SeuratClusteringOfAllCells if TOrBCellSelection used)
- Optional:
LoadingRNAFromSeurat with prepared = false (if loading unprepared Seurat object)
Downstream Processes
- SeuratClusterStats: Cluster statistics and quality metrics
- ClusterMarkers: Differential expression between clusters
- MarkersFinder: Flexible marker finding with enrichment analysis
- ScRepCombiningExpression: If TCR data present (combines RNA + TCR)
- TESSA: TCR-specific clustering analysis
Validation Rules
Resolution Constraints
- Must be positive (resolution > 0)
- Single value or list of values allowed
- Range syntax:
"start:end:step" (step defaults to 0.1 if omitted)
Dimension Requirements
dims must not exceed available dimensions in reduction
- Automatically truncated to
min(dims, ncol(reduction) - 1)
Graph Name Consistency
FindClusters.graph.name must match FindNeighbors.graph.name[1] (SNN graph name)
- When using multiple integration methods, use unique graph names
Algorithm Selection
- Louvain: algorithm = 1 (original), 2 (multilevel), 3 (SLM)
- Leiden: algorithm = 4 (recommended)
- Leiden requires
leiden_method and leiden_objective_function parameters
Troubleshooting
Issue: Too Many Small Clusters
Symptoms: Hundreds of tiny clusters, many singletons
Solutions:
[SeuratClustering.envs.FindClusters]
resolution = 0.4
algorithm = 4
group.singletons = TRUE
Issue: Clusters Overlapping in UMAP
Symptoms: Poor separation in UMAP visualization
Solutions:
[SeuratClustering.envs.RunUMAP]
min.dist = 0.1
n.neighbors = 15
spread = 1.2
Issue: Clustering Not Reproducible
Symptoms: Different clusters on each run
Solutions:
[SeuratClustering.envs.FindNeighbors]
seed.use = 42
[SeuratClustering.envs.FindClusters]
random.seed = 42
n.start = 10
Issue: Slow Performance
Symptoms: Clustering takes hours
Solutions:
[SeuratClustering.envs]
ncores = 8
[SeuratClustering.envs.FindNeighbors]
nn.method = "annoy"
dims = 20
[SeuratClustering.envs.RunUMAP]
n.epochs = 200
Issue: Badly Connected Communities (Louvain)
Symptoms: Leiden warning about disconnected clusters
Solutions:
[SeuratClustering.envs.FindClusters]
algorithm = 4
leiden_method = "leidenbase"
Issue: Graph Name Conflicts with Multiple Integrations
Symptoms: Wrong graph used for clustering
Solutions:
[SeuratClustering.envs.FindNeighbors]
reduction = "integrated.cca"
graph.name = ["cca_nn", "cca_snn"]
[SeuratClustering.envs.FindClusters]
graph.name = "cca_snn"
[SeuratClustering.envs.FindNeighbors]
reduction = "integrated.rpca"
graph.name = ["rpca_nn", "rpca_snn"]
[SeuratClustering.envs.FindClusters]
graph.name = "rpca_snn"
Issue: Clustering Not Using Integration
Symptoms: Clustering on raw RNA instead of integrated data
Solutions:
[SeuratClustering.envs.FindNeighbors]
reduction = "integrated.cca"
dims = 30
[SeuratPreparing.envs]
integration_method = "CCA"
Best Practices
- Use Leiden algorithm (algorithm = 4) for better community detection
- Test multiple resolutions to find optimal granularity
- Set random seeds for reproducible results
- Match reduction to integration if using CCA/RPCA/Harmony
- Custom cluster names when running multiple annotation methods to avoid overwriting
- Cache intermediate results for faster re-runs with different parameters
- Parallelize with ncores for large datasets (>50k cells)
- Use resolution sweeps when unsure of optimal granularity
Related Processes
- SeuratClusteringOfAllCells: Clustering before T/B cell selection
- SeuratSubClustering: Re-clustering within specific clusters
- SeuratMap2Ref: Reference-based supervised clustering
- CellTypeAnnotation: Automated cell type annotation