
CellChat是一个专门用于分析单细胞数据中细胞–细胞通讯的R包。它可以根据单细胞表达数据,结合配体–受体数据库推断细胞群体之间的信号网络,并为每个配体–受体对计算通信概率,同时通过置换检验评估统计显著性。此外,CellChat可进行网络分析,计算中心性、信息流向和信号强度,从而识别主要信号源和受体群体,并提供气泡图、热图、网络图以及空间可视化等多种方式展示细胞间通讯。
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") # 展示组织图像及其注释过的 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)
CellChat 需要四个用户输入(官网有详细解释):
# 矩阵
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]) cellchat <- createCellChat(object = data.input,
meta = meta,
group.by = "labels",
datatype = "spatial",
coordinates = spatial.locs,
spatial.factors = spatial.factors)
cellchat# 要注意数据库的选择,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
为了推断细胞状态特异性的通讯,CellChat会先识别某个细胞群体中过表达的配体或受体,然后在配体或受体任意一方过表达的情况下,识别相应的过表达配体–受体相互作用。
还提供了一个将基因表达数据投影到蛋白质–蛋白质相互作用(PPI)网络的功能。具体来说,该功能使用扩散过程,根据高置信度实验验证的蛋白质–蛋白质网络中定义的邻居关系,对基因表达值进行平滑。当分析测序深度较浅的单细胞数据时,这一功能尤其有用,因为投影可以减少信号基因的 dropout 效应,特别是针对配体或受体亚基可能出现的零表达情况。
虽然有人可能会担心这种扩散过程可能引入伪影,但实际上它仅会引入非常微弱的通讯信号。默认情况下,CellChat 使用原始数据(即object@data.signaling)而非投影后的数据。如果需要使用投影数据,用户应在运行computeCommunProb之前先运行 smoothData,然后在运行 computeCommunProb时将参数 raw.use = FALSE。
# 对子信号基因的表达数据进行子集提取,以节省计算成本
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推断出的配体–受体对数量明显取决于用于计算每组细胞平均基因表达的方法。默认情况下,CellChat使用一种统计上稳健的均值方法——三中位数(trimean),与其他方法相比,这种方法产生的相互作用数量更少。然而发现CellChat在预测强相互作用方面表现良好,这对于缩小进一步实验验证的相互作用范围非常有帮助。
在computeCommunProb中,提供了使用其他方法(如5%或10%截断均值)来计算平均基因表达的选项。值得注意的是,三中位数近似于25%截断均值,这意味着如果某组中表达的细胞比例小于25%,该组的平均基因表达值为零。
要使用10%截断均值,用户可以设置type="truncatedMean"和trim = 0.1。为了确定合适的截断值,CellChat 提供了函数computeAveExpr,可用于检查感兴趣信号基因的平均表达
为了快速检查推断结果,用户可以在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。但作为示例说明,使用了以下设置,其结果与上述方法相同。
# 这一步骤非常缓慢
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)提供了一个函数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介导的细胞间通讯的推断结果。
CellChat 通过汇总与每个信号通路相关的所有配体-受体相互作用中的通讯概率,在信号通路水平上计算通讯概率。
cellchat <- computeCommunProbPathway(cellchat)通过计算连接数或汇总通信概率来计算细胞间通信网络的聚合情况。使用者还可以通过设置sources.use和targets.use来计算细胞群子集之间的聚合网络
cellchat <- aggregateNet(cellchat)例如,使用圆形图或热力图展示任意两个细胞群体之间的相互作用次数或总相互作用强度(权重)。这里选择的分泌信号数据
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")
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")
# 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)
# 计算并可视化网络中心性得分
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)
# 用户在可视化信号网络时,可以在空间转录组图上展示这些信息,例如,圆圈越大表示接收到的信号越强
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)
runCellChatApp(cellchat)
注:若对内容有疑惑或者有发现明确错误的朋友,请联系后台。更多相关内容可关注公众号:生信方舟 。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。