第2章 ComBat的基本原理:统计模型概述
在开始调优ComBat参数之前,咱得先把它的底牌看清楚。说白了,ComBat就是一个用来消除批量效应的统计模型。我个人习惯把它叫做“数据对表器”——不同批次的数据就像不同实验室做出来的实验,明明测的是同一个指标,结果却不在一个量级上。ComBat就是那张能让大家对上话的“标准表”。
2.1 为什么需要这个模型?
批量效应这东西,做组学分析的人大概都吃过它的亏。我在一个多中心RNA-seq项目中遇到过,同一个基因,A批次和B批次的中位数差了3倍,但生物学条件其实是完全一样的。你想想看,如果不做校正,下游的差异分析估计会跑偏到姥姥家。
ComBat的核心思路是:把数据拆成两块——一块是生物学信号,另一块是批次噪声。然后通过统计模型把批次噪声剥离掉。它不要求你提前知道批次效应的分布形态,而是从数据本身去学习。
2.2 位置-尺度模型(Location-Scale Model)
ComBat用的模型名字有点长,叫“位置-尺度模型”。不过别被吓到,它的本质特简单:
- 位置(Location):每个批次给数据加了一个固定的偏移量。好比一个批次总是高0.5,另一个总是低0.3。
- 尺度(Scale):每个批次还会把数据“拉伸”或“压缩”一下。有的批次数据离散度大,有的数据抱团紧。
模型的数学形式长这样:
Y_{ijg} = α_g + Xβ_g + γ_{ig} + δ_{ig} ε_{ijg}
是不是看着眼熟?别慌,我们把每个符号拆开来看:
| 符号 | 含义 | 对应人生经验 |
|---|---|---|
| Y_{ijg} | 第i个批次、第j个样本、第g个基因的表达值 | 你拿到的原始数据 |
| α_g | 基因g的总体平均表达水平 | 如果全世界只有一个批次,它应该长这样 |
| Xβ_g | 生物学协变量(如疾病/对照)带来的影响 | 你想研究的那部分信号 |
| γ_{ig} | 第i批次的加性效应(位置偏移) | 这个批次整体偏高还是偏低 |
| δ_{ig} | 第i批次的乘性效应(尺度缩放) | 这个批次的数据是“松弛”还是“紧绷” |
| ε_{ijg} | 服从标准正态分布的随机误差 | 剩下的纯随机波动 |
核心思想:模型把Y拆成了“生物学信号(α_g + Xβ_g)” + “批次噪声(γ_{ig} + δ_{ig} ε_{ijg})”。校正时,我们只保留前者,去掉后者。
2.3 模型假设,你最好心里有数
任何统计模型都有假设。ComBat做了这么几个关键假设:
- 基因间的批次效应是相关的——这是经验贝叶斯能发挥作用的基础。每个基因的γ和δ不是独立乱蹦的,它们服从一个共同的先验分布。
- 误差项ε是独立同分布的标准正态——说白了,除掉批次效应和生物学效应之后,剩下的噪声应该是白噪音。
- 批量效应与生物学效应是相加的(在位置-尺度框架下)——这假设了批次效应不会扭曲生物学信号的结构。
我曾经踩过的坑:有一次用ComBat处理单细胞数据,细胞类型间的差异太大,导致批次效应和生物学效应纠缠在一起。模型假设被打破,校正后的数据把真实的细胞类型差异也给抹平了。所以如果数据里有极度异质的亚群,得先做分层或者在模型里显式加入协变量。
2.4 整个流程长啥样?
下面这张图把ComBat的“输入→建模→校正→输出”串了一遍。你可以把它当成调参前的路线图。
2.5 经验贝叶斯到底干了啥?
这是ComBat最聪明的地方。你想想,每个基因的样本量一般都不大(比如每个批次就几个样本),如果单独估计γ和δ,那一不小心就会过拟合——尤其那些表达量特别低的基因,稍微蹦个噪声就被当成批次效应了。
经验贝叶斯做的,就是把所有基因的估计值放在一起看,找出它们的共同模式(先验分布)。然后对每个基因的估计值做一个“拉回”操作——如果某个基因的批次效应特别大但证据不足,就把它往整体均值方向缩一缩。说白了,就是“借力打力”。
调参小贴士:如果你在用Python版ComBat,参数prior.pl控制着这个收缩力的大小。数值越小收缩越强,相当于你更相信基因间的共性。我通常从默认值开始,如果数据中批次效应很规整(比如所有基因的批次偏移方向一致),可以适当调大prior.pl,保留更多细节。
2.6 什么时候该用ComBat?
- 适用场景:批量数≥2,每个批次的样本量≥3。数据大致对称,没有太多异常值。
- 不适用场景:批次效应与生物学效应纠缠在一起(比如所有病例都在一个批次,所有对照在另一个批次),此时任何统计校正都无法可靠分离两者。
- 小心使用:数据是非正态分布(比如counts数据没做标准化),ComBat假设误差为正态,直接上可能会引入伪差。建议先做log2或vst变换。
我自己有个习惯:拿到数据后先画个箱线图或PCA图,看看不同批次的分布有没有系统性偏移。如果只是位置偏移(整体上移或下移),ComBat的γ项就能搞定;如果还伴随着离散度差异,那δ项就会大显身手。