BLAST 基础:原理、变种与核心参数

做序列比对,BLAST 是我的首选工具。它快,而且够准。当年我刚开始做功能注释时,拿一条未知基因序列直接跑全库比对,几秒就出结果。后来才发现,如果不理解它背后的局部比对逻辑,很容易被 E-value 骗到。

这一章我们就把 BLAST 的底层机制拆开看看。你不必成为算法专家,但知道它怎么工作的,能帮你更合理地选参数、判结果。

局部比对——BLAST 的核心思想

传统全局比对(比如 Needleman-Wunsch)要求两条序列从头拼到尾,适合高度相似的序列。但生物世界很残酷——基因可能只共享一个结构域,其他部分八竿子打不着。这时候全局比对就像硬拉两个陌生人穿一条裤子,结果一塌糊涂。

BLAST 采取的是局部比对策略。它只在两条序列之间找高相似度的片段,哪怕只有几十个氨基酸匹配,剩下的部分完全不关心。我处理过一个例子:一条人类基因和一条酵母基因全局比对只有 18% 相似度,但 BLAST 却找出了一个 80 个残基的结构域,相似度高达 65%。这个结构域恰好是催化位点。

具体算法分三步:

  1. 种子(Seed)发现:把查询序列切成一个个固定长度的短片段,比如长度为 3 的氨基酸 k-mer。然后在一个预建索引里快速匹配数据库中的相同或相似片段。
  2. 延伸(Extension):从种子向两端扩展,每次加上一个字符,直到得分低于某个阈值。这个过程不加空位,纯靠替换得分。
  3. 打分与统计:用替换矩阵计算整个局部比对的得分,然后用统计学模型算出这个得分出现的概率——这就是 E-value 的前身。

你想想看,如果没有局部比对这个前提,跨物种找同源结构域会难如登天。BLAST 之所以成为经典,就是因为它抓住了生物序列“局部保守”这个本质。

三种常用变种——选错等于白跑

BLAST 家族有几十个变种,但日常最常用的就三个:blastp、blastn 和 blastx。我见过不少新手在蛋白序列库里跑核酸序列,结果全是乱匹配——因为核酸和蛋白的字母表都不一样,怎么可能对上?

变种 查询序列类型 数据库序列类型 典型场景
blastp 氨基酸 氨基酸 蛋白直系同源搜索、结构域注释
blastn 核苷酸 核苷酸 基因组比对、保守非编码区搜索
blastx 核苷酸(翻译后) 氨基酸 新基因组预测编码区、EST 注释

blastp 是最直接的蛋白 vs 蛋白。它用的替换矩阵天然适合蛋白进化距离。
blastn 做核酸比对时,比 water 这类全局工具快得多。但要注意,核酸的替换矩阵默认是 +1/-3 这种简单模型,不适合远缘物种——这个时候我会换成 megablast 参数。
blastx 是我个人最喜欢的变种。它先把核酸序列按六帧翻译成蛋白,再对蛋白数据库做比对。相当于一次解决“这个片段到底编码不编码”和“它像什么蛋白”两个问题。我做过一个宏基因组项目,用 blastx 从一堆垃圾 reads 里找出了全新的抗生素抗性基因,如果只用 blastn 根本看不到。

E-value 与得分矩阵——别只看分数

很多人打开 BLAST 结果只看 Score,分数越高越开心。但 Score 受序列长度影响巨大:一条全长的基因比对分数自然比一个短片段高。真正用来判断显著性的,是 E-value。

E-value 的官方定义是:在随机情况下,预期能出现多少次相同或更高得分的匹配。说白了,如果 E-value 是 1e-10,意味着在同样大小的随机数据库里,你平均需要跑 100 亿次才能碰到一次这么高的分数。所以 E-value 越小,匹配越靠谱。

我的个人经验阈值:
  • 同源蛋白保守域:E-value ≤ 1e-30
  • 跨物种直系同源(有完整序列):E-value ≤ 1e-20
  • 结构域水平匹配:E-value ≤ 1e-5
  • 远缘弱同源(如基因水平转移候选):E-value ≤ 0.01

低于 0.01 的匹配我一般直接忽略,除非有实验证据。

E-value 的计算依赖 得分矩阵。为什么要把氨基酸替换成另一个氨基酸的得分设成不同值?因为有些保守替换(比如 Ile → Leu)在进化中很常见,改变蛋白质结构很小,而带正电的 Arg 换成不带电的 Ser 就可能是灾难性的替换。BLOSUM62 是目前最主流的矩阵,专门针对进化距离 62% 以上的序列优化。如果你跑的是亲缘很远的序列(比如人和细菌),可以试试 BLOSUM45;很近的物种用 BLOSUM80 更好。

我曾经踩过的坑:
做植物转录组注释时,默认用了 BLOSUM62 跑 blastp。结果发现大量水稻基因和拟南芥的匹配分数偏低,E-value 在 1e-5 左右。换回 BLOSUM45 后,很多同源关系清晰的匹配 E-value 降到了 1e-20 以下。并不是序列变长了,而是矩阵参数更匹配了真实进化距离。

建议你每次跑 BLAST 前先思考:我的查询和数据库之间的平均进化距离大约是多少?然后手动指定合适的矩阵和 E-value 阈值。默认值虽然好用,但未必最优。

BLAST 局部比对流程图 BLAST 局部比对核心流程 查询序列 构建 k-mer 种子表 预建数据库索引 种子匹配(HSP 候选) 延伸(允许空位) 替换矩阵打分 统计显著性(E-value) 输出比对报告 绿色节点:预处理阶段;红色节点:比对核心;蓝色节点:输出结果;橙色节点:延伸;青色节点:打分

上图把 BLAST 执行流程串了一遍。你可以看到,得分矩阵和E-value 一起决定了最终报告的可信度。矩阵影响每一步的得分,E-value 则把得分转化为统计学显著性。这两者是 BLAST 的命门。

至于具体命令行,我们会在后面几章手把手演示。本章你只要记住:BLAST 是一个聪明的局部比对工具,选择正确的变种、设置合理的 E-value 阈值、用对替换矩阵,这三件事做好了,注释结果的质量才会有保障。