COMMOTR: Cell-Cell Communication Analysis in Spatial Transcriptomics
Source:vignettes/COMMOTR_tutorial.Rmd
COMMOTR_tutorial.RmdIntroduction
COMMOTR (Cell-cell cOMmunication inference via cOllective opTimal tRansport) is an R package for inferring cell-cell communication (CCC) in spatial transcriptomics data. It implements the COMMOT algorithm from Cang et al., Nature Methods 2023.
Key Features
- Optimal Transport-based CCC Inference: Models ligand-receptor interactions with spatial distance constraints
- Communication Direction Analysis: Infers spatial vector fields for signaling directions
- Cluster-level Analysis: Aggregates to cluster-cluster communication with statistical testing
- Comprehensive Visualization: Publication-ready plots including vector fields, networks, and chord diagrams
- Seurat Integration: Works seamlessly with Seurat V4/V5 workflow
Installation
# Install from GitHub
devtools::install_github("Zaoqu-Liu/COMMOTR")Step 1: Load Ligand-Receptor Database
COMMOTR includes built-in databases from CellChat and CellPhoneDB:
# Load CellChat database for mouse
df_ligrec <- ligand_receptor_database(
database = "CellChat",
species = "mouse",
signaling_type = "Secreted Signaling"
)
head(df_ligrec)Filter LR Pairs by Expression
Filter to keep only LR pairs with sufficient expression in your data:
df_ligrec_filtered <- filter_lr_database(
df_ligrec = df_ligrec,
seurat_obj = seurat_obj,
min_cell_pct = 0.05,
heteromeric = TRUE
)
cat("LR pairs after filtering:", nrow(df_ligrec_filtered), "\n")Step 2: Infer Spatial Communication
The main function spatial_communication() computes
cell-cell communication matrices:
seurat_obj <- spatial_communication(
seurat_obj,
df_ligrec = df_ligrec_filtered,
database_name = "CellChat",
dis_thr = 500, # Distance threshold in spatial units
cot_eps_p = 0.1, # Entropy regularization
cot_rho = 10, # Penalty for unmatched mass
pathway_sum = TRUE, # Compute pathway-level totals
n_workers = 4, # Parallel workers
verbose = TRUE
)Access Results
# Get all results
results <- get_communication_results(seurat_obj, "CellChat")
# Get specific communication matrix
total_comm <- get_communication_matrix(seurat_obj, "CellChat", pathway_name = "total")
# Get sender/receiver summaries
sender_df <- get_sender_receiver_df(seurat_obj, "CellChat", "sender")Step 3: Communication Direction Analysis
Compute spatial vector fields showing communication directions:
# Compute direction for a specific pathway
seurat_obj <- communication_direction(
seurat_obj,
database_name = "CellChat",
pathway_name = "TGFb",
k = 5 # Neighbors for smoothing
)
# Visualize with vector field
plot_cell_communication(
seurat_obj,
database_name = "CellChat",
pathway_name = "TGFb",
plot_method = "grid",
color_by = "signal",
arrow_scale = 1.5
)Spatial Autocorrelation of Direction
Test if communication directions are spatially coherent:
moranI_result <- communication_spatial_autocorrelation(
seurat_obj,
database_name = "CellChat",
key = "TGFb",
field = "sender",
n_permutations = 999
)
cat("Moran's I:", moranI_result$I, "\n")
cat("P-value:", moranI_result$p_value, "\n")Step 4: Cluster-Level Analysis
Aggregate communication to cluster-cluster level:
seurat_obj <- cluster_communication(
seurat_obj,
database_name = "CellChat",
clustering = "seurat_clusters",
pathway_name = "TGFb",
n_permutations = 100
)Visualize Cluster Communication
# Network plot
plot_cluster_communication(
seurat_obj,
database_name = "CellChat",
clustering = "seurat_clusters",
key = "TGFb",
layout = "circle",
p_threshold = 0.05
)
# Heatmap
plot_communication_heatmap(
seurat_obj,
database_name = "CellChat",
clustering = "seurat_clusters",
key = "TGFb"
)
# Chord diagram (requires circlize)
plot_chord_diagram(
seurat_obj,
database_name = "CellChat",
clustering = "seurat_clusters",
key = "TGFb"
)Dotplot for Multiple Pathways
# Compare multiple pathways
plot_communication_dotplot(
seurat_obj,
database_name = "CellChat",
clustering = "seurat_clusters",
keys = c("TGFb", "WNT", "FGF"),
top_n_pairs = 15
)Step 5: Downstream Analysis
Communication-Dependent Gene Detection
Identify genes whose expression varies with communication intensity:
deg_results <- communication_deg_detection(
seurat_obj,
database_name = "CellChat",
key = "TGFb",
signal_type = "sender",
n_workers = 4
)
# Top significant genes
head(deg_results[deg_results$padj < 0.05, ], 20)Communication Impact Analysis
Analyze which signaling pathways impact specific genes:
impact_results <- communication_impact(
seurat_obj,
database_name = "CellChat",
genes = c("Acta2", "Col1a1", "Fn1"), # Example fibrosis markers
method = "partial_correlation"
)
# View top impacts
head(impact_results[order(-abs(impact_results$impact)), ])Group Cells by Communication Patterns
seurat_obj <- group_cell_communication(
seurat_obj,
database_name = "CellChat",
key = "total",
n_groups = 5
)
# Visualize groups
DimPlot(seurat_obj, group.by = "commgroup_CellChat_total")Parameters Guide
Citation
If you use COMMOTR in your research, please cite:
Cang, Z., Zhao, Y., Almet, A.A. et al. Screening cell–cell communication in spatial transcriptomics via collective optimal transport. Nat Methods 20, 218–228 (2023). https://doi.org/10.1038/s41592-022-01728-4