跳转至

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其他工具)

特性CellChatCellPhoneDBNicheNet
方法质量作用+模式识别统计检验先验知识+机器学习
数据库自建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")