BLAST算法基础:blastn、blastp、blastx 到底怎么选?

好,聊完了BLAST的前世今生,咱们得动手了。这一节,我跟你聊聊BLAST家族最常用的三员大将:blastn、blastp 和 blastx。

说白了,这三兄弟干的活都是「找相似」。但找的对象不一样,策略也不同。选错了,轻则结果不准,重则内存爆炸。嗯,这里要注意。

一个核心概念:你拿什么序列去比什么库?

在开工之前,你得想清楚两个问题:

  • Query(查询序列)是什么? 是DNA,还是蛋白质?
  • Database(目标库)是什么? 是DNA,还是蛋白质?

这三者的组合,直接决定了你用哪个BLAST程序。

BLAST 程序选择决策树 你的查询序列是? 是 DNA / RNA 是蛋白质 比对 DNA 库 想查蛋白功能 blastn blastx (6-frame) blastp 简单规则:DNA vs DNA → blastn;DNA → 蛋白功能 → blastx;蛋白 vs 蛋白 → blastp

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
注意: blastn 对 -word_size 很敏感。默认值是 11。想提高灵敏度,可以降到 7,但计算量会暴增。我的习惯是:先在默认参数下跑一轮,没结果再用低 word_size 重跑。

blastp:蛋白 vs 蛋白,跨物种的桥梁

蛋白序列可比DNA序列保守得多。为什么?因为密码子有简并性。DNA变了,蛋白质不一定变。所以,当你想知道一个未知基因的功能时,最好的办法是翻译成蛋白质去找。

这就是 blastp 的价值。

「蛋白序列相似性,往往意味着功能同源性。这是我做注释以来最信任的原则之一。」

对比维度 blastn blastp
查询序列类型 核酸 氨基酸
比对速度 快(相同长度) 慢(但命中率更高)
跨远缘物种 差 好
打分矩阵 +5/-4 (默认) BLOSUM62 (默认)

我建议你在做功能注释时,优先用 blastp 去比对 Swiss-Prot 或 NR 库。跑一轮,基本能锁定80%的基因功能。

小技巧: blastp 的 -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
避坑指南: blastx 计算量远大于 blastn。我曾经在服务器上同时丢10个任务,结果直接把内存打满了。建议:-num_threads 不要给太高,2-4个为佳。

参数速查表:选哪个?看这

你有的序列你要比对的库推荐程序备注
DNA / RNADNA / RNA 数据库blastn最直观,适合模板匹配
蛋白质蛋白质数据库blastp核心注释程序
DNA / RNA蛋白质数据库blastx6框翻译,功能发现利器

三种BLAST的共性,我得说一句

不管哪一种,BLAST的核心机制逃不出两个阶段:

  1. 种子形成(Seeding): 先在序列里找短的「精确匹配词」(word)。比如默认的 word_size=3。这一步过滤掉大部分不可能的区域,计算效率飞升。
  2. 延伸与打分(Extension & Scoring): 找到种子后,向两边延伸,计算带缺位的全局最优比对。最终输出有一定统计显著性的 HIT(匹配结果)。

这个两阶段机制,你在跑大基因组时必须理解。为什么有的作业跑几十小时?是种子太多,还是延伸过于发散。这里可以配合调整 -xdrop_ungap 和 -xdrop_gap_final 来优化。