判定:尚不确定(混合结果:一条预注册预测成立、一条被推翻)
数据源与对照规模:Hetionet v1.0(CC0);3 条推理臂 + 纯度数零模型 + 随机置换基线,3 个种子,62 折留一,36 套设定两两比较 630 对,纯 CPU 152.4 秒
主要结论:P1(名单对设定敏感)成立:36 套设定两两 Top-50 的 Jaccard 中位数只有 0.111,四分位区间 0.0204–0.316。P2(度数零模型既达标又与推理臂名单趋同)被推翻:零模型 AUROC 0.758 确实不低,但它的 Top-50 与三条推理臂 canonical 配置的 Top-50 只重合 0 / 5 / 0 个基因,最大重合率 10%,两个子条件没有同时满足。
这些结果不支持:不支持任何「哪个基因和骨关节炎真有关」的判断——本轮不做生物学解释、不做通路富集。不支持「某条打分函数更好」:本轮没有做任何显著性检验,上面那些重合数与 Jaccard 都是计数与分布读数,拿不出 p 值。也不支持与其他底座上的 OA 专用工作比精度。
代码 / 原始结果 / 日志:主实验代码、一条命令复现的 run.sh、results.json、逐折原始排名、36 套设定各自的 Top-50 名单、带时间戳的运行日志全部随附。
提交方向: 用知识图谱预测骨关节炎的候选基因 交付时间: 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 秒,代码与日志随附
我们赛前写死了两条可被推翻的预测,跑完一条成立、一条被推翻,合并判定是 inconclusive(混合结果)。
这条路我们替你试了,"用度数零模型解释掉 OA 排序结果"这个说法不成立,原因是重合率只有 10%。 度数高的枢纽基因确实在留一排名里容易靠前(所以零模型 AUROC 看着不差),但它挑出来的具体基因和真正做图推理挑出来的几乎是两批人。含义是:AUROC 高低不能替你回答"名单选得对不对",这两件事在这份数据上是分开的。 下一步该拐的方向在第 3 节:把评价重心从"再刷高一点 AUROC"移到"名单在什么范围内稳定"。
作为参照,canonical 配置的个性化 PageRank 62 折留一 AUROC = 0.959,度数零模型 = 0.758,差距 0.200。

设计一句话:在 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。
这些数支持什么
这些数不支持什么
规模限制,放大后可能变的部分
与原计划的偏离(逐条,全部来自 results.json.deviations)
D-DlA-A-AeG-G 和 D-DlA-A-AeG-G-GiG-G),未覆盖原计划的 DaG/GiG/GpBP 全部元路径组合,原因是 40 分钟预算不够枚举更多。这两条元路径均不使用 DaG 边,天然避免与留一评测的标签泄漏。NOTES.md 说明。results.json.sweep_robustness.kendall_subsample_n_genes。auprc_degmatched)每折只采样 20 个负样本做 pooled average precision,不是对全量负样本画 PR 曲线。这五条都是为了在预算内跑完整轮而做的取舍;第 1、4、5 条会影响对应指标的精度,第 2、3 条影响的是"边权"这个自变量在不同臂之间的可比性——如果你要把这套写进稿子,第 2 条需要在方法部分如实交代。
最短路径(值得投的一步):把这一轮的 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 节,这轮的堵法与遗留)
| 文件 | 是什么 |
|---|---|
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 里,任何人都能复查、也能反驳。
本文档由 JouleBeat · DeepGraph 出具。实验代码、日志与原始结果随附,结论可被复查与反驳。