在上一期单细胞PCA降维结果理解中给大家介绍了PCA降维,以及如何理解我们得到的降维结果。
那在单细胞基本分析流程中,使用RunPCA()
进行了单细胞数据进行了线性降维,那接下来基于降维结果,对细胞进行聚类分群
需要用到的主要是FindNeighbors()以及FindClusters()
两个函数,那这期就一起来了解一下单细胞的聚类分群叭!
细胞聚类的目标是根据细胞中各个基因表达模式的相似性(或距离)将一组细胞分组变成大类,使得这些大类成为有数学意义的亚群
seurat包中应用了一种基于图的聚类方法:
FindNeighbors()
执行FindClusters()
来实现sce <- FindNeighbors(sce, reduction = "pca",
dims = 1:15)
FindNeighbors的一般会选择三个参数:
返回的结果告诉我们,计算了最近邻图以及SNN,并将结果保存在graphs中
#设置不同的分辨率,观察分群效果
for (res in c(0.01, 0.05, 0.1, 0.2, 0.3, 0.5,0.8,1)) {
sce.all=FindClusters(sce.all,
resolution = res, algorithm = 1)
}
FindClusters也是一般三个参数:
可以计算不同分辨率,结果会保存在metadata里面,可以查看计算一下不同分辨率得到的分群的数量
colnames(sce.all@meta.data)
> table(sce.all@meta.data$RNA_snn_res.1)
0 1 2 3 4 5 6 7 8 9 10
559 498 342 278 239 231 172 159 114 32 14
> table(sce.all@meta.data$RNA_snn_res.0.8)
0 1 2 3 4 5 6 7 8
610 520 467 342 319 175 159 32 14
使用table()可以看到当前分辨率下的细胞分群及其中的细胞数量,也可以对不同分辨率的进行可视化,然后根据可视化结果去选择合适的分辨率
使用聚类树(clustree )可视化显示在多个分辨率下分群之间的关系,可以看到样本随着分群数量的增加而变化的情况
clustree(sce.all@meta.data, prefix = "RNA_snn_res.")
clustree里面也有一系列的参数可以进行选择,在clustree :聚类可视化利器[1]中周运来老师就有详细介绍
因为使用的是pbmc3k的示例数据,里面有注释结果,所以参考周老师整理的代码,可视化一下不同分辨率下分群与之的匹配程度
sce.all=FindClusters(sce.all,
resolution = c(seq(0,1.6,.2)), algorithm = 1)
label_position <- function(labels) {
if (length(unique(labels)) == 1) {
position <- as.character(unique(labels))
} else {
position <- "mixed"
}
return(position)
}
clustree(sce.all@meta.data, prefix = "RNA_snn_res.", node_label = "seurat_annotations",
node_label_aggr = "label_position")
从结果可看到不同的分辨率下细胞亚群分类的情况,一般比较常用的分辨率是0.1、0.5、0.8,如果选择低分辨率比如0.1就会将细胞分成,如果选择0.5或者0.8较高的分辨率就可以对细胞进行细分比如将CD4T分为Naive和Memory CD4T
除了聚类图外,另一种比较常用的细胞聚类可视化的方法是桑基图
#安装加载需要的R包
install.packages("ggalluvial")
library(ggalluvial)
library(tidyverse)
#基于metadata里面不同的分辨率绘制桑基图
head(sce.all@meta.data)
ggplot(data = sce.all@meta.data,
aes(axis1 = RNA_snn_res.0.2, axis2 = RNA_snn_res.0.4,axis3 = RNA_snn_res.0.6,axis4 = RNA_snn_res.0.8,
axis5 = RNA_snn_res.1,axis6 = RNA_snn_res.1.2)) +
scale_x_discrete(limits = c(paste0("res.",seq(.2,1.2,.2))), expand = c(.01, .05)) +
geom_alluvium(aes(fill = RNA_snn_res.1.2)) +
geom_stratum() + geom_text(stat = "stratum", infer.label = TRUE) +
#coord_polar()+
theme(axis.text.x = element_text(angle = 90, hjust = 1))+
ggtitle("cell number in each cluster")
基于桑基图的结果,我们可以看到中间分辨率下细胞亚群的来源以及可能的分群去向。
同样桑基图也可以选择不同的参数,展示不同的内容,桑基图在单细胞数据探索中的应用[2]中也给出了更加详细的介绍
也可以使用balloonplot简单可视化一下两个resolution中的细胞分群情况
gplots::balloonplot(table(sce.all$RNA_snn_res.0.2,sce.all$RNA_snn_res.0.8))
可以看到在0.2下的0群提高分辨率后变为0.8中的0和1两个群,2群变为4和6两个群,与聚类树中的结果一致
在上一期单细胞PCA降维结果理解结尾中提到,可以使用肘部图去选择合适的维度(FindNeighbors中的dims参数)
#dims=1:15
sce <- FindNeighbors(sce, reduction = "pca",
dims = 1:15)
sce.all=sce
sce.all=FindClusters(sce.all,
resolution = 0.5, algorithm = 1)
DimPlot(sce.all,reduction = 'umap',label = T,repel = T)
sce2 <- FindNeighbors(sce, reduction = "pca",
dims = 1:30)
sce.all2=sce2
sce.all2=FindClusters(sce.all2,
resolution = 0.5, algorithm = 1)
DimPlot(sce.all2,reduction = 'umap',label = T,repel = T)
根据结果可以看到选择不同的PCA维度,在同一分辨率下细胞分群数量有些区别
在细胞聚类分群中,FindNeighbors的dim参数和FindClusters的resolution参数,都与最后的分群数目有关,可以根据样品情况和实际需求选择合适的PCA维度以及分辨率
参考资料
[1]
clustree :聚类可视化利器: https://www.jianshu.com/p/f997c2f41c48
[2]
桑基图在单细胞数据探索中的应用: https://www.jianshu.com/p/a7a6b8b11e3c