BLAST 是什么?先聊聊它的来历
说到序列比对,BLAST 绝对是绕不开的工具。我刚开始做生物信息分析那会儿,第一个上手的工具就是它。
BLAST 的全称是 Basic Local Alignment Search Tool。翻译过来就是「基础局部比对搜索工具」。你想想看,一天要处理几百上千条序列,靠眼睛去看肯定不现实。BLAST 就是帮你在海量数据库里快速找到「相似」序列的利器。
它诞生的背景也挺有意思。90 年代初,NCBI 的数据量开始爆炸式增长。老的比对算法像 FASTA,速度跟不上需求了。Altschul 他们团队就搞出了这个新工具。1990 年那篇论文,到现在引用量已经超过十万次了。可以说是生物信息学领域最经典的论文之一。
基本原理:不是全盘比对,而是找「热点」
传统的动态规划算法,比如 Smith-Waterman,虽然准,但太慢了。BLAST 走了另一条路——它只找那些「有戏」的区域。
具体来说,它会先把查询序列拆成一个个小片段,叫「单词」(word)。比如默认长度是 3 个氨基酸或 11 个碱基。然后去数据库里找这些单词的精确匹配。命中之后,再往两边延伸,看看能不能拼出更长的比对区域。
这里面有个关键参数叫「得分矩阵」。我建议你重点关注 BLOSUM62 和 PAM250。前者用于亲缘关系较近的序列,后者用于较远的。我在项目中曾经犯过糊涂,用 BLOSUM62 去比对跨物种的同源基因,结果敏感度极差。后来换成 BLOSUM80,效果才好起来。
| 得分矩阵 | 适用场景 | 默认参数 |
|---|---|---|
| BLOSUM62 | 中等相似度(62% identity) | blastp 默认 |
| BLOSUM80 | 高度相似(80% identity) | 保守域分析 |
| PAM250 | 远缘进化关系 | 进化距离较大时 |
BLAST 的几种「变体」
很多人以为 BLAST 就一个命令。其实它有好几个版本,针对不同的输入和输出。我常被问到「为什么我的核酸序列没法用 blastp 跑?」——嗯,这里要注意,类型必须匹配。
- blastn:核酸 vs 核酸。最常用的。比如你有一段 16S rRNA 序列,想找物种分类,用这个。
- blastp:蛋白质 vs 蛋白质。氨基酸层面的比对。搜索同源蛋白时用。
- blastx:核酸翻译成蛋白 vs 蛋白库。我在这方面吃过亏。有一次我有一段未知功能的 cDNA 序列,直接跑 blastn 什么也没找到。换成 blastx 后,一下就 hit 到一个远缘物种的转录因子。因为蛋白序列更保守。
- tblastn:蛋白 vs 核酸翻译库。反过来找核酸序列中的蛋白编码区。
- tblastx:核酸翻译 vs 核酸翻译。用于极远缘的比对,不过速度很慢。
输出结果怎么看?
跑完 BLAST,输出文件通常是表格格式。我常用的格式有:
# 标准表格格式 (outfmt 6)
# 列: qseqid sseqid pident length mismatch gapopen qstart qend sstart send evalue bitscore
query_01 NP_123456 98.5 245 3 1 1 245 12 256 1e-120 456
query_01 NP_789012 75.2 230 45 5 1 228 8 237 3e-45 198
这里面最重要的两列:evalue(期望值)和 bitscore(比特分)。evalue 越小说明越可信。bitscore 越大说明比对质量越高。我个人习惯先看 bitscore,因为它不受序列长度影响,更稳定。
输入序列的准备
别以为随便扔一个序列进去就行。格式不对,BLAST 会直接报错。
最常见的格式是 FASTA 格式。结构很简单:
>seq_id description
ATCGATCGATCGATCG
GCTAGCTAGCTAGCTA
这里要注意几点:
- 第一行以
>开头,后面是序列 ID 和描述。别加空格以外的符号。 - 序列行里不要有数字或空格。我见过有人把序列弄成带行号的,结果 BLAST 把数字也当成碱基了。
- 如果你有大量序列,建议用
makeblastdb先建库。后面章节会详细讲。