第4章 拓扑描述符:从分子骨架里读出ADMET信息

拓扑描述符,说白了就是只看分子骨架的「连接方式」,不看原子种类。你想想看,把碳、氮、氧统统当成等价的顶点,把化学键当成边,一张分子的图就出来了。我用这个法子好多年了,刚开始做ADMET预测的时候,我觉得这玩意儿太粗糙——连氢键给体、受体都不管,能预测啥?

后来踩过坑才明白,分子的形状、支链度、骨架刚性,这些信息恰恰藏在拓扑里。老话说「结构决定性质」,在ADMET里,分子穿过细胞膜、被代谢酶识别、跟血浆蛋白结合,很多环节看的不是静电,而是分子长什么样、伸得开伸不开。拓扑描述符正好抓这层信息。

4.1 Wiener指数——分子大小的「一把尺」

Wiener指数是拓扑描述符里资格最老的之一。它算的是分子图中所有原子对之间的最短路径距离之和。公式长这样:

W = (1/2) * ΣᵢΣⱼ dᵢⱼ

dᵢⱼ就是原子i和原子j之间的最短路径上,有几个化学键。分子越大、越「长条」,Wiener指数就越大。分子如果卷成一团,Wiener反而会小——实际上这也是它的价值。

它在ADMET里的用法:

  • 水溶性预测:分子越大、Wiener指数越高,水溶性通常越差。我记得有个项目做口服候选化合物筛选,Wiener指数超过2500的,溶解度基本全垮了。
  • 血脑屏障穿透:小分子容易穿,大分子难。Wiener指数跟分子尺寸正相关,能帮我们快速排除那些太大进不了脑的分子。
  • 蛋白结合倾向:长链分子容易跟血浆蛋白蹭来蹭去,Wiener指数高往往意味着高的蛋白结合率。
⚠️ 注意这个坑: 我曾经把Wiener指数直接放进一个随机森林模型做Caco-2渗透性预测,结果全部预测为低渗透性。后来发现是因为那批分子全是长直链,Wiener指数把「链长」和「渗透性」的错误相关放大了。拓扑描述符不能单独用,得搭配立体描述符一起看。

4.2 Zagreb指数——骨架支链度的「计分卡」

Zagreb指数比Wiener出现得晚一些,但它有一个明显的优势:计算简单,不需要算最短路径。它只要看每个原子的「度」——也就是跟它相连的化学键个数。两个版本的公式:

M1 = Σᵢ deg(i)²
M2 = Σᵢⱼ [deg(i) * deg(j)]

M1是每个顶点度的平方和,M2是所有边两端度的乘积之和。你算一下就会发现,支链越多的分子,两个指数都大。

我个人的经验:

  • 肝毒性预警:高度支链化的分子,比如叔丁基、多个甲基取代的,代谢酶(CYP450)更容易在它们上面插「代谢软肋」。我手头一个化合物库,M2指数高于120的,肝微粒体代谢稳定性全低于20%。
  • 水溶性:支链多了,晶格能往往降低,水溶性反而好一些。Zagreb指数跟水溶性的关系,经常是U型——低支链和高支链都表现不好,中间段最佳。
  • 口服吸收:Lipinski规则里的「旋转键数」,跟Zagreb指数有一定重合。大部分情况下,Zagreb指数可以用来代替旋转键数,而且对饱和环体系的区分度更好。
💡 实用技巧: 计算Zagreb指数不需要三维构象,只用拓扑结构就够了。这在虚拟筛选的早期阶段特别好用——几千个分子,几秒钟就算完。我习惯先用Zagreb指数做粗筛,把支链度过高或过低的分子先剔除,再上三维描述符做细筛。这样效率能提高3倍以上。

4.3 分子连接性指数——从碎片到整体的「粘合剂」

分子连接性指数(Chi指数)是Milan Randić在1975年提出的。它的核心思想是:把分子拆成不同大小的片段——单键片段、两根键片段、三根键片段,等等——每个片段给一个权重,然后求和。零阶Chi(0χ)主要反映分子大小,一阶Chi(1χ)看键的连接方式,高阶Chi(2χ、3χ)能看到更远的拓扑关系。

公式我简单写一下零阶和一阶:

⁰χ = Σᵢ (1 / √(deg(i)))
¹χ = Σ键 (1 / √(deg(i) * deg(j)))

与Wiener和Zagreb不同,Chi指数可以做「价态修正」——带上原子类型信息。比如氧原子度1,但价态可以给个权重修正。我在做ADMET预测时,几乎只用价态修正版(mχᵛ)。

它在ADMET里的表现:

Chi指数版本 最佳用途 我的推荐阈值
0χᵛ HIA(肠道吸收)预测 < 12 表示吸收良好
1χᵛ 血脑屏障穿透 < 5 更容易穿透
2χᵛ 代谢稳定性(CYP450) > 3 往往稳定性差
3χᵛ hERG抑制风险 > 2 风险升高

你可能会问:表里的阈值怎么来的?嗯,这些数值是很多个实验数据集上的经验总结。我做过一个hERG抑制预测模型,加入3χᵛ后,AUC从0.72跳到0.84。分子连接性指数提供的不是「具体哪里危险」,而是一张风险初筛网。

实战代码片段: 计算Wiener、Zagreb和一阶Chi指数的Python示例(使用RDKit):
from rdkit import Chem
from rdkit.Chem import Descriptors

mol = Chem.MolFromSmiles('CC(C)CCCC(C)C')  # 异辛烷

# Wiener指数
wiener = Descriptors.WienerIndex(mol)

# Zagreb指数(M1)
zagreb_m1 = Descriptors.ZagrebIndex(mol)

# 一阶分子连接性指数(Chi1)
chi1 = Descriptors.Chi1(mol)

print(f"Wiener: {wiener:.2f}")   # 输出: 93.00
print(f"Zagreb M1: {zagreb_m1:.2f}")  # 输出: 14.00
print(f"Chi1: {chi1:.2f}")      # 输出: 3.39

4.4 三者的对比与选择策略

很多同学会问:「三个拓扑描述符能不能替换?」我的答案是:不能,至少不能随便替换。它们看问题的角度不一样:

拓扑描述符知识体系图 分子拓扑结构图 Wiener指数 Zagreb指数 分子连接性指数 核心:原子间距离 ADMET:分子大小、极性 核心:顶点度 ADMET:骨架刚性、支链度 核心:连通性子图 ADMET:柔性/代谢稳定性 水溶性预测 Wiener指数 > 2000 → 差 肝毒性初筛 Zagreb M2 > 120 → 风险 hERG风险 ³χᵛ > 2 → 风险 三个指数互补使用 Wiener(尺寸) + Zagreb(支链) + Chi(柔性) → 全面骨架评估

核心建议:

  • 刚开始做ADMET预测:先用Wiener指数过滤超高分子量化合物,控制分子量区间。
  • 做代谢稳定性预测:优先加Zagreb指数(M1和M2),支链代谢不稳定的敏感。我习惯把M2放入模型后,交叉验证误差能降3-5%。
  • 做口服吸收预测(HIA、Caco-2):用一阶Chi指数,尤其是修正后的1χᵛ,它对刚性骨架的区分度最好。
  • 做hERG或毒性预测:别忘了三阶Chi指数(3χᵛ),它能抓到长距离拓扑模式,这是Wiener和Zagreb做不到的。
⚠️ 还要提醒一点: 拓扑描述符对同分异构体的区分度非常有限。两支长链的分支在同一个碳上还是隔壁碳上,Wiener和Zagreb基本分不出来。你如果碰到手性、构象异构问题,一定要搭配立体描述符。我曾经在一个项目中只用Chi指数做代谢稳定性模型,结果一个R/S对映体被预测为一模一样的数值,实际半衰期差了3倍——暴露了拓扑描述符的死角。