单细胞聚类方法大比拼(II)​

admin 72 2025-01-13 编辑

单细胞聚类方法大比拼(II)上回介绍了KNN等几个常见的聚类算法,可惜它们在处理单细胞转录组这种超大数据集的效果都不是特别好。本节的主角是17年发表在Nature Method Single-cell Consensus Clustering——简称SC3聚类。顾名思义,这是专门为单细胞测序技术开发的一个聚类方法。官网介绍它的原文是“SC3 achieves high accuracy and robustness by consistently integrating different clustering solutions through a consensus approach”。那么我们来看看SC3到底有没有宣传中的那么神奇。首先介绍下SC3的大致原理,SC3的开发者认为在单细胞聚类时选择最佳的参数值是困难和费时的。为了避免这个问题,SC3使用了一种并行化方法,即同时并行计算参数空间的一个重要子集以获得一组聚类的结果。然后SC3将所有并行的不同聚类的结果组合为一个一致性矩阵(consensus matrix),并统计每个细胞位于同一类群中的频率。通过将一致性矩阵再次进行层次聚类,得到SC3提供的最终结果。通俗地说,SC3相当用不同的参数做了很多次聚类,然后再统计每次聚类的结果,决定细胞的最终分类结果。优点是避免了不合理的聚类参数对结果的影响,缺点也很明显——就是计算量十分滴惊人(土豪请无视)

接下来是枯燥的详细原理,不想了解的同学可以直接跳到下面的演示部分,毕竟生信的一大精髓不就是“能用就行”吗。(1) 数据预处理,拿到的表达矩阵还是要经过一定的筛选的,不然10x genomics的结果动辄2w多个基因谁也架不住啊。文献中将表达率低于6%和高于94%的基因都从数据集中去除,将数据集的规模减少了50%;(2) 接着是计算细胞与细胞之间的“距离”,SC3中一共计算了三种距离,分别是欧氏距离,皮尔森相关系数与斯皮尔曼相关系数,将数据的空间维数从1维直接拉到3维(3) 接下来是对3种距离矩阵使用PCA算法和拉普拉斯变化进行降维处理。这里的一个关键是确定参数降维后的维数,也就是上图中的“d ranger”。为此,作者在原文中做了很多的实验,最后发现原向量维数的4%-7%是一个比较合理的数值。所以遍历了原数据维度中4%-7%的值,对应图中的d1,d2……dD。对每种距离分别降维到每个维数。这里有点绕,不清楚的结合图多看几遍,你一定看得懂的;(4) 好滴,现在我们有6xdD个降维后的结果,分别对它们进行k-means聚类。一共会得到6xdD个聚类结果;(5) SC3使用基于cluster的相似性划分算法(CSPA),对于每个单独的聚类结果,依据聚类后的细胞标签构建一个二进制相似度矩阵:如果两个cell属于同一簇,则它们的相似度为1,否则相似度为0。通过对每个二进制相似度矩阵求平均值,可以计算出一致性矩阵(为了减少计算时间,如果d范围的长度大于15,则使用从d范围均匀选择的15个值的随机子集);(6) 终于到最后一步了,对上一步得到的一致性矩阵进行一次完全连接的层次聚类(complete-linkage hierarchical clustering),最终就能得到聚类结果,模型也即训练完成。从上面的介绍不难看出,SC3是一个计算密集型算法,计算量很大,需要多核心CPU,并且它在运算时会占用除一个核心之外的所有CPU资源(留一个核心让你摸鱼,是不是特人性化)。虽然本例中只有90个细胞,但运行起来我台式机上8核心16线程的CPU立马满载。所以大家尽量还是在服务器中运行,官方指出2000个细胞需要半个小时以上的时间,细胞数量上万可能有跑10几个小时还没有结束的情况,请君耐心等待吧。

 下面通过一个简单的示例解读一下SC3聚类的流程。作者将主要的算法封装在R包SC3中。但作为专门为聚类开发的工具,SC3这个R包本身不带有数据QC和标准化的功能,官网推荐的是先构建SingleCellExperiment对象,再使用scater完成预处理。当然数据处理不是本文的重点,所以我们直接采用SC3中附带的数据集yan进行演示,这是一个含有90个细胞和20214基因的矩阵(90x20214)。本文中的所有代码可在https://github.com/huhansan666666/singleCell获取。library(SC3)library(SingleCellExperiment)library(scater)# 包含了90个细胞的数据集yan,ann是细胞的名称ann <- annyan <- yan #------------------1 SC3 input----------------------# 创建一个 SingleCellExperiment对象sc3_data <- SingleCellExperiment(  assays = list(    counts = as.matrix(yan),    logcounts = log2(as.matrix(yan)+1)  ),  colData = ann)# 定义 feature names 在 feature_symbol 列rowData(sc3_data)$feature_symbol <- rownames(sc3_data)# 去除feature中重复的基因名sc3_data <- sc3_data[!duplicated(rowData(sc3_data)$feature_symbol), ] #------------------2 SC3 run-----------------------# ks的值是d1-dD的值域sc3_data <- sc3(sc3_data, ks = 2:4, biology = TRUE)# 交互式使用shinysc3_interactive(sc3_data)#利用scater中的PCA快速可视化聚类结果sc3_data <- runPCA(sc3_data)plotPCA(  sc3_data,  colour_by = "sc3_3_clusters",  size_by = "sc3_3_log2_outlier_score")生成的图非常多,这里介绍主要的几个图。1、一致性矩阵;还记得它吗,它由6xdD个k-means聚类的结果集成,是cell聚类的依据,可以看出这个示例数据比较好的能划分为3个类群。但是右下角中颜色深浅不同的红色区域暗示这个类群含有亚类或者还可以继续细分。

2、差异表达基因热图;没啥好多说的,就是文章中都会有的热图

3、Mark Gene 表达图;在SC3中,定义Mark Gene的标准是 ROC曲线下面积(AUROC)> 0.85且p值<0.01的基因。这里展示每个类群的前10个Mark Gene。

4、聚类结果;由于SC3是聚类算法,要是想在二维平面中可视化还是要搭配降维算法,官方采用的是PCA直接降到2维度,而没有采用通常的PCA + t-SNE的组合。

文中作者把SC3与tSNE6 followed by k-means;pcaReduce7, SNN-Cliq8, SINCERA9等做了对比,得出在他所测试的6个数据集上SC3是最棒的(你们的数据集我就不知道了)。此外,文中衡量聚类结果好坏的Benchmarking很有意思,大家可以看一下。由于SC3是一个非常复杂的方法,我也是硬着头皮看了好几天,写的肯定有不详细之处。大家可以在下面留言,我会尽量解答(百度)滴。剧透一下,下一期我会介绍单细胞大杀器Seurat包中默认的聚类方法:谱聚类。 原文链接:Kiselev VY, Kirschner K, Schaub MT, et al. SC3: consensus clustering of single-cell RNA-seq data. Nat Methods. 2017;14(5):483‐486. doi:10.1038/nmeth.4236欢迎关注转录组 | 甲基化 | 重测序 | 单细胞 | m6A|多组学  cytoscape | limma | WGCNA |水熊虫传奇|linux电泳 | PCR | 测序简史 | 核型 | NIPT | 基础实验 基因| 2019-nCoV | 富集分析 | 联合分析 |微环境 瘟疫追凶| 思路汇总| 学者| 科研 | 撤稿 | 读博|基因

单细胞聚类方法大比拼(II)​

上一篇: 质粒构建工具推荐,实验室必备的分子克隆利器
下一篇: SNP突变带给乳腺癌的影响
相关文章