基因组学实践教程
基因组学实践教程
基因组学研究的是 DNA 序列本身:谁的基因组里有什么变异,这些变异是否落在功能区域,以及在群体里如何分布。即便今天大多数湿实验都在转录组或单细胞这一层,基因组重测序仍然是找到疾病相关变异、做 GWAS、做群体遗传分析的起点。
本专栏打算把"拿到一批测序数据之后怎么走到变异列表"这条主线讲清楚。重点放在重测序和短读长小变异,其他方向(长读长、结构变异、甲基化等)会作为延伸而不是主干。
基因组学项目的三条典型主线
新手容易把"基因组学"当成一回事,其实它是三种很不同的项目类型:
| 项目类型 | 核心问题 | 数据特点 | 关键工具 |
|---|---|---|---|
| 胚系变异检测 | 这个人有什么遗传缺陷 | 单/几个样本、深度 30-50x | GATK HaplotypeCaller + ClinVar |
| 肿瘤体细胞变异 | 肿瘤里有什么驱动突变 | 配对 tumor + normal | Mutect2 + maftools |
| 群体遗传 / GWAS | 这个变异在群体里怎么分布 | 几千-几十万样本 | PLINK 2 |
这三条主线分析流程差很多:胚系关注致病性、肿瘤关注 VAF 和驱动基因、群体关注频率和 LD。先想清楚自己在做哪一种,再选工具,比闷头跑流水线效率高。
一个项目大致是什么样子
一个典型的 WES 或 WGS 项目会拿到若干个体的双端 FASTQ 数据。从这里到"一份可以注释、可以过滤、可以做关联分析的 VCF"之间,要走的步骤大致是:
| 步骤 | 典型产物 | 常用工具 |
|---|---|---|
| 质控与接头剪切 | 清洗后的 FASTQ | FastQC、fastp、Trim Galore |
| 参考基因组比对 | sorted.bam + 索引 | BWA-MEM、minimap2 |
| 重复序列标记与 BQSR | 校正后的 BAM | GATK MarkDuplicates、BQSR |
| 变异检测 | 原始 VCF / gVCF | GATK HaplotypeCaller、DeepVariant |
| 联合基因分型 | 多样本 VCF | GATK GenotypeGVCFs |
| 变异过滤 | 高置信变异集 | GATK VQSR、硬过滤 |
| 变异注释 | 带功能注释的 VCF | VEP、ANNOVAR、SnpEff |
| 下游分析 | 关联、群体结构、可视化 | PLINK、R |
"BWA + GATK" 是短读长小变异的事实标准,文献、社区和官方 best practices 都围绕它展开。如果只做基因型分型而不做科研级变异检测,bcftools mpileup + bcftools call 也能跑出可用结果,代码更短。
常见工具栈
这套组合在教学和小到中等规模真实项目里基本够用:
| 阶段 | 工具 | 运行环境 |
|---|---|---|
| 质控 | FastQC、fastp、MultiQC | bash |
| 比对 | BWA-MEM、minimap2 | bash |
| BAM 处理 | samtools、GATK | bash |
| 变异检测 | GATK HaplotypeCaller、DeepVariant | bash |
| 变异过滤 | GATK VQSR、bcftools | bash |
| 注释 | VEP、ANNOVAR、SnpEff | bash |
| 群体与统计 | PLINK 2、vcftools、R | bash + R |
长读长(PacBio、ONT)和结构变异会用到另一套工具链(minimap2、Sniffles、CuteSV 等),这里暂不展开。
推荐公开数据集
学这个专栏可以从三类数据入手:
| 数据集 | 规模 | 适合 | 入口 |
|---|---|---|---|
| NA12878 / HG001 | 单样本,广泛验证 | 流程搭建、variant calling 基准 | Genome in a Bottle |
| 1000 Genomes | 人群规模 | 群体结构、LD、祖源分析 | 1000 Genomes Project |
| GnomAD | 汇总等位基因频率 | 变异注释、罕见变异过滤参考 | gnomAD |
NA12878 有 GIAB 发布的"黄金标准" VCF,可以直接用来评估你自己跑出的结果是否合理,是练习 variant calling 流程最方便的参照物。
最小可跑的例子
下面用 Bioconductor 的 VariantAnnotation 包做一次最简单的 VCF 读取和浏览。它自带一份 chr22.vcf.gz 示例,不需要联网下载:
if (!requireNamespace("BiocManager", quietly = TRUE)) install.packages("BiocManager")
BiocManager::install(c("VariantAnnotation", "TxDb.Hsapiens.UCSC.hg19.knownGene"))
library(VariantAnnotation)
library(TxDb.Hsapiens.UCSC.hg19.knownGene)
# 读入包里自带的 chr22 示例 VCF
fl <- system.file("extdata", "chr22.vcf.gz", package = "VariantAnnotation")
vcf <- readVcf(fl, "hg19")
vcf
# 看一下 VCF 结构
header(vcf)
rowRanges(vcf)[1:5]
# 提取基因型信息
geno(vcf)$GT[1:5, 1:5]
# 把变异定位到基因区域
txdb <- TxDb.Hsapiens.UCSC.hg19.knownGene
loc <- locateVariants(vcf, txdb, CodingVariants())
head(loc)
# 统计每类变异的数量(内含子、外显子、UTR 等)
all_loc <- locateVariants(vcf, txdb, AllVariants())
table(all_loc$LOCATION)
locateVariants 会把每个 VCF 记录映射到最近的基因和区域类型。table(all_loc$LOCATION) 的输出是典型的"变异区域分布"结果——UTR、外显子、内含子、基因间各多少——这也是 variant calling 报告里必写的一栏。
真实重测序项目比这段要多两件事:前半段的 BWA 比对 + GATK 变异检测流水线(要跑几个小时、要有足够磁盘)、后半段的过滤策略和多样本联合分型。但 VCF 拿到手之后的操作思路,和上面这段是一致的。
专栏模块规划
| 模块 | 主题 | 状态 |
|---|---|---|
| 01 | 数据类型:WGS vs WES vs Panel | 已上线 |
| 02 | BWA / GATK 比对与变异检测 | 已上线 |
| 03 | VCF 注释与可视化 | 已上线 |
| 04 | maftools 肿瘤突变分析(WES) | 已上线 |
| 05 | 变异过滤与质量评估 | 已上线 |
| 06 | 群体遗传:PCA / 祖源 / LD | 已上线 |
| 07 | GWAS 入门 | 已上线 |
| 08 | 临床变异解读与报告 | 已上线 |
所有 8 个模块已上线。03 和 04 带可跑脚本和真实数据图。
推荐前置知识
常见误区
误区 1:以为变异越多越好
WGS 跑出来 5M 变异,99% 是已知 SNP,对你研究问题毫无意义。真正有价值的是罕见变异 + 致病变异,需要靠 ClinVar / gnomAD 过滤。"我的样本有 5M 个变异" 不是亮点。
误区 2:用 SNV-only 思路做肿瘤分析
肿瘤里 CNV、SV、染色体重排同样关键 — 漏掉这些等于半残。WGS 项目要补 Manta / GRIDSS(SV)和 ASCAT / FACETS(CNV)。
误区 3:把胚系变异工具用在肿瘤上
HaplotypeCaller 假设变异在 50% 或 100% 的 reads 里(杂合或纯合)。肿瘤是异质性群体,VAF 可以是 5%、20%、80% 等任意值,必须用 Mutect2 或类似肿瘤专用 caller。
误区 4:不做 BQSR 直接 call 变异
BQSR 校正测序仪系统偏差,不做的话假阳性率提高 10-30%。GATK best practices 里这是必须步骤,不要图省事跳过。
误区 5:群体遗传项目不做 LD pruning 直接 PCA
PCA 会被高 LD 区域(HLA、着丝粒等)主导,主成分变成"局部 LD 模式"而不是真实的群体结构。PCA 前必须 LD prune(PLINK --indep-pairwise 50 5 0.2)。