4. BLAST算法原理

说了半天BLAST,其实真正决定比对质量的,就是那三个东西:评分矩阵管生化倾向,E-value管统计可信度,比对统计帮你把原始分转换成可比较的分数。我个人习惯把这三点拎出来单独讲,因为很多人在BLAST上踩的坑,根源就是对这三个参数理解有偏差。

评分矩阵:BLOSUM vs PAM

先聊评分矩阵。说白了,它就是个打分表:一个氨基酸换成另一个,该给多少分。为什么会需要这个表?因为有些替换是“保守”的(比如亮氨酸变异亮氨酸),对蛋白结构影响小;有些则是“激进”的。你想想看,如果给保守替换和高风险替换一样的分数,比对结果肯定偏掉。

两个主流系列:PAM(Point Accepted Mutation)和BLOSUM(BLOcks SUbstitution Matrix)。我给它们做了个对比表:

特性 PAM系列 BLOSUM系列
构建思想 从点突变率外推进化距离 从保守块直接观察替换频率
编号含义 PAM250 = 250个突变/100个残基 BLOSUM62 = 序列相似度 >62%的块
适用场景 远距离进化(>40%分歧) 中等距离(通用默认)
默认首选 较少使用 BLOSUM62(BLAST默认)

我记得早期做注释时,PAM矩阵很流行,但后来BLOSUM成了主流。为什么?因为BLOSUM直接拿真实比对块里的数据,更贴近实际情况。BLOSUM62里的“62”意思是,构建时只用了相似度≥62%的保守块——数字越小,矩阵越容忍分歧大的替换。如果你做跨物种远缘注释,可以试试BLOSUM45;要是做同源精细比对,BLOSUM80会更敏感。

选择合适的评分矩阵时,一个简单原则:短序列、高相似度用高BLOSUM号(如80);长序列、低相似度用低BLOSUM号(如45)。不确定时就维持默认BLOSUM62——它足够均衡。

比对统计:Karlin-Altschul 统计

把序列丢进去,BLAST算出一个原始分。然后呢?原始分本身意义不大——同一个分数,在不同数据库大小、不同序列长度下,置信度完全不同。这就是Karlin-Altschul 统计要解决的问题。

核心公式长这样:

E = K * m * n * e^(-λ * S)

其中:
λ  = 评分系统尺度因子
K  = 归一化常数
m, n = 查询与数据库序列长度
S  = 原始比对得分

你看出门道了吗?E-value依赖四个变量:λ和K是矩阵相关的内部参数,m和n是序列长度,S是你比对出的原始分。BLAST内部会预先算好λ和K,比如BLOSUM62默认的λ值和K值:

# BLAST+ 默认参数示例(BLOSUM62,gap open 11, gap extend 1)
参数:lambda 0.267,K 0.041,H 0.14

有了λ和K,BLAST算出每个比对的E-value。简单说:E-value表示在随机模型下,你预期能看到多少个同样好或更好的匹配。如果E=1,意味着胡乱找个随机序列也能撞上一次;E=0.01,说明纯属凑巧的概率很低。

E-value:最常用也最容易被误读的统计量

E-value和P-value是两回事。每次培训都有人搞混,我说清楚:

  • P-value:某次比对比当前分数更优的概率。
  • E-value:在数据库规模下,预期出现这么多高分比对的次数。

举个数:你用BLAST搜一个序列,某匹配E-value=0.05。不是说5%的概率是假的——而是说,如果你把这份数据库随机打乱再搜,平均每20次搜索才出一次这么高的分数。说白了,E-value已经帮你考虑了数据库大小和多比对的情况,比P-value更实用。

我建议你记住一点:E值越小越好。在Pfam注释实践里,通常取E-value ≤ 1e-5或1e-10作为阈值。你要是设得太宽松(比如1),一堆假阳性就进来了。

避坑提示:E-value不是“假阳性概率”,而是“预期出现次数”。我过去曾拿E=1e-3的匹配做结构域边界判断,结果发现那条匹配在结构上根本不连续——因为比对质量低,被高估了。要结合比对覆盖度(coverage)一起看,别只信E值。

比对统计的其他关键参数

除了E,BLAST输出里还有:

  • Score(原始分):由评分矩阵直接加和得到。
  • Bit-score(比特分):将原始分归一化后的分值,不随数据库大小变化。Bit-score可以跨BLAST版本比较,我习惯用它做结果排序。
  • Identity / Positives:一致性与正匹配比例,用来快速判断比对质量。

原始分转比特分的公式:

bit-score = (λ * S - ln K) / ln 2

看到没?比特分把λ和K的值嵌入进去了,所以不同矩阵跑出来的结果也能放一块比。我经常被问到:“为什么我用不同矩阵跑BLAST,E值一样但分数差很多?”——就是因为比特分已经做了归一化,比对时请优先对比特分,而不是原始分。

避坑清单:我在实际项目中踩过的雷

我曾经有个同事,查一个家族序列,设E-value阈值1e-1,结果列出几千条匹配。他以为这些都是同源域,其实大量是低复杂性区域造成的假象。类似案例我遇到过好几次:

  1. 不设低复杂度过滤:重复序列或低复杂度段会产生非常高的比对分,把E-value压得很低但毫无生物学意义。建议默认开启 -seg yes。
  2. 阈值设定过松:数据库越大,假阳性越多。我推荐先用1e-5做初筛,分析少数候选时才放宽。
  3. 忽略查询序列长度:短序列(<30 aa)做BLAST,统计信噪比很低。不要对短肽片段过分信任E值。
  4. 单一E值定乾坤:我曾碰见一个匹配E=1e-20但覆盖度只有30%,最后验证是不同结构域的错误嵌合。一定要看全长覆盖。
总结一个黄金组合:BLOSUM62 + E-value 1e-5 + Bit-score > 50 + 覆盖度 > 60%,这是我在日常Pfam注释中最稳的起点。
BLAST核心逻辑图:从序列到E-value 查询序列 选择评分矩阵 BLOSUM62(默认) / PAM250 局部比对 & 高分片段 (HSP) 原始比对得分 S Karlin-Altschul 统计模型 E = K·m·n·e^(−λ·S) 参数:λ尺标因子 · K归一化常数 · m,n序列长度 输出 E-value · Bit-score 用于注释决策与过滤 E值越小越好 注意结合查询覆盖度

嗯,我在开始讲Pfam实战之前,必须先把统计基础铺好——否则后面你看到成千上万个匹配输出,根本不知道选哪个。把评分矩阵、E-value和比对统计吃透,BLAST就不再是一个黑盒,而是你手上一把顺手的工具。