Press "Enter" to skip to content

SVD is all you need (单细胞去批次效应,从MNN到RPCI)

这篇文章原计划是作为和某老铁合作的一部分,想要投去某个journal作为comments,但是考虑到大家目前都忙于其他事情,没有时间腾出来专门去写,但又很想吐槽今年发表在NBT的一篇单细胞去批次效应的文章,遂拿出来讲讲。我将会用比较简单的语言去将过往的三个去批次算法的工具串起来,包括MNN,Seurat以及RPCI。实际上他们都和SVD+cos距离有关。

 

关于批次效应的由来,优化目标以及评估标准已经在之前的文章中有所涉及 Data Integration,单细胞组学数据融合 核心观点即

 

尽可能拉近不同特征数据集中来自于同一个细胞亚群的细胞,即它们在我们想要的这个 流形 空间中尽可能近。

 

尽可能保留不同数据集中特异的细胞亚群(cluster)信息。

 

针对如何去除批次效应,在过去开发了相当数量的工具,但其实贯穿其中的核心思想,是找到不同批次共享的latent space。而我觉得其实过去这幺多工作中最经典的当属MNN这篇文章。

说句题外话,我本人其实很喜欢Lalch Haghverdi在single cell做的一系列工作,另外一个她经典的工作是她在博士期间在Theis Lab做的diffusion pseudo-time,因为她博士一系列关于 single cell trajectory analysis 的杰出工作,还被授予2017年的Erwin Schrödinger奖,虽然她本人似乎已经不在学术圈了(已经接近三年没有新的发表)。Lalch作为物理背景的研究工作者,在她的工作中都会附加非常详细的数学证明和数值模拟的结果,很是solid。而她在MNN这篇文章中附加的一个证明,我认为是后续相当多其他researcher能用类似理念在去批次这个问题上持续灌水的理论基础。@金月者 已经写了关于这个证明的推文,我这里直接引用结论,证明不再赘述

 

Assumption:

 

1. 假设我们观测的数据X是由两部分组成,即属于 生物学 的variation和属于technical成分(即批次效应)的variation,可以表示为

 

 

2. Biological variation 和 batch effect variation 所代表的的方向相互 正交

 

3. 生物学之间的差异远大于 Batch 之间的差异。(即X主要由 解释)

 

Conclusion:

 

在reference数据集中能找到的和query中的一个细胞cos距离最近的细胞(即在X上找近邻),在 上也是最近的。

 

这一结论非常重要,因为它意味着我们在跨数据集之间所找到的近邻细胞其实是不受批次效应影响的,那幺也就是说,如果我们用原数据集(表达谱)定义的 内积 (当进行Z-score标准化后和cos距离等价) 矩阵 ,其实和我们想要找的批次joint latent space上定义的细胞内积矩阵应该大抵是类似的。那幺这个问题就简单多了,假设我们有X和Y两个数据集,分别对这两个数据集进行gene level上的Z-score标准化后,我们可以定义一个 内积矩阵 (即similarity matrix)。

 

 

这里我假设两个数据集共享的基因数量为M,因而我们认为,假如我们能够找到一个能够去除批次效应的latent space,其定义出来的内积矩阵也应当是类似的。即

 

 

其中f是对X和Y分别作的映射,可以理解为是某种encoder。一种最简单的方式就是SVD,即我直接对Cor按照最大方差方向进行分解,再将分解得到的左奇异和右奇异向量视作一种cell embedding。

 

 

那幺这样我就能确保新的找到的space上定义的跨批次细胞间的内积矩阵和原来是一样的。利用这个新的cell embedding,就有可能去除批次效应。我们可以在胰腺的单细胞测序数据上试一下,结果如下。

去除批次效应之前

去除批次效应之后

可以看到,仅仅是基于SVD就能够很好的去除批次效应。这也是为什幺@金月者 提到cos距离是MNN和Seurat CCA统一的关键。因而依据CCA原有的理论解释,其实对数据集做了很强的假设(diagonalization,不同特征之间必须正交),而基于Lalch所提供的解释,根本不需要在这幺强的假设上才能得到SVD这一步。实际上Seurat CCA就是利用pair数据集能够找到如此好的共享的空间,来两两数据集定义anchors,再得到矫正的权重矩阵,最后达到去除批次效应的目的。

 

那幺问题来了,为什幺Seurat一定要用SVD在两两数据集之间定义anchors,计算差异以后再整合呢。为什幺在多数据集中直接用左和右奇异向量来作为cell embedding vector呢。我们回到之前的公式,现在我们有一个reference数据集X,同时我们有多个Y,比如我们有三个,分别记作Y1,Y2,Y3,那幺我们可以定义

 

 

 

 

一种比较简单的做法是,我直接concatenate这三个 相关系数矩阵

 

 

那幺问题来了,直接对大Cor计算SVD的时候,其实得到的U和V并不能很好的还原各自的Cor,因为得到的新的U和V一定是sub-optimal的,而且基于L2的损失最小化的直接后果,是哪些数值比较大的entries更好被分解。一个实际的例子是,如果X是smart-seq2的数据,而Y中有一项,比如Y1是indrop的数据,那幺如果Y2也是smart-seq2的,同是一种测序数据其细胞间的相关性系数整体大概率会比跨平台得到的相关性更大。所以这种情况下的分解,就很难将Cor1的信息还原。实际操作效果如下。

去批次结果,包括8个不同来源的pbmc数据集

这也是为啥Seurat CCA就干脆先各自两两计算 相关性系数矩阵 后,各自分解,每个Y分别定量到X的差异,然后再remove,再完成整合,其实目的是为了规避这种问题的一种处理方式。又或者Seurat CCA他们团队可能本身就尝试了直接用SVD的奇异向量来作为embedding,发现不work,只能采取MNN的老做法来去除批次效应。

 

但其实这个问题还有新的做法,而且这个做法已经在二十年前的自然语言处理中被提出来了,没错,就是潜在语义分析。

 

这个问题核心是,无论query数据集长啥样,我都能够先将其变换一下,得到他们在reference上应该有的embedding是什幺样的,再定义距离会更合适。那幺我们可以先定义一个基于reference的encoder函数

 

 

也就是说,对于任意一个新输入的query,我们都可以用 gene eigenvector 先变换到reference上的principal component space,再定义 的距离即可。所以原Cor可以改写为

 

 

利用该新定义的Cor,我们即可重新对这个大Cor计算SVD,然后用新的左奇异和右奇异向量来作为cell embedding vector即可去除批次效应。

这其实就是今年发表在NBT上的这篇去批次效应算法RPCI[1]的核心。但有趣的地方来了,RPCI用的这个方法完全是老一套的潜在语义分析的思路,他们却说这是”a new effective formula”,基于SVD来去除批效应其实最重要的就是基于Lalch的两个基本假设,但RPCI却说这是”assumption-free method”,更有意思的在于在描述他们如何去除批次效应这一部分内容,RPCI在描述他们的方法其实是错的

我不知道这里面对γ进行SVD分解的意义何在,其实读懂前文的读者可以很容易看出,它这里其实是少了V_x。如果理解是typo也就算了,全文竟然只字不提潜在语义分析,这个方法也不算是new methodology。更重要的是,利用潜在语义分析进行整合其实greenleaf组已经发表过了 [2], 但也没有添加引用。

 

感兴趣的读者也可以自己动手写我上述的算法,来看看和RPCI输出的 corrected cell embedding vector 是否相同,我近日会公开上述分析的代码供读者参考。

 

以上

 

[1] Liu Y, Wang T, Zhou B, et al. Robust integration of multiple single-cell RNA sequencing datasets using a single reference space[J]. Nature biotechnology, 2021: 1-8.

 

[2] Granja J M, Klemm S, McGinnis L M, et al. A single cell framework for multi-omic analysis of disease identifies malignant regulatory signatures in mixed phenotype acute leukemia[J]. bioRxiv, 2019: 696328.

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注