主题
干净重跑计划(R9 / 方案 C)
为什么需要这份计划
2026-07-29 这一轮是边跑边改代码推进的:流水线在跑的同时修 04_ldsc.R、改 _region_io.R、 加新脚本。结果是上游修好了、下游还是旧的——最典型的一次是修完 LDSC 让 rg 从 0.886 变成 0.087,但没有回头重跑消费它的阶段 14,导致 ldsc_rg_heatmap 里仍然印着 0.89。
单个产物的时间戳不足以判断结果是否有效,必须看依赖链。这份计划把依赖关系写死, 按顺序一次跑完,不再增量补丁。
一、先决条件
1.1 环境
换机复现见 换机复现指南。核心:WSL2 Ubuntu 24.04 + R 4.3.3 + research 用户。
1.2 数据(D:\mrdata\outcome\,逐个校验 md5)
| 文件 | 用途 | md5 |
|---|---|---|
finngen_R9_DM_RETINOPATHY_EXMORE.gz 等 5 个 | 五个并发症结局 | 见 FinnGen 官方 |
GCST90824163.h.tsv.gz | 外部 T1D 主分析(McGrail 2026) | 官方 |
Mahajan.NatGenet2018b.T2D-noUKBB.European.txt | 外部 T2D 主分析 | — |
Mahajan_hg38_forcoloc.tsv.gz | T2D 共定位用(hg37→hg38 转换版) | 由 tools/lift_mahajan_hg38.R 生成 |
GCST90013791.h.tsv.gz | T1D 零重叠复制(Crouch 2025) | 2ef55eb63f7c4bc09c8ef1ac6e329eed |
GCST90475667.tsv.gz | T2D 零重叠敏感性(MVP) | f7dcf90114fb22b8f910b8e8fd253356 |
GCST90475661.tsv.gz | 旧 T1D(已退役,仅供新旧对照) | — |
下载必须从 Windows 侧走
WSL 在 NAT 模式下够不到 Windows 的 127.0.0.1 代理,裸连 EBI 约 26 KB/s; Windows 侧 Git Bash 有 HTTP_PROXY/HTTPS_PROXY/ALL_PROXY 环境变量,curl 自动使用,约 8.8 MB/s。 且不要用 curl -C - 盲目续传:本地文件 ≥ 远端 Content-Length 时它会继续追加, 把完整文件写成一个比远端还大的坏文件,每轮 md5 都不同。下到临时文件、校验通过再替换。
1.3 代码(F:\project\mr-pipeline-r9\,本轮改过的必须带全)
| 文件 | 本轮改动 |
|---|---|
outcome_manifest.csv | R9_dm 的 T1D 换 GCST90824163;旧源移入 R9_retired;新增 R9_sens(T2D_mvp / T1D_crouch) |
analysis/_region_io.R | 加 gcst_beta 分支;两类 GCST 按列名解析列号;缓存键加入文件签名 |
analysis/05_hyprcoloc.R | FMT_MAP 扩为三分支 |
analysis/04_ldsc.R | munge 复用判据由「文件存在」改为源文件指纹 |
analysis/27_diabetes_contrast.R | 新增:糖尿病易感性对照 |
analysis/29_enrichment.R | 新增:通路富集(g:Profiler) |
analysis/31_source_compare.R | 新增:三组数据源对照 |
analysis/32_targets_table.R | 新增:方向一致性 + PheWAS 警示 + 靶点决策表 |
analysis/33_figures_new.R | 新增:上述四项的配图 |
tools/enrich_win.py | 富集的 Windows 侧调用(WSL 够不到 g:Profiler) |
二、★依赖关系(重跑顺序的依据)
manifest + 数据
│
├─→ 01 screen ──┬─→ 02 visualize
│ ├─→ 03 phewas ──┬─→ 23 phewas域图
│ ├─→ 12 筛查图 │
│ ├─→ 17 外部复制 │
│ ├─→ 27 糖尿病对照 ─┐
│ └─→ 31 源对照 │
│ │
├─→ 04 ldsc ─────────────────┐ │
│ │ │
└─→ 05 hyprcoloc ──┬─→ 13 区域图 │
├─→ 22 UpSet │
├─→ 24 coloc.abf ─→ 25 两法对照
├─→ 26 SuSiE │
└─→ 06 network ──┬─→ 07 可成药性
├─→ 11 单细胞 ─→ 15 单细胞图
└──────────────┐
↓
03 + 04 + 06 ──────────→ 14 下游图 ★这里消费 04
01 + 03 + 05 + 27 ─────→ 32 靶点表 ─→ 29 富集
27 + 29 + 31 + 32 ─────→ 33 新增配图
全部 ──────────────────→ 09/16 汇总 Excel本轮踩的就是这条边
14 消费 04 的产物。 修了 04 必须重跑 14,否则图上印的还是旧数字。 同理:改了 05 要重跑 13/22/24/25/26/06 及其所有下游。
三、执行顺序
步骤 0:清空,确保没有残留
bash
cd /home/research/mr-pipeline-r9
# 备份现有结果(不删)
tar czf ~/backup_r9_results_$(date +%Y%m%d).tgz results/
rm -rf results/pipeline_logs/*.done # 阶段标记
rm -rf results/_region_cache # 区域缓存(换源后必须清)
rm -f results/ldsc_*/*.sumstats.gz results/ldsc_*/*.sumstats.fp results/ldsc_*/*_input.tsv为什么要清区域缓存
_region_io.R 的缓存键现已含文件签名,理论上换源会自动失效。但全新重跑时清掉最省心, 也能顺带验证新键确实生效(重跑后缓存文件名应带新的大小签名)。
步骤 1:主流水线(一条命令,不要中途改代码)
bash
./run_pipeline.sh 2>&1 | tee results/run_clean.log阶段顺序已在 run_pipeline.sh 里定义:01 02 03 04 05 06 07 09 11 12 13 14 15 17 16。
必须用能撑住 WSL 的方式跑
WSL 空闲会自动关停,nohup/setsid 起的后台进程会一起被杀。 用 Claude Code 的 Bash 后台任务(前台运行),或在一个不会断开的终端里跑。
步骤 2:敏感性与对照家族
bash
Rscript analysis/01_screen.R R9_sens # T2D_mvp + T1D_crouch
Rscript analysis/01_screen.R R9_retired # 旧 T1D,供新旧对照
Rscript analysis/31_source_compare.R # 三组对照步骤 3:共定位附加分析
bash
Rscript analysis/22_figure_coloc_upset.R R9_dm
Rscript analysis/24_coloc_abf.R R9_dm
Rscript analysis/25_coloc_compare.R R9_dm
Rscript analysis/26_coloc_susie.R R9_dm # 最慢,约 40 分钟步骤 4:方法学增补(有先后依赖)
bash
Rscript analysis/27_diabetes_contrast.R # 先
Rscript analysis/32_targets_table.R # 依赖 27
# 富集必须从 Windows 侧跑(WSL 够不到 g:Profiler)
# Windows: python tools/enrich_win.py → 结果写回 results/enrichment/
Rscript analysis/33_figures_new.R # 依赖 27/29/31/32步骤 5:重出所有下游图(★不要省)
bash
Rscript analysis/14_figure_downstream.R R9_dm # 消费 03/04/06
Rscript analysis/23_figure_phewas_domain.R R9_dm
python3 analysis/09_report.py results # 汇总 Excel 收尾四、验收检查点(每一步都要对)
| 检查点 | 期望值 | 不对说明什么 |
|---|---|---|
ldsc_R9_dm/genetic_correlation_rg_long.csv 的 T1D_gcst,T2D_mahajan | 0.087 | 若仍是 0.886 → LDSC 复用了旧 munge 产物 |
ldsc_R9_dm/figures/ldsc_rg_heatmap.png 里 T1D×T2D 格 | 0.09 | 若是 0.89 → 阶段 14 没在 04 之后重跑 |
screen_R9_dm/T1D_gcst_significant.csv 行数 | 57 + 表头 | — |
screen_R9_sens/ 显著数 | T2D_mvp 148 / T1D_crouch 33 | — |
source_compare/SUMMARY.csv | T2D 同向 27/27 = 100% | — |
diabetes_contrast/diabetes_contrast.csv | 57 条 / 31 蛋白,糖尿病驱动 35 条 | — |
targets/target_decision_table.csv A 级 | ERMAP / IFNAR1 / APOL1 | — |
enrichment_gprofiler.csv 非MHC 组 | 免疫通路应消失 | 若仍显著 → 分组写错 |
所有 figures/ 下 PNG 时间戳 | 均晚于其数据来源 | — |
出图后必须肉眼看
ggsave 不会因为图例或脚注超出画布边界而报错。本轮首版散点图的图例被右边缘截断, 是打开 PNG 才发现的。每张要用的图都打开看一眼。
五、已知坑清单
| 坑 | 表现 | 对策 |
|---|---|---|
| LDSC 断点续跑 | 换源后 skip munge(已存在),rg 不变,不报错 | 已改指纹判据;重跑前清 *.sumstats.gz 更保险 |
| GCST 列号写死 | 区域读到 0 行,位点被跳过,不报错 | 已改按列名解析(McGrail rsid 在第 9 列、Crouch 在第 10 列) |
| WSL 空闲关停 | nohup 后台任务被杀 | 用前台方式跑长任务 |
| WSL 无代理 | 下载 26 KB/s、g:Profiler 超时 | 网络操作全部从 Windows 侧走 |
curl -C - | 文件越续越大,md5 每轮不同 | 先比 Content-Length;下到临时文件校验后替换 |
| MSYS tar | deploy.ps1 报 "Cannot connect to C:" | 显式用 C:\Windows\System32\tar.exe |
| PowerShell 5.1 | 无 BOM 的 UTF-8 脚本中文乱码、逻辑失效 | .ps1 存为 UTF-8 with BOM |
| 图例/脚注截断 | ggsave 不报错 | guide_legend(nrow=2) + caption 手动换行 + 加宽画布,且出图后肉眼确认 |
六、如果不想全部重跑
截至 2026-07-29 21:41,除 SuSiE(26) 外的所有产物都已是换源后重算的。 最小路径是只跑:
bash
Rscript analysis/26_coloc_susie.R R9_dm # 唯一缺口但全部重跑更可信:本轮是边跑边改代码推进的,无法排除还有别的下游没跟上。 如果结果要写进论文,建议按第三节从零跑一遍。