第四节 内置数据库深度拆解:gnomAD、ClinVar、dbSNP 和 1000 Genomes

做 Funcotator 注释,说白了就是一个“对号入座”的过程。
你手里有一堆变异位点,需要知道它们在人群里有多常见、有没有临床意义、文献里有没有报道。
这些信息从哪来?就是靠内置的参考数据库。

我个人习惯,拿到一个新项目,第一件事就是把数据库结构和版本摸清楚。
今天咱们就挨个拆解 Funcotator 内置的几个核心数据源。
我会结合项目里的实战经验,把每个库的特点和坑都交代清楚。

为什么需要多个数据库?

你可能会想:一个数据库不就够用了?
事实是,每个库的定位完全不同。

数据库 核心用途 典型场景
gnomAD 人群频率 判断变异是否为常见多态性
ClinVar 临床意义 变异与疾病的关联证据
dbSNP 变异标识 获得 rs ID,方便文献检索
1000 Genomes 全球人群频率 不同族裔的携带率比较

它们之间是互补关系,不是替代关系。
我在做肿瘤 panel 注释时,经常四个数据库的结果一起看。

gnomAD:人群频率的“金标准”

gnomAD 全称 Genome Aggregation Database。
说白了,就是目前人类群体遗传学里最大的公开数据集之一。

核心作用:提供变异在不同人群中的等位基因频率(AF, Allele Frequency)。
一个变异如果在 gnomAD 里频率超过 1%,基本可以排除致病性——太常见了。

我曾经遇到过一个案例:一个被 ClinVar 标记为“可能致病”的变异,我把 gnomAD 频率调出来一看,在东亚人群里频率高达 15%。
嗯,明显是个良性多态性被误标了。

实用技巧:Funcotator 默认使用 gnomAD 的基因组版本(2.1.1),包含外显子和非编码区。如果你只关注编码区,可以考虑切换为 gnomAD exome 版本,加载速度更快。

数据格式:Funcotator 使用的 gnomAD 数据是经过预处理的 .seg 文件。
你可以在 Funcotator 配置目录里看到类似这样的文件名:

gnomAD_2.1.1_GRCh38.sorted.bgz
gnomAD_2.1.1_GRCh37.sorted.bgz

这些是 sorted bgzipped 格式,Funcotator 会自动索引。
你不需要手动解压,直接配置路径就行。

ClinVar:临床证据的“集散地”

ClinVar 的定位很简单——记录人类变异与疾病的关系。
每个条目都会包含:

  • 变异描述(HGVS 格式)
  • 临床意义(致病、可能致病、良性等)
  • 提交者(哪个实验室或研究组)
  • 证据等级(Reviewed by expert panel 或 multiple submitters)

我特别关注 ClinVar 的 ReviewStatus 字段。
如果一个变异被多个独立实验室一致评级,可信度就高得多。
如果只有一个提交者,我会标注为“待验证”。

避坑指南:ClinVar 里重复条目不少。同一个变异可能被多个实验室提交,评级还不一样。我曾经遇到过一个位点同时标注“致病”和“良性”,最后发现是不同转录本导致的。解决办法是:在 Funcotator 配置里指定 ClinVar 使用 canonical 转录本。

数据格式:ClinVar 在 Funcotator 里也是 .seg 格式。
但内部存储其实是 VCF 结构的变体。你可以用 grep 直接看部分数据:

# 不要直接解压大文件,这里只是示例
zcat clinvar_20241001.vcf.gz | head -20

输出里会有标准的 VCF header 和记录行,包含 CLNSIG、CLNREVSTAT 等关键 INFO 字段。

dbSNP:变异身份的“身份证”

dbSNP 可能你早就用过了。
它的核心功能就是给变异分配一个唯一的 rs ID。

为什么需要它?
你想想看,当你想在文献里引用一个变异,靠描述“chr1:123456 A>G”别人根本找不到。
但如果你说“rs123456”,全世界的数据库都能精确命中。

Funcotator 在注释时,会自动把变异位点匹配到 dbSNP 的 rs ID。
输出结果里会出现 dbsnp_rsid 字段。

避坑提醒:dbSNP 并不提供临床意义或人群频率信息。它的定位就是标识符。
我见过不少初学者以为 rs ID 代表“有意义”,其实 dbSNP 里包含大量无害多态性。

特性 dbSNP gnomAD ClinVar
标识符 rs ID 唯一 无专用 ID SCV 编号
人群频率 部分有 最全面 无
临床意义 无 无 核心功能
数据量 极大(含所有已提交变异) 中(仅高质量变异) 较小(仅临床相关)

1000 Genomes:全球族裔的“人类样本库”

1000 Genomes Project 是最早的大规模人类基因组项目之一。
虽然样本量(约 2500 人)不如 gnomAD,但它有一个不可替代的优势:族群信息很完整。

  • AFR(非洲)
  • EUR(欧洲)
  • EAS(东亚)
  • SAS(南亚)
  • AMR(美洲混血)

我记得有一次做药物基因组学分析,需要判断一个变异在亚洲人群里是否常见。
gnomAD 里只给了整体频率,而 1000 Genomes 明确给出了 EAS 的频率为 8.2%——这个数据直接影响了后续的用药决策。

格式说明:Funcotator 里的 1000 Genomes 数据也是 .seg 格式。
它的字段设置和 gnomAD 类似,但频率是按族群拆分的。

# Funcotator 数据源配置示例(dataSources目录下的文件)
1000Genomes_phase3_GRCh38.sorted.bgz
实战建议:如果你的样本里包含特定族裔背景,强烈建议同时使用 gnomAD 和 1000 Genomes 做交叉验证。两个库的样本来源不同,结果会有差异,结合来看更可靠。

Funcotator 如何整合这些库?

你可能会问:这些库格式不一样、版本不同,Funcotator 是怎么统一处理的?
嗯,这里就要提到 Funcotator 的“数据源引擎”了。

它其实是个模块化设计:

  1. 每个数据库提供一个 DataSource 类
  2. 每个数据源有自己的读取器和索引
  3. Funcotator 在所有数据源之间做按位并行查找

换句话说,传入一个 VCF 文件,Funcotator 会同时去四个库里查询每个位点的信息,然后把结果合并到一行注释里。

下图展示了这四个内置数据库在 Funcotator 注释流程中的位置和关系:

Funcotator 内置数据库整合结构图 VCF 变异输入 gnomAD ClinVar dbSNP 1000 Genomes Funcotator 数据源引擎 注释输出/回报表 说明:每个数据库独立存储,Funcotator 在注释时并行查询 输出结果会合并所有匹配到的字段(rs ID、人群频率、临床意义等)

实战:配置并验证数据库路径

讲完了库的作用,来点能动手的东西。
我提供一个小脚本,帮你检查当前 Funcotator 环境里已经配置了哪些内置数据库:

#!/bin/bash
# 检查 Funcotator 内置数据库

FUNCOTATOR_DIR="/path/to/funcotator/dataSources"

echo "=== 已配置的内置数据库 ==="
for dir in gnomAD clinvar dbsnp 1000Genomes; do
    if [ -d "$FUNCOTATOR_DIR/$dir" ]; then
        echo "[可用] $dir"
        ls "$FUNCOTATOR_DIR/$dir" | head -3
    else
        echo "[未配置] $dir"
    fi
done

如果某个数据库显示“未配置”,你需要从 GATK 资源包或官方 FTP 下载对应的 .seg 文件,然后放到 dataSources 目录下。

重要提示:不同版本的人类参考基因组(GRCh37 vs GRCh38)对应不同的数据库文件,千万别混用。混用了可能会报错,或者注释结果完全不对。我踩过这个坑,一个项目跑了三天才发现用的是 GRCh37 的 gnomAD 数据搭配 GRCh38 的输入 VCF。

总结一下这四个库的核心差异:

  • gnomAD:看人群频率,尤其是稀有变异过滤
  • ClinVar:看临床意义,判断是否致病
  • dbSNP:看 rs ID,方便文献和数据库交叉引用
  • 1000 Genomes:看族裔特异性频率,适合群体遗传学研究

实际项目中,我一般会同时开启这四个库的注释。
一个位点拿到四条线索,交叉验证后再下结论,准确率会高很多。