Skip to content

config.yaml 逐字段详解

换课题跑 MR,主要就是改这一个文件(单条分析用 run_all.R)。本页把 config.yaml 每个字段讲清楚:作用、可选值、怎么填。 批量筛查(analysis/01_screen.R)的结局清单在 outcome_manifest.csv,见文末 §B


0. 先记住三件事

  1. 换课题 = 改 config.yamlexposures:outcomes: 两段 + 把数据文件放进 data/
  2. 方法引擎(R/ 里的代码)永远不用动——参数都在 config 里调。
  3. 改完运行: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-5

multiple_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_encodingp 值编码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_modersid / position(Mahajan 用 position)
effect_typebeta / OR
pval_encodingraw / 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/0116)换数据要动的是别的文件,见 换数据重新开始

场景改什么运行
换一个疾病结局config outcomes: 复制一块改 id/file/trait/ncase/ncontrolRscript run_all.R
换一个蛋白暴露config exposures: 加一块Rscript run_all.R
换 FinnGen 版本只改 filesample_size/ncase/ncontrolRscript run_all.R
批量扫多个病outcome_manifest.csvRscript analysis/01_screen.R R9
换非欧人群ld$bfile + ld$ancestry + 暴露 ancestry 一起改见工具变量选择页

相关:使用教程(完整流程)· 代码结构详解(每个文件干嘛)· 流水线架构

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