案例 · 用户提交方向,已匿名
核心问题:在 DLPFC 12 张 Visium 切片上,一个零学习的 kNN 邻居平滑基线能拿到多少 ARI?以及一个只有几何、没有真实表达信息的空模型能白拿多少 ARI?
本轮判定:refuted · kNN spatial smoothing (best k=24, gmm_full) reaches mean ARI=0.348 vs 0.207 for the no-smoothing baseline (delta=+0.141, paired Wilcoxon p=0.0005 over 12 slices); P1 refuted. The geometry-only null (real coords, noise expression) reaches ARI=0.050, so P2 is confirmed.
数据:LIBD Human DLPFC 10x Visium, 12 slices ([151507, 151508, 151509, 151510, 151673, 151674, 151675, 151676, 151669, 151670, 151671, 151672]), n_cells range 3431-4788, top-2000 HVGs, PCA-50.
真跑了:3 个噪声种子 · 纯 CPU 682 秒 · 代码/日志/原始结果全部随附

案例速览

判定:负结果

数据源与对照规模:LIBD Human DLPFC 12 张 10x Visium 切片,4 个实验臂 × 3 个随机种子,纯 CPU 682.5 秒

主要结论:空间 kNN 平滑相对无空间基线提升 ARI +0.141,但均值 0.348 低于预注册的 0.40;几何空模型仅 0.0498。

这些结果不支持:不支持零参数平滑已经足够、不支持跨方法排名,也不能外推到其他组织或空间组学平台。

代码 / 原始结果 / 日志:代码、原始 results.json、运行日志、逐样本明细、图和一键复现脚本齐全。

DeepGraph 免费层交付 · 空间域识别:零学习平滑基线 + 空模型对照(主预测被推翻)

提交方向: 单细胞数据分析 交付时间: 2026-08-07 这一轮真跑了: LIBD Human DLPFC 10x Visium 12 张切片(151507–151510 / 151669–151672 / 151673–151676,每张 n_cells 3431–4788),4 个臂,3 个种子(0/1/2),总耗时 682.5 秒;代码、完整日志、图与原始 results.json 随附


0. 结论(先说结果)

我们押的主预测 P1 被推翻了,这条路替你试过,不成立。 预注册的 P1 是:一个零参数的空间 kNN 平滑基线,在 12 张切片上平均 ARI ≥ 0.40 且相对不平滑基线提升 ≥ +0.10(配对 Wilcoxon p<0.05)。实跑结果:提升和检验都过了(+0.141,p=0.000488),但绝对水平只有 0.348,没到 0.40 这条线,所以 P1 判为推翻。含义是:"最土的邻居平滑就能顶掉那些复杂方法"这个故事讲不通——平滑确实拿走了很大一块,但拿不到能自称有用的绝对水平。

次预测 P2 被证实,而且它才是那个坏消息。 几何空模型(真坐标 + 随机高斯噪声表达)的 ARI 只有 0.0498,远在 0.15 阈值之内。我们本来押这里藏着一个"几何免费分"——如果它有 0.2,这条线上所有已发表的 ARI 比较都要重估,那是最有杀伤力的一篇。它没有。这个缺口被我们自己的数据关掉了,别再往这投。

下一步该往哪拐:① 这轮意外拿到一个还开着的口子——同一切片、同一配置、只换随机种子,ARI 标准差平均就有 0.0282(基线)/ 0.0309(平滑臂),单张切片最大到 0.0774;② 值得投的是把 GPU 方法在同一预处理下重跑,用 0.348 这个零参数下限去量化"深度到底换来多少增量"。详见第 3 节。


1. 我们替你跑了什么

设计一句话:同一套预处理、同一组降维/聚类/种子,唯一变量是"要不要把空间邻居的表达混进来",再加两个空模型量地板。

主结果:ARI

每个种子的值 = 该种子下 12 张切片的均值;± 是 3 个种子之间的标准差(n=3,仅描述离散度,不做显著性推断)。

配置seed 0seed 1seed 2均值 ± 种子间标准差
baseline-nonspatialk=0, gmm_full0.2050.2030.2120.207 ± 0.00377
proposed-smooth-knnk=24, gmm_full0.3530.3420.3480.348 ± 0.00483
null-shuffle-exprk=24, gmm_full0.004990.004870.005160.00501 ± 0.000118
null-geometry-onlyk=24, gmm_full0.04950.04920.05060.0498 ± 0.000613

差值与检验:proposed − baseline = +0.141;12 张切片配对 Wilcoxon 符号秩检验,统计量 = 0.0,p = 0.000488(该检验是跨 12 张切片的配对检验,不是跨 3 个种子)。逐张切片的配对数值在随附的 work/logs/per_sample_paired.csvwork/figs/per_sample_paired_ari.png 里。

辅助指标(均值 ± 种子间标准差)

NMI空间连贯性ari_seed_std(逐切片,3 种子间 ARI 标准差)
baseline-nonspatial0.327 ± 0.001100.579 ± 0.00219均值 0.0282(12 切片间标准差 0.0202)
proposed-smooth-knn0.512 ± 0.006170.925 ± 0.00159均值 0.0309(12 切片间标准差 0.0193)
null-shuffle-expr0.0107 ± 0.0005660.350 ± 0.00314均值 0.00242(12 切片间标准差 0.00123)
null-geometry-only0.0908 ± 0.002010.827 ± 0.00289均值 0.0148(12 切片间标准差 0.0109)

> ari_seed_std 按定义就是逐切片统计量(每张切片一个"3 种子间标准差"),所以它的 12 个原始值是逐切片值,不是逐种子值——results.json 里对这一条有专门的 note 标注。


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

2. 怎么读这个结果

这些数支持什么

  1. 空间平滑的收益是真的,但不够。 +0.141 的提升 + 12 切片配对 p=0.000488,不是被个别切片带起来的(符号秩统计量 = 0.0,意味着 12 个配对差值方向一致;逐张数值见随附 CSV)。同时绝对水平 0.348 停在预注册的 0.40 之下,所以我们只能说"平滑有效",不能说"零参数平滑够用"。
  2. 两个空模型都塌得很干净。 打乱表达 → 0.00501;真坐标 + 纯噪声表达 → 0.0498。所以 0.348 不是"变连续"这件事白捡来的分数。注意空间连贯性这一列:几何空模型的连贯性有 0.827(接近实验臂的 0.925),ARI 却只有 0.0498——"看起来很连续"和"分对了"是两回事,连贯性不能替代 ARI
  3. 种子噪声不小。 同切片、同配置、只换种子,ARI 标准差平均 0.0282(基线)/ 0.0309(平滑臂),个别切片到 0.0774 / 0.0638。这直接关系到"两位小数比较方法优劣"到底有没有意义。

这些数不支持什么

规模放大后可能变的部分:P1 是被"绝对值 0.348 < 0.40"这一条卡掉的,而不是被提升幅度或检验卡掉的。所以更大的 k、扫 α、或换更强的聚类器,都有可能把它推过 0.40——这轮没试,所以这轮只能照报推翻。

本轮相对方案的三处偏离(逐条交代)

  1. top-2000 高变基因只在未平滑的 log-normalize 矩阵上选一次,两臂共用;平滑作用在已经选出的 2000 基因矩阵上,而不是全部 ≥10 细胞的基因集。理由:方案里基线臂自己的描述就要求"与实验臂共用完全相同的预处理,唯一差别是不做邻居平滑",共用 HVG 才是那个读法;而且对全基因集稠密平滑在 CPU/内存预算里跑不动。代价:HVG 选择本身从未在平滑后的数据上重跑过。
  2. α(平滑权重)的稳健性扫描 {0.25, 0.5, 0.75} 被跳过,α 固定 0.5。方案里这一项标的是"若时间有余",预算花在了完整的 12 切片 × 2 聚类器 × 多 k 扫描上。
  3. 聚类器按方案扫了 {kmeans, gmm_full},但报告里的基线臂和实验臂都用扫描(k>0)胜出的那个聚类器(gmm_full),所以基线-实验对比是在一个固定的、表现最好的聚类器上隔离平滑效应,而不是把 kmeans 和 gmm_full 当两组独立的基线/实验对分别汇报。

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

最短路径(值得投)

  1. 把 GPU 方法在同一预处理下重跑。 现在你手上有一个零参数、可复现的下限 0.348 和一个不用坐标的下限 0.207。深度方法真正该被问的是"比这两个下限多拿了多少",而不是"ARI 是多少"。这是审稿人的第一问,也是把这轮工作变成完整一篇的必经步骤——需要 GPU,是你自己有算力时的第一件事。
  2. 接着写"种子间波动"这个点。 0.0282 / 0.0309 这个量级是这轮顺手拿到的,而这条线上的新方法论文普遍只报单次运行的两位小数 ARI。"比较精度本身存疑"是可写的发现,而且完全不需要算力——把种子数加上去、逐切片报 ARI 分布即可。
  3. 把 k 继续往上扫、顺带扫 α。 CPU 几分钟一轮。它要么把 P1 推过 0.40(那结论要改写),要么给出真正的饱和点(那"零参数平滑的天花板"这句话才能说)。

先别投

审稿人最可能打的地方(SCOPE.md 第 3 节,本轮结果对应的堵法)

  1. "只有 DLPFC 一个数据集/一个平台。" 最致命。本轮已做的:12 张切片全跑,不挑张。还需要做的:讨论里明确写死边界"本结论限于 10x Visium 分层组织"。主动划边界比被审稿人划便宜。
  2. "是不是拿弱基线打靶?" 本轮已做的:自变量做成网格全扫、种子固定、每个格点的原始日志公开(随附 sweep_detail.csv / run.log),基线与实验臂共用同一聚类器和同一套预处理。
  3. "ARI 单指标,而且簇数用了真值 K。" 本轮已做的:同时报 NMI 和无标签的空间连贯性,并且报了种子间标准差。真值 K 这一点没解决——它是这条线的通行做法,但确实是可被质疑的注水点,建议在讨论里自己先说。

4. 随附材料

文件是什么
work/spatial_domain_experiment.py主实验:数据加载 → 预处理 → 平滑 → PCA → 聚类 → 全扫描 → 空模型 → 配对检验 → 写 results.json
work/make_figures.pyresults.json + CSV 生成三张图
work/run.sh一条命令复现:bash run.sh —— 自动下载公开数据 → 跑完整实验 → 出图
work/results.json原始结果。本报告里每一个数值都能在这里逐个查到
work/logs/run.log完整日志,每一次拟合一行(样本 / k / 聚类器 / 种子 / ari / nmi / coh / 耗时)
work/logs/sweep_detail.csvsweep_detail.pkl全扫描逐格点明细
work/logs/per_sample_paired.csv12 张切片逐张的 baseline / proposed ARI
work/logs/null_shuffle_detail.csvnull_geometry_detail.csv两个空模型的逐切片逐种子明细
work/figs/ari_by_k_clusterer.png平均 ARI 随 k 变化,两种聚类器各一条线
work/figs/arm_comparison.png四个臂的 ARI 对比(误差棒 = 种子间标准差)
work/figs/per_sample_paired_ari.png逐切片配对连线图
work/NOTES.md实验过程记录:做了什么、为什么这么判、踩了什么坑
SCOPE.md前置的方向判断与文献查新(第 5 节是它的摘要)

环境:Python 3.12.3,全程 CPU,没有 GPU。本实验不含深度学习,未使用 torch(results.json.env 里记的就是 torch: not used);只依赖 numpy / scipy / scikit-learn / matplotlib / pandas,额外装的只有 h5py==3.16.0。种子固定为 0 / 1 / 2,bash run.sh 可完整重跑,总耗时 682.5 秒。

原始数据不随交付附带(体积大),run.sh 会自动从公开地址重新下载:表达矩阵来自 spatial-dlpfc.s3.us-east-2.amazonaws.com,点坐标和人工分层真值来自 LieberInstitute/HumanPilot

我们不要你的数据、代码或稿子。 这一轮的证据全部用公开数据集自己造,下载地址、代码、种子、日志都在上面,任何人都能自己重跑一遍并反驳我们。


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

参考来源(原样保留)


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

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

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