第1章:ComBat校正简介——背景与动机

做生物信息学或统计学的朋友,一定对批次效应不陌生。说白了,就是同一批样本,因为实验时间、操作人员、试剂批号、测序仪型号不同,数据里就会混入一些“假信号”。

我刚开始处理高通量数据时,就被这玩意儿坑过。一个差异表达基因列表,本来以为找到了新靶点,结果换个批次重新跑一遍,那基因差异就消失了。后来才知道,那是批次效应捣的鬼。

ComBat(Combating Batch Effects)就是专门用来干掉这个鬼东西的算法。它最早由哈佛大学的Johnson等人提出,用于基因表达芯片数据的批次校正。后来被扩展到甲基化、蛋白组、代谢组等各种组学数据。咱们这门课,就是教你如何把ComBat这工具用到极致,调参调出最佳效果。

批次效应到底有多烦?

先看个现实场景。假设你在做肿瘤转录组研究,样本来自三个医院。A医院用Illumina HiSeq 4000,B医院用NovaSeq 6000,C医院用的平台你都不确定。你把三个批次的表达矩阵一合并,用PCA一看——样本根本没按肿瘤类型聚类,而是按医院扎堆。这就是批次效应的经典症状。

我参与过一个多中心甲基化研究项目,当时从四个中心收了800多份样本。因为样本收集时间跨度长达两年,加上芯片版本升级,我们做的第一个QC图就让我心凉了半截。不过好在有ComBat,调了几次参数后,校正效果肉眼可见。

为什么批次效应这么常见?因为现代组学实验涉及的环节太多了:

  • 样本处理:提取时间、保存条件、操作人员不同
  • 测序平台:不同机型、不同试剂盒版本
  • 数据处理流程:比对参数、归一化算法的小差异
  • 环境因素:实验室温度、湿度波动的累积影响

这些因素单独看可能不显著,但累积起来,就能在数据层面形成明显的“批次标签”。

ComBat究竟做了什么?

ComBat的核心思想很直接:假设每个特征(比如每个基因的表达量)都受到批次效应的影响,而这种影响可以被分解为加性偏移和乘法缩放。换句话说,每个批次都有自己的“系统性偏差”。

它采用经验贝叶斯框架,利用所有基因的信息来稳定地估计这些批次的均值和方差偏移。这句话有点绕,我用大白话翻译一下:

  1. 先算出每个批次内部,每个基因的均值和标准差
  2. 再利用所有基因的信息,对每个批次偏差做一个“收缩估计”
  3. 最后把批次之间的差异看做是噪声,从原始表达量里减掉这个偏移,再按比例缩放一下

嗯,这里要注意:ComBat假设批次效应与生物效应是加法可分离的。如果批次效应和生物效应存在复杂的非线性交互作用(比如批次改变了某个通路的结构),ComBat可能会搞不定。不过在实际项目中,这个假设对大多数组学数据是合理的。

一个具体的例子

我用R语言的sva包做个演示。假设你有两个批次的表达矩阵:

library(sva)
# adj_var 是你要保留的生物协变量,比如疾病状态
# batch 是批次标签向量
combat_data <- ComBat(
  dat = expression_matrix,
  batch = batch_labels,
  mod = model.matrix(~ disease_status + age),
  par.prior = TRUE,
  prior.plots = FALSE
)

我习惯在跑ComBat之前先看一眼原始数据的PCA图。校正完再用同样的PCA画一次,两个批次点如果能混在一起,说明校正有效。如果还是分的很开,那就要考虑参数问题了——后面几章会详细讲。

小技巧: 跑ComBat之前,一定先把表达数据log2转化。ComBat的模型假设数据呈正态分布,原始count数据往往是偏态的,log2处理后更符合假设。我见过不少新手直接拿raw count去跑,结果校正完反而引入了伪差异。

为什么需要调参?

你可能会问:ComBat不是开箱即用吗?为什么还要调参?

确实,ComBat的默认参数在大多数情况下能正常工作。但现实世界的数据哪有那么听话。我遇到过这些情况:

  • 批次数量太少:只有两个批次,经验贝叶斯估计不够稳健
  • 生物效应与批次高度混淆:所有case样本都在批次1,所有control都在批次2,你没法区分是生物差异还是批次差异
  • 数据维度不匹配:基因数几万个,但样本数只有几十个,参数估计容易过拟合
  • 特殊数据类型:比如甲基化beta值(0~1范围),不调整参数直接硬套出问题

每一个问题背后,都需要通过调整ComBat的参数来解决。par.prior参数选参数化还是非参数化先验?mean.only要不要只校正均值?要不要传入协变量矩阵?这些选择直接影响校正质量。

我曾经接手过一个项目,合作方用默认参数跑完ComBat,结果一些known生物学markers反而被校没了。我们复盘后发现,那是因为协变量矩阵没包含重要的临床因素,ComBat误把真实的生物信号当成了批次效应。把协变量补全后,校正结果才合理。

参数 含义 建议调整场景
par.prior 是否使用参数化先验(TRUE/FALSE) 样本量少或数据严重偏离正态时试试FALSE
mean.only 是否只校正均值(不移方差) 批次间方差差异不大时用TRUE,否则FALSE
mod 协变量矩阵 一定要包含生物学感兴趣的变量和已知confounders
eb 是否使用经验贝叶斯收缩 批次数量少时保持TRUE,否则可考虑FALSE做简单校正
ref.batch 是否指定参考批次 需要保持某个批次原始分布时使用

本章核心知识图

下面这张图把ComBat校正的动机和流程串起来。你看看,批次效应来自实验各环节,经过ComBat计算加性偏移和乘法缩放,最终输出校正后的数据。调参就是影响这两个偏移的估计过程。

ComBat校正核心逻辑 批次效应来源 • 不同实验平台 • 不同操作人员 • 不同试剂批次 • 环境条件波动 • 样本存储时间 ComBat 核心过程 1. 估计每个批次的 均值和方差偏移 2. 经验贝叶斯收缩 3. 校正原始表达量 校正后数据 ✓ 批次间差异减小 ✓ 生物信号保留 ✓ 统计效力提升 ✓ 下游分析可靠 调参关键点 • par.prior : 参数化 vs 非参数化先验 • mean.only : 是否仅校正均值 • mod : 协变量矩阵设计 • eb : 收缩强度控制 • ref.batch : 参考批次指定 • 数据预处理 : log2转化、缺失值处理

什么时候该用ComBat?

不是所有批次问题都要上ComBat。我个人建议考虑以下条件:

  • 数据集包含两个及以上明确可区分的批次
  • 你关心的生物效应在整个数据集里都有分布(即每个批次里都有case和control)
  • 批次之间的差异明显影响了下游分析(PCA、聚类能看到批次分离)
  • 你的数据量足够大——每个批次至少要有3~5个样本,否则经验贝叶斯估计可能不靠谱
避坑指南: 切勿对只有一个样本的批次使用ComBat。我曾经见过有人把某个组织只有1个样本的数据跟其他批次合并,结果那个样本被严重扭曲,反而成了离群点。如果批次里样本太少,考虑先舍弃那个批次,或者用其他简单校正方法(比如Z-score逐特征标准化)。

本章小结

批次效应是多中心、多批次组学研究的头号敌人。ComBat通过经验贝叶斯框架,稳健地估计并消除批次间的均值和方差偏移。调参就是为了让这个估计更贴合你的实际数据特性。