分享

单细胞空间转录组|使用CellChat.v2做单细胞空间转录组细胞通讯分析(单样本)

 生信探索 2024-04-28 发布于云南

简介

CellChat V2现在支持从多个空间解析转录组学数据集中推断细胞间的通信。CellChat需要输入细胞(Spot)的的基因表达信息和空间位置数据,并通过整合基因表达与空间距离信息以及信号配体、受体及其辅因子之间相互作用的先验知识(CellChat的数据库DB,支持人、小鼠、斑马鱼),来建模细胞间通信的概率。

输入数据

在从空间分辨转录组学数据推断空间邻近的细胞间通讯时,用户还需提供Spot/细胞质心的空间坐标/位置。此外,为了滤除超出分子最大扩散范围(如约250微米)的细胞间通讯,CellChat需要计算以微米为单位的细胞质心到质心的距离。因此,对于仅提供像素坐标的空间技术,CellChat会通过要求用户提供转换系数,将空间坐标从像素转换为微米。

因此输入的数据有

  • data_input 细胞(Spot)的基因表达信息) 标准化的基因表达量矩阵,行基因列细胞
  • meta (细胞和样本的信息):一个数据框,行是细胞列可以是样本名(samples)、细胞标签、组织类型、分组等信息;
  • coordinates** (细胞(Spot)的空间坐标信息): 一个数据框,每一行是一个细胞或Spot的x,y轴位置
  • spatial.factors (空间距离因子): 一个数据框,包括两个因子,ratiotolratio的作用是将像素坐标转换成微米坐标;tol是 tolerance factortol作为比较质心间距离与交互范围时增强稳健性的耐受因子。其值可设定为细胞/点大小的一半,单位为微米。若细胞/点大小未知,我们提供了一个名为computeCellDistance的函数来计算细胞质心间的距离。此时,tol可取最小质心间距离的一半。需要注意的是,CellChat并不需要精确的耐受因子,它主要用于判断当一对细胞的距离大于交互范围但小于“交互范围 + tol”时,是否仍视为空间邻近。
  • contact.range: 一个给定的交互范围值(单位:微米),用于限制依赖接触的信号传递。对于单细胞分辨率的空间转录组学,contact.range大致等于估计的细胞直径(即细胞质心间距离),这意味着依赖接触或旁分泌的信号传递仅发生在两细胞相互接触时。通常,contact.range设为10,这是一个典型的人类细胞大小。然而,对于低分辨率的空间数据,如10X Visium数据,应将其设为细胞质心间距离(例如,对于10X Visium数据,contact.range = 100)。可以使用computeCellDistance函数来计算质心间距离。
  • contact.knn.k除了提供contact.range外,用户还可以选择提供contact.knn.k值,以便将依赖接触的信号传递限制在k最近邻(knn)范围内。

读入Seurat空转数据

using替代library加载包

using(Seurat,magrittr,CellChat)

读入注释好的空转数据,文末扫码加群获取本文数据

load("visium_mouse_cortex_annotated.RData")
srt <- visium.brain

准备CellChat所需的输入数据

细胞(Spot)的基因表达信息

data_input <- SeuratObject::GetAssayData(srt, layer = "data", assay = "SCT")

细胞和样本的信息

meta <- srt@meta.data %>%
    dplyr::select(orig.ident, label) %>%
    dplyr::rename(samples = orig.ident, labels = label)

空间坐标信息

coordinates <- SeuratObject::GetTissueCoordinates(srt, scale = NULL, cols = c("imagerow""imagecol"))

spatial_factors  (空间距离因子)

spot_diameter_fullres <- jsonlite::fromJSON("spatial/scalefactors_json.json")$spot_diameter_fullres
# 理论上10X Visum的spot直径大小(单位微米)
spot_size <- 65
conversion_factor <- spot_size / spot_diameter_fullres
spatial_factors <- data.frame(ratio = conversion_factor, tol = spot_size / 2)
d_spatial <- CellChat::computeCellDistance(coordinates = coordinates, ratio = spatial_factors$ratio, tol = spatial_factors$tol)
# 10X Visum 约为100微米
min(d_spatial[d_spatial != 0]) # 99.52178

创建CellChat对象

cellchat <- CellChat::createCellChat(object = data_input, meta = meta, group.by = "labels", datatype = "spatial", coordinates = coordinates, spatial.factors = spatial_factors)
cellchat@DB <- CellChat::subsetDB(CellChatDB.mouse)

预处理

future::plan("multisession", workers = 8)
cellchat %<>% CellChat::subsetData()

识别高表达的基因

cellchat %<>% CellChat::identifyOverExpressedGenes()

识别高表达受体或配体

cellchat %<>% CellChat::identifyOverExpressedInteractions(variable.both = FALSE)

(可选)projectData将基因表达数据投影到蛋白质-蛋白质相互作用(PPI)网络上。具体来说,使用扩散过程根据高可信度实验验证的蛋白质-蛋白质网络中定义的邻居来平滑基因的表达值。当分析测序深度较浅的单细胞数据时,此函数非常有用,因为投影可以减少信号基因的缺失效应,特别是配体/受体亚基可能为零表达的情况。有人可能会担心这种扩散过程可能引入的潜在偏差,然而,它只会引入非常微弱的通信。默认情况下,CellChat使用原始数据(即object@data.signaling),而不是投影数据。若要使用投影数据,应在运行computeCommunProb之前运行projectData函数,并在运行computeCommunProb时将raw.use设置为FALSE。

cellchat %<>% CellChat::projectData(adjMatrix = PPI.mouse)

细胞间通信网络的推断

CellChat通过为每种相互作用分配一个概率值并进行置换检验,推断出具有生物学意义的细胞间通信。CellChat利用质量作用定律,结合基因表达与已知的信号配体、受体及其辅因子之间的相互作用先验知识,来建模细胞间通信的概率。

注意事项:推断出的配体-受体对的数量明显取决于计算每个细胞群体平均基因表达的方法。默认情况下,CellChat使用一种称为“trimean”的统计稳健均值方法,与其他方法相比产生的交互作用较少。然而,发现CellChat在预测较强的交互作用方面表现出色,这对于进一步实验验证时缩小关注的交互作用范围非常有帮助。在computeCommunProb中,提供了使用其他方法(如5%和10%截断均值)计算平均基因表达的选项。需要注意的是,“trimean”近似于25%截断均值,这意味着如果一个群体中表达细胞的比例小于25%,则平均基因表达为零。要使用10%截断均值,可以设置type = "truncatedMean"和trim = 0.1。为了确定trim的合适值,CellChat提供了一个名为computeAveExpr的函数,可以帮助检查感兴趣的信号基因(例如,computeAveExpr(cellchat, features = c("CXCL12","CXCR4"), type = "truncatedMean", trim = 0.1))的平均表达。因此,如果研究生物过程中公认的信号通路未被预测到,可以尝试使用较低trim值的截断均值来更改计算每个细胞群体平均基因表达的方法。

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

为了快速查看推断结果,用户可以在computeCommunProb中设置nboot = 20。此时,“pvalue < 0.05”意味着没有一个置换结果大于观察到的通信概率。

如果研究生物过程中公认的信号通路未被预测到,用户可以尝试使用较低trim值的截断均值来更改计算每个细胞群体平均基因表达的方法。

在处理来自其他空间转录组学技术的数据时可能需要调整scale.distance参数。请通过?computeCommunProb详细查看文档说明。

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

cellchat %<>% CellChat::computeCommunProb(
    type = "truncatedMean",
    trim = 0.1,
    distance.use = TRUE,
    interaction.range = 250,
    scale.distance = 0.01,
    contact.dependent = TRUE,
    contact.range = 100
)

如果某些细胞群体中只有少数细胞,可以过滤掉这些细胞间的通信。默认情况下,细胞间通信所需的每个细胞群体中的最小细胞数为10。

cellchat %<>% CellChat::filterCommunication(min.cells = 10)

推断细胞间通信在信号通路水平上的情况

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

注:对于每个配体-受体对和每个信号通路推断出的细胞间通信网络分别存储在'net’和'netP’中。

cellchat %<>% CellChat::computeCommunProbPathway()

汇总细胞间通信网络

可以通过计数链接数量或汇总通信概率来计算聚合的细胞间通信网络。还可以通过设置sources.use和targets.use来计算特定细胞组子集之间的聚合网络。

cellchat %<>% CellChat::aggregateNet()

可视化聚合的细胞间通信网络。例如,使用环形图或热图来展示任意两组细胞之间交互的数量或总交互强度(权重)。

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",font.size = 18,font.size.title = 28)
netVisual_heatmap(cellchat, measure = "weight", color.heatmap = "Blues",font.size = 18,font.size.title = 28)

细胞间通信网络的可视化

在推断出细胞间通信网络后,CellChat提供了多种用于进一步数据探索、分析和可视化的功能。此处仅展示环形图和新的空间图。

在不同层次上可视化细胞间通信:可以使用netVisual_aggregate来可视化信号通路的推断通信网络,并使用netVisual_individual来可视化与该信号通路关联的单个配体-受体对的推断通信网络。

此处以一个信号通路作为输入示例。通过cellchat@netP$pathways可访问到所有显示出显著通信的信号通路。

par(mfrow=c(1,1), xpd = TRUE# `xpd = TRUE` should be added to show the title
netVisual_aggregate(cellchat, signaling = c("IGF") , layout = "circle")

可视化组织中的细胞通讯

par(mfrow=c(1,1))
netVisual_aggregate(cellchat, signaling = c("IGF"), layout = "spatial", edge.width.max = 2, vertex.size.max = 1, alpha.image = 0.2, vertex.label.cex = 3.5)

计算并可视化网络中心性得分

# 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
par(mfrow=c(1,1))
netAnalysis_signalingRole_network(cellchat, signaling = c("IGF"), width = 8, height = 2.5, font.size = 10)

可以在可视化信号网络时在空间转录组学上显示这些信息,例如,较大的圆圈表示更大的输入信号

par(mfrow=c(1,1))
netVisual_aggregate(cellchat, signaling = c("IGF"), 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)

Reference

https://htmlpreview./?https://github.com/jinworks/CellChat/blob/master/tutorial/CellChat_analysis_of_spatial_transcriptomics_data.html

承接单细胞转录组、空间转录组、scATAC-seq分析项目


扫码加群交流与学习

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多