Skip to content

批量筛查(一个蛋白扫一堆病)

run_all.R 做的是"一个暴露 × 一个结局"的精细分析。而批量筛查analysis/01_screen.R)做的是"一批 cis-pQTL 工具 × 几十个疾病结局"的大规模单SNP Wald 扫描——这是本课题实际在用的主力流程。


一、和 run_all.R 的区别

run_all.R(单分析)analysis/01_screen.R(批量筛查)
规模1 暴露 × 少数结局全部 cis 蛋白 × 几十个结局
结局来源config.yamloutcomes:outcome_manifest.csv
MR 方法自适应(Wald/IVW/Egger…)+ 敏感性 + 共定位单SNP Wald ratio(快速扫描)
输出完整 HTML 报告每结局显著蛋白表 + 跨结局重叠
用途深挖某个蛋白广度扫描,先找信号

二、analysis/01_screen.R 怎么用

bash
cd ~/mr-pipeline
Rscript analysis/01_screen.R R9      # 跑 R9 全套结局
Rscript analysis/01_screen.R R13     # 跑 R13 全套结局

它做什么

  1. 读 cis-pQTL 工具(data/exposure/protein_info.csv,UKB-PPP)
  2. outcome_manifest.csvrelease 匹配的所有结局
  3. 每个结局:按工具 SNP 预过滤读取 → 谐化 → 单SNP Wald → 算 F 值 → FDR
  4. 每工具附上:两侧等位、eaf、F/R²、OR/95%CI、P、FDR、基因注释、病例/对照数
  5. 跨结局重叠矩阵 + 发文章级汇总表

rsid 还是 position 匹配?

manifest 每行的 match_mode 决定:FinnGen/GCST 用 rsidMahajan T2D 无 rsID,用 position(按 染色体:位置:等位 的 hg37 键匹配)。引擎自动分流,你不用管。


三、结局清单:outcome_manifest.csv

批量筛查不读 config 的 outcomes:,而是读这张表。加/减结局 = 改这张表。列含义见 config 配置详解 §D。关键:id / file / ncase / ncontrol / match_mode / effect_type / group

config.yaml 里的 iv/ld/coloc 参数仍然生效(screen 也读 config 拿这些)。所以批量筛查 = 改 manifest(结局)+ config(参数)。


四、输出结构

跑完在 results/screen_<版本>/

results/screen_R9/
├── <结局>_all.csv           每个结局:全部工具的 Wald 结果
├── <结局>_significant.csv   每个结局:FDR<0.05 的显著蛋白
├── SUMMARY_publication.csv  ★发文章级汇总:每结局 病例/对照/工具数/minF/medianF/显著数
├── overlap_matrix.csv       跨结局:哪个蛋白在几个病里显著
└── figures/                 可视化(见下)

SUMMARY_publication.csv 是发文章最常引用的表——每个结局一行,病例数、对照数、工具数、最小/中位 F 值、显著蛋白数一目了然。

📖 每张表每一列怎么读、图怎么看、哪些结果能下结论结果怎么看


五、可视化:analysis/02_visualize.R

bash
Rscript analysis/02_visualize.R results/screen_R9      # 对某个版本的结果出图

出三张图到 results/screen_R9/figures/

内容
upset.*UpSet 图:蛋白在多个疾病间的重叠情况
forest_shared.*森林图:跨 ≥3 个并发症共享的蛋白的 OR/CI
network.*蛋白–疾病网络(红=风险 OR>1,蓝=保护 OR<1)。⚠️ 这是阶段三产物,只有 MR、未经共定位过滤,不能作靶点结论——靶点网络见 阶段六

图片格式:600dpi PNG + 矢量 PDF

每张图同时输出两种格式

  • .png(600 dpi)——预览、印刷、投稿初稿
  • .pdf(矢量)——可直接用 Adobe Illustrator 打开编辑(改字体、颜色、排版,不失真)

run_all.R 的报告图(散点/森林/漏斗/LOO)同样是 600dpi PNG + 矢量 PDF,存在 results/figures/。分辨率在 config.yamlreport.dpi 调(默认 600)。


六、汇总成 Excel:analysis/09_report.py

把 R9/R13 结果汇总成发文章用的多表 Excel + CSV:

bash
python analysis/09_report.py results

输出 results/REPORT/

  • MR_publication_tables.xlsx——多表(结局汇总 / 显著关联明细 / 重叠矩阵)
  • table_S_significant_associations.csv——所有显著关联合并,含 F值/等位/OR/CI/P/FDR/注释
  • table_S_outcome_summary.csv——结局汇总

七、删除 / 增减结局后快速重分析(断点续跑)

analysis/01_screen.R 支持断点续跑:每个结局算完会把结果缓存成 <结局>_all.csv,再次运行时已算过的直接复用,不重读大文件。所以增减结局都很快。

场景 A:删掉某几个结局,重出汇总

比如不想要 AutonomicMononeuro(低功效)了:

bash
cd ~/mr-pipeline
# 1) 从 outcome_manifest.csv 删掉这两行(或注释)
# 2) 删掉它们的结果文件
rm results/screen_R9/Autonomic_*.csv results/screen_R9/Mononeuro_*.csv
# 3) 重跑——其余结局全部命中缓存,秒完成;汇总/重叠只统计 manifest 里现存的
Rscript analysis/01_screen.R R9
# 4) 重出图 + Excel
Rscript analysis/02_visualize.R results/screen_R9
python analysis/09_report.py results

汇总表(SUMMARY_publication.csv)和重叠矩阵只统计 manifest 当前的结局——删掉的行不会再进汇总。

场景 B:加一个新结局

bash
# 1) outcome_manifest.csv 加一行(填 id/file/ncase/ncontrol/...)
# 2) 把数据放进 data/outcome/
# 3) 重跑——老结局命中缓存,只算新加的那个
Rscript analysis/01_screen.R R9

场景 C:改了参数(如 clump_r2、cis 窗口),要全部重算

缓存是按结局存的,改参数后需强制重算

bash
Rscript analysis/01_screen.R R9 force    # 加 force 忽略缓存,全部重跑
# 或删掉整个 results/screen_R9/ 再跑

一句话

  • 删/加结局 → 改 manifest + 删对应 _all.csv → 重跑(快,只算变化的)
  • 改参数Rscript analysis/01_screen.R R9 force(全部重算)

八、相关脚本一览

脚本作用
analysis/01_screen.R主力:manifest 驱动的全结局批量筛查
legacy/batch_screen.R旧版(5 结局写死),留作与原始实现结果对照
legacy/screen_t2d.R单独跑 Mahajan T2D(position 匹配),screen_full 已内含
analysis/02_visualize.R出 UpSet / 森林 / 网络图(png+pdf)
analysis/09_report.py汇总成 Excel 多表
analysis/06_network.R阶段六:整合 MR+共定位+PheWAS 出靶点网络(见 阶段六

相关:config 配置详解 · 代码结构详解 · 使用教程

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