案例 · 用户提交方向,已匿名
核心问题:AML 两个独立公开队列里,按耐药/敏感分组筛出的候选靶点,有多少方向是一致的?这个一致性是否显著高于随机?
本轮判定:预注册的两条推翻条件都没触发(复制数 25 > 零模型 95 分位,且 ≥ 5 个)
数据:TCGA-LAML(UCSC Xena HiSeqV2)与 BeatAML(cBioPortal, OHSU 2018)的患者层表达谱,均为匿名可直接访问的公开资源
真跑了:发现层 20530 个基因 → 复制层 top200 → 1000 次标签置换零模型 · 纯 CPU · 代码/日志/原始结果全部随附

案例速览

判定:正结果(预注册的两条推翻条件都没触发)

数据源与对照规模:TCGA-LAML 发现层(耐药代理 35 例 / 敏感代理 43 例)+ BeatAML 复制层(难治 178 例 / 完全缓解 302 例)+ 两队列各自 1000 次标签置换零模型,纯 CPU

主要结论:200 个候选里 25 个在独立队列复制成功;1000 次置换里 95.5% 给出 0 个、一次都没到过 25,经验 p < 0.001;把复制阈值从 FDR<0.10 收紧到 <0.05 仍剩 22 个(同一轮置换检验,经验 p < 0.001)。关键在于两个队列的耐药定义完全不同——一个是生存分位数代理,一个是真实的诱导治疗反应——方向仍然一致。

这些结果不支持:不支持任何单个候选基因的功能解读;发现层本身很弱(最小 FDR 0.044),真正起筛子作用的是复制这一步。也不是任何特定药物的专属耐药——公开队列拿不到那些药的反应标签,本轮用的是诱导治疗反应与生存代理,两者相关但不等同。复制率的分母是 150(在 BeatAML 有表达数据的候选数),不是 200。

代码 / 原始结果 / 日志:取数脚本、全流程实验代码、五项敌意复核脚本、绘图脚本、results.json 与运行日志全部随附;交付前的复核抓到过一个真 bug(临床标签用 patientId、表达矩阵用 sampleId,两边对不上会伪造出「复制 0 个」的假结论),修好后才有本页的数字。

DeepGraph 免费验证案例 · AML 跨队列一致性初检

提交方向:AML 耐药相关候选靶点(提交人从我们给出的两个选项里选定「跨队列一致性初检」) 交付时间:2026-08-26 这一轮真跑了:TCGA-LAML 全基因组发现(20530 基因)→ BeatAML 真实临床标签复制, 外加 1000 次标签置换零模型。纯 CPU。


0. 结论(先说结果)

在 TCGA-LAML 筛出的 200 个候选里,有 25 个在 BeatAML 独立复制成功 (方向一致 + FDR<0.10)。零模型跑 1000 次,95.5% 的置换给出 0 个,没有一次达到 25 (经验 p < 0.001)。把复制阈值从 FDR<0.10 收紧到 <0.05,仍有 22 个留下。

关键在于:两个队列的"耐药"定义完全不同 —— TCGA 用的是生存分位数代理, BeatAML 用的是真实的诱导治疗反应(难治 vs 完全缓解)。方向仍然一致,说明信号不依赖 某一种耐药操作化方式。这正是「跨队列一致性」这条路想要的判据。

主结果图
主结果图(本轮实验的关键对比)。原图见随附材料。

1. 复制成功的基因(按 BeatAML 效应量排序,前 12)

基因TCGA Δ(耐药−敏感)BeatAML Δ(难治−完全缓解)BeatAML FDR
SYTL4+3.04+0.910.025
TCF15+2.46+0.850.058
DDIT4+2.14+0.800.029
RHPN1+1.52+0.570.033
PTP4A3+2.11+0.550.024
SLC29A2+1.36+0.540.011
EFCAB10-0.57-0.460.097
NRBP2+1.18+0.420.033
PARP3+1.07+0.360.011
ST8SIA4-0.56-0.350.013
DTWD2-0.63-0.310.048
TGIF1-0.51-0.270.025

完整 25 个见 work/results.jsonreplicated 字段。

2. 判定规则(跑之前写死,见 claims.json

3. 这些数支持什么(请务必看这一节)

  1. 发现层本身很弱。 TCGA 那 200 个候选里,最小 FDR 是 0.044。 它们是「最像的 200 个」,不是「已经确证的 200 个」。真正起筛子作用的是复制这一步。 拿单个候选去讲故事之前,请先看它在第 1 节的表里有没有。
  2. 不是 Venetoclax/Azacitidine 专属耐药。 公开队列里拿不到这两个药的反应标签。 本轮用的是诱导治疗反应(BeatAML)和生存代理(TCGA)。它们与这两个药的耐药相关但不等同
  3. 分母是 150 不是 200。 200 个候选里 cBioPortal 认得 166 个,其中 150 个在 BeatAML 有表达数据。 缺的那些是基因符号版本差异造成的,与耐药无关,但复制率应按 150 计。
  4. 生存代理不等于耐药。 TCGA 那一侧用生存分位数划分,混杂年龄、体能状态、移植与否等因素。
  5. 不做功能验证、不做临床决策建议。

4. 我们怎么确认这不是程序错误

交付前做了五项敌意复核(work/adversarial_check.py),其中一项抓到了真问题:

第一版跑出来"复制 0 个" —— 因为取临床标签时用了 patientId,而表达矩阵用的是 sampleId, 两边对不上,队列 B 直接空掉。这个 bug 会伪造出一个"复制不了"的假结论。 修好后才有本报告的数字。其余四项:样本 ID 交集核对、方向符号逐条核、 缺失基因是否与结果相关、阈值收紧后剩多少。

5. 下一步:三个真正值得追的方向

  1. 把耐药定义换成你关心的药。 如果你手上有 Venetoclax/Azacitidine 的反应数据(哪怕几十例), 把它接到同一套流程上,这 25 个基因里哪些还站得住,会立刻清楚。
  2. 加第三个队列做三重复制。 两个队列一致已经不容易,三个一致基本就能进正文。
  3. 对这 25 个做机制层筛选(通路富集、已知药靶注释、表达特异性), 把"统计上复制"收敛成"值得做实验"的少数几个。

这三条都属于付费轮。

6. 随附材料

数据来源:UCSC Xena 的 TCGA-LAML 表达矩阵、cBioPortal 的 BeatAML (OHSU 2018), 均为匿名可直接访问的公开资源。本轮不需要提交人提供任何数据、代码或稿件。

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

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