4. 批次效应对ADMET数据的潜在影响
老话说得好,GIGO——垃圾进,垃圾出。做ADMET预测,最怕的就是输入数据本身有问题。批次效应(Batch Effect),就是藏在数据里的“隐形杀手”。
很多人觉得,只要实验条件一样,批次就是重复。这个想法,其实挺危险的。我在项目中踩过太多类似的坑了。
批次效应说白了,就是不同批次实验之间,由于非生物因素导致的系统性差异。比如试剂厂家换了、仪器校准漂移了、操作员手抖了,甚至室温差了2度,这些都能让数据“变形”。
为什么会这样?因为ADMET实验对微环境极度敏感。一个小偏差,可能让IC50值差3倍,让Caco-2渗透率标个“高”还是“中”。
本章我们就把这些潜在影响拆开来看。我整理了三个主要维度:生物学效价漂移、理化属性假象,以及系统误差传递。
先看一张图,理解批次效应是怎么层层渗透到ADMET管线中的:
4.1 生物学效价漂移:最直接的打击
生物学效价漂移,是我在制药公司做体外ADMET项目时感受最深的一点。有一次,我们测同一批化合物的Caco-2渗透率,两个批次之间,有30%的化合物从“高渗透”跌到了“中渗透”。
我当时第一反应是化合物降解了。但后来追查发现,是细胞传代代数不同导致的批次差异。
这类影响通常有三个表现形式:
- IC50/GI50 系统性偏移:比如批次A的IC50普遍是批次B的1.5倍。模型如果在A上训练,看到B的数据就会认为“活性变差”。
- 代谢稳定性排名错乱:肝微粒体实验里,不同批次的酶活性可能差2-3倍。特别是CYP3A4底物,批次效应经常把弱代谢物标成强代谢。
- 膜渗透率“假临界值”:PAMPA或Caco-2的阈值是固定的,但批次间系统误差可能让一批化合物的平均值整体偏移,硬生生把一批好化合物卡在门槛外。
| ADMET指标 | 常见批次效应幅度 | 对后续影响 |
|---|---|---|
| Caco-2 Papp (cm/s) | ±0.3~0.7 log单位 | 渗透性分类误判,PK预测偏差 |
| 人类肝微粒体 CLint | ±40%~80% | 清除率高估/低估,剂量预测偏移 |
| hERG IC50 | ±0.2~0.5 log单位 | 毒性筛选假阳性/假阴性 |
| 水溶性 (kinetic) | ±0.4~0.6 log单位 | 制剂策略选择失真 |
| 血浆蛋白结合率 | ±5%~15% | 游离药物浓度估算偏离 |
我习惯的做法是:在测试集里混几个已知的标准化合物,看一眼它们的读数是否漂了。
4.2 理化属性假象:数据漂亮但骗人
理化属性的测量,看起来比生物学实验稳定,对吧?其实不然。LogD、溶解度、pKa这些“硬数据”,批次效应一样能搞事。
我记得有一次,我们一个合作方给了一批LogD数据,看起来质量很好,标准差也很小。但导入模型后,预测的PK曲线全偏了。后来发现是他们的LogD测量批次用了不同比例的摇瓶时间,没有达到热力学平衡。
常见的理化假象包括:
- LogD/logP 测量条件漂移:不同批次的油水比例、pH缓冲液浓度略有偏差,log值就能差0.3。这在ADMET模型里足以改变化合物的亲脂性分类。
- 动力学溶解度 vs 热力学溶解度:两个概念本身就不同。但同一家实验室,不同批次之间,因为DMSO储存时间不同,可能一个标成了“动力学高溶”,另一个标成了“中等”。
- pKa测定温度效应:温度差1度,pKa可能偏0.05。从不同批次看,如果实验室空调出风口正对着仪器,夏天和冬天的数据都可能不一致。
说白了,理化属性测量的“假象”往往不是因为测错了,而是因为批次间的预处理条件不一致。特别是样品储存时间这个变量,在我以前的项目里,DMSO储存超过3个月的化合物,测出来的LogD和新鲜配制的能差0.5。
我曾经遇到过:两个批次的水溶性数据,用同一个标准品验证时,发现其中一批的系统偏差高达0.6 log单位。如果不做校正,模型会把这个偏差当“结构特征”去学习。
4.3 系统误差传递:蝴蝶效应在ADMET里是真的
最让我头疼的,不是单个实验的批次效应,而是它沿着管线层层传递,到最后变形了。你想想看,一个早期的Caco-2数据偏了0.2 log单位,这个数据喂给渗透率模型;渗透率模型输出又喂给PBPK模型;最后PBPK模型算出来的F%可能是原来的两倍。
系统误差传递有三个关键阶段:
- 训练集阶段的“批次污染”:如果你训练集里大部分数据来自A批次,少量来自B批次。模型会以A批次的统计特征为主。测试集如果来自B批次,预测精度暴跌是必然的。
- 特征工程阶段的“相关性漂移”:假设你的模型用了LogD和TPSA作为输入特征。如果LogD批次偏移了0.3,特征间的相关结构就会发生变化。模型学到的那种“LogD高则渗透率高”的关系,在新的批次里可能不再成立。
- 决策阶段的“阈值震荡”:很多ADMET模型会用二分类阈值——比如Caco-2 Papp > 10-6 cm/s算高渗透。如果批次效应让整体数据往下偏移0.2 log单位,那么一批刚好卡在阈值附近的化合物,有一半会被误判为“低渗透”。
我做过一个具体的模拟:把ChEMBL里同一个靶点的活性数据,按发表年份分成两个批次。结果发现,不同年份的数据集之间,IC50的均值能差0.4 log单位。用这个数据训练的QSAR模型,在另一个年份的数据集上R2直接从0.7掉到0.4。
4.4 实际操作中怎么识别批次效应?
讲完了理论,给点实操的东西。识别批次效应其实不复杂,我总结了三个快速筛查方法:
- 标准品追踪法:在每批次实验里都跑一组已知的标准化合物(至少5个结构不同、覆盖ADMET全范围)。把它们的数据画成一个时间序列,一看就能看出漂移。
- PCA/UMAP对比法:把不同批次的实验数据放在一起,做PCA降维。如果各批次在PC1/PC2空间里明显分开,而不是随机混合,那就说明有批次效应。
- 混合效应模型检测:对连续型ADMET指标(如IC50、Papp),跑一个线性混合模型,把“批次”作为随机效应。如果随机效应的方差分量显著,就说明批次效应存在。
# 快速筛查示例:使用统计检验检测批次效应
# 假设你有两个批次的数据:batch_A 和 batch_B
# 核心思想:看同一化合物在两个批次中的差异是否显著
from scipy import stats
# 对于每个化合物,计算批次间的差值
ic50_diff = batch_A['ic50'] - batch_B['ic50']
# 如果批次效应为0,差值应围绕0随机分布
# 单样本t检验:检验均值是否显著不等于0
t_stat, p_value = stats.ttest_1samp(ic50_diff, 0)
# 如果p值小于0.05,说明存在系统性偏倚
print(f"t统计量: {t_stat:.2f}, p值: {p_value:.4f}")
# 再看箱线图:如果差值的分布明显偏离中位数0
# 那批次效应就很明显了
这就是批次效应在ADMET数据中埋的雷。碰到这些情况,别慌,先问三个问题:
- 这个数据集的批次标注齐全吗?
- 不同批次之间有标准品校准吗?
- 我的训练集和测试集是否来自同一个批次分布?
想清楚这几点,基本就能避免80%的批次效应坑。