第六讲:降维Dimensionality reduction (PCA, tSNE and UMAP)
视频地址:https://www.youtube.com/watch?v=qcLJ_JO6bn8&list=PLjiXAZO27elC_xnk7gVNM85I2IQl5BEJN&index=6
这一讲里,主讲人将介绍三种降维的方法(PCA, tSNE and UMAP),但是关于原理部分(一堆数学公式)他就不细说了(其实我也不想听)。
在你做完测序以后,你会得到reads counts,然后你要做QC来质控一下。之后标准化。接下来你要做降维,PCA或者CCA(CCA在前一讲里说过了),这里取决于你要干什么,如果你要整合数据,那么就要做CCA;如果仅仅是分析你的一个dataset,那么一般就是PCA。然后就是tSNE/UMAP、聚类,最后是差异基因。作为单细胞测序的流程,你有很多的options。如果你已经知道了你的classes,你都不用做降维,可以直接从标准化跳到差异基因,或者直接做轨迹分析。你也可以从PCA跳到聚类。这完全取决于你的dataset和你的需求。主讲人不会一一介绍。但是,中间那个分析流程是最经典的。
那么问题来了,为什么要做降维呢?说白了,就是简化你数据的复杂性。比如你的矩阵里有好几千个基因,然后你把它们降至二维,把非线性转化成线性,这非常有利于你的后续分析,尤其是clustering。其次,把你的数据“去冗余”。因为很多基因都与其他基因有关联,你不需要去解释你的不同样品里几千个基因的变化。第三,发现你数据里与condition最相关的信息。第四,减少下游分析的时间。第五,方便聚类。
降维的算法大致可以分为2类或3类。这一讲主要介绍其中3种。
首先是PCA。这是一种线性代数的降维方法。
PCA利用奇异值分解(SVD)方法进行数据压缩,上图是对PCA的一个说明。你的M矩阵,可以被分解成好几个矩阵,一个就是U矩阵,这个矩阵是所有的基因和主要成分之间的关系,可以代表每一个基因对于主要成分的重要性。还有一个矩阵就是V矩阵,是每一个样品对于主成分的重要性。如果你查看主成分对象(上图右下角),你会发现有两个矩阵,分别是U(rotation)和V(x)。
这个主讲人把PCA讲的有点复杂了,我还是喜欢前一讲里那个人举的例子(鱼的例子),非常的简单明了(Single cell RNA-seq data analysis with R视频学习笔记(四、五))。
上图里可以看到,主成分1里储存了更多的variation,大概占了你data里的98%的variation。而主成分2只占了2%。所以主成分1可以解释你数据里的98%的variation。假设你的dataset里有2万个基因,那么主成分1在这里就可以解释你数据里50%的基因(取决于你的data是什么样的),这也就可以把你的data进行去冗余了。而主成分2在这里基本上没有提供什么有效的信息,所以如果你的PCA也像这样,你完全可以忽略主成分2的影响。
在单细胞测序里,你可以根据里的主成分来判断细胞的类型。有时候主成分会捕捉到你的gene pattern。但有时候,如果你有两个测序文库,主成分会捕捉到你的“测序深度”。有时也会捕捉到“异质性”,特别是你的样品里有红细胞的时候,红细胞相比于成纤维细胞或其他细胞,它没有很多的RNA,所以这时候PCA不仅会根据你的gene pattern来区分细胞,还会根据RNA的量来把细胞分开。比如上图左下角,top 2两个基因对主成分1 的影响是最大的。在右下角的图里,你可以看到哪一个基因真正corresponding一些细胞,然后把这些细胞分到主成分1里。
上面是对PCA的一个总结,不难理解,就不多做说明了。缺点是在单细胞测序里,dataset很多都是0,会影响你的PCA结果。另外细胞大小和测序深度也会被PCA捕捉到,但这通常不是你想看的。所以最好是用非线性降维方式来处理单细胞测序dataset。
在讲解非线性降维之前,主讲人想先讲一下什么是graph(图形)。因为tSNE就是基于graph原理来的。在graph里,每一个蓝色的点是一个细胞,也可以是一个基因。蓝点之间的黑色粗线就是两个细胞之间的connection。有粗线的两个细胞说明他们在多维空间里的距离很近,是高度相关的。这样就可以把你的data很形象的表示出来。并且这种相关性是可以被量化的。很多非线性降维方法都是基于这个概念设计的。这里分为两步:(1)根据k connection建立一个加权图,也叫KNN。(2)把你的Data低维度嵌入这个加权图。举个例子,图里有13个蓝点,也就是说你的矩阵13*13,你要把它们降到二维,也就是x和Y。这个过程就叫“嵌入”。
现在来看看tSNE。
首先,tSNE是一种非线性的降维方式。上图比较形象:一般来说你的数据在多维空间里并不是线性分布的,比如说是一种“流形”的空间结构,而不是平面的(因为平面是二维)。所有的细胞组成了一个“卷”,然后看两个白色的点,代表其中两个细胞。如果你用PCA来计算两个白点之间的距离,那么蓝色的直线就是他们之间的欧式距离,是线性的。但是tSNE寻找的是白色点临近的细胞(neighbor),但是这个图里,两个白点的直线距离内没有细胞。而离它们近的则是沿着红色线方向的细胞群,而红色线就是tSNE方法里两个白点的空间距离。
现在来看看tSNE是怎么做的。怎么确定你降维后的两个细胞的空间距离,可以对应多维空间里两个细胞的空间距离呢?上图左边,这是你的所有的细胞在多维空间里的分布。你想把左边的多维空间,投影到右边的二维上。它是利用一个叫t-distribution来做的。比如左边的i细胞为中心点,那么离它很远的点都不会被考虑为“nearest neighbor”,因为那些点的t-distribution是接近于0的(右下角的图,峰的两侧趋近于0的位置是那些离i很远的细胞所拥有的t-distribution值)。而j细胞是i的"nearest neighbor",无论在多维还是二维,j是i的“最近的邻居”的“可能值”都是最高的。
举个例子:上图左边,我们有两个基因,3个细胞群。我们想把二维降到一维,也就是线性。那么刚开始(右图),细胞是随机分散在一条线的,然后根据几次的重复,计算最邻近的“邻居”,相同颜色的细胞逐渐的被分到一起,这就是tSNE的concept。需要注意的是,在tSNE里,相对于较远的细胞群(比如红色和蓝色,红色和绿色),并不能说明哪一个群离红色细胞更远,所以不能根据tSNE图上的细胞群的距离来判断两个群是否更接近或者更不接近。
这里有需要注意的点:(1)与PCA不同的是,tSNE是一个随机的算法。在你进行PCA分析时,无论你跑几遍PCA,你总能得到相同的图。而对于tSNE来说,每一次你跑tSNE的时候,图都是不一样的。如果你想要你的结果是可重复的,你需要设置“seed”,就是“种子”,以这些种子为中心进行计算,这样你的data才可以重复出来。(2)与前一张PPT讲的一样,上图右边,黑色箭头所标注的细胞群的形态在每次tSNE运行结果里是conserved的,而这个群与其他群的相对位置在每次运行tSNE后却是不一样的,这是因为tSNE并不能解释farthest距离,所以图里的两个不同群的相对位置是没有意义的,不能拿来比较。(3)如果你想加样品,比如你想把其他人的dataset和你的结合在一起分析,请重头分析。
这是tSNE的一个总结,就不多说了。(这里有人问tSNE是不是聚类的方法,主讲人说不是,这只是一个降维的方法)
下面讲的是UMAP。
UMAP是一个比较新的方法,它是一种基于拓扑结构的方法。什么是拓扑结构?主讲人说,简单的理解:拓扑结构就是一个"surface"(面)。所以如果你three dimensions, 你就可以构成一个“球形”,或者是“正方形”,在这里是一个“四面体”。这个四面体就代表了4个样品在多维空间里的结构。与tSNE不同的是,UMAP不是随机的,而是根据拓扑结构来计算距离的。
再来看看这个图,还是两个基因,3个细胞群。UMAP与tSNE不同的是,UMAP考虑的不仅仅是每个细胞群的内部,它还要考虑整体的情况,比如红色和蓝色群,红色和绿色群。这有什么好处呢?说明不管你跑几次UMAP,甚至是只跑你的dataset的部分数据,你会得到非常相似的结果。当然,这不是说我们就不能用tSNE了,还是有很多人习惯用tSNE的。有时也很难说哪一个更好,只能说哪一个可以给我们更好看的结果,完全取决于你的dataset。
至于运算速度:UMAP在处理大量数据的时候(大于10^5个细胞的时候),它的速度慢于其他降维方法。
这是UMAP的总结。
最后这张PPT说的是不同的包里包含的降维方法,可以看到三大R包Seurat v3, Scater, Monocle v3都包含PCA、tSNE、UMAP。所以用哪一个还是看自己的习惯。