PhenoGraph聚类算法

背景&思想

PhenoGraph算法的输入是一个N X D的矩阵, 把这个矩阵中的行划分到类别中,使得类别间的差异大于类别内的差异。

我们的假设是,这些类别代表具有生物学意义表型的细胞群。我们的前提假设是细胞群聚集在D维空间的密集区域,由紧密Marker表达组合定义。因此,我们的目标是在D维空间中辨别这些密集的细胞区域。然而,我们不知道数据中类别的数量,大小或高维形状(例如,椭球,凸)。 单细胞域(domain)特别具有挑战性,因为不同类别之间,类别大小可能会有数量级上的差异(例如,造血干细胞与T细胞),并且我们希望识别罕见子集(类别)而不是将它们作为离群点而丢弃。此外,虽然大多数聚类算法都假设类别内样本分布近似椭球形,但我们已经证明许多细胞亚类具有复杂的形状并且不一定是凸形的(viSNE enables visualization of high dimensional single-cell data and reveals phenotypic heterogeneity of leukemia. Nat Biotechnol. 2013)。 用于密度检测的参数方法需要关于细胞群体(例如,椭球,凸)的形状的强依赖性假设,而单细胞数据中通常不符合这样的假设。

为了克服这些障碍,我们构建了一个图形结构来表示单细胞数据中细胞状态的高维几何结构。每个细胞作为节点并且通过边连接到其邻居细胞(与其最相似的细胞),该边的权重由细胞之间的相似性设置。细胞在高维空间中的密集区域将在该图中表现为高度互连的模块,通过该模块内具有高密度的边的特征来识别。一旦构建完毕,该图可以被划分成这些紧密互连的模块的子集,称为群体(communities),代表不同的表型亚群(类别)。这些图中的群体(communities)的检测(Community structure in social and biological networks. Proc. Natl. Acad. Sci. 2002)为识别亚群提供了一种高效方法。与混合模型等参数化方法不同,该方法不假设子群(某一类别)的大小、分布或数量。该方法成功的关键是构造一个图形结构,这个图形结构真实的表示D维空间中存在的几何结构。PhenoGraph分两步建立单细胞数据的图结构。

步骤

第一步,使用欧式距离为每个细胞识别k个最近邻居,其中k是该方法的唯一参数;如果k值太大,较小的群体(communities)会受到其他节点的影响,难以被识别出来。而如果,k值太小会导致我们想要找的细胞群体内紧密度较差。

因此,在第二步中,我们改进了第一步中定义的k邻居。对所有细胞的k近邻搜索的结果是一组集合:N组k邻居。我们对这些集合进行操作以建立一个加权图。在这个图中,每对节点(细胞)之间的权重是基于它们共享的邻居的数量。

节点i和j之间的权重由以下公式给出:


其中v(i)是节点i的k邻居;v(j)是节点j的k邻居。

以这种方式由真实数据构造的图具有明显的模块化结构。

群体(communities)检测是指将节点划分成不同的群体(communities),从而捕获这个模块化结构。对于一组群体(communities)的确定C={c_(1,) c_(2,),…,c_k},模块系数Q的定义由下面公式确定:


其中Wij是节点i,j的边权重,si是节点i与其他所有节点的边权重加和,sj同上,ci是节点i所在的群体(communities),如果u=v,Kronecker delta 函数δ(u,v)=1;否则为0,m=1/2 ∑▒W_ij 是一个标准化常数。

模块系数Q介于-1到1之间,对于任意一个确定了群体(communities)图结构都可以计算这么一个指标。所以该指标可以作为客观衡量把图结构区分成子集的质量。这样,该问题就转化成一个组合优化问题,即NP完全问题。

接下来用Louvain方法(Fast unfolding of communities in large networks. J. Stat. Mech. 2008)来解决上述问题。Louvain方法具体步骤是,在第一次迭代时,每一个节点(细胞)被单独作为一类(一个群体),在每一次迭代时,若两个节点的合并能使得模块系数Q有最大的增长,那么将这两个节点合并成一类。直到模块系数Q不再增加为止。

REF: Data-Driven Phenotypic Dissection of AML Reveals Progenitor-like Cells that Correlate with Prognosis. 2015 Cell.

群体(communities)检测过程中的Resolution的限制

检测群体(communities)结构对于发现复杂网络中结构与功能之间的联系以及生物学和社会学等许多学科的实际应用至关重要。现在广泛使用的一种流行方法依赖于对模块的数量的优化,这是将网络划分为群体(communities)的质量指标。我们发现,即使在模块定义明确的情况下,模块化优化也可能无法识别小于一定规模的模块,该模块的规模取决于网络的总大小和模块的互连程度。Newman和Girvan(Finding and evaluating community structure in networks. Physical review E, 2004.)在群体(communities)检测方面取得了决定性的进展,他们引入了一种定量方法来衡量将网络划分为群体(communities)的质量,即模块化。该度量实质上将给定模块内的连接数与相同大小和相同度数序列的随机图的期望值进行比较。如果选择模块化作为相关质量函数,则群体(communities)检测的问题就等同于模块化优化。后者非常重要,因为将网络划分为群体(communities)的可能性至少随着网络的大小呈指数增长,即使对于较小的图,穷举式优化在计算上也不可行。我们表明模块化优化确实不能解决大数量的模块。因此,有必要对通过模块化优化获得的模块进行检查。我们表明,模块化存在一个固有规模,该规模取决于网络中边的总数。小于此规模的模块可能无法解析,即使在极端情况下,它们是通过单桥连接的完整图形。模块化分辨率的极限实际上取决于群体(communities)对之间的互连程度,并且可以达到整个网络大小的数量级。因此,事先无法确定通过模块化优化检测到的模块(大还是小)确实是单个模块还是多个较小模块的集合。然而,最大模块性因网络的不同而不同,并且取决于网络的连接数。我们证明了任何网络的模块性值的上限都是1,并且我们看到模块性是与网络尺度相关的。

REF: Resolution limit in community detection. 2007 PNAS.

Seurat包中的PhenoGraph方法实现

函数FindClusters

FindClusters(object, modularity.fxn = 1, initial.membership = NULL, weights = NULL, node.sizes = NULL,  resolution = 0.8, algorithm = 1, n.start = 10, n.iter = 10, random.seed = 0, group.singletons = TRUE, temp.file.location = NULL, edge.file.name = NULL, verbose = TRUE, ...)

参数

#object: Seurat Object

#modularity.fxn: 计算模块系数函数,1为标准函数;2为备选函数,这里没有具体说明是什么函数,我认为1是上面提到的Kronecker delta函数。

# resolution: 分辨率参数,如果大于1,则会得到较多数目的群体(communities);如果小于1,则会得到较少数目的群体(communities)。

#algorithm: 模块系数优化算法,1使用原始Louvain算法;2使用Louvain algorithm with multilevel refinement;3使用SLM算法;4使用Leiden算法(注:4需要额外安装插件)

#n.start: 随机开始的数量

#n.iter: 最大迭代次数

#random.seed: 随机数种子

#graph.name: 图的名字

#group.singletons: (TRUE/FALSE)是否把比较特异的细胞分配到最近的类别中,若FALSE,则可能会出现某个类只有一个细胞的情况

#verbose: 是否在控制台输出结果

你可能感兴趣的:(PhenoGraph聚类算法)