判定:负结果
数据源与对照规模:CTD 化合物-基因互作人类子集(1,327,615 行 / 11,095 个化合物)+ CTD 人工审编卒中基因(5 个 MeSH 并集 131 个基因)+ STRING v12.0,3 个实验臂 × 3 个种子 × 3 档 STRING 置信度(400/700/900),每个条件跑满 1000 次零分布置换,CPU 157 秒
主要结论:预注册预测被证实:标准 degree-hub 网络药理学流程给中药成分选出的核心靶点,在预测未参与建模的留出卒中基因上的 AUROC(0.629)与靶点数量匹配的随机化合物零分布(0.606)在三档 STRING 置信度下都没有拉开差距。
这些结果不支持:不支持「中药成分对缺血性卒中无效」——本轮检验的是这套选靶流程的判别力,不是药效。不支持任何临床或实验层面的机制结论,也不支持对具体靶点的功能解读。
代码 / 原始结果 / 日志:代码、原始 results.json、运行日志、图齐全;报告每个实验数值标注了对应的 results.json 字段路径。
提交方向: 中药活性成分在缺血性卒中治疗中的应用及作用机制研究 交付时间: 2026-08-07 这一轮真跑了: CTD 化合物-基因互作(人类子集 1,327,615 行 / 11,095 个化合物)+ CTD 人工审编基因-疾病(卒中 MeSH D002545/D020521/D000083242/D020244/D002546,并集 131 个基因)+ STRING v12.0 人类物理互作网络;3 个臂 × 3 个随机种子(0/1/2)× 3 档 STRING 置信度(400/700/900),每个条件跑满 1000 次零分布置换;CPU 总耗时 157 秒。代码、日志、图、原始结果随附。
> 数字口径:本报告出现的每个实验数值都取自随附的 work/results.json,四舍五入到 3 位有效数字,表下标注了对应字段路径。第 5 节的文献检索数字来自 SCOPE.md,已单独标注,不是本轮实验结果。
我们的预测是否定性的:常规 degree-hub 网络药理学流程选出的"核心靶点",在预测未参与建模的卒中基因上,不会比"靶点数量匹配的随机化合物"更强。跑完的结果是预测被证实(prediction_outcome: confirmed,同时 negative_result: true)——也就是说,这条路我们替你试了,标准流程这一环没通过对照。
主阈值(STRING ≥700)下:中药成分臂 hold-out AUROC 均值 0.629,靶点数量匹配的随机化合物零分布均值 0.606,3 个种子的经验 p 值分别是 0.173 / 0.619 / 0.183;换到 400 和 900 档,9 个"阈值×种子"组合里没有一个达到 p<0.05(全部 p 在 0.10~0.62 之间)。真实成分与随机化合物选出的 top-20 靶点大量重叠(Jaccard 中位数 0.667 / 1.000 / 0.429)。我们额外试的零分布 z-score 背景校正没有救回来,3 个种子上 AUROC 反而都略低(0.590 vs 0.629)。
下一步该往哪拐:不要把这当成"中药无效"(本轮完全测不到药效),而是把它当成你论文里方法学部分的一块补丁——先承认 degree 排名过不了随机对照,再用别的证据(湿实验、分期表达、剂量-反应)承载机制主张。具体路径见第 3 节。
一句话设计:把 131 个 CTD 人工审编的卒中基因随机分半,一半(D_seed)参与流程、一半(D_hold)藏起来当考题;20 味中药活性成分的人类靶点并集与 D_seed 取交集作为种子节点,在 STRING 物理互作网络里取种子节点 + 一阶邻居构成子网络,按子网络内节点度数(hub score)给全部候选基因排序,再看这个排序能不能把藏起来的那一半卒中基因排到前面。
baseline 是什么:baseline-degree-hub 就是文献里最标准的那条流程本身(成分→靶点→与疾病靶点取交集→建 PPI→按 degree 取 top hub)。我们不是发明一个新方法去跟弱基线比,我们是把现行标准做法放到对照下检验。
为什么这个对照是公平的:三个臂共用同一份 D_seed/D_hold 分半、同一张 PPI 网络、同一套阈值、同一个候选基因池,唯一差别是输入的化合物集合。随机化合物按靶点数量分层匹配抽取(真实成分靶点数 ≥50 的,从 CTD ≥50 靶点池 n=1036 里抽;其余从 ≥20 靶点池 n=1972 里抽),因此排除了"随机组因为靶点太少所以吃亏"这种平凡解释。20 味成分的靶点并集共 9,129 个人类基因。
| 臂 | seed 0 | seed 1 | seed 2 | 均值 ± 标准差 |
|---|---|---|---|---|
baseline-degree-hub(中药成分,标准流程) | 0.554 | 0.674 | 0.659 | 0.629 ± 0.0532 |
null-random-compounds(靶点数匹配的随机化合物,1000 次零分布的均值) | 0.519 | 0.683 | 0.614 | 0.606 ± 0.0674 |
proposed-null-corrected(用零分布做 z-score 背景校正后重排序) | 0.538 | 0.619 | 0.613 | 0.590 ± 0.0369 |
经验 p 值(baseline 相对零分布,(r+1)/(n+1)) | 0.173 | 0.619 | 0.183 | — |
| 候选基因数 | 913 | 870 | 852 | — |
> 字段路径:arms[*].metrics.holdout_auroc.{per_seed,mean,std};p 值与候选基因数见 threshold_sensitivity["700"].{empirical_p_per_seed,n_candidate_genes_per_seed}。 > headline 里的 delta = 0.0234 就是第 1 行减第 2 行(0.629 − 0.606)。注意 headline.proposed_mean 这个字段名存的其实是零分布臂的均值(见 work/summarize.py 中 null_mean 的赋值),不是 proposed-null-corrected 臂的 0.590,读 JSON 时别对错。
| 臂 | 指标 | seed 0 | seed 1 | seed 2 | 均值 ± 标准差 |
|---|---|---|---|---|---|
| baseline | P@10 | 0 | 0 | 0.100 | 0.0333 ± 0.0471 |
| null | P@10 | 0 | 0 | 0.0649 | 0.0216 ± 0.0306 |
| proposed | P@10 | 0 | 0.100 | 0 | 0.0333 ± 0.0471 |
| baseline | P@20 | 0 | 0 | 0.100 | 0.0333 ± 0.0471 |
| null | P@20 | 0 | 0 | 0.0578 | 0.0193 ± 0.0272 |
| proposed | P@20 | 0 | 0.0500 | 0 | 0.0167 ± 0.0236 |
| baseline | P@50 | 0 | 0.0200 | 0.0800 | 0.0333 ± 0.0340 |
| null | P@50 | 0.00018 | 0.0245 | 0.0424 | 0.0223 ± 0.0173 |
| proposed | P@50 | 0 | 0.0400 | 0.0600 | 0.0333 ± 0.0249 |
> 字段路径:arms[*].metrics.precision_at_{10,20,50}。这些数在 0 和 0.1 之间跳,是因为 K 很小、正例只有几十个——不要用它下任何结论,我们放在这里是为了完整披露。
| 臂 | seed 0 | seed 1 | seed 2 | 均值 ± 标准差 |
|---|---|---|---|---|
| baseline top-K vs 1000 次随机 top-K(Jaccard 中位数,越低越特异) | 0.667 | 1.000 | 0.429 | 0.698 ± 0.234 |
| proposed(z 校正)top-K vs 随机 top-K | 0 | 0 | 0 | 0 ± 0 |
> 字段路径:arms[*].metrics.topk_jaccard_vs_null;报告口径为 K=20(见 work/summarize.py 中取 jaccard_*_vs_null_median["20"])。seed 1 出现 1.000,意思是那一次真实成分选出的 top-20 与随机化合物选出的 top-20 完全一致。
| 阈值 | baseline AUROC(3 种子) | 零分布均值 AUROC(3 种子) | 经验 p(3 种子) | 候选基因数(3 种子) |
|---|---|---|---|---|
| ≥400 | 0.695 / 0.720 / 0.699 | 0.681 / 0.715 / 0.677 | 0.103 / 0.412 / 0.232 | 1944 / 1644 / 1513 |
| ≥700(主) | 0.554 / 0.674 / 0.659 | 0.519 / 0.683 / 0.614 | 0.173 / 0.619 / 0.183 | 913 / 870 / 852 |
| ≥900 | 0.659 / 0.628 / 0.605 | 0.635 / 0.603 / 0.590 | 0.145 / 0.434 / 0.280 | 443 / 424 / 449 |
> 字段路径:threshold_sensitivity.{400,700,900}。三档下 baseline 均高于或接近零分布均值,但没有一档、没有一个种子跨过 p<0.05。

figs/ 目录。在这套数据、这条流程、这个评价口径下,degree-hub 排名相对于靶点数量匹配的随机化合物,检测不到成分特异性。 results.json 的原话是"统计不可区分"——排出来的"核心靶点"主要由 PPI 网络的度分布(研究热度 / 连接偏差)驱动。top-20 名单的高重叠(均值 0.698,其中一个种子 1.000)是这句话最直观的证据:换成一组跟中药毫无关系的随机化合物,你会选出很大程度上相同的那批 hub。
deviations 里的四条偏离,逐条交代runtime_sec 总计 157 秒,各档分别约 90.7 / 33.0 / 20.3 秒)。这条偏离的方向是比原计划更充分。值得投的一步:把这份对照作为主论文的方法学补充分析。 你写 MCAO / OGD-R / WB 的主线不变,在方法或讨论里加一段:我们用靶点数量匹配的随机化合物集跑了同一条流程 1000 次,报告经验 p 值与 top-K 重叠率,说明 degree 排名本身不足以支撑"核心靶点"的说法,因此我们最终的 3-5 个靶点是基于 X(湿实验证据 / 已有药代文献 / 分期表达)而非仅凭 degree 选定的。这把 SCOPE.md 第 3 节第①条(三四区最常见的实质性质疑:"TNF、IL6、AKT1 出现在几乎每一篇中药网络药理学论文里,请说明它们是你研究对象的特异靶点")从一个可能的拒稿理由,变成你已经主动处理过的一节。本轮代码可以直接换成你自己的成分列表重跑。
先别投的两步:
SCOPE.md 第 0 节的判断在实验做完后依然成立——单独发的难度反而更高,审稿人会问"那你的改进方法在真实药物上验证了吗",而我们这轮恰恰得到的是"改进方法(z 校正)也没提高预测"。SCOPE.md 第 1 节),novelty 已经很难靠机制新颖性取胜,扎实度是唯一的差异点。审稿人最可能打的三个点(前两条来自 SCOPE.md 第 3 节,第三条是本轮实验新增的):
如果你做分子对接,同一个逻辑照搬:同时对 20-50 个无关蛋白做同样的对接,给出分数的背景分布,再说"我们的靶点位于背景分布的前 5%"。这一句能把对接从装饰变成证据。纯 CPU 可做,本轮因受体结构准备不稳定没有纳入。
| 文件 | 是什么 |
|---|---|
work/run.sh | 一条命令复现全部结果:bash run.sh。自动下载 4 个公开数据文件(已存在则跳过)→ 跑实验 → 生成 results.json → 出图。 |
work/run_experiment.py | 主实验代码:加载 CTD / STRING、构建子网络、三个臂、1000 次零分布、经验 p 值。随机数由 numpy.random.default_rng 按 (threshold, seed[, rep]) 确定性播种。 |
work/summarize.py | 把原始输出汇总成 results.json,内含断言:每个 mean 都从 per_seed 重算并校验一致(<1e-9)。 |
work/make_figures.py | 出图脚本。 |
work/results.json | 结构化最终结果,本报告所有实验数字的唯一来源。 |
work/raw_results.json | 每个"阈值×种子"组合的原始逐项输出(含本报告未展开的中间量)。 |
work/logs/run.log | 完整运行日志,带时间戳,每个种子的 AUROC / p 值 / 候选基因数都在里面,可与 results.json 逐行对照。 |
work/figs/auroc_vs_null.png | 图 A:主阈值下三个种子的 baseline / z 校正点位叠在 1000 次零分布的小提琴图上;图 B:三档阈值下经验 p 值与 p=0.05 线的关系(三条线全部远在红线之上)。 |
work/figs/topk_jaccard.png | K=10/20/50 下,真实成分 top-K 与随机化合物 top-K 的 Jaccard 中位数柱状图。 |
work/data/ | 本轮实际使用的数据文件(CTD 两份 + STRING 两份)。 |
SCOPE.md | 本轮之前做的方向判断与文献查新(第 5 节是它的摘要)。 |
环境:Python 3.12.3、torch 2.13.0+cpu(results.json.env),纯 CPU,无 GPU,OMP_NUM_THREADS=2。种子固定为 0/1/2,重跑数字应完全一致(我们端到端重跑过一次,两次结果相同)。
关于数据:我们不要你的数据、不要你的代码、不要你的稿子。 本轮全部证据用公开数据集自己造——CTD 与 STRING v12.0,免注册、直链可下载,run.sh 里写死了 URL。任何人(包括审稿人)都能拿这套代码复查我们的每一个数,也能推翻它。
SCOPE.md)> 本节数字来自 SCOPE.md 的 2026-08-07 PubMed 实时检索,不是本轮实验结果;实验数字全部在第 1 节。
network pharmacology + (stroke OR cerebral ischemia) 全库 500 篇,其中 237 篇在 2025-2026——这条细分线上近两年平均每三天出一篇同类文章。本文档由 JouleBeat · DeepGraph 出具。实验代码、日志与原始结果随附,结论可被复查与反驳。