案例 · 用户提交方向,已匿名
核心问题:在公开生物医学知识图谱上做骨关节炎候选基因排序时,候选名单对边权方案、打分函数、重启率这些设定有多敏感;以及一个完全不使用疾病特异信息的纯节点度零模型能达到什么水平。
本轮判定:inconclusive(预注册两条预测:P1 成立、P2 被推翻)
数据:Hetionet v1.0(CC0),47031 节点 / 2107709 条无向同质化边;OA = Disease::DOID:8398,62 条疾病–基因边做 62 折留一,候选池 20945 个基因
真跑了:5 条臂(3 条推理 + 2 条基线)· 3 个种子(0/1/2)· 36 套设定全网格 630 对比较 · 纯 CPU 152.4 秒 · 代码/日志/原始结果全部随附

案例速览

判定:尚不确定(混合结果:一条预注册预测成立、一条被推翻)

数据源与对照规模: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 名单、带时间戳的运行日志全部随附。

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(混合结果)。

这条路我们替你试了,"用度数零模型解释掉 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 是什么、为什么公平:

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

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

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

AUPRC(度匹配负样本)MRRrecall@20recall@50recall@100recall@200
scorer-ppr0.6020.02740.2100.5000.5650.694
scorer-dwpc0.6410.05580.3390.5000.5320.694
scorer-adamic-adar0.7560.03250.1770.4520.5970.742
baseline-degree-null0.04910.003100.01610.04840.08060.113
baseline-random-permutation0.0497(seed 0/1/2 = 0.0514 / 0.0479 / 0.0497)0.0002770.0000.0000.0000.00538(seed 0/1/2 = 0 / 0 / 0.0161)

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

读数中位数P25P75
Top-50 Jaccard0.1110.02040.316
Kendall tau(1500 个随机抽样基因上计算)0.5030.3890.675

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


2. 怎么读这个结果

这些数支持什么

这些数不支持什么

规模限制,放大后可能变的部分

与原计划的偏离(逐条,全部来自 results.json.deviations)

  1. DWPC 只实现了 2 条代表性元路径(D-DlA-A-AeG-GD-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.json36 套设定各自的 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) · PubMed 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 - 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.) - Knowledge Graph Embeddings in the Biomedical Domain: Are They Useful? A Look at Link Prediction, Rule Learning, and Downstream Polypharmacy Tasks — arXiv:2305.19979 - Systematic integration of biomedical knowledge prioritizes drugs for repurposing — eLife 2017(Hetionet / DWPC 原始论文) - Hetionet v1.0 数据仓库(CC0,节点 47,031 / 边 2,250,197) - PhenoLinker: Phenotype-Gene Link Prediction and Explanation using Heterogeneous GNNs — arXiv:2402.01809

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

随附材料(点开即看,不用下载)

打包下载全部材料(.zip)
包里不含体积大的原始下载数据(取数脚本会自动重新下载)。
本案例源自一位研究者通过公开表单提交的方向,已隐去其姓名、单位与一切可定位信息。结论与代码可复查、可反驳。
← 全部案例 · JouleBeat · DeepGraph