前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >细胞聚类分群及其可视化

细胞聚类分群及其可视化

作者头像
生信技能树jimmy
发布2024-06-13 18:23:17
920
发布2024-06-13 18:23:17
举报
文章被收录于专栏:单细胞天地单细胞天地

前情提要

在上一期单细胞PCA降维结果理解中给大家介绍了PCA降维,以及如何理解我们得到的降维结果。

那在单细胞基本分析流程中,使用RunPCA()进行了单细胞数据进行了线性降维,那接下来基于降维结果,对细胞进行聚类分群

需要用到的主要是FindNeighbors()以及FindClusters()两个函数,那这期就一起来了解一下单细胞的聚类分群叭!

FindNeighbors及FindClusters简介

细胞聚类的目标是根据细胞中各个基因表达模式的相似性(或距离)将一组细胞分组变成大类,使得这些大类成为有数学意义的亚群

seurat包中应用了一种基于图的聚类方法:

  • 第一步: 根据 PCA 空间中的欧几里得距离构建一个k-最近邻(KNN,k-nearest neighbor)图,并根据任意两个单元格的局部邻域共享重叠——共享最近邻(SNN,shared nearest neighbor)细化任意两个单元之间的边权重两步来组成。使用函数FindNeighbors()执行
  • 第二步: 应用模块化优化技术,默认使用Louvain算法来实现,在图中挑选相似度最高的一群细胞作为一个细胞亚群。使用函数FindClusters()来实现

命令使用及参数介绍

Ⅰ FindNeighbors
代码语言:javascript
复制
sce <- FindNeighbors(sce, reduction = "pca",
                     dims = 1:15) 

FindNeighbors的一般会选择三个参数:

  • object:输入经过降维后的数据
  • reduction:选择降维的方法,比如pca或umap
  • dim参数:选择多少个PCA的维度进行分析,也就是上一步PCA降维后我们依据肘部图选择的维度

返回的结果告诉我们,计算了最近邻图以及SNN,并将结果保存在graphs

Ⅱ FindClusters
代码语言:javascript
复制
#设置不同的分辨率,观察分群效果
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也是一般三个参数:

  • object:输入上一步返回的seurat数据
  • resolution参数:resolution是分辨率,与最后的分群数目有关的,值越大得到的分群数目会越多。
  • algorithm参数:模块化优化算法,1代表使用原始的Louvain算法

可以计算不同分辨率,结果会保存在metadata里面,可以查看计算一下不同分辨率得到的分群的数量

代码语言:javascript
复制
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 )可视化显示在多个分辨率下分群之间的关系,可以看到样本随着分群数量的增加而变化的情况

代码语言:javascript
复制
clustree(sce.all@meta.data, prefix = "RNA_snn_res.")

clustree里面也有一系列的参数可以进行选择,在clustree :聚类可视化利器[1]中周运来老师就有详细介绍

因为使用的是pbmc3k的示例数据,里面有注释结果,所以参考周老师整理的代码,可视化一下不同分辨率下分群与之的匹配程度

代码语言:javascript
复制
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

Ⅱ 桑基图

除了聚类图外,另一种比较常用的细胞聚类可视化的方法是桑基图

代码语言:javascript
复制
#安装加载需要的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

也可以使用balloonplot简单可视化一下两个resolution中的细胞分群情况

代码语言:javascript
复制
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维度的细胞聚类区别

在上一期单细胞PCA降维结果理解结尾中提到,可以使用肘部图去选择合适的维度(FindNeighbors中的dims参数)

代码语言:javascript
复制
#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)
代码语言:javascript
复制
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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-06-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 单细胞天地 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前情提要
  • FindNeighbors及FindClusters简介
  • 命令使用及参数介绍
    • Ⅰ FindNeighbors
      • Ⅱ FindClusters
      • 不同分辨率结果可视化
        • Ⅰ clustree树状图
          • Ⅱ 桑基图
            • Ⅲ balloonplot
            • 不同PCA维度的细胞聚类区别
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档