写在前面
学习一个软件最好的方法就是啃它的官方文档。本着自己学习、分享他人的态度,分享官方文档的中文教程。软件可能随时更新,建议配合官方文档一起阅读。推荐先按顺序阅读往期内容:\
文献篇:\
1.文献阅读:使用 CellChat 推理和分析细胞-细胞通信
::: block-1
目录
- 0 加载所需的库
- 1 Part I: CellChat 对象的数据输入、处理、和初始化
- 2 Part II: 推断细胞间通信网络
- 3 Part III: 可视化细胞间通信网络
- 4 Part IV: 细胞间通信网络系统分析
- 5 Part V: 保存 CellChat 对象
- 6 Part VI: 通过交互式 CellChat Explorer 探索细胞间通信
:::
官网教程:https://htmlpreview.github.io/?https://github.com/jinworks/CellChat/blob/master/tutorial/CellChat-vignette.html
这个教程概述了使用 CellChat 对单个数据集进行细胞间通信网络的推理、分析和可视化的步骤。我们通过将 CellChat 应用于来自患者的病变(LS,患病)人类皮肤细胞的 scRNA-seq 数据来展示 CellChat 的多种功能。
CellChat 需要细胞的基因表达数据作为用户输入,并通过将基因表达与信号配体(ligands)、受体(receptors)及其辅助因子(cofactors)之间相互作用的先验知识相结合来模拟细胞间通讯的概率。
在推断细胞间通信网络后,CellChat 提供进一步数据探索、分析和可视化的功能。
0 加载所需的库
library(CellChat)
library(patchwork)
options(stringsAsFactors = FALSE)
# reticulate::use_python("/Users/suoqinjin/anaconda3/bin/python", required=T)
1 Part I: CellChat 对象的数据输入、处理、和初始化
CellChat 需要两个用户输入:一个是细胞的基因表达数据,另一个是用户分配的细胞标签。
1.1 准备 CellChat 分析所需的输入数据
对于基因表达数据矩阵,行名为 genes,列名为 cells。Normalized data (e.g., library-size normalization and then log-transformed with a pseudocount of 1) 作为 CellChat 分析的输入。如果用户提供 count data,我们提供一个 normalizeData
函数来计算 library size,然后进行 log-transformed。
对于 cell group 信息,需要一个带有行名的 dataframe 作为 CellChat 的输入。
除了接受 count data 矩阵作为输入外,我们还提供了如何从其他现有的单细胞分析工具包(包括 Seurat、SingleCellExperiment 和 Scanpy)准备 CellChat 输入文件的说明。当 normalized count data 和 meta data 可用时,请按照选项 A 开始准备输入数据;当有 Seurat 对象可用时,请按照选项 B 开始;当有 SingleCellExperiment 对象可用时,请按照选项 C 开始;当有 Anndata 对象可用时,请按照选项 D 开始。详细信息请参阅 tutorial on Interface_with_other_single-cell_analysis_toolkits。
这里使用选项 A 导入数据
(A) Starting from a count data matrix
ptm = Sys.time()
# 这里我们加载了一个 scRNA-seq 数据矩阵以及其关联的 cell meta data
# 这是来自两种生物条件的合并数据:normal 和 diseases
# 数据下载链接:https://figshare.com/articles/dataset/scRNA-seq_data_of_human_skin_from_patients_with_atopic_dermatitis/24470719
load("data_humanSkin_CellChat.rda")
data.input = data_humanSkin$data # normalized data matrix
meta = data_humanSkin$meta # a dataframe with rownames containing cell mata data
cell.use = rownames(meta)[meta$condition == "LS"] # extract the cell names from disease data
# Subset the input data for CelChat analysis
data.input = data.input[, cell.use]
meta = meta[cell.use, ]
unique(meta$labels) # check the cell labels
1.2 创建一个 CellChat 对象
用户可以从一个 data matrix、Seurat、SingleCellExperiment、AnnData 对象创建一个新的 CellChat 对象。如果输入是 Seurat 或 SingleCellExperiment 对象,则默认使用对象中的 metadata,用户必须提供 group.by
来定义 cell groups。例如,对于 Seurat 对象中的默认 cell identities,group.by = "ident"
。
按照以下选项之一创建一个 CellChat 对象:选项 A:使用数字基因表达矩阵和细胞标签信息作为输入,选项 B:使用 Seurat 对象作为输入,选项 C:使用 SingleCellExperiment 对象作为输入,选项 D:使用 AnnData 对象作为输入
注意:如果用户加载了先前计算的 CellChat 对象(版本 < 0.5.0),请通过 updateCellChat
更新对象。
这里使用选项 A 创建一个 CellChat 对象
(A) Starting from the digital gene expression matrix and cell label information
cellchat <- createCellChat(object = data.input, meta = meta, group.by = "labels")
如果在创建 CellChat 对象时未添加 cell meta 数据信息,用户也可以在之后使用 addMeta
添加它,并使用 setIdent
设置默认细胞身份。
cellchat <- addMeta(cellchat, meta = meta)
cellchat <- setIdent(cellchat, ident.use = "labels") # set "labels" as default cell identity
levels(cellchat@idents) # show factor levels of the cell labels
groupSize <- as.numeric(table(cellchat@idents)) # number of cells in each cell group
1.3 设置配体-受体相互作用数据库
在用户可以使用 CellChat 推断细胞间通讯之前,他们需要设置配体-受体(ligand-receptor)相互作用数据库,并确定过表达的配体(ligands)或受体(receptors)。
CellChatDB 数据库是一个人工管理的数据库,包含文献支持的人类和小鼠的配体-受体相互作用。CellChatDB v2 包含约 3,300 个经过验证的分子相互作用,包括约 40% 的自分泌/旁分泌信号相互作用,约 17% 的细胞外基质(ECM)-受体相互作用,约 13% 的细胞-细胞接触相互作用和约 30% 的非蛋白信号传导。与 CellChatDB v1 相比,CellChatDB v2 添加了 1000 多个蛋白质和非蛋白质相互作用,例如代谢和突触信号传导。值得注意的是,对于与 scRNA-seq 中测量的基因直接相关的分子,CellChat v2 通过这些分子的关键介质或酶来估算配体和受体的表达,以便通过非蛋白质介导的潜在通讯。
CellChatDB v2 还添加了配体-受体对的其他功能注释,例如 UniProtKB 关键词(包括生物过程、分子功能、功能类别、疾病等)、亚细胞位置和与神经递质的相关性。
用户可以通过添加自己筛选过的配体-受体对来更新 CellChatDB。请查看tutorial on updating the ligand-receptor interaction database CellChatDB。
在分析人类样本时,请使用数据库 CellChatDB.human
;在分析小鼠样本时,请使用数据库 CellChatDB.mouse
。CellChatDB 将配体-受体对分类为不同类型,包括“分泌信号(Secreted Signaling)”、“细胞外基质-受体(ECM-Receptor)”、“细胞-细胞接触(Cell-Cell Contact)”和“非蛋白质信号(Non-protein Signaling)”。默认情况下,“非蛋白质信号(Non-protein Signaling)”不被使用。
CellChatDB <- CellChatDB.human # use CellChatDB.mouse if running on mouse data
showDatabaseCategory(CellChatDB)
# 显示数据库结构
dplyr::glimpse(CellChatDB$interaction)
#> Rows: 3,234
#> Columns: 28
#> $ interaction_name <chr> "TGFB1_TGFBR1_TGFBR2", "TGFB2_TGFBR1_TGFBR2",…
#> $ pathway_name <chr> "TGFb", "TGFb", "TGFb", "TGFb", "TGFb", "TGFb…
#> $ ligand <chr> "TGFB1", "TGFB2", "TGFB3", "TGFB1", "TGFB1", …
#> $ receptor <chr> "TGFbR1_R2", "TGFbR1_R2", "TGFbR1_R2", "ACVR1…
#> $ agonist <chr> "TGFb agonist", "TGFb agonist", "TGFb agonist…
#> $ antagonist <chr> "TGFb antagonist", "TGFb antagonist", "TGFb a…
#> $ co_A_receptor <chr> "", "", "", "", "", "", "", "", "", "", "", "…
#> $ co_I_receptor <chr> "TGFb inhibition receptor", "TGFb inhibition …
#> $ evidence <chr> "KEGG: hsa04350", "KEGG: hsa04350", "KEGG: hs…
#> $ annotation <chr> "Secreted Signaling", "Secreted Signaling", "…
#> $ interaction_name_2 <chr> "TGFB1 - (TGFBR1+TGFBR2)", "TGFB2 - (TGFBR1+T…
#> $ is_neurotransmitter <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FAL…
#> $ ligand.symbol <chr> "TGFB1", "TGFB2", "TGFB3", "TGFB1", "TGFB1", …
#> $ ligand.family <chr> "TGF-beta", "TGF-beta", "TGF-beta", "TGF-beta…
#> $ ligand.location <chr> "Extracellular matrix, Secreted, Extracellula…
#> $ ligand.keyword <chr> "Disease variant, Signal, Reference proteome,…
#> $ ligand.secreted_type <chr> "growth factor", "growth factor", "cytokine;g…
#> $ ligand.transmembrane <lgl> FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALS…
#> $ receptor.symbol <chr> "TGFBR2, TGFBR1", "TGFBR2, TGFBR1", "TGFBR2, …
#> $ receptor.family <chr> "Protein kinase superfamily, TKL Ser/Thr prot…
#> $ receptor.location <chr> "Cell membrane, Secreted, Membrane raft, Cell…
#> $ receptor.keyword <chr> "Membrane, Secreted, Disulfide bond, Kinase, …
#> $ receptor.surfaceome_main <chr> "Receptors", "Receptors", "Receptors", "Recep…
#> $ receptor.surfaceome_sub <chr> "Act.TGFB;Kinase", "Act.TGFB;Kinase", "Act.TG…
#> $ receptor.adhesome <chr> "", "", "", "", "", "", "", "", "", "", "", "…
#> $ receptor.secreted_type <chr> "", "", "", "", "", "", "", "", "", "", "", "…
#> $ receptor.transmembrane <lgl> TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRU…
#> $ version <chr> "CellChatDB v1", "CellChatDB v1", "CellChatDB…
# 使用 CellChatDB 的子集进行细胞间通讯分析
CellChatDB.use <- subsetDB(CellChatDB, search = "Secreted Signaling", key = "annotation") # use Secreted Signaling
# Only uses the Secreted Signaling from CellChatDB v1
# CellChatDB.use <- subsetDB(CellChatDB, search = list(c("Secreted Signaling"), c("CellChatDB v1")), key = c("annotation", "version"))
# use all CellChatDB except for "Non-protein Signaling" for cell-cell communication analysis
# CellChatDB.use <- subsetDB(CellChatDB)
# use all CellChatDB for cell-cell communication analysis
# CellChatDB.use <- CellChatDB # simply use the default CellChatDB. We do not suggest to use it in this way because CellChatDB v2 includes "Non-protein Signaling" (i.e., metabolic and synaptic signaling).
# 在对象中设置使用的数据库
cellchat@DB <- CellChatDB.use
1.4 预处理表达数据以进行细胞间通讯分析
为了推断特定于细胞状态的通讯,CellChat 在一个 cell group 中识别出过表达的配体(ligands)或受体(receptors),然后在配体或受体过表达时识别过表达的配体-受体(ligand-receptor)相互作用。
CellChat 还提供了将基因表达数据投射到 protein-protein interaction(PPI) 网络上的功能。具体来说,a diffusion process 用于根据在高置信度实验验证的 PPI 网络中定义的邻居基因的表达值来平滑基因的表达值。此功能在分析具有浅测序深度的单细胞数据时非常有用,因为投射减少了信号基因的丢失效应,特别是对于配体/受体亚基的零表达。人们可能会担心这种 diffusion process 可能引入 artifact,但是,它只会引入非常微弱的通信。默认情况下 CellChat 使用 raw data(i.e., object@data.signaling
)而不是 projected data。为了使用 projected data,用户需要在运行 computeCommunProb()
之前运行 projectData
,并在运行 computeCommunProb
时设置 raw.use = TRUE
。
# 对信号基因的表达数据取子集以节省计算成本
cellchat <- subsetData(cellchat) # This step is necessary even if using the whole database
future::plan("multisession", workers = 4) # do parallel
cellchat <- identifyOverExpressedGenes(cellchat)
cellchat <- identifyOverExpressedInteractions(cellchat)
execution.time = Sys.time() - ptm
print(as.numeric(execution.time, units = "secs"))
# 将基因表达数据投射到 PPI 上(可选:运行时,用户应在函数 computeCommunProb() 中设置 raw.use = FALSE 以使用投射数据)
# cellchat <- projectData(cellchat, PPI.human)
2 Part II: 推断细胞间通信网络
CellChat 通过为每个交互分配一个概率值并执行排列测试来推断具有生物学意义的细胞间通讯。CellChat 通过使用质量作用定律将基因表达与信号配体、受体及其辅因子之间相互作用的先前已知知识相结合来模拟细胞间通讯的可能性。
注意:推断的配体-受体对数目明显取决于计算每个 cell group 的平均基因表达量的方法。默认情况下,CellChat 使用一种称为 “trimean” 的统计上稳健的均值方法,与其他方法相比,它产生的交互更少。然而,我们发现 CellChat 在预测更强的相互作用方面表现良好,这对于缩小相互作用范围以进行进一步的实验验证非常有帮助。在 computeCommunProb
中,我们提供了使用其他方法,例如 5% 和 10% truncated mean 来计算平均基因表达的选项。值得注意的是,“trimean”近似于 25% truncated mean,这意味着如果一组中表达细胞的百分比小于 25%,则平均基因表达为零。要使用 10% truncated mean,用户可以设置 type = "truncatedMean"
和 trim = 0.1
。为了确定 trim 的合适值,CellChat 提供了一个函数 computeAveExpr
可以帮助检查感兴趣的信号基因的平均表达,例如 computeAveExpr(cellchat, features = c("CXCL12","CXCR4"), type = "truncatedMean", trim = 0.1)
。因此,如果在研究的生物过程中未预测到已知的信号通路,用户可以尝试使用较低的 trim
值来改变计算每个 cell group 平均基因表达量的方法。
在分析未分类的单细胞转录组时,假设丰富的细胞群往往比稀有细胞群发送更强的信号,CellChat 还可以在概率计算中考虑每个细胞群中细胞比例的影响。用户可以设置 population.size = TRUE
。
2.1 计算通信概率并推断细胞通信网络
ptm = Sys.time()
cellchat <- computeCommunProb(cellchat, type = "triMean")
这项分析的关键参数是 type
,用于计算每个细胞组平均基因表达量的方法。默认情况下,type = "triMean"
,会产生较少但较强的相互作用。当设置 type = "truncatedMean"
时,应为 trim
分配一个值,这会产生更多的相互作用。请在上面详细查看计算每个细胞组平均基因表达量的方法。
用户可以在某些细胞组中仅有少数细胞时过滤掉细胞间通讯。默认情况下,每个细胞组中用于细胞间通讯的最小细胞数为 10。
cellchat <- filterCommunication(cellchat, min.cells = 10)
2.2 将推断的细胞通信网络提取为一个数据框
CellChat 提供了一个函数 subsetCommunication
来轻松访问感兴趣的推断细胞间通信。例如,
df.net <- subsetCommunication(cellchat)
返回一个数据框,其中包含配体/受体级别的所有推断的细胞间通信。设置slot.name = "netP"
以访问信号通路级别的推断通信df.net <- subsetCommunication(cellchat, sources.use = c(1,2), targets.use = c(4,5))
给出了从 cell groups 1 和 2 到 cell groups 4 和 5。df.net <- subsetCommunication(cellchat, signaling = c("WNT", "TGFb"))
给出了由信号 WNT 和 TGFb 介导的推断细胞间通信。
2.3 在信号通路水平上推断细胞间通讯
CellChat 通过汇总与每个信号通路相关的所有配体-受体相互作用的通信概率,计算信号通路水平上的通信概率。
注意:每个配体-受体对和每个信号通路的推断细胞间通讯网络分别存储在 slot \`net\` 和 \`netP\` 中。
cellchat <- computeCommunProbPathway(cellchat)
2.4 计算聚合的细胞间通信网络
我们可以通过计算连接数或汇总通信概率来计算聚合的细胞间通信网络。用户还可以通过设置 sources.use
和 targets.use
来计算 cell groups 子集之间的聚合网络。
cellchat <- aggregateNet(cellchat)
execution.time = Sys.time() - ptm
print(as.numeric(execution.time, units = "secs"))
CellChat 还可以可视化聚合的细胞间通信网络。例如,使用 circle plot 显示任意两个 cell groups 之间的交互次数或总交互强度(权重)。
ptm = Sys.time()
groupSize <- as.numeric(table(cellchat@idents))
par(mfrow = c(1,2), xpd=TRUE)
netVisual_circle(cellchat@net$count, vertex.weight = groupSize, weight.scale = T, label.edge= F, title.name = "Number of interactions")
netVisual_circle(cellchat@net$weight, vertex.weight = groupSize, weight.scale = T, label.edge= F, title.name = "Interaction weights/strength")
由于复杂的细胞-细胞通信网络,我们可以检查从每个 cell group 发送的信号。在这里我们还控制参数 edge.weight.max
以便我们可以比较不同网络之间的边权重 (edge weights)。
mat <- cellchat@net$weight
par(mfrow = c(3,4), xpd=TRUE)
for (i in 1:nrow(mat)) {
mat2 <- matrix(0, nrow = nrow(mat), ncol = ncol(mat), dimnames = dimnames(mat))
mat2[i, ] <- mat[i, ]
netVisual_circle(mat2, vertex.weight = groupSize, weight.scale = T, edge.weight.max = max(mat), label.edge= F, title.name = rownames(mat)[i])
}
3 Part III: 可视化细胞间通信网络
在推断细胞间通信网络后,CellChat 为进一步的数据探索、分析和可视化提供了各种功能。具体有:
- 它提供了多种可视化细胞间通信网络的方法,包括层次图、圆图、弦图和气泡图。
- 它提供了一种易于使用的工具,用于提取和可视化推断网络的高阶信息。例如,它可以预测细胞群的主要信号输入和输出,以及这些细胞群和信号如何协调在一起发挥功能。
- 它可以通过结合社交网络分析、模式识别和流形学习方法,使用集成方法定量表征和比较推断的细胞间通信网络。
3.1 使用层次图、圆图或弦图可视化每个信号通路
Hierarchy plot: 用户应该定义 vertex.receiver
,它是一个 numeric vector,给出了 cell groups 的索引作为层次结构图左侧的目标。该层次图由两个部分组成:左侧部分显示了对某些感兴趣的细胞群(即定义的 vertex.receiver
)的自分泌和旁分泌信号,右侧部分显示了对数据集中其余细胞群的自分泌和旁分泌信号。因此,层次结构图提供了一种信息丰富且直观的方式来可视化感兴趣的细胞群之间的自分泌和旁分泌信号通信。例如,在研究成纤维细胞和免疫细胞之间的细胞间通讯时,用户可以将 vertex.receiver
定义为所有成纤维细胞群。
Chord diagram: CellChat 提供了两个函数 netVisual_chord_cell
和 netVisual_chord_gene
用于可视化不同目的和不同层次的细胞间通信。netVisual_chord_cell
用于可视化不同细胞群之间的细胞间通讯(弦图中每个扇区为一个细胞群),netVisual_chord_gene
用于可视化由多个配体-受体或信号通路介导的细胞间通讯(其中弦图中的每个部分都是配体、受体或信号通路)。
Explnations of edge color/weight, node color/size/shape: 在所有可视化图中,edge colors 与作为发送者的 sources 一致,edge weights 与交互强度成正比。edge 线越粗表示信号越强。 在 Hierarchy plot 和 Circle plot 中,圆形大小与每个 cell group 中的细胞数成正比。 在 hierarchy plot 中,实心圆和空心圆分别代表 source 和 target。在 Chord diagram 中,内部较细的条形颜色表示从相应外部条形接收信号的目标。内部条形大小与目标接收到的信号强度成正比。这样的内部小节有助于解释复杂的和弦图。请注意,对于某些 cell group,存在一些没有任何和弦的内部小节,请忽略它,因为这是 circlize 包尚未解决的问题。
Visualization of cell-cell communication at different levels: 可以使用 netVisual_aggregate
可视化推断的信号通路通信网络,并使用 netVisual_individual
可视化与该信号通路相关的各个 L-R 对的推断通信网络。
这里我们以一个信号通路的输入为例。所有显示重要通信的信号通路都可以通过 cellchat@netP$pathways
访问。
pathways.show <- c("CXCL")
# Hierarchy plot
# Here we define `vertex.receive` so that the left portion of the hierarchy plot shows signaling to fibroblast and the right portion shows signaling to immune cells
vertex.receiver = seq(1,4) # a numeric vector.
netVisual_aggregate(cellchat, signaling = pathways.show, vertex.receiver = vertex.receiver)
# Circle plot
par(mfrow=c(1,1))
netVisual_aggregate(cellchat, signaling = pathways.show, layout = "circle")
# Chord diagram
par(mfrow=c(1,1))
netVisual_aggregate(cellchat, signaling = pathways.show, layout = "chord")
# Heatmap
par(mfrow=c(1,1))
netVisual_heatmap(cellchat, signaling = pathways.show, color.heatmap = "Reds")
#> Do heatmap based on a single object
对于 chord diagram,CellChat 有一个独立的函数 netVisual_chord_cell
,可以通过 circlize 包中调整不同的参数来灵活可视化通信网络。例如,我们可以定义一个命名的特征向量 group
来创建多组和弦图,例如,将细胞簇分组为不同的细胞类型。
# Chord diagram
group.cellType <- c(rep("FIB", 4), rep("DC", 4), rep("TC", 4)) # grouping cell clusters into fibroblast, DC and TC cells
names(group.cellType) <- levels(cellchat@idents)
netVisual_chord_cell(cellchat, signaling = pathways.show, group = group.cellType, title.name = paste0(pathways.show, " signaling network"))
#> Plot the aggregated cell-cell communication network at the signaling pathway level
计算每个配体-受体对对整个信号通路的贡献,并可视化由单个配体-受体对介导的细胞间通讯
netAnalysis_contribution(cellchat, signaling = pathways.show)
我们还可以可视化由单个配体-受体对介导的细胞间通讯。我们提供了一个函数 extractEnrichedLR
来提取给定信号通路的所有重要相互作用(L-R pairs)和相关信号基因。
pairLR.CXCL <- extractEnrichedLR(cellchat, signaling = pathways.show, geneLR.return = FALSE)
LR.show <- pairLR.CXCL[1,] # show one ligand-receptor pair
# Hierarchy plot
vertex.receiver = seq(1,4) # a numeric vector
netVisual_individual(cellchat, signaling = pathways.show, pairLR.use = LR.show, vertex.receiver = vertex.receiver)
#> [[1]]
# Circle plot
netVisual_individual(cellchat, signaling = pathways.show, pairLR.use = LR.show, layout = "circle")
# Chord diagram
netVisual_individual(cellchat, signaling = pathways.show, pairLR.use = LR.show, layout = "chord")
自动保存所有推断网络的图以便快速探索
在实际使用中,用户可以使用'for...loop'来自动保存所有推断的网络,以便使用netVisual
进行快速探索。netVisual
支持svg、png和pdf格式的输出。
# Access all the signaling pathways showing significant communications
pathways.show.all <- cellchat@netP$pathways
# check the order of cell identity to set suitable vertex.receiver
levels(cellchat@idents)
vertex.receiver = seq(1,4)
for (i in 1:length(pathways.show.all)) {
# Visualize communication network associated with both signaling pathway and individual L-R pairs
netVisual(cellchat, signaling = pathways.show.all[i], vertex.receiver = vertex.receiver, layout = "hierarchy")
# Compute and visualize the contribution of each ligand-receptor pair to the overall signaling pathway
gg <- netAnalysis_contribution(cellchat, signaling = pathways.show.all[i])
ggsave(filename=paste0(pathways.show.all[i], "_L-R_contribution.pdf"), plot=gg, width = 3, height = 2, units = 'in', dpi = 300)
}
3.2 可视化由多个配体-受体或信号通路介导的细胞间通讯
CellChat 还可以使用函数 netVisual_bubble
(选项 A)和 netVisual_chord_gene
(选项 B)显示由配体-受体对和信号通路介导的所有显著相互作用,以及用户从某些细胞组到其他细胞组提供的相互作用。
(A) Bubble plot
我们还可以使用 netVisual_bubble
显示从一些 cell groups 到其他 cell groups 的所有重要相互作用(L-R pairs)。
# (1) show all the significant interactions (L-R pairs) from some cell groups (defined by 'sources.use') to other cell groups (defined by 'targets.use')
netVisual_bubble(cellchat, sources.use = 4, targets.use = c(5:11), remove.isolate = FALSE)
#> Comparing communications on a single object
# (2) show all the significant interactions (L-R pairs) associated with certain signaling pathways
netVisual_bubble(cellchat, sources.use = 4, targets.use = c(5:11), signaling = c("CCL","CXCL"), remove.isolate = FALSE)
#> Comparing communications on a single object
# (3) show all the significant interactions (L-R pairs) based on user's input (defined by `pairLR.use`)
pairLR.use <- extractEnrichedLR(cellchat, signaling = c("CCL","CXCL","FGF"))
netVisual_bubble(cellchat, sources.use = c(3,4), targets.use = c(5:8), pairLR.use = pairLR.use, remove.isolate = TRUE)
#> Comparing communications on a single object
# set the order of interacting cell pairs on x-axis
# (4) Default: first sort cell pairs based on the appearance of sources in levels(object@idents), and then based on the appearance of targets in levels(object@idents)
# (5) sort cell pairs based on the targets.use defined by users
netVisual_bubble(cellchat, targets.use = c("LC","Inflam. DC","cDC2","CD40LG+ TC"), pairLR.use = pairLR.use, remove.isolate = TRUE, sort.by.target = T)
# (6) sort cell pairs based on the sources.use defined by users
netVisual_bubble(cellchat, sources.use = c("FBN1+ FIB","APOE+ FIB","Inflam. FIB"), pairLR.use = pairLR.use, remove.isolate = TRUE, sort.by.source = T)
# (7) sort cell pairs based on the sources.use and then targets.use defined by users
netVisual_bubble(cellchat, sources.use = c("FBN1+ FIB","APOE+ FIB","Inflam. FIB"), targets.use = c("LC","Inflam. DC","cDC2","CD40LG+ TC"), pairLR.use = pairLR.use, remove.isolate = TRUE, sort.by.source = T, sort.by.target = T)
# (8) sort cell pairs based on the targets.use and then sources.use defined by users
netVisual_bubble(cellchat, sources.use = c("FBN1+ FIB","APOE+ FIB","Inflam. FIB"), targets.use = c("LC","Inflam. DC","cDC2","CD40LG+ TC"), pairLR.use = pairLR.use, remove.isolate = TRUE, sort.by.source = T, sort.by.target = T, sort.by.source.priority = FALSE)
(B) Chord diagram
类似于 Bubble plot,CellChat 提供了一个函数 netVisual_chord_gene
来绘制 Chord diagram
- 显示从一些细胞群到其他细胞群的所有相互作用(L-R 对或信号通路)。两种特殊情况:一种显示从一个细胞群发送的所有交互,另一种显示一个细胞群接收的所有交互。
- 显示用户输入的交互或用户定义的某些信号通路
# show all the significant interactions (L-R pairs) from some cell groups (defined by 'sources.use') to other cell groups (defined by 'targets.use')
# show all the interactions sending from Inflam.FIB
netVisual_chord_gene(cellchat, sources.use = 4, targets.use = c(5:11), lab.cex = 0.5,legend.pos.y = 30)
# show all the interactions received by Inflam.DC
netVisual_chord_gene(cellchat, sources.use = c(1,2,3,4), targets.use = 8, legend.pos.x = 15)
# show all the significant interactions (L-R pairs) associated with certain signaling pathways
netVisual_chord_gene(cellchat, sources.use = c(1,2,3,4), targets.use = c(5:11), signaling = c("CCL","CXCL"),legend.pos.x = 8)
# show all the significant signaling pathways from some cell groups (defined by 'sources.use') to other cell groups (defined by 'targets.use')
netVisual_chord_gene(cellchat, sources.use = c(1,2,3,4), targets.use = c(5:11), slot.name = "netP", legend.pos.x = 10)
注意:在生成绘图时请忽略注释,例如“注意:第一个链接端是从扇区‘MIF’绘制出来的。”。 如果基因名称重叠,您可以通过减小值来调整参数 small.gap
。
3.3 使用小提琴/点图绘制信号基因表达分布
如果已安装 Seurat R 包,CellChat 可以使用 Seurat 封装函数 plotGeneExpression
绘制与配体-受体对或信号通路相关的信号基因的表达分布。该函数提供三种类型的可视化,包括“violin”、“dot”、“bar”。另外,用户还可以使用 extractEnrichedLR
提取与推断的配体-受体对或信号通路相关的信号基因,然后使用 Seurat 或其他包绘制基因表达。
plotGeneExpression(cellchat, signaling = "CXCL", enriched.only = TRUE, type = "violin")
print(as.numeric(execution.time, units = "secs"))
默认情况下,plotGeneExpression
仅显示与推断的重要通信相关的信号基因的表达。用户可以通过以下方式显示与一种信号通路相关的所有信号基因的表达
plotGeneExpression(cellchat, signaling = "CXCL", enriched.only = FALSE)
execution.time = Sys.time() - ptm
4 Part IV: 细胞间通信网络系统分析
为了便于解释复杂的细胞间通信网络,CellChat 通过从图论、模式识别和流形学习中抽象出来的方法对网络进行定量测量。
- 它可以使用网络分析的中心性度量来确定给定信号网络中的主要信号源(sources)和目标(targets)以及中介(mediators)和影响者(influencers)
- 它可以通过利用模式识别方法预测特定细胞类型的关键传入和传出信号以及不同细胞类型之间的协调响应。
- 它可以通过定义相似性度量并从功能和拓扑的角度执行流形学习来对信号通路进行分组。
- 它可以通过多个网络的联合流形学习来描述保守的和特定于上下文的信号通路。
4.1 确定细胞群的信号作用(例如,主要发送者、接收者)以及主要的贡献信号
CellChat 通过为每个 cell group 计算多个网络中心性度量,可以轻松识别细胞间通信网络中的主要发送者(senders)、接收者(receivers)、中介者(mediators)和影响者(influencers)。具体来说,我们使用加权定向网络中的措施,包括出度(out-degree)、入度(in-degree)、流间性(flow betweenesss)和信息中心性(information centrality),分别识别细胞间通信的主要发送者、接收者、中介者和影响者。在权重为计算的通信概率的加权有向网络中,出度(outdegree)计算为来自一个细胞组的传出信号的通信概率之和,入度(in-degree)计算为去到一个细胞组的传入信号的通信概率之和,可用于分别识别信号网络的主要细胞发送者和接收者。关于流介数(flow betweenness)和信息中心性(information centrality)的定义,请查看 CellChat 的论文和相关参考资料。
用户可以在热图(选项 A)和二维图(选项 B)上可视化中心性分数。CellChat 还可以回答某些细胞组的 outgoing 或 incoming 信号中哪些信号贡献最大的问题(选项 C)。
(A) 计算和可视化网络中心性分数
ptm = Sys.time()
# Compute the network centrality scores
cellchat <- netAnalysis_computeCentrality(cellchat, slot.name = "netP") # the slot 'netP' means the inferred intercellular communication network of signaling pathways
# Visualize the computed centrality scores using heatmap, allowing ready identification of major signaling roles of cell groups
netAnalysis_signalingRole_network(cellchat, signaling = pathways.show, width = 8, height = 2.5, font.size = 10)
(B) 可视化 2D 空间中的主要发送者(sources)和接收者(targets)
CellChat 还提供了另一种直观的方式来使用散点图在二维空间中可视化主要的发送者(sources)和接收者(targets)。x 轴和 y 轴分别是与每个细胞组相关联的总 outgoing 或 incoming 通讯概率。点的大小与与每个细胞组相关联的推断链接数(outgoing and incoming)成比例。点的颜色表示不同的 cell groups。如果定义了group
,则点的形状表示不同类别的细胞组。
# Signaling role analysis on the aggregated cell-cell communication network from all signaling pathways
gg1 <- netAnalysis_signalingRole_scatter(cellchat)
#> Signaling role analysis on the aggregated cell-cell communication network from all signaling pathways
# Signaling role analysis on the cell-cell communication networks of interest
gg2 <- netAnalysis_signalingRole_scatter(cellchat, signaling = c("CXCL", "CCL"))
#> Signaling role analysis on the cell-cell communication network from user's input
gg1 + gg2
(C) 确定对某些 cell groups 的 outgoing 或 incoming 信号贡献最大的信号
我们还可以回答哪些信号对某些 cell groups 的 outgoing 或 incoming 信号贡献最大的问题。在这个热图中,颜色条代表一个信号通路在 cell groups 间的相对信号强度(注:值经过 row-scaled)。顶部有色条形图显示了通过总结热图中显示的所有信号通路来表示 cell group 的总信号强度。右侧的灰色条形图显示了通过总结热图中显示的所有 cell group 来表示信号通路的总信号强度。
# Signaling role analysis on the aggregated cell-cell communication network from all signaling pathways
ht1 <- netAnalysis_signalingRole_heatmap(cellchat, pattern = "outgoing")
ht2 <- netAnalysis_signalingRole_heatmap(cellchat, pattern = "incoming")
ht1 + ht2
# Signaling role analysis on the cell-cell communication networks of interest
ht <- netAnalysis_signalingRole_heatmap(cellchat, signaling = c("CXCL", "CCL"))
4.2 识别全局通信模式以探索多种细胞类型和信号通路如何协调在一起
除了探索各个通路的详细通信之外,一个重要的问题是多个 cell groups 和信号通路如何协调发挥作用。CellChat 采用模式识别方法来识别全局通信模式。
随着模式数量的增加,可能会出现冗余模式,从而难以解释通信模式。CellChat 默认选择了五种模式。一般来说,模式的数量大于 2 才具有生物学意义。此外,CellChat 还提供了一个函数 selectK
来推断模式的数量,它基于 NMF R 包中已经实现的两个指标,包括 Cophenetic 和 Silhouette。这两个指标都基于共识矩阵的层次聚类来衡量特定数量模式的稳定性。对于一定数量的模式,合适数量的模式是 Cophenetic 和 Silhouette 值开始突然下降的模式。
这项分析可以针对 outgoing(选项 A)和 incoming(选项 B)信号模式进行。Outgoing 模式显示了发送细胞(即 cells as signal source)如何相互协调以及它们如何与特定信号通路协调以推动通讯。Incoming 模式显示了目标细胞(即 cells as signal receivers)如何相互协调以及它们如何与特定信号通路协调以响应入向信号。
(A) 确定并可视化分泌细胞的 outgoing 通讯模式
Outgoing patterns 揭示了 sender cells(i.e. cells as signal source)如何相互协调以及它们如何与某些信号通路协调以驱动通信。
对于 outgoing (or incoming) patterns,从外向(或入向)细胞间通讯概率的矩阵分解中输出的细胞组模式矩阵 W 表示这些细胞组如何协调发送(或接收)信号,信号通路模式矩阵 H 表示这些信号通路如何协调工作以发送(或接收)信号。为了直观显示潜在模式与细胞组和配体-受体对或信号通路的关联,我们使用了一种河流(alluvial)图。我们首先将 W 的每一行和 H 的每一列归一化为 [0,1],然后如果它们小于阈值(默认值为 0.5),则将 W 和 H 中的元素设为零。这种阈值处理允许揭示与每个推断模式相关的最丰富的细胞组和信号通路。这些经过阈值处理的矩阵 W 和 H 被用作创建河流图的输入。
为了直接将细胞群与其丰富的信号通路联系起来,我们将 W 和 H 中的元素设置为零,如果它们小于 1/R,其中 R 是潜在模式的数量。通过使用不太严格的阈值,可以获得与每个细胞群相关的更丰富的信号通路。 使用通过将 W 乘以 H 计算得出的每个细胞群对每个信号通路的贡献分数,我们构建了一个点图,其中点大小与贡献分数成比例,以显示细胞群与其丰富的信号通路之间的关联。用户还可以降低参数截止值,以显示与每个细胞群相关的更丰富的信号通路。
加载通信模式分析所需的包
library(NMF)
library(ggalluvial)
在这里,我们运行 selectK
来推断模式的数量。
selectK(cellchat, pattern = "outgoing")
当传出模式的数量为 6 时,Cophenetic 和 Silhouette 值都开始突然下降。
nPatterns = 6
cellchat <- identifyCommunicationPatterns(cellchat, pattern = "outgoing", k = nPatterns)
# river plot
netAnalysis_river(cellchat, pattern = "outgoing")
#> Please make sure you have load `library(ggalluvial)` when running this function
# dot plot
netAnalysis_dot(cellchat, pattern = "outgoing")
(B) 识别并可视化目标细胞的传入通信模式
传入模式显示了目标细胞(i.e. cells as signal receivers)如何相互协调以及它们如何与某些信号通路协调以响应传入信号。
selectK(cellchat, pattern = "incoming")
当传入模式的数量为 3 时,Cophenetic 值开始下降。
nPatterns = 3
cellchat <- identifyCommunicationPatterns(cellchat, pattern = "incoming", k = nPatterns)
# river plot
netAnalysis_river(cellchat, pattern = "incoming")
#> Please make sure you have load `library(ggalluvial)` when running this function
# dot plot
netAnalysis_dot(cellchat, pattern = "incoming")
4.3 信号网络的流形和分类学习分析
此外,CellChat 能够量化所有重要信号通路之间的相似性,然后根据它们的细胞通信网络相似性对它们进行分组。可以根据功能(Functional)或结构(Structural)相似性进行分组。
Functional similarity:高度的功能相似性表明主要的发送者(senders)和接收者(receivers)相似,可以解释为两个信号通路或两个配体-受体对表现出相似和/或冗余的作用。功能相似性分析需要两个数据集之间具有相同的细胞群组成。
Structural similarity:结构相似性用来比较它们的信号网络结构,不考虑发送者和接收者的相似性。
根据功能相似性识别信号基团
cellchat <- computeNetSimilarity(cellchat, type = "functional")
cellchat <- netEmbedding(cellchat, type = "functional")
#> Manifold learning of the signaling networks for a single dataset
cellchat <- netClustering(cellchat, type = "functional")
#> Classification learning of the signaling networks for a single dataset
# Visualization in 2D-space
netVisual_embedding(cellchat, type = "functional", label.size = 3.5)
netVisual_embeddingZoomIn(cellchat, type = "functional", nCol = 2)
根据结构相似性识别信号基团
cellchat <- computeNetSimilarity(cellchat, type = "structural")
cellchat <- netEmbedding(cellchat, type = "structural")
#> Manifold learning of the signaling networks for a single dataset
cellchat <- netClustering(cellchat, type = "structural")
#> Classification learning of the signaling networks for a single dataset
# Visualization in 2D-space
netVisual_embedding(cellchat, type = "structural", label.size = 3.5)
netVisual_embeddingZoomIn(cellchat, type = "structural", nCol = 2)
execution.time = Sys.time() - ptm
print(as.numeric(execution.time, units = "secs"))
5 Part V: 保存 CellChat 对象
saveRDS(cellchat, file = "cellchat_humanSkin_LS.rds")
6 Part VI: 通过交互式 CellChat Explorer 探索细胞间通信
对于单细胞转录组学的 CellChat 分析,请确保 object@dr
包含数据的低维空间,例如“umap”和“tsne”,以便生成信号基因的特征图。可以通过函数 addReduction
添加新的低维空间。
runCellChatApp(cellchat)
<center>结束</center>
<p style="color: gray; font-size: 10px;">注:本文为个人学习笔记,仅供大家参考学习,不得用于任何商业目的。如有侵权,请联系作者删除。</p>
本文由mdnice多平台发布
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。