第1章:ComBat校正简介——背景与动机
做生物信息学或统计学的朋友,一定对批次效应不陌生。说白了,就是同一批样本,因为实验时间、操作人员、试剂批号、测序仪型号不同,数据里就会混入一些“假信号”。
我刚开始处理高通量数据时,就被这玩意儿坑过。一个差异表达基因列表,本来以为找到了新靶点,结果换个批次重新跑一遍,那基因差异就消失了。后来才知道,那是批次效应捣的鬼。
ComBat(Combating Batch Effects)就是专门用来干掉这个鬼东西的算法。它最早由哈佛大学的Johnson等人提出,用于基因表达芯片数据的批次校正。后来被扩展到甲基化、蛋白组、代谢组等各种组学数据。咱们这门课,就是教你如何把ComBat这工具用到极致,调参调出最佳效果。
批次效应到底有多烦?
先看个现实场景。假设你在做肿瘤转录组研究,样本来自三个医院。A医院用Illumina HiSeq 4000,B医院用NovaSeq 6000,C医院用的平台你都不确定。你把三个批次的表达矩阵一合并,用PCA一看——样本根本没按肿瘤类型聚类,而是按医院扎堆。这就是批次效应的经典症状。
我参与过一个多中心甲基化研究项目,当时从四个中心收了800多份样本。因为样本收集时间跨度长达两年,加上芯片版本升级,我们做的第一个QC图就让我心凉了半截。不过好在有ComBat,调了几次参数后,校正效果肉眼可见。
为什么批次效应这么常见?因为现代组学实验涉及的环节太多了:
- 样本处理:提取时间、保存条件、操作人员不同
- 测序平台:不同机型、不同试剂盒版本
- 数据处理流程:比对参数、归一化算法的小差异
- 环境因素:实验室温度、湿度波动的累积影响
这些因素单独看可能不显著,但累积起来,就能在数据层面形成明显的“批次标签”。
ComBat究竟做了什么?
ComBat的核心思想很直接:假设每个特征(比如每个基因的表达量)都受到批次效应的影响,而这种影响可以被分解为加性偏移和乘法缩放。换句话说,每个批次都有自己的“系统性偏差”。
它采用经验贝叶斯框架,利用所有基因的信息来稳定地估计这些批次的均值和方差偏移。这句话有点绕,我用大白话翻译一下:
- 先算出每个批次内部,每个基因的均值和标准差
- 再利用所有基因的信息,对每个批次偏差做一个“收缩估计”
- 最后把批次之间的差异看做是噪声,从原始表达量里减掉这个偏移,再按比例缩放一下
嗯,这里要注意: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不是开箱即用吗?为什么还要调参?
确实,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。我个人建议考虑以下条件:
- 数据集包含两个及以上明确可区分的批次
- 你关心的生物效应在整个数据集里都有分布(即每个批次里都有case和control)
- 批次之间的差异明显影响了下游分析(PCA、聚类能看到批次分离)
- 你的数据量足够大——每个批次至少要有3~5个样本,否则经验贝叶斯估计可能不靠谱
本章小结
批次效应是多中心、多批次组学研究的头号敌人。ComBat通过经验贝叶斯框架,稳健地估计并消除批次间的均值和方差偏移。调参就是为了让这个估计更贴合你的实际数据特性。