Advanced Single-Cell Analysis-2026-09-12

Cell-Cell Communication

NM

Nasir Mahmood Abbasi, PhD

Bioinformatics Educator

Cell-Cell Communication

Cell–cell communication analysis uses ligand and receptor expression to prioritize candidate interactions between annotated cell populations. This walkthrough prepares a normalized Seurat object, runs the R LIANA consensus workflow, and explains where CellChat fits. These are transcript-based hypotheses, not evidence that proteins meet or signal in tissue.

Format: Advanced template. For readers familiar with R and Seurat who have their own processed single-cell object; you will check its structure, produce and inspect a LIANA consensus table, and plan whether CellChat is warranted. No dataset is supplied, and the optional CellChat path is a documented review exercise rather than a runnable script.

Scope and prerequisites

Use the LIANA workflow for exploratory analysis of one scRNA-seq dataset when cell identities and normalized expression are already available. It assumes working knowledge of R and Seurat, and compatible versions of Seurat, LIANA, and dplyr. CellChat is optional and is not required to complete the LIANA example. Install packages using their current official instructions; package APIs, databases, and defaults change, so record the environment and consult the linked tutorials before adapting code.

Before starting, confirm that the object has normalized expression in the assay/data layer LIANA will use, a non-missing cell_type metadata column, and adequate representation of each group for your design. Retain sample, condition, and batch metadata. An object-wide pooled analysis does not by itself provide replicate-aware condition testing.

1. Load and check the input

library(Seurat)
seurat_obj <- readRDS("seurat_obj.rds")
stopifnot(inherits(seurat_obj, "Seurat"))
stopifnot("cell_type" %in% colnames(seurat_obj[[]]))
cell_counts <- table(seurat_obj$cell_type, useNA = "ifany")
print(cell_counts)
stopifnot(!anyNA(seurat_obj$cell_type))

# Inspect the assay and available layers before selecting expression input.
Assays(seurat_obj)
Layers(seurat_obj[[DefaultAssay(seurat_obj)]])

The file path is an input you supply; this is not a self-contained dataset. In R, save your processed Seurat object as seurat_obj.rds in the working directory from which you run the code, or replace the path with its actual location. Check that the selected assay contains normalized values and that group labels match your intended annotations. Seurat v5 stores expression in layers; do not assume a layer called data exists or that the default assay is the one you intend. The check above stops on missing group labels; investigate any very small groups before proceeding.

2. Run LIANA and inspect its consensus ranking

The R LIANA tutorial documents liana_wrap() followed by liana_aggregate(). The aggregation step returns consensus rank columns, including aggregate_rank; this is not the consensus_score used in some older examples. The code below follows the documented default workflow and leaves assay selection to the input object's active assay. Verify that this is appropriate for your installed LIANA/Seurat versions before running.

library(liana)
liana_raw <- liana_wrap(seurat_obj, groupby = "cell_type")
liana_ranked <- liana_aggregate(liana_raw)

# Confirm actual output fields, then rank smallest aggregate_rank first.
print(names(liana_ranked))
stopifnot(all(c("source", "target", "aggregate_rank") %in% names(liana_ranked)))
liana_ranked <- dplyr::arrange(liana_ranked, aggregate_rank)
utils::write.csv(liana_ranked, "liana_aggregate_results.csv", row.names = FALSE)
saveRDS(liana_raw, "liana_raw_results.rds")

LIANA's aggregate_rank is a robust rank-aggregation statistic across method results: smaller values appear earlier in the ranking. It is not a calibrated probability that signaling occurs. Inspect per-method columns and rank agreement as well as ligand/receptor complex labels; a single consensus column can hide method disagreement. The exact output fields depend on selected methods, resources, and package version, which is why the example checks fields before using them.

3. Decide whether CellChat adds a distinct analysis

CellChat can model and visualize group-level communication using its curated database and analysis workflow. It is complementary, not a validation stage for LIANA: shared expression inputs and curated resources do not turn inferred edges into observed signaling. This section is an optional conceptual map, not a second runnable route. The CellChat maintainers' full single-dataset tutorial and Nature Protocols workflow specify input conversion, expression representation, version-specific functions, and analysis checks; follow them rather than passing a Seurat object directly to createCellChat() as a generic recipe.

  1. Before opening the official tutorial, write down the question and confirm that its input contract matches your assay, normalized expression, cell labels, organism, and gene identifiers.
  2. As you review its preprocessing, over-expression, communication probability, pathway aggregation, and network steps, note the expected intermediate tables/objects and which checks show that each step completed.
  3. Decide whether pathway/network summaries answer something beyond the LIANA ranking; record database/software versions and inspect underlying tables alongside visualizations. Do not treat agreement between tools as independent validation.

For the standard single-dataset route, use the official CellChat repository, which links its full single-dataset tutorial and Nature Protocols. Match the database to the organism and verify gene identifiers and complex coverage. Do not compare raw LIANA and CellChat scores as though they shared a scale; consult the CellChat protocol for multi-condition analysis rather than interpreting separate pooled runs as replicate-aware tests.

CellChat's probability and pathway summaries depend on its model, database and parameters. Consult the current protocol for code and for multi-condition workflows rather than interpreting separate pooled runs as a replicate-aware test.

Interpret candidates, not causal messages

  • Ask whether a candidate is supported by multiple LIANA methods and whether source/target populations have adequate cells and plausible expression of the relevant ligand/receptor complex.
  • Check whether patterns persist across biological samples and are robust to composition, batch, annotation, and preprocessing choices. Cells are not independent biological replicates.
  • Use spatial, protein-level, or perturbation evidence where the biological claim requires proximity, binding, or functional signaling. Standard dissociated scRNA-seq does not establish tissue proximity.

Transcript abundance does not establish protein abundance, secretion, localization, receptor occupancy, downstream activation, or direction of causal effect. A high rank is prioritization evidence within a chosen method/resource, not a universal confidence threshold, clinical conclusion, or proof of interaction.

Hypothetical decision check

Suppose LIANA and CellChat both prioritize the same ligand–receptor candidate from the same pooled RNA dataset. What does that agreement support, and what would it still not establish?

Reasoned feedback

It supports prioritizing the transcript-based candidate for follow-up under the chosen methods and resources. Both analyses still rely on expression and prior interaction knowledge, so agreement is not independent experimental validation and does not show that proteins meet or signaling occurs in tissue. Check whether the candidate recurs across biological samples, then choose spatial, protein-level, or perturbation evidence suited to the claim.

Troubleshoot before loosening filters

  • Missing/empty groups: inspect labels including NA, group counts, and object metadata. Correct annotation or data-joining errors before merging biologically distinct populations.
  • LIANA errors about expression or genes: inspect the active assay and its layers, normalized data availability, organism/gene identifiers, and installed function documentation. Do not blindly set an assay-slot argument copied from an older release.
  • Few candidates: check group sizes, expression sparsity, and database/resource coverage. A low candidate count can reflect biology or measurement as well as settings; lowering cutoffs may increase candidates without making them better supported.
  • Methods disagree: inspect method-specific scores and assumptions. Consensus is a useful summary, not a reason to suppress discordance.
  • CellChat organism/database mismatch: match database species to the input and check gene symbols and complex components against the selected database.

Reproducibility record

Save the exact R session information, package versions, database/resource versions, assay/layer, cell grouping, filters, and any random seeds used by stochastic steps. For a lightweight record after loading your packages, run sessionInfo() and save its output with the analysis; this captures the versions in your own environment, not a version combination tested by this page. Keep sample and condition metadata with intermediate outputs. The example does not implement differential communication testing; use a documented sample-aware comparison design for condition claims.

Further reading

Software and package behaviour can change. Record versions from your own R session and re-check commands against the official documentation. If a command does not work or you find an error, please report it through the Contact page.

Author: Nasir Mahmood Abbasi, PhD - Category: Advanced Single-Cell Analysis

Back to topCell-Cell Communication