单细胞细胞通讯分析¶
一句话概述¶
基于单细胞转录组数据,利用CellChat、CellPhoneDB、NicheNet等工具推断细胞间配体-受体通讯网络,揭示组织微环境中的细胞互作模式与信号通路活性。
核心知识点总览¶
| 知识点 | 关键内容 | 重要程度 |
|---|---|---|
| 配体-受体数据库 | CellChatDB/CellPhoneDB/OmniPath/NATMI数据库 | ⭐⭐⭐⭐⭐ |
| CellChat框架 | 概率模型推断通讯/通路/模式 | ⭐⭐⭐⭐⭐ |
| CellPhoneDB | 置换检验配体-受体对显著性 | ⭐⭐⭐⭐⭐ |
| NicheNet | 配体活性-靶基因调控链路 | ⭐⭐⭐⭐ |
| 通讯模式分析 | 信号通路网络/传入传出模式/NMF | ⭐⭐⭐⭐ |
| 多条件比较 | 疾病vs对照通讯差异 | ⭐⭐⭐⭐ |
| 可视化 | 气泡图/弦图/热图/等级图 | ⭐⭐⭐ |
| 多工具整合 | 多方法交叉验证提高可靠性 | ⭐⭐⭐ |
各步骤详解¶
第一步:理解细胞通讯的生物学基础¶
白话解释: 细胞不是孤立存在的,它们通过释放配体(ligand)与相邻细胞表面的受体(receptor)结合来传递信号。就像人们通过对话交流一样,细胞也有自己的"语言系统"——配体-受体对(Ligand-Receptor pairs)。单细胞细胞通讯分析就是"窃听"这些细胞间对话,推断哪些细胞在和谁说话、说了什么。
技术细节: 细胞通讯分析基于以下假设:如果某种细胞高表达某种配体,同时另一种细胞高表达其对应受体,则推断两者之间可能存在通讯。主流方法包括: - 基于表达丰度的方法:CellChat使用质量作用定律建模通讯概率 - 基于统计检验的方法:CellPhoneDB使用置换检验判断配体-受体对是否显著共表达 - 基于下游调控的方法:NicheNet追溯配体对靶基因的调控效应
配体-受体数据库是所有分析的基础。常用数据库包括: - CellChatDB:包含人和小鼠的分泌型信号、ECM-受体、细胞-细胞接触三大类 - CellPhoneDB:手动整理的多亚基复合物配体-受体对 - OmniPath:整合多数据库的大型互作资源
# CellChatDB 数据库结构
library(CellChat)
CellChatDB <- CellChatDB.human
str(CellChatDB)
# 包含: interaction, complex, cofactor, geneInfo
table(CellChatDB$interaction$annotation)
# Secreted Signaling, ECM-Receptor, Cell-Cell Contact
第二步:数据准备与预处理¶
白话解释: 分析细胞通讯之前,需要有一份质量合格的单细胞数据——已完成质控、降维、聚类、细胞类型注释。细胞类型注释的准确性直接影响通讯推断结果,因此是最关键的前提。
技术细节: 输入数据通常为标准化后的表达矩阵(log-normalized)和细胞元数据(包含细胞类型标签)。需要注意: 1. 表达矩阵需为归一化数据,而非原始counts 2. 细胞类型注释应足够精细但不过度拆分 3. 如果要做多条件比较,需将不同条件的数据分别处理
# 从Seurat对象提取数据用于CellChat
library(Seurat)
library(CellChat)
# 假设已有注释好的Seurat对象 seurat_obj
# 提取归一化表达矩阵
data.input <- GetAssayData(seurat_obj, assay = "RNA", slot = "data")
# 提取元数据
meta <- data.frame(
labels = seurat_obj$celltype, # 细胞类型标签
samples = seurat_obj$sample, # 样本信息(可选)
row.names = colnames(seurat_obj)
)
# 创建CellChat对象
cellchat <- createCellChat(object = data.input, meta = meta, group.by = "labels")
# CellPhoneDB 输入准备(Python)
import pandas as pd
import scanpy as sc
# 读取 h5ad 文件
adata = sc.read_h5ad("scRNA_annotated.h5ad")
# 导出 CellPhoneDB 所需文件
# 1. counts矩阵(转置,基因×细胞)
counts = adata.to_df().T
counts.to_csv("cellphonedb_count.txt", sep="\t")
# 2. meta文件(细胞ID + 细胞类型)
meta = pd.DataFrame({
'Cell': adata.obs.index,
'cell_type': adata.obs['celltype'].values
})
meta.to_csv("cellphonedb_meta.txt", sep="\t", index=False)
第三步:CellChat分析流程¶
白话解释: CellChat是最流行的R语言通讯推断工具。它使用数学模型(质量作用定律)计算细胞间通讯的概率,然后帮你找出哪些信号通路最活跃,哪些细胞是"主要说话者"或"主要听众"。
技术细节: CellChat的核心是基于质量作用定律(law of mass action)建模配体-受体互作概率。通讯概率与配体在发送细胞中的表达和受体在接收细胞中的表达成正比,同时考虑辅因子(cofactor)的调节作用。
CellChat v2 主要流程: 1. 设置配体-受体数据库 2. 预处理:识别过表达的配体/受体 3. 推断通讯概率 4. 通讯网络聚合与可视化 5. 通讯模式分析(NMF)
# === CellChat 完整分析流程 ===
# 1. 设置数据库
CellChatDB <- CellChatDB.human
# 可选择子集,如只看分泌型信号
# CellChatDB.use <- subsetDB(CellChatDB, search = "Secreted Signaling")
cellchat@DB <- CellChatDB
# 2. 预处理:识别过表达基因
cellchat <- subsetData(cellchat)
cellchat <- identifyOverExpressedGenes(cellchat)
cellchat <- identifyOverExpressedInteractions(cellchat)
# 3. 推断细胞通讯网络
cellchat <- computeCommunProb(cellchat, type = "triMean")
# type参数:triMean(默认截断均值), truncatedMean, median
# 过滤低细胞数的通讯
cellchat <- filterCommunication(cellchat, min.cells = 10)
# 4. 通路水平通讯推断
cellchat <- computeCommunProbPathway(cellchat)
# 5. 聚合通讯网络
cellchat <- aggregateNet(cellchat)
# 6. 可视化:通讯网络圆形图
groupSize <- as.numeric(table(cellchat@idents))
par(mfrow = c(1, 2), xpd = TRUE)
netVisual_circle(cellchat@net$count, vertex.weight = groupSize,
weight.scale = TRUE, label.edge = FALSE,
title.name = "Number of interactions")
netVisual_circle(cellchat@net$weight, vertex.weight = groupSize,
weight.scale = TRUE, label.edge = FALSE,
title.name = "Interaction weights/strength")
# 7. 查看特定通路
netVisual_aggregate(cellchat, signaling = c("WNT"), layout = "circle")
netVisual_aggregate(cellchat, signaling = c("WNT"), layout = "chord")
netVisual_heatmap(cellchat, signaling = c("WNT"), color.heatmap = "Reds")
# 8. 配体-受体对贡献度
netAnalysis_contribution(cellchat, signaling = "WNT")
# 9. 气泡图展示所有显著通讯
netVisual_bubble(cellchat, sources.use = c(1, 2), targets.use = c(3, 4),
remove.isolate = FALSE)
第四步:CellPhoneDB分析流程¶
白话解释: CellPhoneDB是另一个常用工具,用Python开发。它的特点是使用"打乱标签"的方法来检验配体-受体对是否在某两种细胞之间显著共表达。如果打乱后的均值很少超过实际值,说明这个通讯是真实的而非偶然。
技术细节: CellPhoneDB采用置换检验(permutation test):随机打乱细胞类型标签1000次,计算每次打乱后配体-受体对的平均表达,与实际观察值比较得到p值。CellPhoneDB v5(Nature Protocols 2025)的主要更新包括:数据库扩充至2912个手动整理的互作(新增约1000个非肽类配体如激素、神经递质等)、CellSign模块(基于受体下游转录因子活性)、多模态整合策略(空间/ATAC-seq)、以及CellPhoneDBViz交互式可视化模块。
# CellPhoneDB v5 命令行运行
# 安装
pip install cellphonedb
# 方法1:统计分析(置换检验)
cellphonedb method statistical_analysis \
cellphonedb_meta.txt \
cellphonedb_count.txt \
--counts-data hgnc_symbol \
--threads 8 \
--iterations 1000 \
--threshold 0.1 \
--output-path ./cpdb_results
# 方法2:DEG分析(基于差异基因)
cellphonedb method degs_analysis \
cellphonedb_meta.txt \
cellphonedb_count.txt \
degs_file.txt \
--counts-data hgnc_symbol \
--threshold 0.1 \
--output-path ./cpdb_degs_results
# CellPhoneDB 结果解析与可视化
import pandas as pd
from cellphonedb.utils import db_utils
# 读取结果
means = pd.read_csv("cpdb_results/means.txt", sep="\t")
pvalues = pd.read_csv("cpdb_results/pvalues.txt", sep="\t")
significant = pd.read_csv("cpdb_results/significant_means.txt", sep="\t")
# 过滤显著互作 (p < 0.05)
# pvalues的列为细胞类型对(如 T_cells|Macrophages)
celltype_cols = [c for c in pvalues.columns if '|' in c]
sig_mask = pvalues[celltype_cols] < 0.05
# 统计每个细胞类型对的显著互作数
sig_counts = sig_mask.sum()
print(sig_counts.sort_values(ascending=False).head(20))
# CellPhoneDB v5 内置可视化
from cellphonedb.utils import vizutils
vizutils.dot_plot(
means_path="cpdb_results/means.txt",
pvalues_path="cpdb_results/pvalues.txt",
rows=["PDGFA_PDGFRA", "VEGFA_FLT1", "TNF_TNFRSF1A"],
columns=["Fibroblast|Endothelial", "Macrophage|T_cell"],
output_path="cpdb_dotplot.pdf"
)
第五步:NicheNet分析流程¶
白话解释: NicheNet与前两个工具思路不同。它不只是看配体-受体是否共表达,而是进一步追问:某个配体到底有没有真正影响靶细胞的基因表达?它通过整合已知的信号转导网络,预测哪些配体最可能导致了我们观察到的靶基因表达变化。
技术细节: NicheNet整合了配体-受体互作、信号转导通路、基因调控网络三层信息,构建先验模型。通过计算配体活性分数(ligand activity score),评估候选配体对靶基因集的调控能力。输入需要: 1. 发送细胞中表达的配体列表 2. 接收细胞的差异基因(靶基因集) 3. 接收细胞的背景基因集
# === NicheNet 分析流程 ===
library(nichenetr)
library(Seurat)
library(tidyverse)
# 加载先验模型
ligand_target_matrix <- readRDS("ligand_target_matrix.rds")
lr_network <- readRDS("lr_network.rds")
weighted_networks <- readRDS("weighted_networks.rds")
# 定义发送和接收细胞
sender_celltypes <- c("Macrophage", "Dendritic_cell")
receiver_celltype <- "CD8_T_cell"
# 获取接收细胞的差异基因作为靶基因集
seurat_obj_receiver <- subset(seurat_obj, celltype == receiver_celltype)
DE_genes <- FindMarkers(seurat_obj, ident.1 = "Disease", ident.2 = "Control",
subset.ident = receiver_celltype)
geneset_oi <- rownames(DE_genes %>% filter(p_val_adj < 0.05 & abs(avg_log2FC) > 0.5))
# 获取接收细胞表达的背景基因
background_expressed_genes <- rownames(seurat_obj_receiver)[
Matrix::rowMeans(GetAssayData(seurat_obj_receiver) > 0) >= 0.10
]
# 获取发送细胞表达的配体
sender_cells <- subset(seurat_obj, celltype %in% sender_celltypes)
expressed_ligands <- rownames(sender_cells)[
Matrix::rowMeans(GetAssayData(sender_cells) > 0) >= 0.10
]
ligands <- intersect(expressed_ligands, lr_network$from)
# 获取接收细胞表达的受体
expressed_receptors <- rownames(seurat_obj_receiver)[
Matrix::rowMeans(GetAssayData(seurat_obj_receiver) > 0) >= 0.10
]
receptors <- intersect(expressed_receptors, lr_network$to)
# 过滤合法的配体-受体对
lr_network_filtered <- lr_network %>%
filter(from %in% ligands & to %in% receptors)
potential_ligands <- unique(lr_network_filtered$from)
# 预测配体活性
ligand_activities <- predict_ligand_activities(
geneset = geneset_oi,
background_expressed_genes = background_expressed_genes,
ligand_target_matrix = ligand_target_matrix,
potential_ligands = potential_ligands
)
# 排序取top配体
best_upstream_ligands <- ligand_activities %>%
arrange(-aupr_corrected) %>%
pull(test_ligand) %>%
head(30)
# 配体-靶基因热图
active_ligand_target <- get_active_ligand_target_links(
best_upstream_ligands, geneset_oi, ligand_target_matrix, n = 200
)
vis_ligand_target <- prepare_ligand_target_visualization(
active_ligand_target, ligand_target_matrix, cutoff = 0.33
)
p <- make_heatmap_ggplot(vis_ligand_target, "Prioritized ligands",
"Predicted target genes",
legend_title = "Regulatory potential")
第六步:通讯模式与多条件比较¶
白话解释: 细胞通讯不是孤立的"一对一"对话,而是存在"群聊模式"——多种细胞通过同一套信号通路协调行动。CellChat可以用NMF(非负矩阵分解)提取这些通讯模式。另外,在疾病研究中,比较疾病vs正常两种条件下的通讯差异非常重要。
技术细节: CellChat v2支持多条件比较分析: 1. 分别对各条件构建CellChat对象 2. 合并后进行比较分析 3. 识别增强/减弱的信号通路
# === CellChat 多条件比较 ===
# 分别创建两个条件的CellChat对象
cellchat_ctrl <- createCellChat(data_ctrl, meta = meta_ctrl, group.by = "celltype")
cellchat_disease <- createCellChat(data_disease, meta = meta_disease, group.by = "celltype")
# 分别运行完整分析(同上流程)
# ... 省略中间步骤 ...
# 合并用于比较
object.list <- list(Control = cellchat_ctrl, Disease = cellchat_disease)
cellchat_merged <- mergeCellChat(object.list, add.names = names(object.list))
# 比较互作数量和强度
gg1 <- compareInteractions(cellchat_merged, show.legend = FALSE, group = c(1, 2))
gg2 <- compareInteractions(cellchat_merged, show.legend = FALSE,
group = c(1, 2), measure = "weight")
gg1 + gg2
# 差异互作网络
netVisual_diffInteraction(cellchat_merged, weight.scale = TRUE)
netVisual_diffInteraction(cellchat_merged, weight.scale = TRUE, measure = "weight")
# 差异热图
netVisual_heatmap(cellchat_merged)
# 识别上调/下调的信号通路
gg <- rankNet(cellchat_merged, mode = "comparison", stacked = TRUE, do.stat = TRUE)
gg
# === 通讯模式分析(NMF) ===
# 选择模式数(通过Cophenetic和Silhouette指标)
selectK(cellchat, pattern = "outgoing")
# 识别传出通讯模式
cellchat <- identifyCommunicationPatterns(cellchat, pattern = "outgoing", k = 3)
netAnalysis_river(cellchat, pattern = "outgoing")
netAnalysis_dot(cellchat, pattern = "outgoing")
# 识别传入通讯模式
cellchat <- identifyCommunicationPatterns(cellchat, pattern = "incoming", k = 4)
netAnalysis_river(cellchat, pattern = "incoming")
第七步:信号通路层级分析与中心性评估¶
白话解释: 在通讯网络中,有些细胞像"意见领袖"一样传播很多信号(高传出中心性),有些细胞像"信息汇聚点"一样接收很多信号(高传入中心性)。通过计算网络中心性指标,可以识别哪些细胞在通讯网络中扮演关键角色。
技术细节:
# 网络中心性分析
cellchat <- netAnalysis_computeCentrality(cellchat, slot.name = "netP")
# 热图展示信号通路的中心性
netAnalysis_signalingRole_network(cellchat, signaling = "WNT",
width = 8, height = 2.5,
font.size = 10)
# 散点图:传出vs传入信号强度
gg <- netAnalysis_signalingRole_scatter(cellchat)
gg
# 识别主要的sender/receiver/mediator/influencer
gg1 <- netAnalysis_signalingRole_heatmap(cellchat, pattern = "outgoing")
gg2 <- netAnalysis_signalingRole_heatmap(cellchat, pattern = "incoming")
gg1 + gg2
# 信号通路相似性聚类
cellchat <- computeNetSimilarity(cellchat, type = "functional")
cellchat <- netEmbedding(cellchat, type = "functional")
cellchat <- netClustering(cellchat, type = "functional")
netVisual_embedding(cellchat, type = "functional", label.size = 3.5)
实战命令速查¶
# === 环境配置 ===
# R包安装
# install.packages("devtools")
# CellChat v2已迁移至新仓库(旧仓库sqjin/CellChat已停止维护)
# devtools::install_github("jinworks/CellChat")
# devtools::install_github("saeyslab/nichenetr")
# Python环境
pip install cellphonedb scanpy
# === CellPhoneDB 命令行 ===
cellphonedb method statistical_analysis meta.txt counts.txt \
--counts-data hgnc_symbol --threads 8 --output-path ./results
# === CellPhoneDB v5 数据库更新 ===
cellphonedb database download --version v5.0.0
# === LIANA+(多方法整合框架) ===
# LIANA+已发展为Python包(liana-py),是scverse生态的一部分
# pip install liana
# R版liana仍可用:devtools::install_github("saezlab/liana")
library(liana)
liana_results <- liana_wrap(seurat_obj, method = c("cellchat", "natmi", "sca"))
liana_aggregate <- liana_results %>% liana_aggregate()
# 注:LIANA+ Python版(liana-py)功能更全,支持空间数据、多模态、代谢物通讯等
面试常问点¶
Q1: CellChat和CellPhoneDB的原理区别是什么?¶
A: CellChat基于质量作用定律建模通讯概率,考虑了配体、受体及辅因子的联合表达,统计推断使用的是概率框架。CellPhoneDB采用置换检验(permutation test),随机打乱细胞类型标签来构建零分布,检验配体-受体对的共表达是否显著偏离随机预期。CellChat更强调信号通路层面的整合分析,而CellPhoneDB更侧重于单个配体-受体对的统计显著性。
Q2: NicheNet与CellChat/CellPhoneDB有何不同?¶
A: CellChat和CellPhoneDB主要基于配体-受体的共表达来推断通讯,是"表达驱动"的方法。NicheNet则是"功能驱动"的方法——它整合了信号转导和基因调控网络的先验知识,评估候选配体是否能解释靶细胞中观察到的基因表达变化。简单说,前者回答"谁在说话",NicheNet回答"谁说的话真正起了作用"。
Q3: 细胞通讯分析中,细胞类型注释的粒度如何选择?¶
A: 注释粒度需平衡生物学意义和统计效力。过粗的注释(如只分T/B/Myeloid)会掩盖亚群特异的通讯;过细的拆分(如过度聚类到几十个亚群)则每个亚群细胞数太少,统计检验缺乏power。建议:每个细胞类型至少50-100个细胞;功能相关的亚群应拆分(如CD4 vs CD8 T细胞);功能相似的小群可合并。
Q4: 如何评估通讯推断结果的可靠性?¶
A: 主要策略包括:(1) 多工具交叉验证——用CellChat、CellPhoneDB、LIANA等不同方法分析同一数据,取交集;(2) 生物学验证——检查推断的配体-受体对是否有文献支持;(3) 空间信息验证——如果有空间转录组数据,确认通讯细胞确实在空间上邻近;(4) 实验验证——流式、免疫荧光共定位确认蛋白水平表达。
Q5: CellChat中computeCommunProb的type参数如何选择?¶
A: triMean(默认)使用截断均值,更保守,适合大多数场景,能有效过滤低表达噪声。truncatedMean在指定阈值处截断后计算均值。median最保守。对于稀疏数据或罕见细胞群体,可尝试降低截断阈值或使用truncatedMean。建议先用默认参数跑完全流程,再根据结果调整。
Q6: 多条件通讯比较中,如何处理细胞组成差异?¶
A: 不同条件下细胞组成差异(如疾病样本某种细胞增多)会影响通讯推断。CellChat v2通过population size参数控制是否校正细胞数量差异。建议:(1) 比较时使用population.size = TRUE校正细胞比例;(2) 报告各条件的细胞类型比例;(3) 必要时下采样使两个条件的细胞数相当。
Q7: LIANA框架的优势是什么?¶
A: LIANA(LIgand-receptor ANAlysis)提供统一接口调用多种通讯推断方法(CellChat、CellPhoneDB、NATMI、SingleCellSignalR等),并通过aggregate ranking整合多种方法的结果。优势在于:(1) 减少单一方法的偏倚;(2) 一致的输入输出格式;(3) 提供共识排名降低假阳性。
易错点¶
1. 使用原始count矩阵而非归一化矩阵¶
CellChat需要log-normalized数据作为输入。如果误用原始counts,会导致高表达基因主导通讯推断,结果偏差严重。对于CellPhoneDB,虽然其内部会做归一化,但输入一致的归一化数据仍是最佳实践。
2. 忽略多亚基受体复合物¶
许多受体是由多个亚基组成的复合物(如IL-6受体由IL6R和IL6ST组成)。简单方法只检测单基因共表达,会遗漏需要多亚基同时表达才能发挥功能的受体。CellPhoneDB和CellChat都支持复合物,使用这些工具时应启用相关选项。
3. 过度解读低表达配体-受体对¶
单细胞数据存在严重的dropout问题。即使某配体-受体对通过了统计检验,如果其表达水平极低(如仅在<5%的细胞中检测到),其生物学意义也很可疑。建议设置最小表达百分比阈值(如10%-25%)。
4. 忽略空间距离约束¶
通讯分析假设配体和受体"能够"互作,但分泌型信号有扩散距离限制,而细胞-细胞接触型信号要求物理接触。在没有空间信息时,所有细胞类型都被假设为潜在互作对象,这对接触型信号尤其可能产生假阳性。
5. 物种数据库混用¶
CellChatDB有人和小鼠版本,使用错误物种的数据库会导致基因符号不匹配。CellPhoneDB默认使用人类数据库,分析小鼠数据需要先进行基因名转换。
6. NicheNet先验模型版本不匹配¶
NicheNet的先验模型(ligand_target_matrix等)需从Zenodo下载,不同版本与不同版本的R包匹配。使用错误版本的模型文件会导致基因不匹配或结果异常。
7. 未考虑批次效应对通讯推断的影响¶
如果多个样本来自不同批次,批次效应可能在通讯推断中被误认为生物信号。建议在通讯分析前进行批次校正(如Harmony/Scanorama),或在多条件比较时将批次信息纳入考量。
补充知识¶
CellChat v2 新特性¶
CellChat v2(Nature Protocols 2024)增加了以下功能: - CellChatDB v2:新增1000+非蛋白互作(代谢信号、突触信号等),并提供updateCellChatDB函数用于数据库更新 - 支持空间转录组数据(Visium/MERFISH)的距离约束通讯推断 - 改进的多条件比较算法 - 新增通讯信息流分析(communication information flow) - Interactive CellChat Explorer:内置runCellChatApp交互式浏览器 - 更高效的大规模数据处理(30万细胞约15分钟) - 注意:CellChat已迁移至新仓库jinworks/CellChat,旧仓库sqjin/CellChat已归档停止维护;CellChat v3(Spatial CellChat)已在jinworks/SpatialCellChat开发
其他通讯推断工具¶
- NATMI:基于边权重(表达量×特异性)排序互作
- SingleCellSignalR:使用LRscore整合表达和评分
- Connectome:支持加权差异通讯分析
- COMMOT:专为空间转录组设计的通讯分析
- CellCall:整合转录因子活性进行通讯推断
配体-受体数据库整合平台¶
- OmniPath:整合CellPhoneDB/KEGG/Reactome等多个数据库
- CellTalkDB:手动文献整理的高置信度LR对
- ICELLNET:专注免疫细胞通讯的数据库
从通讯到功能的验证策略¶
- Spatial proximity验证:空间转录组确认通讯细胞的物理邻近性
- 蛋白水平验证:流式/IHC/IF确认配体受体蛋白表达
- 功能验证:体外共培养+抗体阻断/基因敲除
- 临床相关性:通讯强度与临床表型(预后/分期/用药反应)的关联
引用推荐¶
- CellChat v1: Jin et al., Nature Communications, 2021
- CellChat v2: Jin et al., Nature Protocols, 2024
- CellPhoneDB v5: Troulé et al., Nature Protocols, 2025
- NicheNet: Browaeys et al., Nature Methods, 2020
- LIANA+: Dimitrov et al., Nature Cell Biology, 2024