主题
批量筛查(一个蛋白扫一堆病)
run_all.R做的是"一个暴露 × 一个结局"的精细分析。而批量筛查(analysis/01_screen.R)做的是"一批 cis-pQTL 工具 × 几十个疾病结局"的大规模单SNP Wald 扫描——这是本课题实际在用的主力流程。
一、和 run_all.R 的区别
run_all.R(单分析) | analysis/01_screen.R(批量筛查) | |
|---|---|---|
| 规模 | 1 暴露 × 少数结局 | 全部 cis 蛋白 × 几十个结局 |
| 结局来源 | config.yaml 的 outcomes: | 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 全套结局它做什么:
- 读 cis-pQTL 工具(
data/exposure/protein_info.csv,UKB-PPP) - 读
outcome_manifest.csv里release匹配的所有结局 - 每个结局:按工具 SNP 预过滤读取 → 谐化 → 单SNP Wald → 算 F 值 → FDR
- 每工具附上:两侧等位、eaf、F/R²、OR/95%CI、P、FDR、基因注释、病例/对照数
- 跨结局重叠矩阵 + 发文章级汇总表
rsid 还是 position 匹配?
manifest 每行的 match_mode 决定:FinnGen/GCST 用 rsid;Mahajan 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.yaml 的 report.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:删掉某几个结局,重出汇总
比如不想要 Autonomic、Mononeuro(低功效)了:
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 配置详解 · 代码结构详解 · 使用教程