判定:负结果
数据源与对照规模:CTD 人类子集(11095 个人类化合物)+ STRING v12.0(combined_score ≥ 700,16201 个有边基因)+ Enrichr(KEGG_2021_Human 320 term、DisGeNET 9829 term),4 个实验臂(标准流程 + 规模匹配零模型 + 度匹配零模型 + 疾病置换对照)× 3 个种子,两个零模型臂各 1000 次抽样 × 3 个种子,19.5 秒
主要结论:预注册预测被证实,而这恰恰是坏消息:两种随机对照(仅规模匹配 0.944、规模+度数匹配 0.973)复现「核心靶点」的频率都极高,说明这套流程选出的 hub 在随机化合物集上几乎必然出现;海马自己相对度数匹配零分布的经验 p 值是 0.478(AD 基因重叠)和 0.403(KEGG 富集),落在随机分布中间。也就是说,标准网络药理学流程选出的这批核心靶点,没有通过针对该药材的特异性检验。
这些结果不支持:不支持「海马对阿尔茨海默病无效」——本轮检验的是这套计算流程的特异性,不是药材的药理作用。不支持任何临床、动物或体外实验层面的结论,也不支持对具体靶点的功能解读。
代码 / 原始结果 / 日志:代码、原始 results.json、运行日志、图与原始 CSV 齐全;报告正文每个数值可逐个回查 results.json。
提交方向: 中药海马防治阿尔茨海默病 交付时间: 2026-08-07 这一轮真跑了: CTD(报表日期 2026-07-30,人类行 OrganismID==9606,11095 个人类化合物)+ STRING v12.0(combined_score>=700,16201 个有边基因)+ Enrichr(KEGG_2021_Human 320 个 term、DisGeNET 9829 个 term);4 个臂(baseline-standard-pipeline / null-size-matched / null-degree-matched / disease-swap-control),3 个种子(0、1、2),两个空模型臂各 1000 次抽样 × 3 个种子;results.json 记录的总耗时 19.5 秒。代码、日志、图、原始 CSV 随附。
> 全文除第 5 节外,每一个数值都直接来自随附的 work/results.json(最多四舍五入到 3 位有效数字),你可以逐个回查。第 5 节的数字来自随附的 SCOPE.md 文献检索,不是本轮实验结果。
我们的预注册预测被证实了,而这是个负结果:在这条标准流水线下,海马成分集给出的 AD 靶点/通路结果,与规模和靶点度数都匹配的随机化合物集给出的结果分不开。
预测原文(results.json.falsifiable_prediction):随机集的 top-10 hub 命中率 ≥ 50%、且海马的 emp_p_ad_overlap > 0.05,即判为"证实"(说明是流水线假象);若命中率 < 20% 且两个经验 p 都 < 0.05,则判为"推翻"(说明流水线有判别力)。跑出来:degree-matched 空模型的 hub 命中率 = 0.973,海马 AD 基因重叠的经验 p = 0.478、KEGG hsa05010 富集的经验 p = 0.403,推翻条件在任何一个种子上都没出现,prediction_outcome = confirmed。疾病置换对照更直接:同一份海马靶点集,AD 在 6 个疾病里按富集强度排第 4。
结论的准确措辞(不能比数据更强):已发表的那类"核心靶点模块"结论,与"数据库/流水线通用假象"这一解释是一致的,我们没有找到它是海马特异的证据。这不等于说海马对 AD 无效——本轮没有任何细胞、动物或结合数据,也没覆盖海马的肽类成分。
下一步该往哪拐(细节在第 3 节):① 别把这套 hub 当"发现"写,把它降级成"候选 + 特异性检验"写进正文;② 换掉靠原始子网度数排 hub 的做法,先对全基因组背景度数做归一化再排;③ 真正的增量在肽组学和一组自己的湿实验数据上。
一句话设计:把文献里那条标准流水线原样实现成 baseline 臂,再给它加上它自己缺的东西——同规模、同靶点度数分布的随机化合物集,跑完全相同的流水线 1000 次,看海马的结果在这个随机分布里排在哪。
baseline 是什么(arms[0].what):海马成分清单 → CTD 人类靶点取并集去重 → 与 KEGG "Alzheimer disease"(hsa05010)取交集 → 在交集上建 STRING(score>=700)子网 → 按子网内度数排序取 top-10 hub → 用完整靶点集对 KEGG_2021_Human 全部 term 做超几何检验 + BH-FDR。为什么公平:这就是审稿人默认的做法,我们没有把它做弱、没有换掉任何一环;两个空模型臂跑的是同一段代码路径、同一份数据快照,唯一的差别是把海马成分清单换成随机化合物。度数匹配这一步是关键:只匹配化合物个数会高估显著性,因为 CTD 里不同化合物挂的基因数差几百倍。
成分清单是输入参数不是我们的发现:CTD ChemicalName 精确匹配到 21 条,其中 20 条有至少 1 个人类 CTD 靶点,Proline 因为无人类记录被剔除(逐条命中数在 work/logs/run.log 里全部打印)。
| 指标 | 种子 0 / 1 / 2 | 均值 ± 标准差 |
|---|---|---|
n_targets_seahorse(去重人类靶基因数) | 1270 / 1270 / 1270 | 1270 ± 0 |
n_ad_overlap(∩ KEGG hsa05010) | 71 / 71 / 71 | 71 ± 0 |
neglog10p_ad_kegg | 6.49 / 6.49 / 6.49 | 6.49 ± 0 |
ad_kegg_fdr | 1.17e-06 / 1.17e-06 / 1.17e-06 | 1.17e-06 ± 0 |
n_kegg_terms_sig_fdr05(FDR<0.05 的 KEGG term 数) | 174 / 174 / 174 | 174 ± 0 |
单看这一栏,它是一份"可以直接写进论文结果"的漂亮命中。下面两张表是它在随机对照下的样子。
| 臂 | 指标 | 种子 0 / 1 / 2 | 均值 ± 标准差 |
|---|---|---|---|
| null-size-matched(弱空模型,只匹配化合物个数) | emp_p_ad_overlap | 0.207 / 0.207 / 0.211 | 0.208 ± 0.00188 |
emp_p_ad_kegg | 0.320 / 0.301 / 0.292 | 0.304 ± 0.0117 | |
hub_recovery_rate | 0.936 / 0.936 / 0.959 | 0.944 ± 0.0108 | |
| null-degree-matched(主对照,个数+靶点度数都匹配) | emp_p_ad_overlap | 0.462 / 0.485 / 0.489 | 0.478 ± 0.0119 |
emp_p_ad_kegg | 0.395 / 0.400 / 0.416 | 0.403 ± 0.00895 | |
hub_recovery_rate | 0.970 / 0.976 / 0.973 | 0.973 ± 0.00245 |
headline 记录的对比是这两个空模型臂的 hub_recovery_rate:0.944 → 0.973,差值 0.0293(为什么是这两个臂对比,见第 2 节偏离说明)。
流水线判别力上限(degree-matched 臂,hub_jaccard_null):任取两个互不相关的随机集,它们 top-10 hub 列表的 Jaccard 中位数 0.667(Q1 = 0.429,Q3 = 0.667,3 个种子完全一致)。也就是说,两份毫无关系的随机成分表,top-10 hub 名单一半以上是重合的。
| 基因 | null-degree-matched 种子 0/1/2 | 均值 ± 标准差 | null-size-matched 均值 |
|---|---|---|---|
| APP | 0.032 / 0.040 / 0.021 | 0.0310 ± 0.00779 | 0.0897 |
| JUN | 0 / 0 / 0 | 0 ± 0 | 0 |
| PPARG | 0 / 0 / 0 | 0 ± 0 | 0 |
| AKT1 | 0.961 / 0.965 / 0.964 | 0.963 ± 0.00170 | 0.791 |
| TNF | 0.933 / 0.943 / 0.925 | 0.934 ± 0.00736 | 0.852 |
| IL6 | 0.838 / 0.836 / 0.837 | 0.837 ± 0.000816 | 0.752 |
| TP53 | 0 / 0 / 0 | 0 ± 0 | 0 |
海马靶点集固定不动,只换疾病基因集(DisGeNET 的 AD + 2 型糖尿病 / 高血压 / 结直肠癌 / 哮喘 / 骨关节炎),同一套超几何检验按 −log10(p) 排名:
| 指标 | 种子 0 / 1 / 2 | 均值 ± 标准差 |
|---|---|---|
disease_rank_ad(1 = AD 最强) | 4 / 4 / 4 | 4 ± 0 |
n_diseases_tested | 6 / 6 / 6 | 6 ± 0 |
ad_neglog10p | 74.0 / 74.0 / 74.0 | 74.0 ± 0 |
AD 的富集强度绝对值很高(−log10 p ≈ 74.0),但在 6 个疾病里只排第 4 位——有非 AD 疾病排在它前面。逐个疾病的 overlap / p 值在随附的 work/results_raw/disease_swap_control.csv。

figs/ 目录。这些数支持什么:在 CTD + STRING + Enrichr 这套数据库、这条标准流水线下,海马小分子成分集的 AD 富集(重叠 71 个基因、FDR 1.17e-06)落在随机对照分布的中间位置(经验 p 分别是 0.478 和 0.403,离 0.05 很远),而 top-10 hub 里的高连接度基因在随机集里也几乎必然出现(0.973)。加上疾病置换里 AD 只排第 4,合起来支持一句话:这条流水线在这个成分清单上,对"是不是海马"和"是不是 AD"都没有分辨力。
这些数不支持什么(重要,别外推):
out_of_scope 里写死了不下这个结论。work/results_raw/baseline_hub.json)——不同的成分清单来源会给出不同的 hub,这本身也提示"核心模块"对输入清单不稳健。规模限制,放大后可能变的部分:每个种子 1000 次抽样,能分辨的经验 p 分辨率就到千分位;但本轮的经验 p 在 0.4 附近,离 0.05 差一个数量级,再加抽样数不会翻盘。真正可能翻盘的是换掉方法本身——见第 3 节第 ② 条。
results.json.deviations 里的 4 条偏离,逐条交代:
work/results_raw/sweep_results.csv(每行的 n_null 和 seed 两列记录了究竟跑了多少),没有折进 results.json 的主结果,本报告也不引用它的任何数字。要判断结论对阈值/基因集来源的稳健性,请直接看那份 CSV 和 figs/04_sweep_hub_recovery_heatmap.png。headline 里的 baseline_mean / proposed_mean 不是"baseline 臂 vs 实验臂",而是 null-size-matched(0.944)与 null-degree-matched(0.973)的 hub_recovery_rate 对比——因为真正的证伪轴在这里;baseline-standard-pipeline 是确定性的,实验计划里没给它定义 hub_recovery_rate。读 headline 时别把它误读成"我们的方法比 baseline 好 0.0293"。ad_neglog10p = 74.0),和 1.1 表里基于 KEGG hsa05010 的 neglog10p_ad_kegg = 6.49 不是同一个量,不能横向比。值得马上投入的一步:把这一节直接写进你的正文,而不是另写一篇方法学论文。 标题就叫"靶点特异性验证",内容是本轮的三张对照(size-matched 空模型、degree-matched 空模型、疾病置换),结论照实写:核心靶点未通过特异性检验,因此后续实验验证的候选靶点不按子网度数排名选,而按另一套标准选。中文核心 / SCI 三四区这个档位,审稿人看到有人主动做了这一步,基本不会再拿"数据库偏倚"来毙你——这正是 SCOPE.md 第 2 节判断为"可行性最高的缺口"的那件事,现在它跑完了。
先别急着投的一步:再多跑几个 STRING 阈值、再换几个成分-靶点数据库,指望结论翻盘。 本轮的经验 p 在 0.4 附近,不是"差一点点显著"。方法不换,加算力换不来判别力。
如果要救"hub 排序"这条线,只有一个技术改法值得试(本轮没跑,预算用完,记在 work/NOTES.md):不要用子网内的原始度数排 hub,先把每个基因的 STRING 度数对全基因组背景度数做归一化(例如相对同规模随机基因集的 z-score)再排。诊断是明确的——AKT1/TNF/IL6 在随机集里的命中率高达 0.963/0.934/0.837,说明它们是被度数结构顶上来的;扣掉背景度数之后,可能会露出真正被成分表决定的那部分信号。这是一个可以在 CPU 上当天跑完的改动。
审稿人最可能打你的三个点(压缩自 SCOPE.md 第 3 节):
中长期真正的增量在肽组学(SCOPE.md 缺口 B):海马的活性主体是蛋白和肽,所有主流成分-靶点数据库都只收小分子——本轮的结论范围因此天然只覆盖"最不重要的那一小部分成分"。这不是我们跑不动,是库里没有。你有 UPLC-MS/MS 肽组学数据的话,这部分我们能算。
全部在本目录下,可逐个打开核对:
| 文件 | 是什么 |
|---|---|
work/run.sh | 一条命令复现:bash run.sh。下载或复用缓存 → awk 预过滤 STRING → 主实验 → 补充扫描 → 出图 → 写日志 |
work/run_experiment.py | 主流水线:baseline 臂 + 两个空模型臂 + 疾病置换臂,argparse CLI,成分清单可用 -- 参数换成你自己的 CSV |
work/sweep.py | 补充的 STRING 阈值 × AD 基因集来源扫描(降规模、单种子,见第 2 节偏离 2) |
work/make_figures.py | 从 results.json + results_raw/*.csv 出 4 张图 |
work/results.json | 本报告所有数字的唯一来源:4 个臂 × 各指标 × 每种子原始值 + 均值/标准差、预测原文与判定、数据快照版本、偏离清单 |
work/logs/run.log | 完整运行日志:每个化合物的 CTD 命中数、被剔除的 Proline、71 个 AD 重叠基因的完整名单、baseline top-10 hub、每个种子每个臂的逐行结果 |
work/results_raw/ | 原始 CSV/JSON:每种子 1000 次空抽样明细(null_*_seed*.csv)、baseline KEGG 富集全表、疾病置换表、baseline hub 列表、Jaccard 原始值、扫描结果 |
work/figs/01_null_overlap_distribution.png | degree-matched 空分布(3 种子合并)与海马观测重叠值的位置 |
work/figs/02_hub_recovery_rate.png | 两个空模型臂逐种子的 hub 命中率,并标出预注册的 0.50 证实线与 0.20 推翻线 |
work/figs/03_disease_swap_control.png | 6 个疾病的 −log10(p) 排序,AD 标红 |
work/figs/04_sweep_hub_recovery_heatmap.png | 补充扫描的热图(降规模、单种子,数字以 CSV 为准) |
SCOPE.md | 本轮之前的方向判断与文献查新全文(第 5 节是它的压缩版) |
环境:results.json.env 记录 Python 3.12.3,torch 字段是 "not used in this task"——这个任务是集合运算 + 超几何检验,纯 CPU、不需要 GPU、不需要深度学习框架,额外依赖为空。随机种子固定为 0、1、2,bash run.sh 可重跑;数据快照写死在 results.json 里(CTD 报表 2026-07-30、STRING v12.0、Enrichr KEGG_2021_Human 与 DisGeNET)。
我们不要你的数据、代码或稿子。 本轮所有证据都用公开数据库自己造:CTD、STRING、Enrichr 三个源都是程序化直接下载、无需登录,run.sh 里的 URL 就是原始地址。任何人拿这份代码都能在自己的机器上复查、也能反驳我们。你唯一需要提供的东西是你自己的成分清单——把本轮那 21 条换成你实验室 UPLC-MS/MS 测出来的成分表重跑一遍,结论可能完全不同,那才是你论文里该用的数。
> 以下数字来自 SCOPE.md 的文献检索(2026-08-07 PubMed 实测),不是本轮实验结果。
"network pharmacology"[tiab] 共 17,794 篇,与 AD 交叉 614 篇、其中 282 篇挤在 2025–2026 两年。参考来源(与 SCOPE.md 一致,未删改):
本文档由 JouleBeat · DeepGraph 出具。实验代码、日志与原始结果随附,结论可被复查与反驳。