构效关系(Structure-Activity Relationship, SAR)描述分子结构的变化如何影响生物活性。建立并解读 SAR 是先导优化的核心工作——它把随机试错变成有方向的设计。
SAR 的三个层次
| 层次 | 内容 | 价值 |
|---|---|---|
| 描述性 | 「这个位置换成甲基活性提高 5 倍」 | 记录事实 |
| 模式性 | 「这个位置需要小的疏水基团」 | 可外推到未测试的取代基 |
| 机制性 | 「这个甲基填充了 Leu98 旁的疏水小口袋」 | 可指导跨系列设计 |
结构信息是从「模式」走向「机制」的关键:没有共晶结构,SAR 只能停留在经验规律;有了结构,就能解释为什么并预测新的改造方向。
R 基团分解:SAR 分析的起点
from rdkit import Chem
from rdkit.Chem import rdRGroupDecomposition as rgd
import pandas as pd
# 1) 定义核心
core = Chem.MolFromSmarts("c1ccc2c(c1)[nH]c(n2)[*:1]")
mols = [Chem.MolFromSmiles(s) for s in df["smiles"]]
mols = [m for m in mols if m is not None]
res, unmatched = rgd.RGroupDecompose([core], mols, asSmiles=True, asRows=False)
rg = pd.DataFrame(res)
rg["pIC50"] = df["pIC50"].values[:len(rg)]
# 2) 逐位点分析
for col in [c for c in rg.columns if c.startswith("R")]:
stats = rg.groupby(col)["pIC50"].agg(["mean", "std", "count"])
stats = stats[stats["count"] >= 2].sort_values("mean", ascending=False)
print(f"\n=== {col} ===")
print(stats.head(8))
print(f"该位点的活性跨度: {stats['mean'].max() - stats['mean'].min():.2f} log")
# 关键洞察:
# 活性跨度大的位点 = 对活性敏感 = 关键位点
# 活性跨度小的位点 = 容差大 = 可用于优化性质
#
# 这个区分极其实用:
# 在容差大的位点引入极性基团改善溶解度,
# 不会损害活性
活性悬崖
活性悬崖(activity cliff)指结构极相似但活性差异很大的分子对。它们既是麻烦也是机会:
- 麻烦:它们违反了「相似分子有相似活性」的假设,是机器学习模型误差的主要来源;
- 机会:它们蕴含最丰富的 SAR 信息——一个微小改动导致活性剧变,说明那个位置有关键的相互作用。研究它们能揭示结合模式的本质。
from rdkit import Chem, DataStructs
from rdkit.Chem import rdFingerprintGenerator
import numpy as np
gen = rdFingerprintGenerator.GetMorganGenerator(radius=2, fpSize=2048)
def find_activity_cliffs(smiles_list, activities,
sim_threshold=0.85, activity_threshold=1.5):
fps = [gen.GetFingerprint(Chem.MolFromSmiles(s)) for s in smiles_list]
cliffs = []
for i in range(len(fps)):
sims = DataStructs.BulkTanimotoSimilarity(fps[i], fps[i+1:])
for j, sim in enumerate(sims, start=i+1):
d_act = abs(activities[i] - activities[j])
if sim >= sim_threshold and d_act >= activity_threshold:
cliffs.append({
"mol_a": smiles_list[i], "mol_b": smiles_list[j],
"similarity": round(sim, 3),
"delta_activity": round(d_act, 2),
# SALI: 结构-活性景观指数
"SALI": round(d_act / (1 - sim + 1e-9), 1),
})
return sorted(cliffs, key=lambda x: -x["SALI"])
# 找到悬崖后必做的两件事:
# 1) 核实数据是否可靠(是真悬崖还是实验错误?)
# 2) 如果是真的,用结构解释为什么
# → 这往往是理解结合模式的突破口
匹配分子对(MMP)分析
# MMP:只差一个片段的分子对
# 用它可以从数据中系统性地提取「某个替换的平均效果」
pip install mmpdb
# 构建 MMP 数据库
mmpdb fragment compounds.smi -o frag.fragdb --num-jobs 8
mmpdb index frag.fragdb -o mmp.mmpdb
mmpdb loadprops -p properties.csv mmp.mmpdb
# 查询某个分子的可能转换
mmpdb transform --smiles "目标分子" --property pIC50 mmp.mmpdb
MMP 分析的独特价值:它给出的不是理论推测,而是「在真实数据中,这个替换平均让活性变化多少、变异有多大」。「效果稳定性」(标准差小)比「平均效果大」更值得信赖——一个平均提升 0.5 log 但标准差 1.2 的替换,实际上是不可预测的。
SAR 可视化
# 常用的可视化方式
#
# 1) SAR 表格(最基础但最有效)
# 行 = 化合物,列 = 各位点取代基 + 活性 + 性质
# 用 mols2grid(见 217)渲染结构
#
# 2) R 基团矩阵
# 行 = R1 的选项,列 = R2 的选项,格子 = 活性
# → 直观显示位点间的相互作用(协同或拮抗)
#
# 3) 活性景观图(SALI 网络)
# 节点 = 分子,边 = 相似分子对,边的粗细 = SALI
# → 突出显示活性悬崖
#
# 4) 化学空间投影 + 活性着色
# 用 t-SNE/UMAP 把指纹降到 2D,按活性着色
# → 看活性在化学空间中的分布
#
# 5) 结构叠合 + 活性映射
# 把系列分子叠合在口袋中,用颜色标注活性
# → 直观看到哪个方向的取代有利
SAR 与结构的结合
- 用 SAR 验证结合模式:如果结构提示某个基团形成关键氢键,那么去掉该基团应该大幅降低活性。做这个「预期失活」的对照实验,是验证结合模式假设最直接的方式;
- 用结构解释 SAR 异常:某个改动的效果与预期相反时,回到结构看是否有未注意的相互作用或构象变化;
- 用相互作用指纹量化:把一系列类似物的相互作用指纹与活性一起分析(见 338《用 ProLIF 提取相互作用指纹》),能识别出哪些相互作用与活性提升相关;
- 诱导契合的复杂性:不同配体可能诱导略微不同的口袋构象,这是 SAR 难以完全用单一结构解释的原因之一。
建立可解读 SAR 的实验设计原则
- 一次只改一个位点:同时改多处会让 SAR 无法归因;
- 系统覆盖性质空间:每个位点试大小、极性、电荷、氢键能力各不同的取代基;
- 包含预期失活的对照:验证假设,而非只做「预期有效」的分子;
- 保留内标:每批实验包含已知活性的参照化合物,控制批次差异;
- 记录完整的实验条件:不同条件的活性数据不可直接比较。
关键要点
- 区分「活性敏感位点」与「容差大的位点」——后者可用于优化性质而不损害活性;
- 活性悬崖既是模型误差来源,也是最富信息的 SAR 线索;
- MMP 分析中「效果稳定性」比「平均效果」更值得信赖;
- 做「预期失活」的对照实验,是验证结合模式假设最直接的方式。
延伸资源
- R 基团替换:353《R-group Replacement 实战》;相互作用指纹:338《用 ProLIF 提取相互作用指纹》;
- 先导优化:405《Lead Optimization》;骨架跃迁:352《Scaffold Hopping 实战》。