744. 单细胞通讯分析CellChat¶
一句话概述:从单细胞RNA-seq数据中推断细胞之间通过配体-受体互作的通讯网络——就像"窃听"细胞之间的"电话",看谁在跟谁说话、说的什么、说了多少。
核心知识点速查表¶
| 概念 | 白话解释 | 关键工具 |
|---|---|---|
| 配体(Ligand) | 细胞分泌的"信号分子" | CellChat数据库 |
| 受体(Receptor) | 接收信号的"天线" | CellChat数据库 |
| 信号通路 | 多个配体-受体对组成的通讯通道 | CellChat内置 |
| 通讯概率 | 量化两群细胞间通讯的强度 | 质量作用模型 |
| 信息流 | 某个通路在整个系统中的活跃程度 | CellChat计算 |
| CellChatDB | 配体-受体互作数据库 | 人/小鼠/斑马鱼 |
一、原理(白话版)¶
1.1 细胞通讯是什么?¶
在组织中,细胞不是孤立的: - A细胞分泌一个蛋白(配体,如WNT) - B细胞表面有对应的受体(如FZD) - 配体结合受体 → B细胞收到信号 → 做出反应
CellChat做的事情: 1. 检查每种细胞表达了哪些配体和受体 2. 如果A细胞表达配体X,B细胞表达受体Y,且X-Y是已知的互作对 3. 计算A→B通过X-Y通讯的概率 4. 画出完整的"通讯网络图"
1.2 CellChat的特点(vs其他工具)¶
| 特性 | CellChat | CellPhoneDB | NicheNet |
|---|---|---|---|
| 方法 | 质量作用+模式识别 | 统计检验 | 先验知识+机器学习 |
| 数据库 | 自建CellChatDB | 自建 | 整合多个数据库 |
| 多亚基受体 | 支持 | 支持 | 不直接支持 |
| 比较分析 | 支持(v2核心功能) | 有限 | 不直接支持 |
| 空间信息 | v3支持 | 不支持 | 不支持 |
二、CellChat v2分析流程¶
2.1 安装¶
# ===== R语言安装CellChat =====
# 安装依赖
if (!requireNamespace("BiocManager", quietly=TRUE))
install.packages("BiocManager") # 安装BiocManager
BiocManager::install(c("ComplexHeatmap", "BiocGenerics")) # 安装Bioc依赖
# 安装CellChat v2
devtools::install_github("jinworks/CellChat") # 从GitHub安装最新版
# 验证
library(CellChat) # 加载CellChat
packageVersion("CellChat") # 查看版本
2.2 创建CellChat对象¶
# ===== CellChat完整分析流程 =====
library(CellChat) # 加载CellChat
library(Seurat) # 加载Seurat
library(patchwork) # 加载patchwork(组合图)
# 从Seurat对象创建CellChat对象
seurat_obj <- readRDS("seurat_processed.rds") # 读取处理好的Seurat对象
# 提取需要的信息
data.input <- GetAssayData(seurat_obj, assay="RNA",
layer="data") # 归一化后的表达矩阵
meta <- seurat_obj@meta.data # 元数据
cell.use <- rownames(meta) # 使用所有细胞
# 创建CellChat对象
cellchat <- createCellChat(
object = data.input, # 表达矩阵
meta = meta, # 元数据
group.by = "cell_type" # 按细胞类型分组
)
# 设置配体-受体数据库
CellChatDB <- CellChatDB.human # 使用人类数据库(小鼠用CellChatDB.mouse)
# 查看数据库
showDatabaseCategory(CellChatDB) # 查看通讯类型
# "Secreted Signaling" # 分泌型信号(最常见)
# "ECM-Receptor" # 细胞外基质-受体
# "Cell-Cell Contact" # 细胞-细胞接触
# 可以选择使用全部或部分数据库
CellChatDB.use <- CellChatDB # 使用全部(推荐)
# 或只看分泌型:
# CellChatDB.use <- subsetDB(CellChatDB, search="Secreted Signaling")
cellchat@DB <- CellChatDB.use # 设置数据库
2.3 推断通讯网络¶
# ===== 推断细胞通讯 =====
# 第一步:预处理 — 找到在数据中表达的配体-受体对
cellchat <- subsetData(cellchat) # 筛选数据库中实际表达的基因
# 第二步:识别过表达的配体、受体和互作
cellchat <- identifyOverExpressedGenes(cellchat) # 找过表达基因
cellchat <- identifyOverExpressedInteractions(cellchat) # 找过表达互作
# 第三步:计算通讯概率
cellchat <- computeCommunProb(
cellchat,
type = "triMean", # 使用截断均值(比均值更稳健)
population.size = TRUE # 考虑细胞群大小的影响
)
# 过滤低细胞数的通讯
cellchat <- filterCommunication(
cellchat,
min.cells = 10 # 每个细胞群至少10个细胞
)
# 第四步:在信号通路水平推断通讯
cellchat <- computeCommunProbPathway(cellchat) # 汇总到通路级别
# 第五步:汇总通讯网络
cellchat <- aggregateNet(cellchat) # 计算总的互作数量和强度
2.4 可视化¶
# ===== 可视化通讯网络 =====
# 1. 总互作数量和强度
par(mfrow=c(1,2)) # 1行2列布局
netVisual_circle(
cellchat@net$count, # 互作数量矩阵
vertex.weight = table(cellchat@idents), # 节点大小=细胞数
weight.scale = TRUE,
title.name = "Number of Interactions"
)
netVisual_circle(
cellchat@net$weight, # 互作强度矩阵
vertex.weight = table(cellchat@idents),
weight.scale = TRUE,
title.name = "Interaction Strength"
)
# 2. 查看特定通路的通讯
# 例如查看WNT通路
netVisual_aggregate(
cellchat,
signaling = "WNT", # 指定通路
layout = "circle" # 圆形布局
)
# 3. 气泡图:显示所有显著的配体-受体对
netVisual_bubble(
cellchat,
sources.use = c("Macrophage"), # 信号发送方
targets.use = c("T cell", "B cell"), # 信号接收方
remove.isolate = TRUE # 去掉没有互作的
)
# 4. 热图
netVisual_heatmap(
cellchat,
signaling = "WNT", # 特定通路
color.heatmap = "Reds"
)
# 5. 信号通路排名
netAnalysis_signalingRole_scatter(cellchat)
# x轴 = outgoing信号强度(发送)
# y轴 = incoming信号强度(接收)
2.5 比较分析(CellChat v2核心功能)¶
# ===== 比较两个条件的通讯差异 =====
# 例如:比较健康vs疾病
# 分别创建两个CellChat对象
cellchat_healthy <- createCellChat(...) # 健康组
cellchat_disease <- createCellChat(...) # 疾病组
# 对每个对象运行完整分析(省略详细代码)
# ...
# 合并进行比较
cellchat_list <- list(
Healthy = cellchat_healthy,
Disease = cellchat_disease
)
cellchat_merged <- mergeCellChat(
cellchat_list,
add.names = names(cellchat_list)
)
# 比较互作数量和强度
compareInteractions(
cellchat_merged,
show.legend = TRUE,
group = c(1, 2) # 比较第1和第2个条件
)
# 比较特定通路
netVisual_bubble(
cellchat_merged,
sources.use = c("Macrophage"),
targets.use = c("T cell"),
comparison = c(1, 2), # 比较两个条件
max.dataset = 2,
title.name = "Healthy vs Disease",
remove.isolate = TRUE
)
# 信息流比较(哪些通路活跃度变化最大)
rankNet(
cellchat_merged,
mode = "comparison",
stacked = TRUE,
do.stat = TRUE # 统计检验
)
三、常见报错与解决¶
| 报错信息 | 原因 | 解决方案 |
|---|---|---|
No significant interactions | 表达水平太低或分组太少 | 降低阈值或合并稀有细胞类型 |
Database gene mismatch | 基因名格式不一致 | 确保用HUGO gene symbols |
computeCommunProb: error | 某些细胞群太小 | filterCommunication(min.cells=10) |
mergeCellChat: dimension error | 两个对象的细胞类型不同 | 确保两个条件有相同的细胞类型标签 |
Memory error | 细胞数太多 | 每种细胞类型下采样到5000个 |
四、面试高频问题¶
Q1: CellChat如何计算通讯概率?¶
A: 使用简化的质量作用模型:通讯概率与配体表达量、受体表达量、以及辅因子表达量的乘积成正比。还考虑了多亚基受体的情况(所有亚基都表达才算)。
Q2: CellChat和CellPhoneDB的主要区别?¶
A: CellPhoneDB用置换检验评估显著性,CellChat用质量作用模型计算通讯概率。CellChat的优势在于:①支持比较分析(v2);②支持空间信息(v3);③有模式识别功能(找通讯模式)。
Q3: 如何验证预测的细胞通讯?¶
A: ①免疫荧光共定位实验验证配体和受体的共表达;②配体/受体敲除实验验证功能;③空间转录组验证空间邻近性;④已有文献中的实验验证。
五、速查表¶
# ===== CellChat速查 =====
# 安装
devtools::install_github("jinworks/CellChat")
# 创建对象
cellchat <- createCellChat(data, meta, group.by="cell_type")
cellchat@DB <- CellChatDB.human
# 分析流程
cellchat <- subsetData(cellchat)
cellchat <- identifyOverExpressedGenes(cellchat)
cellchat <- identifyOverExpressedInteractions(cellchat)
cellchat <- computeCommunProb(cellchat, type="triMean")
cellchat <- filterCommunication(cellchat, min.cells=10)
cellchat <- computeCommunProbPathway(cellchat)
cellchat <- aggregateNet(cellchat)
# 可视化
netVisual_circle(cellchat@net$count) # 网络圆图
netVisual_aggregate(cellchat, signaling="X") # 特定通路
netVisual_bubble(cellchat, sources="A", targets="B") # 气泡图
netAnalysis_signalingRole_scatter(cellchat) # 角色散点图
# 比较分析
merged <- mergeCellChat(list(A=cc1, B=cc2))
compareInteractions(merged)
rankNet(merged, mode="comparison")