Skip to content

干净重跑计划(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.gzT2D 共定位用(hg37→hg38 转换版)tools/lift_mahajan_hg38.R 生成
GCST90013791.h.tsv.gzT1D 零重叠复制(Crouch 2025)2ef55eb63f7c4bc09c8ef1ac6e329eed
GCST90475667.tsv.gzT2D 零重叠敏感性(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.csvR9_dm 的 T1D 换 GCST90824163;旧源移入 R9_retired;新增 R9_sensT2D_mvp / T1D_crouch
analysis/_region_io.Rgcst_beta 分支;两类 GCST 按列名解析列号;缓存键加入文件签名
analysis/05_hyprcoloc.RFMT_MAP 扩为三分支
analysis/04_ldsc.Rmunge 复用判据由「文件存在」改为源文件指纹
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.csvT1D_gcst,T2D_mahajan0.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.csvT2D 同向 27/27 = 100%
diabetes_contrast/diabetes_contrast.csv57 条 / 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 tardeploy.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     # 唯一缺口

全部重跑更可信:本轮是边跑边改代码推进的,无法排除还有别的下游没跟上。 如果结果要写进论文,建议按第三节从零跑一遍。

个人科研与运维文档 · 内容持续修订