# NOTES

## 起点

工作目录里已经有上一轮(被压缩前的会话)写好但从未真正跑过的 `run_experiment.py` +
`scripts/{self,lookup}.awk`——`data/`、`logs/`、`results.json` 全是空的。检查代码后设计是对的
(流式 curl|zcat|mawk、先抓5个"锚点角色"文件定位显著位点、clump 出 lead SNP、再抓5个内异症文件在
这些位点上查 beta、MAF匹配零分布、配对 bootstrap 求 Δ),所以没有推倒重写,先做了两个小烟雾测试
(`curl -r` 部分下载 2MB 喂给 `self.awk` / `lookup.awk`)确认列位置(`pval=$7 mlogp=$8 beta=$9 se=$10 af=$11`)
和输出格式没问题,然后直接推进到全量跑。

## 关键工程决定:把10个文件的抓取拆成多次前台调用

单个 FinnGen 文件实测下载+`zcat|mawk`解压耗时稳定在 ~70秒(10个文件里的每一个都是,包括自身
`fetch_self`和跨文件`fetch_lookup`)。10个文件顺序抓 + clump + null bootstrap + 出图,总耗时约
19分钟,超过了我单次工具调用的10分钟上限,但任务要求不许后台化、必须在当前会话前台等到进程退出。
解法:给 `fetch_self`/`fetch_lookup` 加了基于 `<file>.done` 标记的幂等跳过逻辑,加了
`SINGLE_SHOT=1` 环境变量(做完一次真正的下载就退出),然后我自己连续调用
`SINGLE_SHOT=1 python run_experiment.py` 十几次,每次要么秒级跳过已完成的文件、要么老老实实抓
一个新文件后退出。最后一次不设 `SINGLE_SHOT` 走完整分析。`run.sh` 里保留的是等价的 `for i in 1..12`
循环,人类一条命令跑的话就是同一套逻辑连续执行,不需要我这边的分段。

## 实际抓取结果(见 logs/run.log 逐行时间戳)

- 参考骨架(H7_MYOPIA,10kb窗口内首个 0.01<af<0.99 的变异):283,340 个位点。
- 其余9个文件按 chrom:pos:ref:alt 与这个骨架做inner-join,retention全部是1.0000~1.0006
  (1.0006是因为把5个锚点性状clump出的186个lead SNP并集里、原本不在骨架上的182个位置也加了进去)。
  说明FinnGen R13不同表型共用同一套变异集合,流水线没有系统性丢失变异。
- Clump出的独立位点数(p<5e-8, 1Mb距离剪枝, 排除MHC):myopia 7 / M13_RHEUMA 41 /
  SPONDYLOARTHRITIS 13 / M13_PSORIARTH 15 / CD2_BENIGN_LEIOMYOMA_UTERI 111。

## 核心结果:预测的前提就没成立,判定为 inconclusive

预先注册的预测是"合并内异症表型在M13_RHEUMA的lead SNP上,方向一致性显著高于MAF匹配零分布"。
真实观测:sign_concordance=0.463(比0.5还低,方向上偏不一致),经验单尾p=0.796(3个种子:
0.784/0.802/0.801)——完全没有显著性。也就是说这一轮连"合并表型和类风湿有共享"这个前提都没测出来,
更谈不上测部位特异性。据此把 `prediction_outcome` 判为 `inconclusive`(不是confirmed也不是refuted),
`negative_result=true`。这是流水线诚实报告出的结果,没有为了让它显著而换锚点/换种子/挑子集。

阳性对照(CD2_BENIGN_LEIOMYOMA_UTERI,已知与内异症共享遗传起源)在同一条流水线上
sign_concordance=0.811, p=0.001(3个种子全部0.001,已达1000次抽样的下限),说明流水线本身有效能,
不是"测不出任何东西"的空转。阴性对照(H7_MYOPIA)p≈0.51,没有假阳性。两个对照都通过,
说明"前提不成立"是真实生物学信号(RA和内异症在FinnGen当前样本量下测不出稳健的方向性共享),
不是流水线坏了。

## 一个没有通过复现检验的孤立信号

M13_RHEUMA 锚点下,子宫/腺肌症(uterus)相对合并表型的 Δsign_concordance=+0.195,
95% CI=[0.024, 0.366]不覆盖0(p≈0.03~0.05),看起来像"腺肌症对RA有额外共享"。但按预先写好的推翻条件,
这类信号要在≥2个关节炎锚点上复现才算数。检查另外两个锚点(结果都在logs/run.log里,没有整合进
results.json的arms,因为schema的headline只认单一baseline/proposed口径):
- SPONDYLOARTHRITIS 锚点下 uterus 的Δ=-0.154, CI=[-0.385,0.000],方向相反且覆盖0;
- M13_PSORIARTH 锚点下 uterus 的Δ=+0.133, CI=[0.000,0.333],勉强覆盖0。

三个锚点×四个部位=12次Δ检验里,只有2次CI不覆盖0(rheuma/uterus 和 psoriarth/pelvicperitoneum),
且方向不一致、不可复现。在α=0.05下12次检验本身就期望有~0.6次假阳性,这个数量级的"命中"更像多重比较
噪声而不是真实的部位特异效应。所以没有把它写成阳性发现,只在Δ的95% CI里如实报告。

## 主要偏离(也写进了 results.json.deviations)

1. 预算内只完整跑了一组主参数(anchor_p=5e-8, clump窗口=1Mb, 排除MHC),原计划的sweep网格
   (500kb窗口 / 纳入MHC / anchor_p=1e-5)没有重跑,因为这些维度组合起来会让null bootstrap和
   clump步骤重复跑很多遍,45分钟预算下载阶段已经用了~12分钟,没有余量做完整网格。
2. SPONDYLOARTHRITIS、M13_PSORIARTH 两个次要锚点的 site-vs-pooled Δ 已经算出来(见上一节),
   但只用来做复现性检验,没有写进 results.json 的 arms(headline字段设计上只支持单一
   baseline/proposed口径)。
3. scaffold_retention_frac 的分母用的是 H7_MYOPIA 的骨架而不是原计划文字里写的
   N14_ENDOMETRIOSIS——myopia是流水线里第一个抓、用来奠定target_scaffold的文件,这样设计。
   由于10个文件间retention几乎都是1.0,换哪个做分母结论都一样。
4. 只做了距离剪枝,没有用1000G参考面板做LD clumping(计划里本来就标了"out of scope")。

## 时间

FETCH PHASE(10个文件顺序流式抓取+过滤):约12.5分钟(10×~70秒+少量clump/建骨架开销)。
分析阶段(clump、观测统计量、MAF匹配零分布1000次×3种子×多对anchor/endo组合、配对bootstrap Δ、
出图、写results.json):约18秒。总runtime_sec字段记录的是分析阶段自己的计时(15-18秒,不含抓取),
抓取阶段的真实耗时以 logs/run.log 里每次 `fetch_*` 的 `done in Xs` 为准。
