来自:SEACells infers transcriptional and epigenomic cellular states from single-cell genomics data。
- 简单介绍
单细胞状态的细胞聚合(SEACells)是一种基于图的算法,它使用kernal archetypal分析来计算元细胞。我们的SEACells算法基于几个关键假设:(1)单细胞分析数据可以被近似为一个低维manifold(phenotypic manifold);(2)细胞间观察到的大多数变异性是由于不完全采样造成的;以及(3)大多数细胞可以被分配到一组有限的细胞状态中,每个状态都有独特的基因调控程序组合特征。
该算法首先构建一个表示phenotypic manifold)的最近邻图。然后,它应用archetypal分析来迭代地精炼meta细胞。最后,它将计数聚合到一组输出的meta细胞中。manifold构建是针对每种数据模态量身定制的,之后算法可以以数据类型不可知的方式进行。
archetypal分析是一种稳健的矩阵分解技术,已经应用于数据矩阵中,以识别处于细胞表型空间边界的极端细胞状态。与此不同的是,将archetypal分析应用于细胞-细胞相似性核心矩阵。这种核心将细胞投影到一个更高维的空间中,在这个空间中,两个细胞仅在它们共享邻居且与共享邻居的距离相似时才相似。这种转换所施加的更严格的相似性条件将高度相似的细胞投影到微小的簇中,使得边界细胞成为其簇中与每个其他细胞最相似的细胞,从而使得核心空间中的原型成为每个独特细胞状态的良好代表。因此,核心原型分析将细胞划分为高度相似的细胞的紧密簇。在细胞-细胞相似性矩阵的对角线上形成紧密的块,这些块代表不同的细胞状态。
SEACells的性能得益于:(1)使用adaptive Gaussian kernel来表示单细胞表型,以准确捕获数据中的主要变异源;(2)使用maximum–minimum sampling 进行初始化,确保在表型空间中均匀地表示细胞状态,不论细胞密度如何;以及(3)应用核心原型分析来识别高度可解释的meta细胞。自适应核心和最大-最小采样使得SEACells特别擅长稳健地识别罕见的细胞状态,这些状态通常代表在生物学或疾病中起关键作用的重要群体。
- core 代码 SEACells object
def SEACells(
ad,
build_kernel_on: str,
n_SEACells: int,
use_gpu: bool = False,
verbose: bool = True,
n_waypoint_eigs: int = 10,
n_neighbors: int = 15,
convergence_epsilon: float = 1e-3,
l2_penalty: float = 0,
max_franke_wolfe_iters: int = 50,
use_sparse: bool = False,
):
"""Core SEACells class.
:param ad: (AnnData) annotated data matrix
:param build_kernel_on: (str) key corresponding to matrix in ad.obsm which is used to compute kernel for metacells
Typically 'X_pca' for scRNA or 'X_svd' for scATAC
:param n_SEACells: (int) number of SEACells to compute
:param use_gpu: (bool) whether to use GPU for computation
:param verbose: (bool) whether to suppress verbose program logging
:param n_waypoint_eigs: (int) number of eigenvectors to use for waypoint initialization
:param n_neighbors: (int) number of nearest neighbors to use for graph construction
:param convergence_epsilon: (float) convergence threshold for Franke-Wolfe algorithm
:param l2_penalty: (float) L2 penalty for Franke-Wolfe algorithm
:param max_franke_wolfe_iters: (int) maximum number of iterations for Franke-Wolfe algorithm
:param use_sparse: (bool) whether to use sparse matrix operations. Currently only supported for CPU implementation.
See cpu.py or gpu.py for descriptions of model attributes and methods.
"""
这里有3个模式,dense matrix和sparse matrix在cpu上,和 dense matrix 在gpu上。我们这里只看sparse matrix在cpu上。
if use_sparse:
assert (
not use_gpu
), "Sparse matrix operations are only supported for CPU implementation."
try:
from . import cpu
except ImportError:
import cpu
model = cpu.SEACellsCPU(
ad,...
)
return model
如果use_sparse为True,则会断言use_gpu必须为False,表明稀疏矩阵操作只支持在CPU上进行。
接着,尝试从当前包中导入一个cpu模块(表示为from . import cpu)。如果失败,则回退到导入包外的cpu模块(表示为import cpu)。
- SEACellsCPU Class
init: 类的构造函数,用于初始化SEACells模型。它接受诸如注释数据矩阵(ad)、用于计算元细胞的kernel(build_kernel_on)、要计算的SEACells数量(n_SEACells)等参数。
construct_kernel_matrix: 使用PCA/SVD和最近邻方法从数据矩阵构建核心矩阵。
def construct_kernel_matrix(
self, n_neighbors: int = None, graph_construction="union"
):
# input to graph construction is PCA/SVD
kernel_model = build_graph.SEACellGraph(
self.ad, self.build_kernel_on, verbose=self.verbose
)
# K is a sparse matrix representing input to SEACell alg
if n_neighbors is None:
n_neighbors = self.n_neighbors
M = kernel_model.rbf(n_neighbors, graph_construction=graph_construction)
self.kernel_matrix = M
# Pre-compute dot product
self.K = self.kernel_matrix @ self.kernel_matrix.T
return