BLAST算法基础:blastn、blastp、blastx 到底怎么选?
好,聊完了BLAST的前世今生,咱们得动手了。这一节,我跟你聊聊BLAST家族最常用的三员大将:blastn、blastp 和 blastx。
说白了,这三兄弟干的活都是「找相似」。但找的对象不一样,策略也不同。选错了,轻则结果不准,重则内存爆炸。嗯,这里要注意。
一个核心概念:你拿什么序列去比什么库?
在开工之前,你得想清楚两个问题:
- Query(查询序列)是什么? 是DNA,还是蛋白质?
- Database(目标库)是什么? 是DNA,还是蛋白质?
这三者的组合,直接决定了你用哪个BLAST程序。
blastn:DNA vs DNA,最朴素的战士
blastn 干的事最简单:查DNA序列在哪出现。它直接拿核酸序列去比对核酸数据库。
我刚开始做注释时,对 blastn 有一个误解,觉得它慢。其实不是慢,是参数没调对。对于高度相似的近缘物种,它的准确率极高。
- 比对单位:单个碱基
- 敏感度:高(用于近缘物种)
- 主要用途:物种鉴定、重复序列屏蔽、miRNA 预测、cDNA 比对回基因组
- 常用参数:
-word_size,-gapopen,-gapextend
举个例子,你有一个叶绿体基因组的测序片段,想看看它在大肠杆菌基因组里是不是有类似序列。直接上 blastn。
blastn -query query.fasta -db nt -out result.out -evalue 1e-10 -num_threads 8
-word_size 很敏感。默认值是 11。想提高灵敏度,可以降到 7,但计算量会暴增。我的习惯是:先在默认参数下跑一轮,没结果再用低 word_size 重跑。
blastp:蛋白 vs 蛋白,跨物种的桥梁
蛋白序列可比DNA序列保守得多。为什么?因为密码子有简并性。DNA变了,蛋白质不一定变。所以,当你想知道一个未知基因的功能时,最好的办法是翻译成蛋白质去找。
这就是 blastp 的价值。
「蛋白序列相似性,往往意味着功能同源性。这是我做注释以来最信任的原则之一。」
| 对比维度 | blastn | blastp |
|---|---|---|
| 查询序列类型 | 核酸 | 氨基酸 |
| 比对速度 | 快(相同长度) | 慢(但命中率更高) |
| 跨远缘物种 | 差 | 好 |
| 打分矩阵 | +5/-4 (默认) | BLOSUM62 (默认) |
我建议你在做功能注释时,优先用 blastp 去比对 Swiss-Prot 或 NR 库。跑一轮,基本能锁定80%的基因功能。
-matrix 参数我常用 BLOSUM62。但对于远源同源搜索(进化距离远),用 BLOSUM45 更高灵敏。不过速度会慢一些。
blastp -query proteins.faa -db swissprot -out blastp_output.txt -evalue 1e-5 -outfmt 6
blastx:DNA ⇨ 蛋白翻译,最聪明的侦探
这个程序是我最喜欢的一个。为什么?它能回答一个问题:一段不知道功能的DNA,翻译成蛋白质后,能比对上哪个已知蛋白?
说具体点,blastx 会先把你的DNA输入序列,按6个阅读框(3个正向 + 3个负向)实时翻译成蛋白质,然后再去比对蛋白库。
我当年在一个细菌基因组项目中,遇到一个长度很长的未知区域。用 blastn 几乎没结果,但改用 blastx 后,一下子就比对上了某个噬菌体蛋白。嗯,这就是它的威力。
- 新基因组中未注释的基因预测
- mRNA序列到蛋白库的功能映射
- 宏基因组测序中的物种与功能鉴定
- 寻找被注释遗漏的「孤儿基因」
blastx -query unknown_dna.fasta -db uniprot_sprot -out blastx_result.txt -evalue 1e-6 -max_target_seqs 5
-num_threads 不要给太高,2-4个为佳。
参数速查表:选哪个?看这
| 你有的序列 | 你要比对的库 | 推荐程序 | 备注 |
|---|---|---|---|
| DNA / RNA | DNA / RNA 数据库 | blastn | 最直观,适合模板匹配 |
| 蛋白质 | 蛋白质数据库 | blastp | 核心注释程序 |
| DNA / RNA | 蛋白质数据库 | blastx | 6框翻译,功能发现利器 |
三种BLAST的共性,我得说一句
不管哪一种,BLAST的核心机制逃不出两个阶段:
- 种子形成(Seeding): 先在序列里找短的「精确匹配词」(word)。比如默认的 word_size=3。这一步过滤掉大部分不可能的区域,计算效率飞升。
- 延伸与打分(Extension & Scoring): 找到种子后,向两边延伸,计算带缺位的全局最优比对。最终输出有一定统计显著性的 HIT(匹配结果)。
这个两阶段机制,你在跑大基因组时必须理解。为什么有的作业跑几十小时?是种子太多,还是延伸过于发散。这里可以配合调整 -xdrop_ungap 和 -xdrop_gap_final 来优化。