先看一个在线工具:
结果:
“|”代表相同的残基,“ : ”和“ . ”代表残基的相似程度,“ : ”表示比较相似(大于0),“ . ”表示不太相似(小于0),根据一个替换矩阵来衡量(对称、上下游无关),根据矩阵进行罚分。空位是gap( = insertion or deletion, indel),因为indel通常会对序列的功能产生影响,所以空位在比对中总是对应负分(空位罚分)。由于插入和删除往往涉及多个残基,所以空位罚分采用线性组合的形式:
Affine gap penalty: opening a gap receives a penalty of d; extending a gap receives a penalty of e. The total penalty for a gap with length n would be:
P e n a l t y = d + ( n − 1 ) × e Penalty = d + (n-1)\times e Penalty=d+(n−1)×e
例如:
Gap penalty: 10.0
Extend penalty: 0.5
则上图第二个gap罚分为 10 + ( 2 − 1 ) × 0.5 = 10.5 10 + (2-1)\times 0.5=10.5 10+(2−1)×0.5=10.5
最后一个gap罚分为 10 + ( 5 − 1 ) × 0.5 = 12 10 + (5-1)\times 0.5=12 10+(5−1)×0.5=12
最后将所有罚分加起来,得到总分数: 292.5 292.5 292.5
输入数据:两条序列S1和S2
参数:打分函数 scoring function f f f
输出:可使分数最大化的比对结果
arg max a l i ( f ( a l i ( S 1 , S 2 ) ) ) \argmax_{ali}(f(ali(S1, S2))) aliargmax(f(ali(S1,S2)))
两条长度相同的序列,新的比对结果能且只能通过插入空位产生,最极端的情况就是所有残基都对应空位,这时比对结果的序列长度就是2倍的序列长度,因此所有可能比对结果数目是从2n中选取n个的可能数目:
( 2 n n ) = ( 2 n ) ( n ! ) 2 \left(\begin{array}{c} 2 n \\ n \end{array}\right)=\frac{(2 n)}{(n !)^{2}} (2nn)=(n!)2(2n)
若序列长度为300,
( 2 n n ) = ( 2 n ) ! ( n ! ) 2 = ( 2 ∗ 300 ) ! ( 300 ! ) 2 ≈ 7 × 1 0 88 \left(\begin{array}{c} 2 n \\ n \end{array}\right)=\frac{(2 n) !}{(n !)^{2}}=\frac{(2 * 300) !}{(300 !)^{2}} \approx 7 \times 10^{88} (2nn)=(n!)2(2n)!=(300!)2(2∗300)!≈7×1088
这个数目约等于目前可见宇宙中所有粒子数目的一亿倍!
可见,枚举法在实践中并不可行。
一个残基可能的情况:
The best alignment that ends at a given pair of symbols is the best alignment of the sequences up to that point, plus the best alignment for the two additional symbols.
最好的比对就是之前最好的比对加上当前位置最好的比对。
动态规划是一种用来解决具有最优子结构性质的优化问题的计算机算法。局部最优解的组合就是全局最优解。
Sequence alignment with Dynamic Programming: the Formula
F ( 0 , 0 ) = 0 F ( i , j ) = max { F ( i − 1 , j − 1 ) + s ( x i , y j ) , x i 对 应 y j F ( i − 1 , j ) + d , x i 对 应 空 位 F ( i , j − 1 ) + d , y j 对 应 空 位 \begin{array}{l} F(0,0)=0 \\ F(i, j)=\max \left\{\begin{array}{l} F(i-1, j-1)+s\left(x_{i}, y_{j}\right) ,x_i对应y_j\\ F(i-1, j)+d ,x_i对应空位\\ F(i, j-1)+d,y_j对应空位 \end{array}\right. \end{array} F(0,0)=0F(i,j)=max⎩⎨⎧F(i−1,j−1)+s(xi,yj),xi对应yjF(i−1,j)+d,xi对应空位F(i,j−1)+d,yj对应空位
为了便于理解,将x,y两条序列摆在矩阵的两条边上(动态规划矩阵):
举例:
对于核酸序列
现在将两条序列按照行和列填入到动态规划矩阵中:
首先填最靠边的两排:
因为空位罚分是-5分
接下来填中间的格子:
我们先看第二行第二列的可能值,有三个:
所以这个格子应取最大值2,并画一个反向箭头表明其来源:
再看下图画圈的“-3”,有两个箭头指向它,代表这两条路径都可以得到-3这个值
下图“-6”代表最终迭代的最优打分为-6
现在,迭代做完了,需要从最后一个值“-6”向前回溯,得到最终的比对:
我们想要得到最好的比对结果,在同一个打分规则下,得到相同打分两个比对结果,都是最好的比对。
即将gap opening和gap extending分开来考虑
P e n a l t y = d + ( n − 1 ) × e Penalty = d + (n-1)\times e Penalty=d+(n−1)×e
一对残基之间可能的比对关系有三种:
M代表两个残基对上,不一定相等;X表示x序列有一个插入或者对应y上一个空位;Y表示y序列有一个插入或者对应x上一个空位。
利用计算机中有限状态机的概念,将序列之间的比对描述为在不同状态下的转移。
上一部分是对两条序列全部进行比对,也就是全局比对(Global Alignment),虽然这个算法得到了广泛地应用,但也存在一些问题。
首先,随着越来越多蛋白质序列的被测定,研究人员发现功能相关的蛋白之间虽然可能在整体蛋白序列上相差甚远,却常常具有相同的功能域,这些片段能够独立的发挥生物学功能,在不同蛋白之间相当保守,但仅靠全局比对算法显然是无法发现这些片段的。另一方面,内含子的发现使得在做核酸水平的序列比对时必须要能正确处理内含子导致的大片段的差异。因此,我们需要方法去发现相似的局部序列。
序列局部比对算法(Sequence Local Alignment, Smith-Waterman Algorithm)
F ( 0 , 0 ) = 0 F ( i , j ) = max { F ( i − 1 , j − 1 ) + s ( x i , y j ) F ( i − 1 , j ) + d F ( i , j − 1 ) + d 0 \begin{array}{l} F(0,0)=0 \\ F(i, j)=\max \left\{\begin{array}{l} F(i-1, j-1)+s\left(x_{i}, y_{j}\right) \\ F(i-1, j)+d \\ F(i, j-1)+d \\ 0 \end{array}\right. \\ \end{array} F(0,0)=0F(i,j)=max⎩⎪⎪⎨⎪⎪⎧F(i−1,j−1)+s(xi,yj)F(i−1,j)+dF(i,j−1)+d0
跟全局算法比,局部比对算法增加了一个下限0,限制了最低的分数。
所有的回溯都是局部的,获得的比对也是局部的:
Smith-Waterman算法提高了差异扩大之后,重启比对的能力,从而可以有效地发现局部水平上的相似性,也说明了动态规划算法的灵活性。