4. 批次效应对ADMET数据的潜在影响

老话说得好,GIGO——垃圾进,垃圾出。做ADMET预测,最怕的就是输入数据本身有问题。批次效应(Batch Effect),就是藏在数据里的“隐形杀手”。

很多人觉得,只要实验条件一样,批次就是重复。这个想法,其实挺危险的。我在项目中踩过太多类似的坑了。

批次效应说白了,就是不同批次实验之间,由于非生物因素导致的系统性差异。比如试剂厂家换了、仪器校准漂移了、操作员手抖了,甚至室温差了2度,这些都能让数据“变形”。

为什么会这样?因为ADMET实验对微环境极度敏感。一个小偏差,可能让IC50值差3倍,让Caco-2渗透率标个“高”还是“中”。

本章我们就把这些潜在影响拆开来看。我整理了三个主要维度:生物学效价漂移、理化属性假象,以及系统误差传递。

关键认知:批次效应不是随机噪声,而是系统性偏倚。它会改变数据分布,让模型学到“批次特征”而不是“药化特征”。

先看一张图,理解批次效应是怎么层层渗透到ADMET管线中的:

批次效应在ADMET数据中的渗透路径 实验操作批次A/B/C 数据采集:浓度/响应值 生物学效价漂移 IC50/Caco-2/代谢稳定性 理化属性假象 LogD/solubility/PAMPA 系统误差传递 训练集/测试集/QSAR 模型预测偏差 / 化合物误判 高估活性 / 低估毒性 / 排序翻转 注意:批次效应在管线中层层放大,上游一个偏差,到下游可能让排名完全颠倒

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% 游离药物浓度估算偏离
一个小经验:当你发现模型预测的准确率在你换了一组测试集后突然从80%掉到60%,先别急着调模型。先检查新测试数据是否来自不同批次。
我习惯的做法是:在测试集里混几个已知的标准化合物,看一眼它们的读数是否漂了。

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%可能是原来的两倍。

系统误差传递有三个关键阶段:

  1. 训练集阶段的“批次污染”:如果你训练集里大部分数据来自A批次,少量来自B批次。模型会以A批次的统计特征为主。测试集如果来自B批次,预测精度暴跌是必然的。
  2. 特征工程阶段的“相关性漂移”:假设你的模型用了LogD和TPSA作为输入特征。如果LogD批次偏移了0.3,特征间的相关结构就会发生变化。模型学到的那种“LogD高则渗透率高”的关系,在新的批次里可能不再成立。
  3. 决策阶段的“阈值震荡”:很多ADMET模型会用二分类阈值——比如Caco-2 Papp > 10-6 cm/s算高渗透。如果批次效应让整体数据往下偏移0.2 log单位,那么一批刚好卡在阈值附近的化合物,有一半会被误判为“低渗透”。

我做过一个具体的模拟:把ChEMBL里同一个靶点的活性数据,按发表年份分成两个批次。结果发现,不同年份的数据集之间,IC50的均值能差0.4 log单位。用这个数据训练的QSAR模型,在另一个年份的数据集上R2直接从0.7掉到0.4。

核心结论:在ADMET建模中,批次效应造成的偏倚往往是单方向且系统的,不是随机噪声。这意味着它不会“平均掉”,而是会累积。你一两个实验的偏差可能很小,但经过管线传递后,最后的预测结果可能跟真实值差一个数量级。

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%的批次效应坑。