10.单细胞 RNA-seq:聚类分析

学习目标:

  • 评估是否存在聚类过程产生的技术误差
  • 使用 PCA 和 UMAP 图确定聚类质量,并了解何时重新聚类
  • 评估已知的细胞类型标记与假设簇的细胞类型同一性

单细胞 RNA-seq 聚类分析

现在我们已经进行了整合,我们想知道我们的细胞群中存在哪些不同细胞类型。

image

目标:

  • *生成特定于细胞类型的簇,并使用已知的标记来确定簇的身份。
  • 确定分群是否代表真实的细胞类型或由于生物或技术差异而形成的群集 ,例如处于细胞周期S期的细胞群集、特定批次的群集或高线粒体含量的细胞。

挑战:

  • 识别每个分群的细胞类型
  • 保持耐心,因为这可能是聚类和标记识别之间的高度迭代过程(有时甚至回到 QC 过滤或标准化)

建议:

  • 对存在的细胞类型和这些细胞类型的几个标记基因有一个很好的预期。了解你所期望的是低复杂性的细胞类型还是高线粒体含量的细胞类型,以及这些细胞是否正在分化。
  • 确定要删除的任何垃圾群。垃圾群可能是包含高线粒体含量和低UMIs/基因的那些。
  • 如果未将所有细胞类型检测为单独的群 ,请尝试更改UMAP分辨率、用于分群的PC数量或使用的可变基因数量。

探讨质制指标

为了确定我们的分群是否可能是由于细胞周期阶段或线粒体表达等人为因素造成的,可视化探索这些指标以查看是否有任何簇表现出富集或与其他簇不同,这是很有用的。但是,如果观察到特定簇的富集或差异,它可以用细胞类型来解释,那就可以不必担忧。
为了探索和可视化各种质量指标,我们将使用来自Seurat的通用的DimPlot()FeaturePlot() 函数。

按样本分离聚类

我们可以从每个样本中每个簇的细胞分布开始:

# Extract identity and sample information from seurat object to determine the number of cells per cluster per sample
n_cells <- FetchData(seurat_integrated, 
                     vars = c("ident", "orig.ident")) %>%
        dplyr::count(ident, orig.ident) %>%
        tidyr::spread(ident, n)

# View table
View(n_cells)

image

我们可以使用 UMAP 对每个样本的每个簇的细胞进行可视化:

# UMAP of cells in each cluster by sample
DimPlot(seurat_integrated, 
        label = TRUE, 
        split.by = "sample")  + NoLegend()

image

一般来说,我们希望在所有条件下,大多数细胞类型簇都存在;然而,根据实验,我们可能会看到一些特定条件的细胞类型存在。这些簇在不同条件下看起来非常相似,这很好,因为我们预计在对照和刺激条件下都存在类似的细胞类型。

按细胞周期分离簇

接下来,我们将探索细胞是否会因不同的细胞周期阶段而出现聚集。当我们对无意义的变异源进行SCTransform归一化和回归时,并没有因为细胞周期阶段而使变异消退。如果我们的细胞簇在线粒体表达上表现出很大的差异,这预示着我们要重新运行SCTransform,并将 S.ScoreG2M.Score 添加到我们的变量中以进行回归,然后重新运行其余步骤。
接下来,我们将探讨细胞是否会因不同的细胞周期出现阶段聚集。

# Explore whether clusters segregate by cell cycle phase
DimPlot(seurat_integrated,
        label = TRUE, 
        split.by = "Phase")  + NoLegend()

image

我们看不到细胞周期评分的太多聚类,因此我们可以继续进行 QC。

按照各种意义的变化来源分离聚类

接下来,我们将探索其他指标,例如每个细胞的 UMI 和基因数量、S 期和 G2M 期标记,以及 UMAP 的线粒体基因表达。查看各自的 S 和 G2M 分数可以为我们提供额外的信息来检查细胞周期因素的影响,就像我们之前所做的那样。

# Determine metrics to plot present in [email protected]
metrics <-  c("nUMI", "nGene", "S.Score", "G2M.Score", "mitoRatio")

FeaturePlot(seurat_integrated, 
            reduction = "umap", 
            features = metrics,
            pt.size = 0.4, 
            order = TRUE,
            min.cutoff = 'q10',
            label = TRUE)

image

注:order参数将在低表达细胞上方绘制高表达细胞,而min.cutoff参数将确定着色的阈值。 min.cutoffq10意味着基因表达最低的10%的细胞,不会表现出任何紫色阴影(完全灰色)

指标在整个群集中相对均匀,但nUMInGene在群集3、9、14和15中显示出更高的值,也许还包括群集17。我们将密切关注这些群集,看看细胞类型是否可以解释这种增加。

如果我们在此时看到与这些指标对应的差异,那么我们通常会注意到它们,然后在确定细胞类型标识后决定是否采取进一步的行动。

探索驱动不同集群的PC

我们还可以探索群集通过不同的PC分开的情况。我们希望定义的PC能够很好地区分细胞类型。要可视化这个信息,我们需要提取细胞的UMAP坐标信息及其对应的每个PC分数,以便通过UMAP查看每个PC。
首先,我们确定要从Seurat对象提取的信息,然后,可以使用 FetchData() 函数提取它。

# Defining the information in the seurat object of interest
columns <- c(paste0("PC_", 1:16),
            "ident",
            "UMAP_1", "UMAP_2")

# Extracting this data from the seurat object
pc_data <- FetchData(seurat_integrated, 
                     vars = columns)

注意:我们如何知道在FetchData()函数中包含UMAP_1以获取 UMAP 坐标?所述seurat的cheatsheet描述了该函数为能够从表达式矩阵,细胞的嵌入,或元数据中提取任何数据。

例如,如果您浏览seurat_integrated@reductions列表对象,第一个组件用于 PCA,并包含一个用于cell.embeddings. 我们可以使用列名(PC_1PC_2PC_3等)为每个 PC 提取与每个细胞对应的坐标或 PC 分数。

我们可以为 UMAP 做同样的事情:

# Extract the UMAP coordinates for the first 10 cells
seurat_integrated@[email protected][1:10, 1:2]

FetchData()函数可以让我们更容易地提取数据。

在下面的 UMAP 图中,细胞按每个主成分的 PC 分数着色。

让我们浏览一下排名前 16 的 PC:

# Adding cluster label to center of cluster on UMAP
umap_label <- FetchData(seurat_integrated, 
                        vars = c("ident", "UMAP_1", "UMAP_2"))  %>%
  group_by(ident) %>%
  summarise(x=mean(UMAP_1), y=mean(UMAP_2))

# Plotting a UMAP plot for each of the PCs
map(paste0("PC_", 1:16), function(pc){
        ggplot(pc_data, 
               aes(UMAP_1, UMAP_2)) +
                geom_point(aes_string(color=pc), 
                           alpha = 0.7) +
                scale_color_gradient(guide = FALSE, 
                                     low = "grey90", 
                                     high = "blue")  +
                geom_text(data=umap_label, 
                          aes(label=ident, x, y)) +
                ggtitle(pc)
}) %>% 
        plot_grid(plotlist = .)

image

我们可以看到如何由不同的 PC 表示的集群。例如,PC_2基因在簇 6、11 和 17 中表现出更高的表达(在 15 中也可能更高一些)。我们可以回顾一下驱动这台 PC 的基因,以了解细胞类型可能是什么:

# Examine PCA results 
print(seurat_integrated[["pca"]], dims = 1:5, nfeatures = 5)

image

以 CD79A 和 CD74 基因以及 HLA 基因作为 PC_2的阳性标记,我们可以假设簇6、11 和17 对应于 B 细胞。这只是暗示了集群身份可能是什么,集群的身份是通过 PC 的组合来确定的。

为了真正确定集群的身份以及resolution是否合适,探索一些已知的预期细胞类型的基因标记是有帮助的。

探索已知的细胞类型标记

随着细胞的聚集,我们可以通过寻找已知的标记来探索细胞类型的身份。显示了带有簇标记的 UMAP 图,然后是预期的不同细胞类型。

DimPlot(object = seurat_integrated, 
        reduction = "umap", 
        label = TRUE) + NoLegend()

image
细胞类型 标记
CD14+ 单核细胞 CD14, LYZ
FCGR3A+ 单核细胞 FCGR3A、MS4A7
常规树突状细胞 FCER1A, CST3
浆细胞样树突状细胞 IL3RA、GZMB、SERPINF1、ITM2C
B细胞 CD79A、MS4A1
T细胞 CD3D
CD4+ T 细胞 CD3D、IL7R、CCR7
CD8+ T 细胞 CD3D、CD8A
自然杀伤细胞 GNLY、NKG7
巨核细胞 PPBP
红细胞 HBB、HBA2

seurat的FeaturePlot()函数可以使用存储在 Seurat 对象中的基因 ID 轻松可视化少数基因。我们可以在 UMAP 可视化之上轻松探索已知基因标记的表达。让我们通过并确定集群的身份。为了访问所有基因的标准化表达水平,我们可以使用存储在RNA检测槽中的标准化计数数据。

注意: SCTransform 归一化仅对 3000 个最易变的基因执行,因此我们感兴趣的许多基因可能不存在于该数据中。

# Select the RNA counts slot to be the default assay
DefaultAssay(seurat_integrated) <- "RNA"

# Normalize RNA data for visualization purposes
seurat_integrated <- NormalizeData(seurat_integrated, verbose = FALSE)

注意: Assay 是在 Seurat 对象中定义的一个插槽,其中有多个插槽。在给定的检测中,counts槽存储非标准化的原始计数,data槽存储标准化的表达数据。因此,当我们运行NormalizeData()上述代码中的函数时,归一化数据将存储在dataRNA 分析的槽中,而counts槽将保持不变。

根据我们感兴趣的标记,它们可能是特定细胞类型的阳性或阴性标记。我们选择的少数标记的组合表达应该让我们了解一个集群是否对应于特定的细胞类型。

对于此处使用的标记,我们正在寻找阳性标记和标记在整个集群中的表达一致性。例如,如果一种细胞类型有两个标记,而一个簇中只有其中一个被表达——那么我们不能可靠地将该簇分配给细胞类型。

CD14+ 单核细胞标志物

FeaturePlot(seurat_integrated, 
            reduction = "umap", 
            features = c("CD14", "LYZ"), 
            order = TRUE,
            min.cutoff = 'q10', 
            label = TRUE)

image

CD14+ 单核细胞似乎对应于簇 1、3 和 14。我们不会包括簇 9 和 15,因为它们不高度表达这两种标记。

FCGR3A+ 单核细胞标志物

FeaturePlot(seurat_integrated, 
            reduction = "umap", 
            features = c("FCGR3A", "MS4A7"), 
            order = TRUE,
            min.cutoff = 'q10', 
            label = TRUE)

image

FCGR3A+ 单核细胞标记明显突出了簇 9,尽管我们确实在簇 1、3 和 14 中看到了一些不错的表达。我们希望在执行标记识别时看到 FCGR3A+ 细胞的其他标记出现。

巨噬细胞

FeaturePlot(seurat_integrated, 
            reduction = "umap", 
            features = c("MARCO", "ITGAM", "ADGRE1"), 
            order = TRUE,
            min.cutoff = 'q10', 
            label = TRUE)

image

我们没有看到我们的标记有太多重叠,因此似乎没有与巨噬细胞对应的簇;也许细胞培养条件对巨噬细胞进行了负面选择(更高的粘附性)。

常规树突状细胞标志物

FeaturePlot(seurat_integrated, 
            reduction = "umap", 
            features = c("FCER1A", "CST3"), 
            order = TRUE,
            min.cutoff = 'q10', 
            label = TRUE)

image

对应于常规树突细胞的标记物识别簇 15(两个标记物始终显示表达)。

浆细胞样树突状细胞标志物

FeaturePlot(seurat_integrated, 
            reduction = "umap", 
            features = c("IL3RA", "GZMB", "SERPINF1", "ITM2C"), 
            order = TRUE,
            min.cutoff = 'q10', 
            label = TRUE)

image

浆细胞样树突状细胞代表簇 19。虽然这些标记的表达存在很多差异,但我们看到簇 19 始终强烈表达。


锻炼

假设表中每个不同集群对应的集群:

细胞类型 集群
CD14+ 单核细胞 1, 3, 14
FCGR3A+ 单核细胞 9
常规树突状细胞 15
浆细胞样树突状细胞 19
巨噬细胞 -
B细胞 ?
T细胞 ?
CD4+ T 细胞 ?
CD8+ T 细胞 ?
自然杀伤细胞 ?
巨核细胞 ?
红细胞 ?
未知 ?

注意:如果任何集群似乎包含两种不同的细胞类型,则提高我们的集群分辨率以正确地对集群进行子集化是有帮助的。或者,如果我们仍然无法使用增加的分辨率分离出簇,那么可能我们使用的主成分太少,以至于我们没有分离出这些感兴趣的细胞类型。为了告知我们对 PC 的选择,我们可以查看与 UMAP 图重叠的 PC 基因表达,并确定我们的细胞群是否被包含的 PC 分开。

现在我们对大多数集群对应的细胞类型有了一个不错的想法,但仍然存在一些问题:

  1. 集群 7 和 20 的细胞类型标识是什么?
  2. 对应于相同细胞类型的簇是否具有生物学意义的差异?是否存在这些细胞类型的亚群?
  3. 通过识别这些簇的其他标记基因,我们能否对这些细胞类型身份获得更高的可信度?

标记识别分析可以帮助我们解决所有这些问题!!

下一步将是进行标记识别分析,这将输出聚类之间表达显着差异的基因。使用这些基因,我们可以确定或提高对集群/亚群群识别的信心。

你可能感兴趣的:(10.单细胞 RNA-seq:聚类分析)