案例 · 用户提交方向,已匿名
核心问题:中药海马(Hippocampus spp.)小分子成分集在标准 TCM 网络药理学流水线下得到的 AD 核心靶点与通路富集,是否显著强于规模与靶点度数匹配的随机化合物集?即已发表的核心模块(APP/JUN/PPARγ)是海马特异信号还是数据库偏倚产物?
本轮判定:confirmed · The random compound sets reproduce the seahorse AD-module signal at least as often as predicted (hub recovery >=50%, seahorse overlap not significant vs the degree-matched null) -- the published core-target module is consistent with a database/pipeline artifact, not seahorse-specific.
数据:CTD CTD_chem_gene_ixns.tsv.gz (report date 2026-07-30, human rows filtered to OrganismID==9606, 11095 distinct human compounds); STRING v12.0 9606.protein.links + protein.info (combined_score>=700, 16201 genes with >=1 edge kept); Enrichr KEGG_2021_Human (320 terms) and DisGeNET (9829 terms) gene set libraries; seahorse compound list = 21 CTD ChemicalName entries (20 with >=1 human CTD target, excluded: ['Proline']).
真跑了:3 个噪声种子 · 纯 CPU 20 秒 · 代码/日志/原始结果全部随附

案例速览

判定:负结果

数据源与对照规模: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。

DeepGraph 免费层交付 · 空模型对照:海马 × AD 的"核心靶点"没通过特异性检验

提交方向: 中药海马防治阿尔茨海默病 交付时间: 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 文献检索,不是本轮实验结果。


0. 结论(先说结果)

我们的预注册预测被证实了,而这是个负结果:在这条标准流水线下,海马成分集给出的 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 的做法,先对全基因组背景度数做归一化再排;③ 真正的增量在肽组学和一组自己的湿实验数据上。

1. 我们替你跑了什么

一句话设计:把文献里那条标准流水线原样实现成 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 里全部打印)。

1.1 baseline 臂(确定性,3 个种子取值相同)

指标种子 0 / 1 / 2均值 ± 标准差
n_targets_seahorse(去重人类靶基因数)1270 / 1270 / 12701270 ± 0
n_ad_overlap(∩ KEGG hsa05010)71 / 71 / 7171 ± 0
neglog10p_ad_kegg6.49 / 6.49 / 6.496.49 ± 0
ad_kegg_fdr1.17e-06 / 1.17e-06 / 1.17e-061.17e-06 ± 0
n_kegg_terms_sig_fdr05(FDR<0.05 的 KEGG term 数)174 / 174 / 174174 ± 0

单看这一栏,它是一份"可以直接写进论文结果"的漂亮命中。下面两张表是它在随机对照下的样子。

1.2 两个空模型臂(各 1000 次抽样 × 3 个种子)

指标种子 0 / 1 / 2均值 ± 标准差
null-size-matched(弱空模型,只匹配化合物个数)emp_p_ad_overlap0.207 / 0.207 / 0.2110.208 ± 0.00188
emp_p_ad_kegg0.320 / 0.301 / 0.2920.304 ± 0.0117
hub_recovery_rate0.936 / 0.936 / 0.9590.944 ± 0.0108
null-degree-matched(主对照,个数+靶点度数都匹配)emp_p_ad_overlap0.462 / 0.485 / 0.4890.478 ± 0.0119
emp_p_ad_kegg0.395 / 0.400 / 0.4160.403 ± 0.00895
hub_recovery_rate0.970 / 0.976 / 0.9730.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 名单一半以上是重合的。

1.3 逐基因命中率(这一栏比总命中率更能说明问题)

基因null-degree-matched 种子 0/1/2均值 ± 标准差null-size-matched 均值
APP0.032 / 0.040 / 0.0210.0310 ± 0.007790.0897
JUN0 / 0 / 00 ± 00
PPARG0 / 0 / 00 ± 00
AKT10.961 / 0.965 / 0.9640.963 ± 0.001700.791
TNF0.933 / 0.943 / 0.9250.934 ± 0.007360.852
IL60.838 / 0.836 / 0.8370.837 ± 0.0008160.752
TP530 / 0 / 00 ± 00

1.4 疾病置换对照(确定性)

海马靶点集固定不动,只换疾病基因集(DisGeNET 的 AD + 2 型糖尿病 / 高血压 / 结直肠癌 / 哮喘 / 骨关节炎),同一套超几何检验按 −log10(p) 排名:

指标种子 0 / 1 / 2均值 ± 标准差
disease_rank_ad(1 = AD 最强)4 / 4 / 44 ± 0
n_diseases_tested6 / 6 / 66 ± 0
ad_neglog10p74.0 / 74.0 / 74.074.0 ± 0

AD 的富集强度绝对值很高(−log10 p ≈ 74.0),但在 6 个疾病里只排第 4 位——有非 AD 疾病排在它前面。逐个疾病的 overlap / p 值在随附的 work/results_raw/disease_swap_control.csv

主结果图
主结果图(本轮实验的关键对比)。原图见随附 figs/ 目录。

2. 怎么读这个结果

这些数支持什么:在 CTD + STRING + Enrichr 这套数据库、这条标准流水线下,海马小分子成分集的 AD 富集(重叠 71 个基因、FDR 1.17e-06)落在随机对照分布的中间位置(经验 p 分别是 0.478 和 0.403,离 0.05 很远),而 top-10 hub 里的高连接度基因在随机集里也几乎必然出现(0.973)。加上疾病置换里 AD 只排第 4,合起来支持一句话:这条流水线在这个成分清单上,对"是不是海马"和"是不是 AD"都没有分辨力

这些数不支持什么(重要,别外推):

规模限制,放大后可能变的部分:每个种子 1000 次抽样,能分辨的经验 p 分辨率就到千分位;但本轮的经验 p 在 0.4 附近,离 0.05 差一个数量级,再加抽样数不会翻盘。真正可能翻盘的是换掉方法本身——见第 3 节第 ② 条。

results.json.deviations 里的 4 条偏离,逐条交代:

  1. GO_BP_2025 富集没跑。6 个预注册指标没有一个需要它(只用到 KEGG hsa05010、hub 基因、重叠数、疾病排名),跳过它对任何一个报出来的数字都没有影响;baseline 臂的 KEGG_2021_Human 富集 + BH-FDR 是完整跑的。
  2. (STRING 阈值 × AD 基因集来源)的 3×3 扫描没有按满规模跑。满规模是 1000 次抽样 × 3 种子 × 9 种组合 = 27,000 次,本轮没有尝试;实际跑的是一个降规模、单种子的版本,结果单独放在 work/results_raw/sweep_results.csv(每行的 n_nullseed 两列记录了究竟跑了多少),没有折进 results.json 的主结果,本报告也不引用它的任何数字。要判断结论对阈值/基因集来源的稳健性,请直接看那份 CSV 和 figs/04_sweep_hub_recovery_heatmap.png
  3. 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"。
  4. 疾病置换对照的 6 个疾病全部取自 DisGeNET(包括 AD),没有混用 DisGeNET 和 KEGG。这样做是为了让 6 次检验的背景基因全集完全一致——混库比较会把"背景集大小"和"疾病身份"混在一起,排名就不可信了。代价是:这一臂的 AD 富集用的是 DisGeNET 的 AD 基因集(ad_neglog10p = 74.0),和 1.1 表里基于 KEGG hsa05010 的 neglog10p_ad_kegg = 6.49 不是同一个量,不能横向比

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

值得马上投入的一步:把这一节直接写进你的正文,而不是另写一篇方法学论文。 标题就叫"靶点特异性验证",内容是本轮的三张对照(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 肽组学数据的话,这部分我们能算。

4. 随附材料

全部在本目录下,可逐个打开核对:

文件是什么
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.pyresults.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.pngdegree-matched 空分布(3 种子合并)与海马观测重叠值的位置
work/figs/02_hub_recovery_rate.png两个空模型臂逐种子的 hub 命中率,并标出预注册的 0.50 证实线与 0.20 推翻线
work/figs/03_disease_swap_control.png6 个疾病的 −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 测出来的成分表重跑一遍,结论可能完全不同,那才是你论文里该用的数。

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

> 以下数字来自 SCOPE.md 的文献检索(2026-08-07 PubMed 实测),不是本轮实验结果。

参考来源(与 SCOPE.md 一致,未删改):


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

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

打包下载全部材料(.zip)
口径与边界。这些限制与负结果均保留在原始材料中。
本案例源自一位研究者通过公开表单提交的方向,已隐去其姓名、单位与一切可定位信息。结论与代码可复查、可反驳。
← 全部案例 · JouleBeat · DeepGraph