本文来源于哈佛大学的单细胞课程系列,在此做一些学习,不当之处请指正。
scRNA-seq/07_SC_clustering_cells_SCT.md at master · hbctraining/scRNA-seq · GitHubhttps://github.com/hbctraining/scRNA-seq/blob/master/lessons/07_SC_clustering_cells_SCT.md
利用方法评估用于集群的PC的选择
基于重要的PC进行细胞集群
现在我们已经集成了高质量的细胞,我们想知道我们细胞群中存在的不同细胞类型。
目标:
要生成特定于细胞类型的簇,并使用已知的细胞类型标记基因来确定簇的身份。
为了确定是否簇表示由于生物或技术变化真细胞类型或簇,如在细胞周期的S期的细胞群,特定批次的簇,或具有高含量的线粒体细胞。
挑战:
识别出可能是由于生物学或技术上的无意义变化而导致的质量较差的簇
识别每个群集的细胞类型
保持耐心,因为这可能是聚类和标记识别之间的高度迭代过程(有时甚至返回到QC过滤)
建议:
在执行群集之前,最好对将要出现的细胞类型有一个期望。了解您是否期望低复杂度或更高线粒体含量的细胞类型,以及细胞是否在分化
如果您有多个条件,执行整合以对齐细胞通常会很有帮助
如果需要并且适合实验,请淘汰UMI的数量(默认情况下使用sctransform),线粒体含量和细胞周期,以免引起聚类
确定要删除或重新访问QC过滤的所有垃圾群集。可能的垃圾簇可能包括那些具有高线粒体含量和低UMI /基因的垃圾簇。如果由很多细胞组成,则可能有助于返回到QC进行过滤,然后重新整合/聚类。
如果未将所有细胞类型都检测为单独的群集,请尝试更改分辨率或用于群集的PC数量
为了克服针对scRNA-seq数据的任何单个基因表达中的广泛技术干扰,Seurat根据从整合的可变性最高的基因表达中获得的PCA分数,将细胞分配至簇,每个PC基本上代表一个“元基因”,结合跨相关基因集的信息。因此,确定要在聚类步骤中包含多少PC对于确保我们捕获数据集中存在的大多数变异或细胞类型非常重要。在决定要包括哪些PC以便进行下游聚类分析之前,先探索PC是很有用的。(a)探索PC的一种方法是使用热图将具有PCA分数排序的基因和细胞的选定PC的最变异基因可视化。这里的想法是查看PC,并确定驱动PC的基因对于区分不同细胞类型是否有意义。该cells
参数指定用于绘制的PCA分数为负数或负数最多的像元数。这个想法是,我们正在寻找一PC,其热图开始看起来更加“模糊”,即基因组之间的区别不太明显。
#探索PC热图
DimHeatmap(seurat_integrated,
dims = 1:9,
cells = 500,
balanced = TRUE)
如果我们想探索大量的PC,这种方法可能会很慢并且很难可视化单个基因。同样,要探索大量PC,我们可以通过驱动PC的PCA分数打印出前10个(或更多)阳性和阴性基因。#打印出驱动PC
# 输出PCs分群的高变基因
print(x = seurat_integrated[["pca"]],
dims = 1:10,
nfeatures = 5)
(b)肘部图 是另一有用的方法,可用于确定要用于群集的PC数,以便我们捕获数据中的大部分变化。肘部图显示了每PC的标准偏差,我们正在寻找标准偏差开始趋于平稳的地方。本质上,肘部出现的位置通常是识别大部分变化的阈值。但是,此方法可能非常主观。让我们使用前40PC绘制一个肘部图:
# 绘制肘部图
ElbowPlot(object = seurat_integrated,
ndims = 40)
根据此图,我们可以大致确定PC8-PC10周围肘部发生的大部分变化,或者可以认为应该是数据点开始接近X轴,PC30左右的时候。这使我们对需要包含的PC数量有了一个非常粗略的想法,我们可以更定量地提取此处显示的信息,这可能会更加可靠。尽管以上两种方法与来自Seurat的较旧方法一起用于标准化和鉴定可变基因的方法更多,但它们不再像以前那样重要。这是因为SCTransform方法比旧方法更准确。为什么选择PC对于较旧的方法更重要?较早的方法将一些技术变化源纳入了一些高级PC中,因此PC的选择更为重要。SCTransform可以更好地估计方差,并且不会在较高的PC中经常包含这些技术变化的来源。从理论上讲,使用SCTransform时,我们选择的PC越多,执行群集时所考虑的变化就越大,但是执行群集需要花费更长的时间。因此,在此分析中,我们将使用前40PC来生成群集。
Seurat使用基于图的聚类方法,该方法使用K近邻(KNN)图(默认情况下)将细胞嵌入图结构中,并在具有相似基因表达模式的细胞之间绘制边缘。然后,它尝试将此图划分为高度互连的“准clique”或“社区” [ Seurat引导聚类教程]。我们将使用该FindClusters()
函数执行基于图的聚类。这resolution
是一个重要参数,可设置下游聚类的“粒度”,并且需要针对每个单独的实验进行优化。对于3000- 5,000个细胞的数据集,所述resolution
间集0.4
-1.4
通常产生良好的群集。分辨率值的提高导致簇的数量增加,这对于较大的数据集通常是必需的。该FindClusters()
函数允许我们输入一系列分辨率,并将计算聚类的“粒度”。这对于测试哪种分辨率适用于前进是非常有帮助的,而不必为每个分辨率运行该功能。
# 确定K近邻图表
seurat_integrated <- FindNeighbors(object = seurat_integrated, dims = 1:40)
# 确定用于各种分辨率簇
seurat_integrated <- FindClusters(object = seurat_integrated,resolution = c(0.4, 0.6, 0.8, 1.0, 1.4))
如果我们查看Seurat object(seurat_integrated@metadata
)的元数据,则每个计算出的不同分辨率都有一个单独的列。
#探索分辨率
seurat_integrated@meta.data %>% View()
要选择开始的分辨率,我们通常会在范围的中间进行选择,例如0.6或0.8。我们将使用Idents()
功能分配簇的标识,以0.8的分辨率开始。
# 分配集群的标识
Idents(object = seurat_integrated) <- "integrated_snn_res.0.8"
为了可视化细胞簇,有几种不同的降维技术可能会有所帮助。最受欢迎的方法包括t分布随机邻居嵌入(t-SNE)和均匀流形逼近与投影(UMAP)技术。两种方法的目的都是将高维空间中具有相似局部邻域的细胞放置在低维空间中。这些方法将要求您输入要用于可视化的PCA尺寸数,我们建议使用相同数量的PC作为聚类分析的输入。在这里,我们将继续使用UMAP方法来可视化集群。
##UMAP计算
# seurat_integrated <- RunUMAP(seurat_integrated,
# reduction = "pca",
# dims = 1:40)
# 绘制UMAP
DimPlot(seurat_integrated,
reduction = "umap",
label = TRUE,
label.size = 6)
探索其他分辨率也可能很有用。它将使您快速了解如何根据解析度参数更改群集。例如,让我们切换到0.4的分辨率:
# 分配集群的标识
Idents(object = seurat_integrated) <- "integrated_snn_res.0.4"
# 分配集群的标识
DimPlot(seurat_integrated,
reduction = "umap",
label = TRUE,
label.size = 6)
您的UMAP图与上面的图相比如何?与本课中的图像相比,群集的外观可能会有所不同。特别是,您可能会看到簇的标签有所不同。不幸的是,软件包版本略有变化(主要是Seurat依赖项)。如果您的群集看上去与本课中的内容相同,请继续进行下一部分,而无需下载任何内容。
如果您的集群看上去确实与本课中的有所不同,请右键单击并将此Rdata文件下载到该data
文件夹中。它包含我们为该类创建的seurat_integrated对象。下载大文件后,您将需要:
双击解压缩文件
将对象加载到您的R会话中,并覆盖现有的R会话:
load("data/seurat_integrated.RData")
现在,我们将继续使用0.8分辨率来检查质量控制指标和预期细胞类型的已知标记。再次绘制UMAP,以确保您现在(或仍然)的图像与您在课程中看到的图像匹配:
# 分配集群的标识
Idents(object = seurat_integrated) <- "integrated_snn_res.0.8"
# 绘制UMAP
DimPlot(seurat_integrated,
reduction = "umap",
label = TRUE,
label.size = 6)
#####################################################
####07_SC_clustering_cells_SCT.md
# Printing out the most variable genes driving PCs
print(x = seurat_integrated[["pca"]],
dims = 1:10,
nfeatures = 5)
# Plot the elbow plot
ElbowPlot(object = seurat_integrated,
ndims = 40)
# Determine the K-nearest neighbor graph
seurat_integrated <- FindNeighbors(object = seurat_integrated,
dims = 1:40)
# Determine the clusters for various resolutions
seurat_integrated <- FindClusters(object = seurat_integrated,
resolution = c(0.4, 0.6, 0.8, 1.0, 1.4))
# Explore resolutions
seurat_integrated@meta.data %>%
View()
# Assign identity of clusters
Idents(object = seurat_integrated) <- "integrated_snn_res.0.8"
## Calculation of UMAP
## DO NOT RUN (calculated in the last lesson)
# seurat_integrated <- RunUMAP(seurat_integrated,
# reduction = "pca",
# dims = 1:40)
# Plot the UMAP
DimPlot(seurat_integrated,
reduction = "umap",
label = TRUE,
label.size = 6)
# Assign identity of clusters
Idents(object = seurat_integrated) <- "integrated_snn_res.0.4"
# Plot the UMAP
DimPlot(seurat_integrated,
reduction = "umap",
label = TRUE,
label.size = 6)
load("data/seurat_integrated.RData")
# Assign identity of clusters
Idents(object = seurat_integrated) <- "integrated_snn_res.0.8"
# Plot the UMAP
DimPlot(seurat_integrated,
reduction = "umap",
label = TRUE,
label.size = 6)