首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >基于Seurat的空转单样本数据分析流程学习(五)-cellchat

基于Seurat的空转单样本数据分析流程学习(五)-cellchat

原创
作者头像
凑齐六个字吧
发布2025-09-28 14:27:40
发布2025-09-28 14:27:40
3320
举报
文章被收录于专栏:单细胞单细胞

CellChat是一个专门用于分析单细胞数据中细胞–细胞通讯的R包。它可以根据单细胞表达数据,结合配体–受体数据库推断细胞群体之间的信号网络,并为每个配体–受体对计算通信概率,同时通过置换检验评估统计显著性。此外,CellChat可进行网络分析,计算中心性、信息流向和信号强度,从而识别主要信号源和受体群体,并提供气泡图、热图、网络图以及空间可视化等多种方式展示细胞间通讯。

分析流程
1.导入
代码语言:javascript
复制
rm(list = ls())
library(Seurat)
library(tidyverse)
library(cowplot)
library(patchwork)
library(CellChat)
library(patchwork)
library(qs)

scRNA <- qread("sce.all.qs")

dir.create("0-cellchat")   
setwd("0-cellchat")   
2.加载数据
代码语言:javascript
复制
# 展示组织图像及其注释过的 spot
color.use <- scPalette(nlevels(scRNA$second_type)); 
names(color.use) <- levels(scRNA)

Idents(scRNA) <- "second_type"
Seurat::SpatialDimPlot(scRNA, label = T, 
                       label.size = 3, cols = color.use)
3.空间数据预处理

CellChat 需要四个用户输入(官网有详细解释):

  1. data.input(斑点/细胞的基因表达数据). 数据格式:基因应在行中(带有行名),细胞应在列中(带有列名)。 要求:输入的数据需要经过标准化(例如,先进行文库大小标准化,然后加上伪计数 1 进行对数转换)。如果用户提供的是原始计数矩阵,CellChat 提供 normalizeData函数来进行文库大小标准化并完成对数转换。
  2. meta(用户指定的细胞标签和样本标签). 数据格式:一个数据框(行是细胞,行名标识),其中包含细胞相关信息,用于定义细胞分组。要求:在进行空间转录组分析时,需要提供一列名为 samples的列,用于聚合多个样本或重复实验,以便分析细胞间通讯。注意:如果要比较不同条件下的通讯情况,用户仍然需要为每个条件单独创建一个CellChat对象。
  3. coordinates(斑点/细胞的空间坐标). 数据格式:一个数据框,每一行对应一个细胞/斑点的质心坐标(位置)。
  4. spatial.factors(空间距离因子). 数据格式:一个包含两个距离因子 ratio 和 tol 的数据框。 说明:ratio:坐标转换因子,用于将空间坐标从像素(Pixels)或其他单位转换为微米(Micrometers, μm)。例如:设置 ratio = 0.18 表示 1 像素 = 0.18 μm。tol:容差因子,在比较中心到中心距离与 interaction.range 时增加鲁棒性。一般可设为细胞/斑点直径的一半(单位:μm)。
代码语言:javascript
复制
# 矩阵
data.input <- GetAssayData(scRNA, assay ="SCT",slot ="data" )

# 临床信息
Idents(scRNA) <- "second_type"
meta = data.frame(labels = Seurat::Idents(scRNA), #要选择特定的Idents
                  samples = "sample1", 
                  row.names = names(Seurat::Idents(scRNA)))
meta$samples <- factor(meta$samples)

# 坐标
coordinates <- GetTissueCoordinates(
  scRNA,
  scale = NULL,
  cols = c("imagerow", "imagecol")
)
spatial.locs <- as.matrix(coordinates[, c("x", "y")])

# 缩放因子
scalefactors <- jsonlite::fromJSON(
  txt = file.path(
    "~/Desktop/Spatial_scRNA/GSE281978/GSM8633891/spatial",
    "scalefactors_json.json"
  )
)

spot.size <- 65   # 10X Visium: spot 直径 ~55 μm,Gap ~10 μm,总约 65 μm

# 转换因子 (像素 -> 微米)
conversion.factor <- spot.size / scalefactors$spot_diameter_fullres

spatial.factors <- data.frame(
  ratio = conversion.factor,
  tol   = spot.size / 2   # 容差 = 半个 spot 大小
)

d.spatial <- computeCellDistance(
  coordinates = spatial.locs,
  ratio       = spatial.factors$ratio,
  tol         = spatial.factors$tol
)
min(d.spatial[d.spatial!=0]) 
4. 创建CellChat对象
代码语言:javascript
复制
cellchat <- createCellChat(object = data.input, 
                           meta = meta, 
                           group.by = "labels",
                           datatype = "spatial", 
                           coordinates = spatial.locs, 
                           spatial.factors = spatial.factors)

cellchat
5. 设置配体-受体相互作用数据库
代码语言:javascript
复制
# 要注意数据库的选择,human还是mouse
CellChatDB <- CellChatDB.human 
showDatabaseCategory(CellChatDB)
dplyr::glimpse(CellChatDB$interaction)

# 使用CellChatDB的一个子集进行细胞-细胞通讯分析
CellChatDB.use <- subsetDB(CellChatDB,
                           search = "Secreted Signaling",
                           key = "annotation") # use Secreted Signaling

# 使用CellChatDB的所有子集进行分析
CellChatDB.use <- CellChatDB 

# 设定数据库所用数据集
cellchat@DB <- CellChatDB.use
6.预处理用于细胞间通讯分析的表型数据

为了推断细胞状态特异性的通讯,CellChat会先识别某个细胞群体中过表达的配体或受体,然后在配体或受体任意一方过表达的情况下,识别相应的过表达配体–受体相互作用。

还提供了一个将基因表达数据投影到蛋白质–蛋白质相互作用(PPI)网络的功能。具体来说,该功能使用扩散过程,根据高置信度实验验证的蛋白质–蛋白质网络中定义的邻居关系,对基因表达值进行平滑。当分析测序深度较浅的单细胞数据时,这一功能尤其有用,因为投影可以减少信号基因的 dropout 效应,特别是针对配体或受体亚基可能出现的零表达情况。

虽然有人可能会担心这种扩散过程可能引入伪影,但实际上它仅会引入非常微弱的通讯信号。默认情况下,CellChat 使用原始数据(即object@data.signaling)而非投影后的数据。如果需要使用投影数据,用户应在运行computeCommunProb之前先运行 smoothData,然后在运行 computeCommunProb时将参数 raw.use = FALSE。

代码语言:javascript
复制
# 对子信号基因的表达数据进行子集提取,以节省计算成本
cellchat <- subsetData(cellchat) # 即便采用完整数据库,这一步骤仍然必不可少
future::plan("multisession", workers = 4) 
cellchat <- identifyOverExpressedGenes(cellchat)
cellchat <- identifyOverExpressedInteractions(cellchat, variable.both = F)
#> The number of highly variable ligand-receptor pairs used for signaling inference is 1469 
 
#将基因表达数据投影到蛋白质–蛋白质相互作用网络(可选:在运行时,用户应在 computeCommunProb() 函数中将 raw.use = FALSE,以使用投影后的数据)
cellchat <- smoothData(cellchat, adj=PPI.human) # PPI.mouse
7.细胞间通讯网络的推理

推断出的配体–受体对数量明显取决于用于计算每组细胞平均基因表达的方法。默认情况下,CellChat使用一种统计上稳健的均值方法——三中位数(trimean),与其他方法相比,这种方法产生的相互作用数量更少。然而发现CellChat在预测强相互作用方面表现良好,这对于缩小进一步实验验证的相互作用范围非常有帮助。

在computeCommunProb中,提供了使用其他方法(如5%或10%截断均值)来计算平均基因表达的选项。值得注意的是,三中位数近似于25%截断均值,这意味着如果某组中表达的细胞比例小于25%,该组的平均基因表达值为零。

要使用10%截断均值,用户可以设置type="truncatedMean"和trim = 0.1。为了确定合适的截断值,CellChat 提供了函数computeAveExpr,可用于检查感兴趣信号基因的平均表达

7.1 计算通信概率并推断细胞间通信网络

为了快速检查推断结果,用户可以在computeCommunProb中将nboot = 20,设置为较小的置换次数。此时,“pvalue < 0.05”表示所有置换结果都不大于观察到的通信概率。

如果在研究的生物过程中未预测到已知的信号通路,用户可以尝试使用 truncatedMean 并设置较低的 trim 值,从而改变每组细胞平均基因表达的计算方法。

在推断接触依赖性或旁分泌信号时,用户应提供contact.range的值,并将 contact.dependent = TRUE。简而言之,用户可以设置 contact.range = 10,这是一个典型的人类细胞大小。然而,对于低分辨率的空间数据(如 10X Visium),应将其设置为细胞中心到中心的距离(例如10X Visium数据可设置contact.range = 100)。

在本示例中,没有使用来自Cell–Cell Contact信号的配体–受体对,因此可以将contact.dependent = FALSE 并设置 contact.range = NULL。但作为示例说明,使用了以下设置,其结果与上述方法相同。

代码语言:javascript
复制
# 这一步骤非常缓慢
cellchat <- computeCommunProb(cellchat, type = "truncatedMean", trim = 0.1,
                              distance.use = TRUE, 
                              interaction.range = 250, 
                              scale.distance = 0.01,
                              contact.dependent = TRUE, 
                              contact.range = 100)

# 如果某些细胞组中的细胞数量较少,用户可以选择过滤掉细胞间的通信。默认情况下,每个细胞组中需要至少有 10 个细胞才能进行细胞间通信。
cellchat <- filterCommunication(cellchat, min.cells = 10)
8.提取推断的细胞间通讯网络为数据框

提供了一个函数subsetCommunication,用于轻松访问感兴趣的细胞间通讯。例如:df.net <- subsetCommunication(cellchat)

返回一个数据框,其中包含所有在配体/受体水平上推断出的细胞间通讯。如果将slot.name ="netP"设置为参数,则可以访问在信号通路水平上推断出的通讯。

df.net <- subsetCommunication(cellchat, sources.use = c(1,2), targets.use = c(4,5));显示从细胞群1和2向细胞群4和5发送的推断细胞间通讯。

df.net <- subsetCommunication(cellchat, signaling = c("WNT", "TGFb"));给出了由信号通路WNT和TGFb介导的细胞间通讯的推断结果。

8.1 在信号通路水平上推断细胞间通讯

CellChat 通过汇总与每个信号通路相关的所有配体-受体相互作用中的通讯概率,在信号通路水平上计算通讯概率。

代码语言:javascript
复制
cellchat <- computeCommunProbPathway(cellchat)
8.2 计算细胞间通讯网络的汇总

通过计算连接数或汇总通信概率来计算细胞间通信网络的聚合情况。使用者还可以通过设置sources.use和targets.use来计算细胞群子集之间的聚合网络

代码语言:javascript
复制
cellchat <- aggregateNet(cellchat)
8.3可视化聚合的细胞间通讯网

例如,使用圆形图或热力图展示任意两个细胞群体之间的相互作用次数或总相互作用强度(权重)。这里选择的分泌信号数据

代码语言:javascript
复制
groupSize <- as.numeric(table(cellchat@idents))
par(mfrow = c(1,2), xpd=TRUE)
netVisual_circle(cellchat@net$count, vertex.weight = rowSums(cellchat@net$count), weight.scale = T, label.edge= F, title.name = "Number of interactions")
netVisual_circle(cellchat@net$weight, vertex.weight = rowSums(cellchat@net$weight), weight.scale = T, label.edge= F, title.name = "Interaction weights/strength")

netVisual_heatmap(cellchat, measure = "count", color.heatmap = "Blues")
#> Do heatmap based on a single object

netVisual_heatmap(cellchat, measure = "weight", color.heatmap = "Blues")
9 可视化
代码语言:javascript
复制
pathways.show <- c("IGF") 
# Circle plot
par(mfrow=c(1,1), xpd = TRUE) # `xpd = TRUE` should be added to show the title
netVisual_aggregate(cellchat, signaling = pathways.show, layout = "circle")
代码语言:javascript
复制
# Spatial plot
par(mfrow=c(1,1))
netVisual_aggregate(cellchat, signaling = pathways.show, layout = "spatial", edge.width.max = 2, vertex.size.max = 1, alpha.image = 0.2, vertex.label.cex = 3.5)
代码语言:javascript
复制
# 计算并可视化网络中心性得分
cellchat <- netAnalysis_computeCentrality(cellchat, slot.name = "netP") # 槽 ‘netP’ 表示推断出的信号通路的细胞间通讯网络
# 使用热图可视化计算出的中心性分数,便于快速识别各细胞群在主要信号传导中的作用
par(mfrow=c(1,1))
netAnalysis_signalingRole_network(cellchat, signaling = pathways.show, width = 8, height = 2.5, font.size = 10)
代码语言:javascript
复制
# 用户在可视化信号网络时,可以在空间转录组图上展示这些信息,例如,圆圈越大表示接收到的信号越强
par(mfrow=c(1,1))
netVisual_aggregate(cellchat, signaling = pathways.show, layout = "spatial", edge.width.max = 2, alpha.image = 0.2, vertex.weight = "incoming", vertex.size.max = 4, vertex.label.cex = 3.5)

# 在组织中可视化基因表达分布
spatialFeaturePlot(cellchat, features = c("Igf1","Igf1r"), point.size = 0.8, color.heatmap = "Reds", direction = 1)

# 输入一个配体–受体对
spatialFeaturePlot(cellchat, pairLR.use = "IGF1_IGF1R", point.size = 0.5, do.binary = FALSE, cutoff = 0.05, enriched.only = F, color.heatmap = "Reds", direction = 1)

# 输入一个配体–受体对,并以二值形式显示其表达情况
spatialFeaturePlot(cellchat, pairLR.use = "IGF1_IGF1R", point.size = 1, do.binary = TRUE, cutoff = 0.05, enriched.only = F, color.heatmap = "Reds", direction = 1)
10.交互式cellchat探索细胞间 通讯
代码语言:javascript
复制
runCellChatApp(cellchat)
参考资料:
  1. cellchat: https://htmlpreview.github.io/?https://github.com/jinworks/CellChat/blob/master/tutorial/CellChat_analysis_of_spatial_transcriptomics_data.html
  2. cellchat-空转常见疑问:https://htmlpreview.github.io/?https://github.com/jinworks/CellChat/blob/master/tutorial/FAQ_on_applying_CellChat_to_spatial_transcriptomics_data.html

:若对内容有疑惑或者有发现明确错误的朋友,请联系后台。更多相关内容可关注公众号:生信方舟

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 分析流程
    • 1.导入
    • 2.加载数据
    • 3.空间数据预处理
    • 4. 创建CellChat对象
    • 5. 设置配体-受体相互作用数据库
    • 6.预处理用于细胞间通讯分析的表型数据
    • 7.细胞间通讯网络的推理
      • 7.1 计算通信概率并推断细胞间通信网络
    • 8.提取推断的细胞间通讯网络为数据框
      • 8.1 在信号通路水平上推断细胞间通讯
      • 8.2 计算细胞间通讯网络的汇总
      • 8.3可视化聚合的细胞间通讯网
    • 9 可视化
    • 10.交互式cellchat探索细胞间 通讯
  • 参考资料:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档