主题
config.yaml 逐字段详解
换课题跑 MR,主要就是改这一个文件(单条分析用
run_all.R)。本页把config.yaml每个字段讲清楚:作用、可选值、怎么填。 批量筛查(analysis/01_screen.R)的结局清单在outcome_manifest.csv,见文末 §B。
0. 先记住三件事
- 换课题 = 改
config.yaml的exposures:和outcomes:两段 + 把数据文件放进data/。 - 方法引擎(
R/里的代码)永远不用动——参数都在 config 里调。 - 改完运行:
Rscript run_all.R(或Rscript run_all.R 你的配置.yaml)。
A. 全局参数(config.yaml 顶层)
project 项目设置
yaml
project:
name: "MR_generic" # 项目名(随便起,进报告标题)
output_dir: "results" # 结果输出目录
seed: 12345 # 随机种子(保证可复现,别改)
resume: true # 断点续跑:已算好的中间结果直接复用(当前 config 即为 true)断点续跑
resume: true 时,改一处重跑不会全部重来,已算的 .rds 直接读。想全新跑:删掉对应中间目录,或设 resume: false。
analysis_mode 分析模式(最重要的开关)
yaml
analysis_mode: "cis" # cis | genome_wide| 值 | 用途 | 行为 |
|---|---|---|
cis | 分子暴露(cis-pQTL / cis-eQTL) | 按基因 TSS/TES ±窗口取 SNP,阈值 5e-6,强制做共定位 |
genome_wide | 普通风险因子(如 LDL) | 全基因组显著 5e-8,跑全套敏感性 |
defaults 匹配与校验
yaml
defaults:
match_by: "rsid" # rsid(默认) | position(无rsID数据,如Mahajan)
require_rsid: true # 强制两侧都有 rsID
require_build_consistency: true # 强制 build 一致(除非开 liftover)match_by: rsid:按 rsID 对齐(最稳,默认)。match_by: position:按染色体:位置:等位对齐——用于无 rsID 的数据集(如 Mahajan T2D)。此时要求两边同一 build。
iv 工具变量参数
yaml
iv:
pval_genome_wide: 5.0e-8 # genome_wide 模式显著性阈值
pval_cis: 5.0e-6 # cis 模式显著性阈值
cis_window_kb: 500 # cis 窗口 ±500kb(可改 1000=±1Mb)
clump_r2: 0.001 # LD clumping r² 阈值
clump_kb: 10000 # LD clumping 距离
clump_pop: "EUR" # api 模式 LD 人群(须与暴露祖先一致)
f_stat_min: 10 # 弱工具阈值,F<10 剔除
steiger_filtering: true # 是否做 Steiger 方向过滤
harmonise_action: 2 # 回文处理:1假设正向 2按MAF推断 3丢弃回文ld LD 参考面板(clumping 用)
yaml
ld:
method: "local" # local(本地PLINK) | api(OpenGWAS在线)
plink_bin: "plink1.9" # plink 二进制(本机 apt 装在 PATH 上;留空则回退 genetics.binaRies)
bfile: "/mnt/d/mrdata/ldpanel/EUR" # LD 面板 bfile 前缀(1000G EUR, GRCh37, 按 rsID 匹配)
ancestry: "EUR" # 面板人群,须与暴露 ancestry 一致人群祖先必须匹配
clumping 的 LD 结构必须与暴露的人群一致。换非欧暴露(如东亚 pQTL)要同时改 bfile(指向对应人群面板,如 /mnt/d/mrdata/ldpanel/EAS)和 ancestry: EAS,否则会报错拦截。见 工具变量选择。
coloc 共定位
yaml
coloc:
engines: ["coloc_abf", "hyprcoloc"] # 跑哪些共定位引擎
enabled_cis: true # cis 模式开
enabled_genome_wide: false # genome_wide 模式默认关
min_region_snps: 50 # 区域 SNP 少于此值→跳过并标注"数据不足"
pp_h4_threshold: 0.8 # PP.H4>此值 判共享因果变异
prior_p1: 1.0e-4 # coloc 先验(一般不动)
prior_p2: 1.0e-4
prior_p12: 1.0e-5multiple_testing 多重检验
yaml
multiple_testing:
grouping: "by_outcome" # by_outcome(每结局内) | global(全部对一起)
method: "BH" # Benjamini-Hochberg FDR
alpha: 0.05 # 显著性阈值其他开关
yaml
bidirectional:
enabled: false # 是否做反向 MR(需暴露有全量sumstats)
liftover:
enabled: false # 是否做 build 转换(hg19↔hg38)
chain: "" # liftover chain 文件路径
report:
title: "..." # 报告标题
author: "..." # 报告作者
dpi: 600 # 图片 PNG 分辨率(≥600 供印刷);每张图另存矢量 PDF
data_availability: "..." # 数据可及性说明(进报告)
code_availability: "..." # 代码可及性说明
run:
stages: ["read","iv","harmonise","mr","sensitivity","coloc","mt","report"]
# 想只重出报告不重读数据,就裁剪这个列表B. 暴露怎么写(exposures:)
情况 A:工具表(如 UKB-PPP,一行一个已选 pQTL)
yaml
exposures:
- id: "IL6R" # 短名,用于结果目录
format: "instrument_table" # 工具表模式
file: "data/exposure/ukbppp.csv"
build: "GRCh38" # 基因组版本(必填)
ancestry: "EUR" # 样本祖先(必填,须与 ld$ancestry 一致)
trait: "IL6R protein"
type: "continuous"
gene: "IL6R" # cis 模式用它定位窗口
chr: 1 # 或直接给坐标
tss: 154377669
tes: 154441926
sample_size: 34557 # UKB-PPP discovery(欧裔);须与所取的 discovery 效应量列一致
pval_encoding: "neglog10" # UKB-PPP 的 log10p 是 -log10
effect_type: "beta"
variant_id_split: # 复合变异ID拆列(没有就删)
column: "Variant.ID"
pattern: "chr:pos:OA:EA"
filter: { "cis.trans": "cis" } # 只取 cis 行情况 B:全量 GWAS(一个风险因子一个文件,如 LDL)→ 用 format: "tsv",写法和结局一样(type: continuous),流水线自己按阈值选显著 SNP。
C. 结局怎么写(outcomes:)
yaml
outcomes:
- id: "DR_finngenR13"
format: "tsv" # 扁平表(tsv/csv/.gz)
file: "data/outcome/finngen_R13_DR.gz"
build: "GRCh38"
ancestry: "EUR" # 与暴露不同=跨人群MR,报告会警示
trait: "Diabetic retinopathy (FinnGen R13)"
type: "binary" # binary→出OR;continuous→出beta
sample_size: 312000
ncase: 12000 # binary 才需要
ncontrol: 300000
prevalence: 0.038 # binary 共定位用
pval_encoding: "raw" # raw | neglog10(如FinnGen mlogp)
effect_type: "beta" # beta | OR | HR(后两者自动取log)
column_map: # 列名映射(留空则自动探测)
SNP: rsids
chr: "#chrom"
pos: pos
effect_allele: alt
other_allele: ref
eaf: af_alt
beta: beta
se: sebeta
pval: pval关键字段速查
| 字段 | 作用 | 常见取值 |
|---|---|---|
format | 输入类型 | tsv / instrument_table / vcf |
build | 基因组版本 | GRCh38 / GRCh37(暴露结局必须一致) |
ancestry | 样本祖先 | EUR/EAS/AFR(暴露须与 LD 面板一致) |
pval_encoding | p 值编码 | raw / neglog10(-log10p,如 FinnGen mlogp、UKB log10p) |
effect_type | 效应量类型 | beta / OR / HR |
type | 结局性质 | binary(出OR)/ continuous(出beta) |
column_map | 列名映射 | 留空=自动探测;探测不到再显式写 |
列名不确定?
先不写 column_map,让它自动探测(内置 FinnGen/UKB/GWAS-SSF 常见别名)。探测不到会明确报错告诉你缺哪列。
D. 批量筛查用 outcome_manifest.csv
analysis/01_screen.R(一个蛋白扫几十个病)不读 config 的 outcomes:,而是读 outcome_manifest.csv。一行一个结局:
| 列 | 说明 |
|---|---|
release | 版本(R9 / R13),运行时用 Rscript analysis/01_screen.R R9 选 |
id | 结局短名 |
file | 文件名(放在 data/outcome/) |
phenocode | 官方 endpoint 编码 |
ncase / ncontrol | 病例/对照数(进报告,必须准确) |
match_mode | rsid / position(Mahajan 用 position) |
effect_type | beta / OR |
pval_encoding | raw / neglog10(该结局文件的 p 值编码) |
se_from_ci | 是否从 CI 重构 SE(GCST 那种) |
group | 分组(eye/neuro/renal/systemic/base) |
notes | 备注(中文病名,不参与计算) |
config.yaml 里的 iv/ld/参数仍然生效(screen 也读 config 拿这些)。所以批量筛查 = 改 outcome_manifest.csv(结局)+ config.yaml(参数)。
E. 总结:换课题的最小改动
这一节只覆盖 run_all.R
批量筛查主线(analysis/01→16)换数据要动的是别的文件,见 换数据重新开始。
| 场景 | 改什么 | 运行 |
|---|---|---|
| 换一个疾病结局 | config outcomes: 复制一块改 id/file/trait/ncase/ncontrol | Rscript run_all.R |
| 换一个蛋白暴露 | config exposures: 加一块 | Rscript run_all.R |
| 换 FinnGen 版本 | 只改 file 和 sample_size/ncase/ncontrol | Rscript run_all.R |
| 批量扫多个病 | 改 outcome_manifest.csv | Rscript analysis/01_screen.R R9 |
| 换非欧人群 | ld$bfile + ld$ancestry + 暴露 ancestry 一起改 | 见工具变量选择页 |