073

SAR 构效关系:药物化学优化的核心语言

SAR 是药物化学优化的核心语言。这篇讲清 SAR 的解读方法、活性悬崖的意义与计算工具的辅助作用。

构效关系(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 分析中「效果稳定性」比「平均效果」更值得信赖;
  • 做「预期失活」的对照实验,是验证结合模式假设最直接的方式。

延伸资源