——以及这些视角如何帮助安排 EGFR 选择性的后续对照
队列:TeachOpenCADD T023 的 9 个激酶 | 输入:data/cadd-tutorial-inputs(固定提交 4efdbd3)
本报告的全部数值、图与代码位于本会话 module-08/。
同一批 9 个激酶,用四种不同方式衡量"相似",得到的图大体一致、局部冲突:
一句话给初学者:这四张图不是"四个实验",而是同一个激酶队列的四种度量方式—— 数据来源和指标都不同,因此不能当作彼此独立的证据。 它们一致的地方值得优先跟进,冲突的地方要先问"这个视角的度量方式本身有没有偏向"。
9 个激酶(KLIFS 名 / 常用名):
| 常用名 | KLIFS 名 | UniProt | 分组(KLIFS kinase group) |
|---|---|---|---|
| EGFR | EGFR | P00533 | TK |
| ErbB2 | ErbB2 | P04626 | TK |
| PI3K | p110a | P42336 | Atypical |
| VEGFR2 | KDR | P35968 | TK |
| BRAF | BRAF | P15056 | TKL |
| CDK2 | CDK2 | P24941 | CMGC |
| LCK | LCK | P06239 | TK |
| MET | MET | P08581 | TK |
| p38a | MAPK14 | Q16539 | CMGC |
一个必须先统一的口径:KLIFS 的标准激酶口袋是固定的 85 个位置, 所以"口袋序列相似性"比的是这 85 位,而不是整条蛋白序列。 另外两个视角的结构清单(T025、T026)来自同一份 1620 个冻结结构 ID。
| 视角 | 观测到什么 | 比较单位 | 本次处理 | 与随包矩阵的核对 |
|---|---|---|---|---|
| T024 序列 | KLIFS 每个激酶的规范 85 位口袋序列 | 每激酶 1 条序列 | 重算 | 最大差 3.3e-16 |
| T025 口袋几何 | 随包原始 KiSSim 指纹(1611 结构 × 1032 特征) | 结构对 | 重算 | 最大差 1.7e-12 |
| T026 相互作用指纹 | KLIFS 公开端点 /interactions_get_IFP,595 位 |
结构对 | 重算(取到 1466/1620) | 最大差 1.4e-16 |
| T027 配体活性谱 | 随包只有派生矩阵,没有逐化合物活性记录 | 不可还原 | 上游参考,未重算 | — |
这里有一个必须讲清楚的区别: 综合比较(图 2 的面板 E)显式使用随包的四张冻结矩阵作为共同参照口径。 前三个视角我们另外从原始观测重算并逐元素核对通过; 第四个视角只有上游保存的矩阵,它的"共同测量化合物数、活性分母、缺失状态"都无法从随包文件还原。 所以不能把综合图说成"四类原始数据都重新计算过"。
给初学者:下面每条都是"如果不这样做会怎样"。
① 为什么先把矩阵对齐到同一个激酶顺序?
四个文件的行列顺序并不一样(T024/T027 与 T025/T026 的排列不同),命名也不统一
(显示名 VEGFR2 在矩阵里叫 KDR)。若直接按位置相加,就是拿 EGFR 去比 BRAF。
本模块统一用 KLIFS 名,并按显式顺序重排。
② 为什么用"距离"而不是"相似度"来综合? 四个视角的量纲完全不同:序列是 0–0.6 的距离,KiSSim 是 16–41,指纹是 0–0.57 的 Jaccard, 配体谱是 0–1。距离都满足"越小越像",方向一致,才可以直接平均。
③ 为什么综合前要做 min-max 归一化? 把每个视角线性压到 0–1,否则 KiSSim 那 16–41 的数值会淹没其它三个视角。 代价是:min-max 会被该视角最极端的那一格(几乎总是 PI3K 相关的配对)锚定, 把其余数值压进很窄的区间。所以我们另外做了"按名次平均"的稳健配方做对照(见第 7 节第 5 条), 两种配方给出的 EGFR 最近邻都是 ErbB2。
④ 为什么"结构对取最小值"这个约定需要格外小心? T025 与 T026 都把两个激酶之间的距离定义为 "这两个激酶的所有结构两两比较,取最像的那一对"。 这个定义的物理含义是"是否存在任何一对构象很接近",而不是"平均构象有多接近"。 问题在于:它是最小值统计量,比较的结构对越多,最小值天然越小。 两个视角的可比结构对数并不相同,必须分开看: KiSSim(T025) EGFR×CDK2 = 357×848 = 302,736 对,EGFR×ErbB2 = 357×4 = 1,428 对(212.0 倍); IFP(T026) EGFR×CDK2 = 339×763 = 258,657 对,EGFR×ErbB2 = 339×4 = 1,356 对(190.75 倍)。 覆盖差异是一个可能的部分因素;本模块只在 KiSSim 上做了等量重采样验证(图 4B,另见第 7 节第 4 条)。
⑤ 为什么 T025 的"每激酶只留第一个结构"是另一件事?
方法说明提到上游 notebook 代码里有一句"按激酶名去重、只保留第一个结构"。
我们实算了这个变体:它与随包矩阵最大差达 17.54(KiSSim 单位)。
而"全部结构对取最小"与随包矩阵逐元素完全一致。
因此正确表述是:随包保存的矩阵符合"全部结构对取最小值"的口径;
"先按激酶去重"是代码层面的另一种做法,二者不应混为同一出处。本模块把该对照单独存为
results/sensitivity_T025_first_structure_only.csv。
⑥ 为什么 T024 里 - 的处理要单独标注?
KLIFS 规范口袋序列里,p110a / CDK2 / p38a 各含 1–2 个缺失位(-)。
上游实现把 - 映射成 *(等于把"共同缺失"也算作相同),这能精确复现随包矩阵;
若改为"排除缺失位、只按实际可比位置算",最大差 0.0158。
本模块把实际可比位置数单独存为
results/T024_observation_position_denominator.csv——
它是一张计数表,所以对角线是该激酶自身的可用位置数(85 / 84 / 83),而不是距离矩阵的 0。
⑦ 为什么 T026 要去联网重算,而不是直接用随包矩阵?
随包没有原始指纹,但 KLIFS 有公开端点。实际取到 1466/1620 个结构的 595 位指纹,
按原定义算 Jaccard 并聚合,结果与随包矩阵完全一致。
154 个结构端点没有返回记录——这是"KLIFS 没有为它发布指纹",
不等于"它没有相互作用"。这 154 个 ID 与原因全部存在
results/T026_missing_structures.csv,我们没有为它们编造指纹。
⑧ 为什么图里的统计检验用词要谨慎?
36 个"激酶对"来自 9 个激酶,彼此不独立。所以置换检验的 p 值只作描述性参考,
不能说成对 36 个独立生物样本的确认性推断。检验用有限抽样估计
(极端次数 + 1)/(置换次数 + 1),原始极端计数与随机种子都保存下来。

为什么要先看这张图:后面所有"谁离谁近"的结论,都要先问"这个结论背后有多少证据撑腰"。

每个视角各自 min-max 归一化后画在同一激酶顺序上;颜色可跨面板比较,绝对量级不可比。 灰格是对角线(自比较,按约定为 0)。
可以一眼看出的三件事:

六个视角配对的 Spearman 相关系数全为正,范围 r = 0.31–0.73,其中 3 对达到 p < 0.05:
| 视角配对 | Spearman r | Mantel p |
|---|---|---|
| 口袋几何 × 指纹 | 0.73 | 0.002 |
| 序列 × 口袋几何 | 0.70 | 0.003 |
| 序列 × 指纹 | 0.50 | 0.046 |
| 序列 × 配体谱 | 0.43 | 0.068 |
| 指纹 × 配体谱 | 0.36 | 0.154 |
| 口袋几何 × 配体谱 | 0.31 | 0.222 |


| 激酶 | 综合距离 | 序列 | 口袋几何 | 指纹 | 配体谱 |
|---|---|---|---|---|---|
| ErbB2 | 0.345 | 1 | 1 | 6 | 1 |
| LCK | 0.480 | 3 | 2 | 2 | 5 |
| VEGFR2 | 0.488 | 2 | 3 | 5 | 3 |
| MET | 0.517 | 4 | 4 | 4 | 6 |
| BRAF | 0.518 | 5 | 6 | 7 | 2 |
| p38a | 0.520 | 7 | 7 | 3 | 4 |
| CDK2 | 0.522 | 6 | 5 | 1 | 7 |
| PI3K | 0.853 | 8 | 8 | 8 | 8 |
(表中数字为"相对 EGFR 的名次",1 = 最近。)
这些视角能支持什么
这些视角不能支持什么
下一步最有信息量的实验
对同一组 EGFR 抑制剂,在 EGFR / ErbB2 / CDK2 / VEGFR2 / PI3K 上做同一条件的活性测定。 把 PI3K 一并纳入,才能同时检验"ErbB2 最近""CDK2 较远""PI3K 离 EGFR 更远"这三条排序; 若只测 EGFR / ErbB2 / CDK2 / VEGFR2,则 PI3K 的排序仍未被检验。
| 视角 | 结果 | 与随包矩阵 |
|---|---|---|
| T024 序列 | 由 KLIFS 规范口袋序列按上游变换(BLOSUM62 平移+归一,85 位取均值)重算 | 最大差 3.3e-16 ✅ |
| T025 口袋几何 | 由 1611×1032 原始指纹算 nan_euclidean,再按全部结构对取最小聚合 |
最大差 1.7e-12 ✅ |
| T025(对照) | "每激酶仅保留第一个结构" | 最大差 17.54 ❌ 与随包矩阵不同口径 |
| T024(对照) | 排除缺失位、按实际可比位置计算 | 最大差 0.0158 ❌ 与随包矩阵不同口径 |
| T026 指纹 | 联网取 1466/1620 个结构的 595 位 IFP,算 Jaccard 后按全部结构对取最小 | 最大差 0.0 ✅ |
| T027 配体谱 | 未重算(随包无逐化合物活性记录) | — |
T026 的重算是真正的联网复现:查询时间、端点、请求/返回/缺失数量、
每个激酶对取到最小值的那一对具体结构 ID 与比较对数,全部记录在
results/T026_ifp_retrieval_log.csv、T026_ifp_argmin_pairs.csv、T026_missing_structures.csv。
0 表示"未标注相互作用",
不是"测得无接触"。在保留的 1466 个结构中,有 1033 个(70.5%)至少含一个未解析口袋位,
共 11,116 / 872,270 位(1.27%)落在未解析位之下;这些位置上的 0 尤其不能当作"无接触"。python module-08/code/run_all.py # 全部三步(缓存完整时不联网)
python module-08/code/run_all.py --offline # 禁止联网;快照不完整即报错
python module-08/code/run_all.py --step figures # 只重绘,不重算
CADD_INPUT_ROOT=/path/to/pack python module-08/code/run_all.py
../README.md — 模块清单、逐文件说明、快照语义与可复用入口../inputs/INPUTS.md — 输入文件映射与 SHA256../code/ — run_all.py、01_build_views.py、02_recompute_T026_ifp.py、03_figures.py../results/ — 全部数值结果(含 summary.json)../figures/ — 5 张组图(.png 查看、.svg/.pdf 矢量、.csv 为绘图数据)本文件位于 module-08/report/,因此上文的图片与文件链接一律相对本文件所在目录解析
(例如 ../figures/fig01_cohort_and_coverage.png → module-08/figures/fig01_cohort_and_coverage.png)。
每张图都配有同名 .csv,保存该图实际绘制的数字。
致谢与许可:数据与教学材料来自 Volkamer Lab TeachOpenCADD(CC BY 4.0); ChEMBL / KLIFS / UniProt 等底层数据各自适用其原始条款。