这一讲是介绍单细胞聚类的相关知识点。里面不仅是介绍方法,还有一些相关的原理,每一种cluster是怎么工作的(不是数学公式,而是用图形说明原理),有的地方主讲人讲的太偏于数学原理,我就直接跳过去了。所以如果想了解细节的童鞋可以看看。
视频地址:https://www.youtube.com/watch?v=Qa6k7RIwltg&list=PLjiXAZO27elC_xnk7gVNM85I2IQl5BEJN&index=7
练习地址:https://github.com/NBISweden/excelerate-scRNAseq/blob/master/session-clustering/Clustering.md
之前讲了质量控制、降维,现在这一步就是鉴定你的data里的细胞群。上图就是一个简单的流程图。拿到scRNA-seq 的matrix,这个matrix里含有细胞和features(这里就是基因)。然后你把细胞聚类(clustering),然后你再试着将这些细胞群注释,标注细胞群的名称。
上图就是从QC开始的一个简单的分析流程,图里打√的部分都是之前几讲讲过的,今天要讲的是clustering。那么在讲聚类前,还涉及一步是feature selection。这部分主讲人会在下面讲到。
所以,为什么我们需要做feature selection?这里有一个名词叫curse of dimensionality(有道翻译出来是“维数灾难”,孤陋寡闻的我没听说过这个词。。)。主讲人举了个例子:上图的两张PCA图,左边那个你只用500个基因来分析,你可以得到非常好的clustering;而右边你用2万个基因来分析,你会发现细胞并没有分的很开,比如黑色和灰色的细胞群就没有像左边那样分的很开。所以curse of dimensionality的意思就是:你想看越多的features,那么背景noise就会越大。所以去除一些基因的目的就是提高real 的信号,提高信噪比。另外一个目的就是降低计算的复杂程度。
上图是一个feature selection的方法,你的目的是选出那些在你的dataset里不同细胞之间表达差异最大的那些基因。但是问题是,当你看variance和平均表达量之间的关系,你会发现他们是相互依赖的。所以你第一件事可以做的就是:画变异系数图(变异系数:coefficient of variation)。棕色的点是所有的基因,蓝色的点是spike-in,根据这些你可以fit一个函数在spike-in上(基因和spike-in之间的variation是技术层面的variation)。粉色的点显示的是基因的true variation。但是如果你用的是droplet-base的方法进行测序,是不适用spike-in的,如果是这种情况,你就要根据你所有的基因来估计技术noise。比如下面这种方法:
上图是基于dropout的feature selection的方法。原理我就不听了,听也听不懂。。主要看右下角,蓝色线是根据所有基因评估出来的,类似于上一个方法图里的红色虚线。这里蓝色线右面的黄色点,就是你data里真正的variation.
接下来选主要成分。上图是Elbow plot图,也叫碎石图。这图是对主要成分进行排序。那么排在第一的成分就是你的data里最大的variation。然后你可以选择多少个PC进行下游分析,那么虚线右边的PC就可以忽略不看了。
在这一讲里,主讲人将主要介绍3种聚类的方法。
先看上图,先看看什么是好的聚类,什么是不好的聚类。那你觉得哪一个聚类结果更好呢?很显然,左图的聚类明显比右边的好。为什么呢?因为左图里,同一个圈里的点之间的距离,要明显小于和另一个圈里的距离。而右图并不是。
首先是第一种,Hierarchical clustering,分层聚类。举个简单的例子,8个点分布在二维里。现在我们想把这些点聚类。
首先我们要做的是,把最接近的两个细胞圈在一起。在右边系统树图里,4和2之间连接的高度,代表两个点的距离。
第二步,把离的第二近的两个细胞圈在一起。然后再在右边系统树图里标出5和8的height。
第三步,把4和2的圈与3画在一起,因为这个距离是第三近的。同样的,在右边系统树图里把4,2和3的height标出来。接着用同样的方法,一步一步把系统树画完整:
直到上图,把两个离的较远的群划分在一起,这样cluster就结束了。
如果你想要两个分群,那么可以把系统树从上面切开,这样就得到了两个独立的群。
那么怎么计算两个cluster之间的距离呢?主讲人主要讲了其中的两种:第一种方法是single linkage,这种方法是计算两个cluster里每一个点之间的距离。然后得到最短的和最长的距离,取平均值。
第二种方法是complete linkage。这种方法是计算两个cluster里距离最远的两个点的距离,然后取最小的那个距离。
由于两种方法的不同,可导致你最后的聚类结果的不同。如果你用single linkage聚类,你最终会得到比较“长条”的聚类结果;而complete linkage方法聚类,你会得到比较大的聚类结果。
上面讲了分层聚类方法,现在来讲k-means聚类方法。这种聚类方法是先从data里随机选取两个随机点,这里不是说所有的k-means方法都是先取两个随机点,如果你只想把细胞聚类为2类,那么就随机取2个开始。你想把细胞聚几类,就要随机取几个开始。
然后把其他细胞根据距离每个随机点(prototype)的远近,分配给不同的随机点,形成一个cluster。
之后根据你分的群里每个点的平均距离,更新你的prototype(随机点),所以上图里可以看到,随机点的位置改变了。
由于随机点的位置改变,这时就要忽略你之前的分派了。现在所有的点根据新的随机点,再重新被分派到离自己最近的随机点,形成一个新的cluster。
然后再根据两个cluster里的点的平均距离来更新随机点的位置,上图看到,随机点的位置又变了。
根据这个再次更新的随机点,每个点又会被重新分派给新的cluster。这个过程会被一直重复,直到没有点的分配改变,那么这个循环就会停止。最终的cluster会像下图一样:
但是,k-means聚类方法仍然存在一些缺陷。第一,就是k-means做出来的聚类图,基本上都是圆圈形状的聚类。但是你的dataset不会刚好都是圆圈的那种聚类,比如上图,如果你用k-means聚类,就会得到很奇怪的聚类结果。所以如果你确定你的聚类会得到圆圈形状的结果,用k-means就没问题。
第三种要讲的聚类方法是基于graph的聚类。graph,就是network。它包括节点和边界。
在单细胞的分析里,人们讨论的graph主要分两类。KNN和SNN。这两种很相似,但是还是有不同点。(这里原理实在是听不懂,是和数学模型有关的)像我们经常使用的Seurat包就是基于 graph的方法进行聚类的(下面省略几张PPT是数学模型的,太过于复杂,感兴趣的可以去看视频)
请记住,聚类是非常主观的一个过程。这取决于你使用哪种聚类方法,不同聚类方法给出的结果可能完全不一样。重要的是聚类以后你的实验证明。
还有一个办法可以验证你的clustering是否合适。你可以从你的dataset里得到的cluster中抽出一部分细胞,每个cluster都抽出一部分细胞,组成一个小的dataset,然后把这个小的dataset进行聚类,如果你的小的dataset聚类结果和你的总的dataset聚类结果非常相似,那么你的clustering是比较靠谱的。你可以利用这种方法多重复几次,如果你每一次的聚类结果图形都是一样的,那么这个结果就比较可靠。
请记得:经常要检查你的QC情况。是否有低质量的细胞、是否有线粒体基因、是否有批次效应!因为clustering对于你输入的dataset是非常敏感的,任何干扰都有可能导致结果的不同。
注释你的clusters。这一步是一门“艺术”,会花你很多时间。因为你要找到每一个cluster的差异表达基因或者是marker。所以关于这一步,实在是没有一个统一的标准。