学习目标:
- 使用变异最大的基因进行不同条件的细胞整合,从而识别出最相似的细胞
单细胞 RNA-seq 聚类分析:整合
目标:
- 在不同的条件下,比对同一类型的细胞。
挑战:
- 比对似细胞类型的细胞,这样我们就不会由于样品、条件、形态或批次之间的差异而导致下游聚集。
建议:
- 先不进行整合,进而来确定是否需要进行整合。
整合还是不整合?
通常,在决定是否需要执行任何对齐之前,我们总是在没有集成的情况下查看我们的聚类。不要总是因为您认为可能存在差异而总是执行集成 - 探索数据。如果我们在 Seurat 对象中一起对两种条件进行归一化并可视化细胞之间的相似性,我们就会看到条件特定的聚类:
通常,在决定是否需要执行任何对齐之前,我们需要先查看没有整合的集群。不要认为可能存在差异而执行整合——探索数据。如果我们在Seurat对象中同时对这两个条件进行归一化,并可视化细胞之间的相似性,我们就会看到特定条件下的聚类:
不同条件下的细胞聚类,为了确保相同细胞类型的细胞聚集在一起,我们需要在不同条件下整合细胞。
为什么让相同细胞类型的细胞聚集在一起很重要?
在所有样品/条件/模式中我们要鉴别出细胞类型,并在于我们的数据该细胞类型存在,我们需要探索我们的集群之间差异表达的基因。如果我们在一个簇中有我们的对照 T 细胞,而在另一个簇中有我们的受激 T 细胞,那么当我们试图在 T 细胞中找到富集的基因时,我们将返回许多作为 T 细胞标记的基因,以及相关基因处理和控制之间的差异。这些可能难以区分,使细胞类型识别更加困难。如果我们在同一簇中拥有相同细胞类型的所有细胞,它还可以通过识别保守的细胞类型来帮助我们识别细胞类型基因在簇之间差异表达。此外,如果您想对这些 T 细胞进行任何下游分析(例如控制/治疗之间的 DE 分析、配体-受体分析等),重要的是相同细胞类型的细胞存在于相同的簇中.
在本课中,我们将介绍不同条件整合样本,它改编自Seurat v3 引导集成教程。
注意: Seurat 有一个关于如何在没有整合的情况下运行流程的小插图。与此工作流程非常相似,但在开始时不一定要拆分样本,也不会执行集成。
如果不确定条件(例如肿瘤和对照样本)之间期望什么簇或期望某些不同的细胞类型,它可以作为开始单独运行条件,然后将它们一起运行以查看两种条件中是否存在针对细胞类型的条件特异性簇. 通常,在对来自多个条件的细胞进行聚类时,存在特定条件的聚类,整合有助于确保相同的细胞类型聚类在一起。
使用高度共享的可变基因在不同条件整合或对齐样本
如果细胞按样本、条件、批次、数据集、模式进行聚类,则此整合步骤可以大大地改进聚类和下游分析。
为了整合,我们将使用来自每个组共有的高度可变基因(使用 SCTransform 识别),然后,我们将“整合”或“协调”这些组以覆盖具有相似“共同生物学特征”的细胞或组。例如,我们可以整合:
-
不同的条件(例如控制和刺激)
-
不同的数据集(例如,使用不同文库制备方法对同一样本生成的scRNA-seq数据集的)
-
不同的模式(例如 scRNA-seq 和 scATAC-seq)
不同批次(例如,当实验条件需要对样品进行批次处理时)
整合是一种强大的方法,它使用这些最大差异的共享资源来跨条件或数据集识别共享的亚群 [ Stuart 和 Bulter 等人。(2018) ]。整合的目标是确保一个条件/数据集的细胞类型与其他条件/数据集的细胞类型一致(例如,控制巨噬细胞与受刺激巨噬细胞一致)。。
具体地说,这种整合方法期望在组内的至少单个细胞子集之间有“对应”或共享的生物状态。集成分析的步骤如下图所示:
图片来源: Stuart T 和 Butler A 等人。单细胞数据的整合,bioRxiv 2018 (https://doi.org/10.1101/460147)
运行的不同分析步骤如下:
-
典型相关分析 (CCA):
CCA 确定条件/组之间共同差异来源。它是 PCA 的一种形式,因为它可以识别数据中最大的变异来源,但只有在跨条件/组之间共享或保守的情况下(使用来自每个样本的 3000 个变异最大的基因)。
这个步骤使用最大的共享变异源粗略地排列细胞。
注意:使用共享的高度可变基因是因为它们最有可能代表区分不同细胞类型的那些基因。
-
跨数据集识别的锚点或最近邻(MNN)(有时会识别出不正确的锚点):
MNN 可以被认为是“最好的伙伴”。对于一个条件下的每个细胞:
- 在另一种情况下,细胞的最近邻是根据基因表达值确定的——它是“最好的伙伴”。
- 执行相互分析,如果两个细胞在两个方向上都是“最好的伙伴”,那么这些细胞将被标记为锚点,将两个数据集“锚定”在一起。
“MNN 对中细胞之间表达值的差异提供了批效应的估计,通过对许多这样的对进行平均,批效应变得更加精确。获得校正向量并应用于表达式值执行批量校正。” [斯图尔特和布尔特等人。(2018) ]。
-
过滤锚以移除不正确的锚:
通过在邻近区域的重叠来评估锚对之间的相似性(不正确的锚会有较低的分数)——相邻的细胞是否有彼此相邻的“最好的伙伴”?
-
整合条件/数据集:
使用锚点和相应的分数来转换细胞表达值,允许整合条件/数据集(不同的样本、条件、数据集、模式)
注意:每个细胞的转换使用跨数据集锚点的每个锚点的两个细胞的加权平均值。权重由细胞相似度得分(细胞与 k 个最近锚点之间的距离)和锚点得分决定,因此同一邻域内的细胞应该具有相似的校正值。
如果细胞类型存在于一个数据集中,而不存在于另一个数据集中,则这些细胞仍将显示为单独的特定于样本的集群。
现在,使用我们的 SCTransform 对象作为输入,让我们执行跨条件的集成。
首先,我们需要指定我们要使用 SCTransform 识别的所有 3000 个最大突变的基因进行整合。默认情况下,此函数仅选择前 2000 个基因。
# Select the most variable features to use for integration
integ_features <- SelectIntegrationFeatures(object.list = split_seurat,
nfeatures = 3000)
注意:如果您缺少该
split_seurat
对象,您可以从您的data
文件夹中加载它:# Load the split seurat object into the environment split_seurat <- readRDS("data/split_seurat.rds")
如果您的
data
文件夹中没有该split_seurat.rds
文件,您可以右键单击此处将其下载到该data
文件夹中(下载可能需要一些时间)。
现在,我们需要准备用于整合的SCTransform 对象。
# Prepare the SCT list object for integration
split_seurat <- PrepSCTIntegration(object.list = split_seurat,
anchor.features = integ_features)
现在,我们将执行 CCA,找到最好的伙伴或锚点并过滤不正确的锚点。对于我们的数据集,这最多需要 15 分钟才能运行。另外,请注意控制台中的进度条将保持在 0%,但要知道它实际上正在运行。
# Find best buddies - can take a while to run
integ_anchors <- FindIntegrationAnchors(object.list = split_seurat,
normalization.method = "SCT",
anchor.features = integ_features)
最后,我们可以跨条件整合。
# Integrate across conditions
seurat_integrated <- IntegrateData(anchorset = integ_anchors,
normalization.method = "SCT")
UMAP 可视化
整合后,为了可视化整合的数据,我们可以使用降维技术,例如 PCA 和 Uniform Manifold Approximation and Projection (UMAP)。虽然 PCA 将确定所有 PC,但我们一次只能绘制两个。相比之下,UMAP 将从任意数量的主要 PC 获取信息,以在这个多维空间中排列细胞。它将在多维空间中获取这些距离,并在二维空间中绘制它们,可以保持局部和全局结构。这样,细胞之间的距离代表了表达的相似性。如果您想更详细地探索 UMAP,这篇文章是对 UMAP 理论的一个很好的介绍。
要生成这些可视化结果,我们需要首先运行 PCA 和 UMAP 方法。让我们从 PCA 开始。
# Run PCA
seurat_integrated <- RunPCA(object = seurat_integrated)
# Plot PCA
PCAPlot(seurat_integrated,
split.by = "sample")
我们可以通过 PCA 映射看到 PCA 很好地覆盖了这两个条件。
现在,我们还可以使用 UMAP 进行可视化。运行该方法并绘制图表。
# Run UMAP
seurat_integrated <- RunUMAP(seurat_integrated,
dims = 1:40,
reduction = "pca")
# Plot UMAP
DimPlot(seurat_integrated)
当我们将上图中的 ctrl 和 stim 集群与我们使用未集成数据集看到的相似性进行比较时,很明显整合该数据集更加有益!
集群间比较
有时,如果我们在 conditions 之间拆分绘图,更容易查看所有细胞是否对齐,我们可以通过向DimPlot()
函数添加split.by
参数实现:
# Plot UMAP split by sample
DimPlot(seurat_integrated,
split.by = "sample")
保存“整合”对象!
由于整合可能需要一段时间,因此保存整合 seurat 对象是一个很不错的选择。
# Save integrated seurat object
saveRDS(seurat_integrated, "results/integrated_seurat.rds")