4. 序列比对原理:参考基因组选择、索引构建、比对算法简介
拿到测序仪吐出来的 reads 之后,第一步是什么?
我个人的习惯,是先安静地想清楚一个问题:我要把这些短片段贴到哪张地图上?
这个“地图”就是参考基因组。没有它,你手里的几千万条 reads 就是一盘散沙。几年前我第一次做 RNA-seq 时,随便下了一个参考基因组版本就跑流程,结果发现基因注释老对不上。后来才意识到,参考基因组的选择直接影响后面所有分析的质量。
好了,咱们一步步拆解。序列比对的核心流程可以概括为三步:选基因组 → 建索引 → 做比对。
4.1 参考基因组选择——选对地图,事半功倍
参考基因组说白了就是一个物种的“标准模板”。通常以 FASTA 格式存放,里面是一堆染色体序列和 scaffolds。选择时我主要看三个指标:组装质量、版本号、文件格式。
| 考量维度 | 说明 | 我的建议 |
|---|---|---|
| 组装质量 | 基因组是否完整,gap 多不多 | 优先选染色体级别 (chromosome-level) 的组装 |
| 版本号 | GRCh38 vs GRCh37 / hg38 vs hg19 | 新项目一律用最新主要版本 |
| 文件格式 | FASTA + GTF/GFF 注释是否配套 | 检查注释文件的基因名格式是否一致 |
常见的参考基因组来源有几个:Ensembl、NCBI RefSeq、UCSC Genome Browser。我个人更习惯用 Ensembl,因为它的注释比较完整,且版本命名清晰。下载时一般这样操作:
# 以人类 GRCh38 为例,从 Ensembl 下载
wget ftp://ftp.ensembl.org/pub/release-110/fasta/homo_sapiens/dna/Homo_sapiens.GRCh38.dna.primary_assembly.fa.gz
gunzip Homo_sapiens.GRCh38.dna.primary_assembly.fa.gz
# 同时下载配套注释
wget ftp://ftp.ensembl.org/pub/release-110/gtf/homo_sapiens/Homo_sapiens.GRCh38.110.gtf.gz
4.2 索引构建——给基因组建立“电话簿”
为什么要有索引?你想想看,几千万条 reads 逐条去跟全长 3Gbp 的基因组比对,那太慢了。索引的作用就是把基因组序列转化成一个可以快速检索的数据结构。
最流行的索引方案是 Burrows-Wheeler Transform (BWT) 配合 FM-index。说白了,就是先把基因组序列变换一下,再压缩存储,让搜索过程更快、更省内存。这个领域的代表作就是 BWA 和 Bowtie2 这两个工具。
不同比对工具的索引构建命令略有不同:
# BWA 索引
bwa index Homo_sapiens.GRCh38.dna.primary_assembly.fa
# 运行后你会得到 5 个文件:
# .amb, .ann, .bwt, .pac, .sa
# Bowtie2 索引
bowtie2-build Homo_sapiens.GRCh38.dna.primary_assembly.fa GRCh38
# 运行后生成 .bt2 系列文件
需要注意,索引一旦建好就可以重复使用。我通常会在服务器上建立一个共享目录,比如 /ref/genomes/,把常用物种的索引都放进去,这样不同项目之间就不用重复建索引了。建一次索引的时间取决于基因组大小,人类基因组用 BWA 大概需要 2-3 小时。
4.3 比对算法——三种思路,各有千秋
市面上主流的比对工具虽然多,但核心算法思路基本可以归为三类。我根据实际使用经验整理了一个对比表:
| 算法类型 | 代表工具 | 适用场景 | 核心原理 | 速度和准确率 |
|---|---|---|---|---|
| BWT + FM-index | BWA-MEM, Bowtie2 | 常规 WGS、WES、RNA-seq | 基于 Burrows-Wheeler 变换的精确匹配,再允许少量错配和 gap | 速度快,内存低,准确率不错 |
| 哈希表(Hash-based) | BWA-backtrack, MAQ | 短 reads(≤100bp)、早期数据分析 | 将 reads 的 k-mer 或基因组位置映射到哈希表中 | 短 reads 时速度较快,长 reads 时性能下降明显 |
| Seed-and-extend | STAR, HISAT2 | RNA-seq 剪接比对、长 reads | 先找小段精确匹配(seed),再向两端延伸并合并 | 能处理剪接位点和结构变异,但内存消耗大 |
我最常用的是 BWA-MEM。它能处理 70bp 到 1Mbp 的 reads,准确率也很稳。RNA-seq 场景下我会换用 STAR,因为它能高效处理剪接位点的比对。操作起来很简单:
# BWA-MEM 比对(单端)
bwa mem -t 8 Homo_sapiens.GRCh38.dna.primary_assembly.fa sample_R1.fastq.gz > aligned.sam
# BWA-MEM 比对(双端)
bwa mem -t 8 Homo_sapiens.GRCh38.dna.primary_assembly.fa sample_R1.fastq.gz sample_R2.fastq.gz > aligned.sam
# 参数说明
# -t 8:使用 8 个线程
# -M:短 split reads 标记为 secondary(Picard 流程常用)
比对完成后你会得到一个 SAM 文件。这里面每一行记录了一条 read 的比对信息:比对位置、CIGAR 字符串、MAPQ(比对质量分数)等等。我一般会先看一下 MAPQ 的分布,大致评估比对质量。
4.4 实操中的几个小经验
- 检查重复率:比对跑完后,用
samtools flagstat看一下有多少 reads 比对不上。如果比对率低于 70%,先检查参考基因组版本是否正确。 - 内存监控:BWA-MEM 用 8 线程时内存大概 5-6GB,STAR 起步就在 30GB 以上。跑之前用
top或htop看一眼。 - 输出格式转换:SAM 文件很大,通常转成 BAM(二进制)来节省空间。这一步用
samtools view就能搞定。
# 查看比对统计
samtools flagstat aligned.sam
# 转换 SAM 到 BAM,并排序
samtools view -bS aligned.sam | samtools sort -o aligned.sorted.bam
samtools index aligned.sorted.bam
我记得有一次做微生物组分析,参考基因组用的是从 NCBI 下的一个不完整组装版本。跑完比对后一看,70% 的 reads 都没比对上去。换了一个更完整的参考版本后,比对率直接升到 95%。这给我的教训就是:花 10 分钟选择合适的参考基因组,能省掉 10 小时的排错时间。
好,这章的内容就到这儿。核心点你们记一下:选对参考基因组版本 → 建好索引 → 用对的比对工具。这三步走稳了,后面的特征矩阵才能建得扎实。