# DeepGraph 第一轮交付 · 知识图谱 OA 候选基因排序的设定稳健性

**提交方向**: 用知识图谱预测骨关节炎的候选基因
**交付时间**: 2026-08-11
**这一轮真跑了**: Hetionet v1.0(CC0,47,031 节点 / 2,107,709 条无向同质化边,OA = `Disease::DOID:8398`,62 条疾病–基因边做 62 折留一,候选池 20,945 个基因)· 5 条臂(3 条推理臂 + 2 条基线臂)· 3 个随机种子(0/1/2)· 外加 36 套设定的全网格两两比较 · 总耗时 152.4 秒,代码与日志随附

---

## 0. 结论(先说结果)

我们赛前写死了两条可被推翻的预测,跑完一条成立、一条被推翻,合并判定是 `inconclusive`(混合结果)。

- **P1(候选名单对设定敏感,36 套设定两两 Top-50 Jaccard 中位数 < 0.5)→ 成立。** 实测中位数 **0.111**(630 对设定,四分位区间 0.0204–0.316)。换一套边权 / 打分函数 / 重启率,Top-50 基本换掉一批基因。
- **P2(纯度数零模型 AUROC ≥ 0.70 **且** 其 Top-50 与完整流程 Top-50 重合 ≥ 30%)→ 被推翻。**(重合率是计数读数,本轮**没有**对它做任何显著性检验,拿不出 p 值;详见第 2 节。) 前半条成立(度数零模型 AUROC = **0.758**),后半条不成立:它的 Top-50 与三条推理臂 canonical 配置 Top-50 的重合分别是 **0 / 5 / 0** 个基因,最高重合率 **10%**。两个子条件必须同时满足,所以 P2 判定推翻。

**这条路我们替你试了,"用度数零模型解释掉 OA 排序结果"这个说法不成立,原因是重合率只有 10%。** 度数高的枢纽基因确实在留一排名里容易靠前(所以零模型 AUROC 看着不差),但它挑出来的具体基因和真正做图推理挑出来的几乎是两批人。含义是:**AUROC 高低不能替你回答"名单选得对不对",这两件事在这份数据上是分开的。** 下一步该拐的方向在第 3 节:把评价重心从"再刷高一点 AUROC"移到"名单在什么范围内稳定"。

作为参照,canonical 配置的个性化 PageRank 62 折留一 AUROC = 0.959,度数零模型 = 0.758,差距 0.200。

---

## 1. 我们替你跑了什么

**设计一句话**:在 Hetionet 上把 OA 的 62 条已知疾病–基因边做 62 折留一,每折挖掉 1 条边重新打分,看被挖掉的那个基因在 20,945 个候选基因中的排名;3 条推理臂和 2 条基线臂走**完全相同的折划分、相同负样本、相同评测代码**,唯一差别是打分函数。

**baseline 是什么、为什么公平**:
- `baseline-degree-null` —— 忽略 OA 节点的任何连接,只用基因在全图中的度排序。它拿到的任何分数,都是"不做知识图谱推理也能拿到的分数"。
- `baseline-random-permutation` —— 每折随机打分,给出评测流水线的下限刻度,确认评测代码本身不引入信号(实测 AUROC 0.494;AUPRC 0.0497,与 1 正 20 负下的随机水平 1/21 = 0.0476 吻合)。

**主结果表(62 折留一,三个种子)。三条推理臂与度数零模型是确定性打分,三个种子的原始值完全相同;随机置换臂逐种子不同。**

| 臂 | AUROC(seed 0 / 1 / 2) | AUROC 均值 ± 标准差 |
|---|---|---|
| `scorer-ppr`(canonical:degree_normalized_w0.4, α=0.15) | 0.959 / 0.959 / 0.959 | 0.959 ± 0.000 |
| `scorer-dwpc`(2 条元路径,degree_normalized_w0.4) | 0.937 / 0.937 / 0.937 | 0.937 ± 0.000 |
| `scorer-adamic-adar`(degree_normalized_w0.4) | 0.924 / 0.924 / 0.924 | 0.924 ± 0.000 |
| `baseline-degree-null`(基线) | 0.758 / 0.758 / 0.758 | 0.758 ± 0.000 |
| `baseline-random-permutation`(基线) | 0.507 / 0.497 / 0.476 | 0.494 ± 0.0131 |

**其余指标(均值,同一批 62 折;推理臂与度数零模型三种子标准差为 0)**

| 臂 | AUPRC(度匹配负样本) | MRR | recall@20 | recall@50 | recall@100 | recall@200 |
|---|---|---|---|---|---|---|
| `scorer-ppr` | 0.602 | 0.0274 | 0.210 | 0.500 | 0.565 | 0.694 |
| `scorer-dwpc` | 0.641 | 0.0558 | 0.339 | 0.500 | 0.532 | 0.694 |
| `scorer-adamic-adar` | 0.756 | 0.0325 | 0.177 | 0.452 | 0.597 | 0.742 |
| `baseline-degree-null` | 0.0491 | 0.00310 | 0.0161 | 0.0484 | 0.0806 | 0.113 |
| `baseline-random-permutation` | 0.0497(seed 0/1/2 = 0.0514 / 0.0479 / 0.0497) | 0.000277 | 0.000 | 0.000 | 0.000 | 0.00538(seed 0/1/2 = 0 / 0 / 0.0161) |

**稳健性网格(核心产出)**:36 套设定(打分函数 4 种 × 边权方案 3 种 × 重启率 3 种),在全量图上各出一份 Top-50,做 C(36,2) = **630** 对两两比较。

| 读数 | 中位数 | P25 | P75 |
|---|---|---|---|
| Top-50 Jaccard | 0.111 | 0.0204 | 0.316 |
| Kendall tau(1500 个随机抽样基因上计算) | 0.503 | 0.389 | 0.675 |

**度数零模型 vs 三条推理臂的 Top-50 重合基因数**:`scorer-ppr` 0、`scorer-dwpc` 5、`scorer-adamic-adar` 0;最大重合率 0.10。

---

## 2. 怎么读这个结果

**这些数支持什么**
- 支持:在这份图谱、这个疾病节点上,**Top-50 候选名单对设定选择高度敏感**。Jaccard 中位数 0.111 与阈值 0.5 之间有 4 倍以上距离,不是贴着线的判断。
- 支持:**排序精度指标和名单构成是两件事**。度数零模型 AUROC 0.758 与推理臂 0.924–0.959 之间有差距,但真正的分野在名单——重合率 0–10%。只报 AUROC 说明不了名单是怎么来的。
- 支持:评测流水线本身不注入信号(随机置换臂 AUROC 0.494、AUPRC 0.0497)。
- 支持:**换一种负样本,度数零模型的优势就没了。** 在度匹配负样本下,零模型 AUPRC 0.0491 与随机置换臂的 0.0497 已经分不开——而它的 AUROC 还有 0.758。这不是新发现,是度匹配负采样的定义使然(负样本按度挑,度这个信号就被消掉了);列出来是因为它给上面三条推理臂的 AUPRC(0.602 / 0.641 / 0.756)提供了一把干净的尺子:**那三个数是在"度数已经不管用"的条件下拿到的。** 反过来说,**AUROC 0.758 这个数有多少来自度偏置,取决于你怎么选负样本**——这正是 PNAS 2025 那篇讲的度偏置污染,写稿时负样本方案必须交代。

**这些数不支持什么**
- **不支持"哪个基因和 OA 真有关"的任何判断。** 我们不做生物学解释,也没做通路富集,这一轮从设计上就排除了(见 SCOPE 第 4 节 out-of-scope)。
- **不支持"某条打分函数更好"的结论。** Kendall tau 中位数 0.503 说明连续排序层面有中等相关,但我们没有做任何显著性检验;3 个种子且三条推理臂的打分是确定性的(标准差为 0 只反映"没有随机成分",不是"结果稳定"的证据),**任何"显著"字样都不适用于本轮**。
- **不支持与已有 OA 专用 KG 工作的精度对比。** 底座图谱不同,我们没做这个比较。

**规模限制,放大后可能变的部分**
- 正样本只有 62 条,这是 Hetionet 里 OA 的全部疾病–基因边,决定了本方向的统计功率上限。62 折留一里 recall@k 的每一格只值 1/62 ≈ 0.0161,分辨率很粗。
- 网格是 36 套(4 × 3 × 3),不是把所有合理设定穷举到底;Top-K 截断与负采样方案是排序后处理,没有进入这 630 对比较的自变量。设定数放大后,Jaccard 分布的尾部可能更宽,但中位数 0.111 离阈值的距离大,方向不太可能翻转。

**与原计划的偏离(逐条,全部来自 `results.json.deviations`)**
1. **DWPC 只实现了 2 条代表性元路径**(`D-DlA-A-AeG-G` 和 `D-DlA-A-AeG-G-GiG-G`),未覆盖原计划的 DaG/GiG/GpBP 全部元路径组合,原因是 40 分钟预算不够枚举更多。这两条元路径均不使用 DaG 边,天然避免与留一评测的标签泄漏。
2. **edge_weight 在三种打分函数里的数学形式不同**:PPR/AA 的边权加权作用在全图同质邻接矩阵的度幂次归一化上,不是逐 metaedge 类型分别加权;DWPC 的 edge_weight 则在各自 metaedge 的二部图度上归一化。三者共用同一组 w 取值(0 / 0.4 / 1.0),但不是同一个矩阵——它是同一个"边权强度旋钮"在不同打分函数里的具体化。
3. **PPR 的度数归一化系数 D^-w 不逐 fold 重算**,用的是全图整体度。留一只体现在两处:转移矩阵里把该 OA–gene 边置零后重新行归一化;degree-null 分数里从全图度数减 1。这是预算内的简化,已在 `NOTES.md` 说明。
4. **Kendall tau 在 1500 个随机抽样基因上计算**(不是全部 20,945 个候选),抽样种子固定为 0,记录在 `results.json.sweep_robustness.kendall_subsample_n_genes`。
5. **AUPRC(`auprc_degmatched`)每折只采样 20 个负样本**做 pooled average precision,不是对全量负样本画 PR 曲线。

这五条都是为了在预算内跑完整轮而做的取舍;第 1、4、5 条会影响对应指标的精度,第 2、3 条影响的是"边权"这个自变量在不同臂之间的可比性——如果你要把这套写进稿子,第 2 条需要在方法部分如实交代。

---

## 3. 你现在可以拿它做什么

**最短路径(值得投的一步)**:把这一轮的 36 套设定网格扩成完整的设定曲线,并把**报告口径从"我们的 AUROC 是多少"换成"名单在什么范围内稳定、在哪里崩掉"**。理由是 SCOPE 第 2 节缺口 A 的判断:现有 OA 相关工作都只报一套超参下的最终名单,没人系统报过设定敏感性;而这一轮已经给出这条缺口确实存在的证据(Jaccard 中位数 0.111)。这类结果不出漂亮的 AUC 数字,但审稿人很难说"缺乏创新性"。

**同样值得报的一步**:把 P2 的负结果原样写进去。SCOPE 第 2 节缺口 B 的预期是"零模型可能解释掉大半结果";实测是零模型 AUROC 不低但名单几乎不重合,**这个反差比一个漂亮的正结果信息量更大**——它直接说明在 OA 这个具体疾病上,AUROC 这个指标对"名单选得对不对"没有区分力。

**先别投的一步**:把 GWAS 效应量当边权融进去(SCOPE 第 2 节缺口 C)。2026 年 npj Digital Medicine 那篇已经做了,跟着做是跟随;而且要拿 OA GWAS 汇总统计、做 MR/共定位,超出本轮范围。同理,在 62 条正样本上训 KG 嵌入模型(TransE/RotatE)也不建议——样本量撑不住,硬跑出来的数字会误导。

**审稿人最可能打的三处(SCOPE 第 3 节,这轮的堵法与遗留)**
1. **"62 个正样本,结论有统计意义吗?"** —— 这是最致命的一条,由数据本身决定。本轮用了 62 折留一而不是单次划分,但**没有做自助法置信区间**,这一块要补;区间宽到跨越基线就直说"当前样本量下区分不出"。
2. **"你怎么证明不是在预测'哪个基因被研究得多'?"** —— 本轮已经加了度数零模型对照臂并报了度匹配负样本下的 AUPRC。要注意这一轮的 AUPRC 每折只采样 20 个负样本(偏离 5),正式投稿前要跑全量。
3. **"你的名单跟已有工作重合吗?为什么不比 CausalPathKG?"** —— 底座不同(我们用 Hetionet,对方用 DRKG + GWAS 扩展的 OKG),直接比 AUC 不公平。可行口径是报**名单重合度**,并明确说明知道有这篇。审稿人接受"不同底座不硬比",不接受"装作不知道"。

---

## 4. 随附材料

| 文件 | 是什么 |
|---|---|
| `work/kg_experiment.py` | 主实验代码:建图、加权矩阵、5 条臂的打分、62 折留一评测、36 套设定网格 |
| `work/make_figs.py` | 作图脚本 |
| `work/run.sh` | **一条命令复现**:`bash run.sh`。自动 curl 下载 Hetionet 边表与节点表,跑 `--seeds 0 1 2`,写出 `results.json` 并作图 |
| `work/results.json` | 原始结果:每条臂的逐种子指标、稳健性网格读数、偏离说明、运行耗时 |
| `work/logs/run.log` | 完整运行日志(带时间戳,含每个种子完成时的 AUROC 与总耗时 152.4 秒) |
| `work/logs/per_fold_raw.jsonl` | 逐折逐配置的原始排名,186 条记录 |
| `work/logs/grid_top50.json` | 36 套设定各自的 Top-50 名单(Jaccard/Kendall 的原始输入) |
| `work/figs/summary.png` | 三联图:各臂 AUROC 对比 / 36 套设定的稳健性分布 / 度数零模型对照 |
| `work/data/` | Hetionet v1.0 边表(`edges.sif.gz`)与节点表(`nodes.tsv`),CC0,由 `run.sh` 自动下载 |
| `work/NOTES.md` | 实验过程记录:做了什么、关键数字出处、踩过的坑、偏离说明 |
| `SCOPE.md` | 方向判断与文献查新(本报告第 5 节是它的摘要) |

**环境**:纯 CPU,Python 3.12.3 + scipy/numpy 稀疏矩阵,**没有用到 torch**(`results.json.env.torch` 记为 `n/a`),`OMP_NUM_THREADS=2`。种子固定为 0/1/2 写在 `run.sh` 里。`bash run.sh` 可整轮重跑,全程约 152 秒(三次独立重跑 150.6/152.4/152.4 秒,指标逐位一致)。

**关于数据**:我们不要你的数据、不要你的代码、不碰你的稿子。证据全部用公开数据集(Hetionet v1.0,CC0 许可)自己造,下载链接写在 `run.sh` 里,任何人都能复查、也能反驳。

---

## 5. 方向判断与文献(摘自随附的 SCOPE.md)

1. **算力和命题匹配,CPU 就够。** 45k 节点、225 万边的公开图谱,单次 30 轮个性化 PageRank 0.15 秒(实测),不需要 GPU。
2. **这不是空白地带,是"方法多、可复现性少"。** OA 专用的 KG 嵌入工作在 2026 年已经发表并占了首发位,再投同类工作会被要求和它比。
3. **通用底座已标准化**:Hetionet 及其 DWPC 度归一化路径打分是这条线事实上的公开基线和数据源。
4. **当前公认的难点在评测不在模型**:PNAS 2025 指出生物网络链路预测基准被度偏置严重污染,只用节点度的朴素模型就能打赢复杂模型。
5. **数据量级要有心理准备**:Hetionet 里 OA 只有 62 条疾病–基因边,这是全部正样本,决定了统计功率上限。
6. **还开着的缺口 A(本轮做的)**:候选名单的设定敏感性没人系统报过——做成了是方法学/可重复性论文,不出漂亮 AUC 数字,所以没人愿意做。
7. **缺口 B(本轮当对照臂)**:度偏置零模型对照在 OA 上从没做过,工作量极小,结论有引用价值。
8. **缺口 C(不建议现在碰)**:把 GWAS 效应量真正当边权融进去——已经被做了,且超出本轮范围。
9. **本轮明确不做**:不给生物学解释、不判断哪个基因真与 OA 相关、不融合 GWAS、不训 KG 嵌入、不与不同底座硬比 AUC、只用 Hetionet 一个图谱。
10. **参考来源(全部保留,链接可点)**:
    - [Knowledge-graph embeddings for osteoarthritis candidate prediction — npj Digital Medicine (Wang Z, Lu Z, Li M, Zhao P, Zhang C)](https://www.nature.com/articles/s41746-025-02290-x) · [PubMed 41519968](https://pubmed.ncbi.nlm.nih.gov/41519968/)
    - [Bias-aware training and evaluation of link prediction algorithms in network biology — PNAS 2025 (Yılmaz S, Yorgancioglu K, Koyutürk M), doi:10.1073/pnas.2416646122](https://pmc.ncbi.nlm.nih.gov/articles/PMC12184500/)
    - [The Role of Graph Topology in the Performance of Biomedical Knowledge Graph Completion Models — arXiv:2409.04103 (Cattaneo A, Bonner S, Martynec T, et al.)](https://arxiv.org/abs/2409.04103)
    - [Knowledge Graph Embeddings in the Biomedical Domain: Are They Useful? A Look at Link Prediction, Rule Learning, and Downstream Polypharmacy Tasks — arXiv:2305.19979](https://arxiv.org/abs/2305.19979)
    - [Systematic integration of biomedical knowledge prioritizes drugs for repurposing — eLife 2017(Hetionet / DWPC 原始论文)](https://elifesciences.org/articles/26726)
    - [Hetionet v1.0 数据仓库(CC0,节点 47,031 / 边 2,250,197)](https://github.com/hetio/hetionet)
    - [PhenoLinker: Phenotype-Gene Link Prediction and Explanation using Heterogeneous GNNs — arXiv:2402.01809](https://arxiv.org/abs/2402.01809)

---

*本文档由 JouleBeat · DeepGraph 出具。实验代码、日志与原始结果随附,结论可被复查与反驳。*
