BANKSY: Using Neighborhood Context to Find Spatial Domains
Why adding just 20% neighbor signal outperforms pure expression clustering for tissue layer detection
Standard Leiden clustering on spatial data ignores one obvious fact: cells that sit next to each other tend to be in the same tissue layer. BANKSY (Building Aggregates with a Neighborhood Kernel for Yeoman Segmentation) fixes this by mixing each cell's own expression with a smoothed average of its neighbors — then clustering on the combined signal. The result is cleaner, more spatially coherent domains without requiring any graph-based post-processing.
Figure 1. BANKSY spatial domain map (left) and performance comparison vs. other methods by ARI and NMI (right).
The Core Idea: Lambda Controls the Mix
BANKSY introduces one key parameter: lambda (0 to 1), which controls how much neighbor context to blend in:
The embedding is constructed as: z = (1 - lambda) * x_self + lambda * x_neighbors, where x_neighbors is a weighted mean of expression in the spatial neighborhood (typically k=15-30 nearest neighbors in physical space).
Running BANKSY with Squidpy
import squidpy as sq
import scanpy as sc
import numpy as np
from banksy import Banksy
# Load and preprocess
adata = sc.read_visium('path/to/visium/')
sc.pp.normalize_total(adata, target_sum=1e4)
sc.pp.log1p(adata)
sc.pp.highly_variable_genes(adata, n_top_genes=2000)
adata = adata[:, adata.var.highly_variable]
# Build spatial graph (required for BANKSY)
sq.gr.spatial_neighbors(adata, coord_type='generic', n_neighs=15)
# Run BANKSY
banksy = Banksy(
adata,
banksy_lambda=0.2, # neighbor mix ratio
resolution=0.8, # Leiden resolution
pca_dims=20,
n_neighbors=15,
)
banksy.fit()
banksy.plot_domains(adata, color='banksy_labels')
pip install banksy-py — works with AnnData/Squidpy natively.
BANKSY vs. Other Spatial Domain Methods
| BANKSY | BayesSpace | STAGATE | Leiden only | |
|---|---|---|---|---|
| Approach | Neighbor smoothing + clustering | Bayesian HMRF | Graph autoencoder | Expression only |
| Speed | Fast | Slow | Slow (GPU) | Fastest |
| Scalability | Visium HD / Xenium OK | Visium only | Large datasets OK | Any |
| Interpretability | High (lambda is intuitive) | Low | Low (latent space) | High |
| Best for | General use, layered tissues | Small datasets, fine structure | Complex, non-laminar | Quick baseline |
Practical Tips
- Start with lambda=0.2 for most tissues. Go higher (0.5-0.8) only for clearly laminar structures like brain cortex or retina.
- Run both BANKSY and Leiden and compare — BANKSY domains should look spatially cleaner. If they don't, your spatial graph might be poorly constructed.
- Use sq.gr.spatial_neighbors with coord_type='generic' for Visium. The default 'grid' mode can misrepresent actual tissue distances.
- BANKSY domains are not cell types — they are tissue microenvironments. Combine with cell type deconvolution (cell2location or Tangram) to get the full picture.
Key Takeaways
- BANKSY adds spatial coherence with a single parameter (lambda) on top of standard clustering
- lambda=0.2 is a reliable default; increase for laminar tissues
- Faster and more interpretable than deep learning alternatives for most use cases
- Best used alongside cell type deconvolution, not as a replacement
Interested in the immunology behind those spatial domains?
See NeoantigenLab for checkpoint inhibitors, CAR-T, and neoantigen biology.
Explore NeoantigenLabFrom the NeoantigenLab sister blog
Working with tumor transcriptomics for neoantigen research?
NeoantigenLab covers neoantigen biology, WES pipelines, pVACseq, and HLA typing for experimental researchers — the biology behind what you're sequencing.
Visit NeoantigenLab →
No comments:
Post a Comment