第四节:常见批次效应校正方法简介

好,咱们直接进入正题。批次效应这东西,说实话,就像你实验室里那个总出毛病的离心机——你知道它有问题,但一时半会儿还换不掉。那怎么处理呢?市面上有几种主流方法,我挨个儿给你盘盘。

我个人习惯把这几种方法分成两类:一类是“事前预防”,也就是实验设计阶段就考虑到;另一类是“事后补救”,数据都拿到手了,再用统计手段去抠。今天咱们重点聊事后补救,因为这些才是你我现在最需要的。

4.1 最经典的 Combat

如果你去问一个做了十年生信的老手:“处理批次效应,你最常用什么?”十有八九他会回答——ComBat。这玩意儿来自一个叫 sva 的 R 包,全称是 Combining Batches。

它的核心逻辑是什么?说白了就是假设每个批次有自己的“均值”和“方差”,然后通过经验贝叶斯方法,把这些差异给抹平。我最初接触 Combat 时,也觉得这不就是标准化吗?但实际上它更精细——它考虑到了基因本身的表达强度。

适用场景:ComBat 对于样本量较大的数据集效果特别好,尤其是那种有几十个样本、三四个批次的情况。我在项目中遇到过,用 Combat 处理后的数据,PCA 图上原本分裂的批次直接合拢,效果非常明显。

4.2 RUV(Remove Unwanted Variation)

RUV 是另一条路子。它的思路是:我不用去猜批次到底带来了什么影响,我直接找一批“负对照基因”——也就是那些理论上不应该受实验条件影响的基因(比如持家基因)。

然后,RUV 通过这些基因来估算出隐藏的“噪音因子”,再把它们从所有基因中剔除。你想想看,这其实挺聪明的。它不需要你事先知道批次信息,甚至不需要你定义批次变量。

注意:RUV 对负对照基因的选择非常敏感。我曾经在一次 RNA-seq 分析中偷了个懒,直接用默认的基因列表,结果校正后的数据反而出现了新的假阳性。所以,“选对对照”是这步的关键。

4.3 Harmony 算法

Harmony 是这几年新冒出来的方法,最早是为单细胞数据设计的,但现在很多人也拿来处理批量 RNA-seq。它的原理有点意思——通过一种“最大多样性聚类”的方式,把不同批次的样本往一起拽。

我记得第一次用 Harmony 时,心里还在嘀咕:这东西靠谱吗?结果一跑下来,UMAP 图上原本分属不同批次的那几坨细胞,愣是揉到了一起。而且 Harmony 的一大优点是——速度快。数据量越大,它的优势越明显。

方法 核心原理 适合场景 局限
ComBat 经验贝叶斯,调整均值和方差 批量 RNA-seq,样本量大 对批次信息要求明确
RUV 借助负对照基因估计噪音因子 不知道批次来源时 对照基因列表质量影响大
Harmony 最大多样性聚类后对齐 单细胞、大规模多批次 对极端差异批次效果一般
limma-voom 线性模型中直接纳入批次因子 差异表达分析流程一体 批次因子在模型中占自由度

4.4 limma-voom 的特殊地位

聊到这儿,你可能注意到了——limma-voom 我单独列出来了。为什么?因为它是咱们这整个课程的核心。Combat 也好,RUV 也好,多数时候是作为一个预处理步骤单独跑。但 limma-voom 不一样,它直接把“批次”作为一个协变量放进线性模型里,在差异表达分析的同时就把批次效应给处理了。

这是一个很优雅的做法。你不必分成两步走:先校正批次,再做差异分析。你一步就搞定了。而且 limma-voom 对 RNA-seq 的计数数据做了特别优化——先用 voom 把计数转化成 log-CPM 并估计权重,再套用 limma 的线性模型框架。

什么时候选 limma-voom?如果你要做差异表达分析,而且批次信息明确、样本量不是特别小(每组至少 3 个样本以上),我个人强烈推荐直接用它。省事、鲁棒、结果好解释。

你可能会问:那是不是有了 limma-voom,其他方法就不用了?我的建议是,看情况。如果你只是单纯想看数据有没有受批次影响,或者你想先画个漂亮的 PCA 图,那 Combat 或 Harmony 更适合。等正式做差异分析时,再切回 limma-voom。

常见批次效应校正方法流程对比 原始表达数据 选择校正策略 ComBat limma-voom Harmony / RUV 校正后计数矩阵 差异表达结果 校正后表达矩阵 后续差异分析统一流程 建议:预处理用 Combat/Harmony,正式 DE 用 limma-voom

4.5 避坑指南:别把方法用反了

嗯,这里要注意一个常见的误区。很多初学者会这么干:先用 ComBat 校正完数据,拿到一个“干净”的表达矩阵,然后再用 limma(或者别的包)去做差异分析。这有问题吗?表面上看起来没问题。但实际上一旦你用了 ComBat 校正,数据的分布已经被改变了,你再套 limma 的模型时,原本的 voom 权重估计会不准确。

我曾经犯过这个错。那会儿为了图省事,在一个项目中先用 ComBat 跑了全基因组校正,再丢进 limma 做差异分析。结果出来的差异基因列表,跟直接只用 limma-voom 的对比,居然有 20% 以上不一样。后来仔细查才发现,是两次“校正”互相干扰了。

避坑指南:如果你决定用 limma-voom,就别预处理阶段单独跑 ComBat 了。直接在 voom 的线性模型中加入 ~ batch 即可。两步走反而容易出问题。

4.6 不常见的“大杀器”:SVA 与 PCA 回归

除了上面几种,还有一些方法虽然不常见,但在某些特定场景下特别好使。

  • SVA(Surrogate Variable Analysis):跟 RUV 有点像,但它不需要负对照基因,而是靠数据本身来推断隐藏变量。适合你不知道批次来源、数据又很复杂的情况。
  • PCA 回归:说白了就是先跑个 PCA,把前几个主成分当协变量放到模型里。这听着很粗暴,但很多时候效果还真不赖。

这两种方法,我个人建议在你已经试了 ComBat 和 limma-voom 都不行时,再拿出来用。简单说就是:通用性强的方法先上,实在解决不了了,再上定制化的。

4.7 选方法之前,先问自己三个问题

  1. 我的批次信息明确吗? 明确的话,ComBat 或 limma-voom 直接上;不明确的话,优先考虑 RUV 或 SVA。
  2. 我是只做预处理,还是直接差异分析? 只预处理选 ComBat / Harmony;全套分析直接 limma-voom。
  3. 样本量大不大? 样本少(每组小于 3 个),经验贝叶斯方法更稳健;样本大,Harmony 速度优势明显。
最后一句:没有万能的方法。我见过有人在 3 个不同的数据集上分别用 Combat、RUV 和 limma-voom,结果完全不一样。所以我的建议是——多试几种,看 PCA 图和差异基因列表的一致性,哪个稳定用哪个。