2. 批次效应对数据分析的影响:偏倚、假阳性、假阴性、可重复性下降
大家好,我是这门课的讲师。在组学数据分析里混久了,我最怕听到一句话:“咦,上次做出来明明很显著,这次怎么完全没信号了?”
很多时候,捣蛋鬼就是咱们这章要聊的——批次效应。它像个隐形修理工,悄无声息地把你的数据结果拧歪了。
我记得刚入行做转录组项目时,用 t-test 跑差异基因,出来好几百个显著的,P 值漂亮极了。我兴奋得不行,觉得能发大文章。结果导师让我画个热图看看——我瞬间傻眼:所有“显著基因”完全按实验批次聚类,分得清清楚楚。哪有什么生物学差异,全是批次效应在演戏。
今天,我就带大家盘点一下,批次效应到底是怎么“搞破坏”的。
2.1 估计偏倚:平均值与方差的“漂移”
说白了,批次效应会让你的数据估计值不准。
比如两组病人的基因表达量平均值,本来没差别。结果因为一组在去年检测,一组在今年检测,试剂盒换了批次——好,平均值硬生生“跑偏”了 20%。你计算出来的差异倍数,到底是生物效应,还是技术偏差?
方差也逃不掉。有些批次的测量噪声大,有些批次噪声小。合并分析时,整体方差被拉大,置信区间变宽——你本来能检测到的微弱信号,就这么被方差淹没了。
我遇到过一个项目,合作方没注意到测序的 flow cell 批次不一样,结果差异基因列表里,一大半是跟批次相关的核糖体 RNA 和线粒体基因……欲哭无泪。
2.2 假阳性:当技术噪声伪装成生物学发现
这是最坑人的——没有之一。
统计检验不认你是生物差异还是技术差异,它只认数字大小。如果实验分组与批次完全混杂(比如 Case 都在批次 1,Control 都在批次 2),那你找出来的差异基因,大概率是批次效应的产物。
为什么会这样?
你想想看,t-test 比较的是两组均值的差异,除以组内变异。如果组内变异主要来自批次,而批次恰好与分组重合——那不显著的也会变得显著。P 值再小,也是假的。
我曾经帮人审过一篇文章,作者信誓旦旦找到了几十个“生物标志物”。我让他把样本按采集时间点着色画 PCA——结果一清二楚:所谓的“差异”全是不同批次引入的噪声。文章最后被拒了,浪费了至少一年的时间和经费。
2.3 假阴性:被“淹没”的真实信号
反过来也一样。
假设真实的生物学信号很弱——比如药物只引起了 10% 的表达上调。如果批次效应带来的技术噪声有 30%,那这个真实信号就彻底被淹没在噪声里了。
你拿着数据跑一遍多重检验校正,发现没有任何基因通过阈值。结论:“该药物无效。” 但这是错的。
假阴性的危害被很多人低估了。
在代谢组学和蛋白组学里尤其常见。这些平台本身测量变异就大,再加上批次效应,很多关键的代谢物或蛋白被漏掉了。我做过一个代谢组项目,ComBat 校正前什么也没找出来,校正后在通路层面挖到了核心机制。差别就是这么夸张。
2.4 可重复性下降:科学验证的“噩梦”
偏倚、假阳性、假阴性加在一起,结果就是一个:你的研究结论重复不出来。
换个实验平台,时间不同,操作人员不同——结果完全变了。这不仅仅是浪费经费,更是对整个学科公信力的伤害。
现在越来越多的顶级期刊要求公开原始数据和代码,就是希望大家能复现结果。但如果批次效应没处理好,就算数据公开了,别人用同样的流程跑一遍,出来的结果也是错的。
我跟团队反复强调一句话: 文章发表了只是开始,能被别人独立复现才是真本事。批次效应处理不好,你的发现就是“沙滩上的城堡”,看起来漂亮,一推就倒。
| 影响类别 | 具体表现 | 对结论的危害 | 我见过的典型案例 |
|---|---|---|---|
| 估计偏倚 | 均值/方差系统性漂移 | 差异倍数不准,置信区间失真 | 不同试剂盒批次引入的基因表达偏移 |
| 假阳性 | 技术差异被误认为生物差异 | 发现大量虚假“生物标志物” | 分组和批次完全混杂的 RNA-seq 项目 |
| 假阴性 | 真实生物信号被技术噪声掩盖 | 漏掉真正关键的分子/通路 | 代谢组数据中微弱但关键的代谢物变化 |
| 可重复性降低 | 跨批次验证时结果不一致 | 研究结论不稳固,验证失败 | 跨实验室/跨平台验证时差异基因列表大面积不重叠 |
下面这张图我经常在课程和项目汇报里用,能帮团队一眼看明白批次效应带来的“多米诺骨牌效应”——
limma::removeBatchEffect 的绘图函数或者 sva::num.sv 估算),再决定下一步用什么校正策略。
最后,我放一段小代码,模拟一下批次效应如何让 t 检验失效。你看一眼就明白了——
# R代码:模拟有/无批次效应的t检验
set.seed(2024)
# 构造20个样本,分为A、B两组
group <- rep(c("A", "B"), each = 10)
# 无批次效应:纯粹随机噪声,没有差异
expr_no_batch <- rnorm(20, mean = 10, sd = 1)
# 有批次效应:前10个样本(恰好是A组)整体偏移+2
expr_batch <- expr_no_batch + c(rep(2, 10), rep(0, 10))
# 无批次效应时 — 应该不显著
t.test(expr_no_batch ~ group)
# 有批次效应时 — 显著!但这是假阳性
t.test(expr_batch ~ group)
看到没有?同样的随机数,加上批次效应后,p 值从“不显著”变成了“极显著”。这不是生物学发现,这是技术事故。而 ComBat 这类工具,就是用来拆掉这个“隐形炸弹”的。
嗯,这章的内容就到这儿。理解了这些影响,你再看后面几章的检测方法与校正原理,就能知道每一步是为了解决什么问题了。