常用的细胞通讯软件:
- CellphoneDB:是公开的人工校正的,储存受体、配体以及两种相互作用的数据库。此外,还考虑了结构组成,能够描述异构复合物。(配体-受体+多聚体)
- iTALK:通过平均表达量方式,筛选高表达的胚体和受体,根据结果作圈图。(配体-受体)
- CellChat:CellChat将细胞的基因表达数据作为输入,并结合配体受体及其辅助因子的相互作用来模拟细胞间通讯。(配体-受体+多聚体+辅因子)
- NicheNet:通过将相互作用细胞的表达数据与信号和基因调控网络的先验知识相结合来预测相互作用细胞之间的配体-靶标联系的方法。( 配体-受体+信号通路)
- Celltalker:通过寻找细胞群内和细胞群之间已知的胚体和受体对的表达来评估细胞间的交流。(配体-受体)
其它细胞互作软件还包括
SingleCellSignalR
,scTensor
和SoptSC
(这三个也是基于配体-受体相互作用)
CellChat
通过综合信号配体、受体及其辅因子基因的表达只与它们之间互作的先验知识对细胞通讯概率建模。在推断出细胞间通讯网络后,CellChat提供了进一步数据探索、分析和可视化的功能。
文章链接:https://www.nature.com/articles/s41467-021-21246-9
视频链接:https://www.youtube.com/watch?v=kc45au1RhNs


CellChat工作流程图:

在进行细胞交互分析的时候,不同分组的样本尽量不要一起进行分析,想要一起分析的时候需要保证不同分组间的细胞种类一致。同一分组的不同生物学重复可以一起分析(很多文献这样做)。
一、单样本分析(可以是同一组的多个生物学重复一起分析)
1. 安装:
devtools::install_github("sqjin/CellChat")
2. 数据准备:
Sys.setenv(RETICULATE_PYTHON="/usr/bin/python3")
# ⚠️要根据自己python3的路径来设置,可以在终端使用which python3来查看
library(Seurat)
library(SeuratData)
library(tidyverse)
library(CellChat)
library(NMF)
library(ggalluvial)
library(patchwork)
library(ggplot2)
library(svglite)
options(stringsAsFactors = FALSE)
pbmc3k.final
3. 创建一个Cell Chat对象
从Seurat对象直接创建:
⚠️:构建Cell Chat对象时,输入的是log后的数据。
cellchat
4. 导入配体受体数据库
CellChatDB

在CellChat中,我们还可以先择特定的信息描述细胞间的相互作用,可以理解为从特定的侧面来刻画细胞间相互作用,比用一个大的配体库又精细了许多。
unique(CellChatDB$interaction$annotation)#查看可以选择的侧面,也就是上图左中的三种
#选择"Secreted Signaling"进行后续细胞互作分析
CellChatDB.use
5. 预处理
对表达数据进行预处理,用于细胞间的通信分析。首先在一个细胞组中识别过表达的配体或受体,然后将基因表达数据投射到蛋白-蛋白相互作用(PPI)网络上。如果配体或受体过表达,则识别过表达配体和受体之间的相互作用。
## 在矩阵的所有的基因中提取signaling gene,结果保存在data.signaling(13714个基因,过滤完只有270个)
cellchat
6. 推断细胞通讯网络
通过为每个相互作用分配一个概率值并进行置换检验来推断生物意义上的细胞-细胞通信。
-
推断配体-受体水平细胞通讯网络(结果储存在@net下面,有一个概率值和对应的pval)
⚠️这一步也是CellChat比CellPhoneDB多的一步
通过计算与每个信号通路相关的所有配体-受体相互作用的通信概率来推断信号通路水平上的通信概率。
#根据表达值推测细胞互作的概率(cellphonedb是用平均表达值代表互作强度)。
cellchat

- 推断信号通路水平的细胞通讯网络(结果储存在@netP下面,有一个概率值和对应的pval)
我们可以通过计算链路的数量或汇总通信概率来计算细胞间的聚合通信网络。
cellchat

至此,统计分析部分已经完成。
7. 细胞互作关系展示
7.1 所有细胞群总体观:细胞互作数量与强度统计分析:
#统计细胞和细胞之间通信的数量(有多少个配体-受体对)和强度(概率)
cellchat

检查每种细胞发出的信号
mat

mat

mat
7.2 单个信号通路或配体-受体介导的细胞互作可视化(层次图、网络图、和弦图、热图)
⚠️注:层次图、网络图、和弦图、热图只是不同的展示方法,展示的内容和代表的意思一模一样
比如在前面的功能富集分析或case control的比较中找到了一些信号通路差异,就可以进一步在细胞水平上验证。
cellchat@netP$pathways #查看都有哪些信号通路
# [1] "TGFb" "NRG" "PDGF" "CCL" "CXCL" "MIF" "IL2" "IL6"
# [9] "IL10" "IL1" "CSF" "IL16" "IFN-II" "LT" "LIGHT" "FASLG"
# [17] "TRAIL" "BAFF" "CD40" "VISFATIN" "COMPLEMENT" "PARs" "FLT3" "ANNEXIN"
# [25] "GAS" "GRN" "GALECTIN" "BTLA" "BAG"
# 选择其中一个信号通路,比如说TGFb
pathways.show
层次图(Hierarchy plot)
levels(cellchat@idents) # show all celltype
# [1] "Naive CD4 T" "Memory CD4 T" "CD14+ Mono" "B" "CD8 T"
# [6] "FCGR3A+ Mono" "NK" "DC" "Platelet"
vertex.receiver = c(1,2,4,6) # define a numeric vector (淋系细胞)giving the index of the celltype as targets
#par(mar=c(5.1,4.1,4.1,2.1))
netVisual_aggregate(cellchat, signaling = pathways.show, vertex.receiver = vertex.receiver)
# save as TIL/CXCL_hierarchy.pdf

网络图(Circle plot)
par(mfrow=c(1,1))
netVisual_aggregate(cellchat, signaling = pathways.show, layout = "circle")
# save as TIL/CXCL_circle.pdf

和弦图(Chord diagram)
par(mfrow=c(1,1))
netVisual_aggregate(cellchat, signaling = pathways.show, layout = "chord")
# save as TIL/CXCL_chord.pdf
热图(Heatmap)
par(mfrow=c(1,1))
netVisual_heatmap(cellchat, signaling = pathways.show, color.heatmap = "Reds")
# save as TIL/CXCL_heatmap.pdf

7.3 配体-受体层级的可视化(计算各个ligand-receptor pair对信号通路的贡献)
#计算配体受体对选定信号通路的贡献值(在这里就是查看哪条信号通路对TGFb贡献最大)
netAnalysis_contribution(cellchat, signaling = pathways.show)
pairLR.TGFb

层次图( Hierarchy plot)
#提取对这个通路贡献最大的配体受体对来展示(也可以选择其他的配体受体对)
LR.show

网络图(Circle plot)
netVisual_individual(cellchat, signaling = pathways.show, pairLR.use = LR.show, layout = "circle")
# save as TIL/CXCL_circle2.pdf

和弦图(Chord diagram)
netVisual_individual(cellchat, signaling = pathways.show, pairLR.use = LR.show, layout = "chord")
# save as TIL/CXCL_chord2.pdf
Error: not enough space for cells at track index ‘1’.
7.4 自动(批量)保存每个信号通路的互作结果
# Access all the signaling pathways showing significant communications将所有信号通路找出来
pathways.show.all
7.5多个配体-受体介导的细胞互作关系可视化
气泡图(全部配体受体)
levels(cellchat@idents)
# show all the significant interactions (L-R pairs)
#需要指定受体细胞和配体细胞
p = netVisual_bubble(cellchat, sources.use = c(3,5,7,8,9),
targets.use = c(1,2,4,6), remove.isolate = FALSE)
ggsave("Mye_Lymph_bubble.pdf", p, width = 8, height = 12) #髓系对淋巴的调节
# save as TIL/Mye_Lymph_bubble.pdf

气泡图(指定信号通路或配体-受体)
#比如制定CCL和CXCL这两个信号通路
netVisual_bubble(cellchat, sources.use = c(3,5,7,8,9), targets.use = c(1,2,4,6),
signaling = c("CCL","CXCL"), remove.isolate = FALSE)

气泡图(指定信号通路或配体-受体并指定细胞)
# show all the significant interactions (L-R pairs) based on user's input
pairLR.use

参与某条信号通路(如TGFb)的所有基因在细胞群中的表达情况展示(小提琴图和气泡图)
## Plot the signaling gene expression distribution
p = plotGeneExpression(cellchat, signaling = "TGFb")
ggsave("TGFb_GeneExpression_vln.pdf", p, width = 8, height = 8)
p = plotGeneExpression(cellchat, signaling = "TGFb", type = "dot")
ggsave("TGFb_GeneExpression_dot.pdf", p, width = 8, height = 6)


8. 通讯网络系统分析(可信度有待考量)
通讯网络系统分析使用了三种算法:社会网络分析、NMF分析和流行学习与分类
⚠️:不同的算法算出来的结果可能会相互矛盾,需要结合生物学知识加以判断
8.1 社会网络分析(通讯网络中的角色识别)
计算网络中心性权重
cellchat
通过计算每个细胞群的网络中心性指标,识别每类细胞在信号通路中的角色/作用C(发送者、接收者、调解者和影响者)
netAnalysis_signalingRole_network(cellchat, signaling = pathways.show,
width = 15, height = 6, font.size = 10)
# # save as TIL/SNA_CXCL_signalingRole.pdf

识别细胞的信号流模式
ht1

8.2 非负矩阵分解(NMF)识别细胞的通讯模式(这里是一个比较标准的NMF的应用方式)
- 信号输出细胞的模式识别
#计算分解成几个因子(pattern)比较合适(这一步运行比较慢 。在使用NMF对细胞进行亚群细分时,如果不测试的话,最好选择比细胞类型多一点的值)
selectK(cellchat, pattern = "outgoing")
# save as TIL/NMF_outgoing_selectK.pdf

热图
nPatterns = 2 # 挑选曲线中第一个出现下降的点(从2就开始下降了)
cellchat

冲击图/河流图(river plot)
netAnalysis_river(cellchat, pattern = "outgoing")
# save as TIL/NMF_outgoing_comPattern_river.pdf

气泡图
netAnalysis_dot(cellchat, pattern = "outgoing")
# save as TIL/NMF_outgoing_comPattern_dotplot.pdf

- 信号输入细胞的模式识别
selectK(cellchat, pattern = "incoming")
# save as TIL/NMF_incoming_selectK.pdf

热图
nPatterns = 2
cellchat

冲击图
netAnalysis_river(cellchat, pattern = "incoming")
# save as TIL/NMF_incoming_comPattern_river.pdf

气泡图
netAnalysis_dot(cellchat, pattern = "incoming")
# save as TIL/NMF_incoming_comPattern_dotplot.pdf

8.3 信号网络的流行学习与分类
把共同起作用的信号通路归纳在一起,分为基于功能的归纳和基于拓扑结构的归纳
- 基于功能相似性的流行学习与分类
cellchat
- 基于拓扑相似性的流行学习与分类
cellchat
## The end
saveRDS(cellchat, file = "cellchat.rds")
二、不同分组之间的配对分析
⚠️:配对分析必须保证细胞类型是一样的,才可以进行配对。如果 两个样本的细胞类型不一样又想进行配对分析时,可以用subset把两个样本的细胞类型取成一致的。
1. 数据准备,分别创建CellChat对象
Sys.setenv(RETICULATE_PYTHON="/usr/bin/python3")
library(Seurat)
library(tidyverse)
library(CellChat)
library(NMF)
library(ggalluvial)
library(patchwork)
rm(list = ls())
options(stringsAsFactors = FALSE)
## 创建cellchat对象
### 提取数据子集
scRNA
2. 细胞通讯网络分析
- 2.1 数据准备和路径切换
dir.create("./Compare")
setwd("./Compare")
# load("../cco.rda")
# cco.pbmc
- 2.2 分析样本cco.pbmc的细胞通讯网络
⚠️:cellchat不太稳定,identifyOverExpressedGenes常出错(不出现进度条就是出错了),重启Rstudio后再运算。
cellchat
- 2.3 分析样本cco.til的细胞通讯网络
cellchat
- 2.4 合并cellchat对象
cco.list
3. 可视化
3.1 所有细胞群总体观:通讯数量与强度对比
gg1

数量与强度差异网络图
par(mfrow = c(1,2))
netVisual_diffInteraction(cellchat, weight.scale = T)
netVisual_diffInteraction(cellchat, weight.scale = T, measure = "weight")
# save as Diff_number_strength_net.pdf

数量与强度差异热图
par(mfrow = c(1,1))
h1

细胞互作数量对比网络图
par(mfrow = c(1,2))
weight.max

3.2 指定细胞互作数量对比网络图
par(mfrow = c(1,2))
s.cell

3.3 保守和特异性信号通路的识别与可视化
## 通路信号强度对比分析
gg1

3.4 流行学习识别差异信号通路
这里function的图出不来,只有structural的图可以出来
cellchat

3.5 细胞信号模式对比
library(ComplexHeatmap)
总体信号模式对比
pathway.union

输出信号模式对比
pathway.union

输入信号模式对比
pathway.union

3.6 特定信号通路的对比
网络图
pathways.show

热图
par(mfrow = c(1,2), xpd=TRUE)
ht

和弦图
par(mfrow = c(1,2), xpd=TRUE)
for (i in 1:length(cco.list)) {
netVisual_aggregate(cco.list[[i]], signaling = pathways.show, layout = "chord", pt.title = 3, title.space = 0.05,
vertex.label.cex = 0.6, signaling.name = paste(pathways.show, names(cco.list)[i]))
}
# save as Compare_IL16_chord.pdf 10*6.5
3.7 配体-受体对比分析
气泡图展示所有配体受体对的差异
levels(cellchat@idents$joint)
p

气泡图展示上调或下调的配体受体对
p1

和弦图
par(mfrow = c(1, 2), xpd=TRUE)
for (i in 1:length(cco.list)) {
netVisual_chord_gene(cco.list[[i]], sources.use = c(4,5), targets.use = c(1,2,3,6), signaling = "MHC-I",
lab.cex = 0.6, legend.pos.x = 10, legend.pos.y = 20,
title.name = paste0("Signaling from Treg - ", names(cco.list)[i]))
}
# save as Compare_LR_chord.pdf 10*6.5