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远缘进化关系进化距离较大时
我的经验: 做突变研究时,我习惯先用 BLOSUM62 跑一轮。如果 hits 太少,再试试 PAM250。别在一棵树上吊死。

BLAST 的几种「变体」

很多人以为 BLAST 就一个命令。其实它有好几个版本,针对不同的输入和输出。我常被问到「为什么我的核酸序列没法用 blastp 跑?」——嗯,这里要注意,类型必须匹配。

  • blastn:核酸 vs 核酸。最常用的。比如你有一段 16S rRNA 序列,想找物种分类,用这个。
  • blastp:蛋白质 vs 蛋白质。氨基酸层面的比对。搜索同源蛋白时用。
  • blastx:核酸翻译成蛋白 vs 蛋白库。我在这方面吃过亏。有一次我有一段未知功能的 cDNA 序列,直接跑 blastn 什么也没找到。换成 blastx 后,一下就 hit 到一个远缘物种的转录因子。因为蛋白序列更保守。
  • tblastn:蛋白 vs 核酸翻译库。反过来找核酸序列中的蛋白编码区。
  • tblastx:核酸翻译 vs 核酸翻译。用于极远缘的比对,不过速度很慢。
BLAST 类型选择决策图 你的输入序列是什么? 核酸 (DNA/RNA) 比如 cDNA、16S 蛋白质 (氨基酸) 比如蛋白序列 比对核酸库 → blastn 最常用 翻译后比对蛋白库 → blastx 远缘 / 未知功能 比对蛋白库 → blastp 标准蛋白比对 比对核酸翻译库 → tblastn 找蛋白同源基因 两个核酸互怼 → tblastx(极远缘,速度慢) 非编码区比对慎用 ⚠️ 选了不对的类型,结果就是空集 蛋白序列别去跑 blastn,不会有结果的

输出结果怎么看?

跑完 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,因为它不受序列长度影响,更稳定。

避坑指南: evalue 别只看绝对值。比如你跑一个短序列(< 50 bp),evalue 0.01 可能已经很有意义了。但如果是全长基因,evalue 必须到 1e-50 以上才值得关注。我早期吃过这个亏,把一堆假阳性当宝贝分析了好久。

输入序列的准备

别以为随便扔一个序列进去就行。格式不对,BLAST 会直接报错。

最常见的格式是 FASTA 格式。结构很简单:

>seq_id description
ATCGATCGATCGATCG
GCTAGCTAGCTAGCTA

这里要注意几点:

  • 第一行以 > 开头,后面是序列 ID 和描述。别加空格以外的符号。
  • 序列行里不要有数字或空格。我见过有人把序列弄成带行号的,结果 BLAST 把数字也当成碱基了。
  • 如果你有大量序列,建议用 makeblastdb 先建库。后面章节会详细讲。