スミス-ウォーターマン アラインメント:ローカル シーケンス アラインメント
概要
二つの塩基配列から、最も似ている部分のアラインメントを見つけることを局所アラインメントlocal Alignmentと言い、その方法として最も広く使われているのがスミス-ウォーターマンアルゴリズムsmith-Waterman Algorithmを紹介する。
配列アラインメントにはあまりにも多くのケースがあるため、動的計画法を通じて効率的かつ迅速に計算する必要がある。
アルゴリズム1
Input
二つの文字列 と代替行列 が与えられているとして、次のように表示されているとしよう。
の長さは 、 の長さは だ。二つのキャラクター のペナルティは のように表され、特にギャップを表すキャラクターは と表すことにしよう。
Step 1. 初期化
空の行列 を作り、次のように最初の行、最初の列を初期化する。
Step 2. 動的計画法
と がすでに計算されていれば、 を次のように計算する。(もちろん、 は計算されているだろう。)
Ouput
行列で最もスコアが高い要素を としよう。 から始めて左、左上、上の要素から最もスコアが高い要素を選び、0に遭遇するまで止まる。二つの文字列の一部と最も似ている局所アラインメントを得る。そのスコアは だ。
例
Input
julia> s1 = "ATTAGCTCAC";
julia> s2 = "ACTATAGCGCAG";
上のように二つの塩基配列をグローバルアラインメントしよう。
julia> EDNAFULL
SubstitutionMatrix{BioSymbols.DNA,Int64}:
A C M G R S V T W Y H K D B N
A 5 -4 1 -4 1 -4 -1 -4 1 -4 -1 -4 -1 -4 -2
C -4 5 1 -4 -4 1 -1 -4 -4 1 -1 -4 -4 -1 -2
M 1 1 -1 -4 -2 -2 -1 -4 -2 -2 -1 -4 -3 -3 -1
G -4 -4 -4 5 1 1 -1 -4 -4 -4 -4 1 -1 -1 -2
R 1 -4 -2 1 -1 -2 -1 -4 -2 -4 -3 -2 -1 -3 -1
S -4 1 -2 1 -2 -1 -1 -4 -4 -2 -3 -2 -3 -1 -1
V -1 -1 -1 -1 -1 -1 -1 -4 -3 -3 -2 -3 -2 -2 -1
T -4 -4 -4 -4 -4 -4 -4 5 1 1 -1 1 -1 -1 -2
W 1 -4 -2 -4 -2 -4 -3 1 -1 -2 -1 -2 -1 -3 -1
Y -4 1 -2 -4 -4 -2 -3 1 -2 -1 -1 -2 -3 -1 -1
H -1 -1 -1 -4 -3 -3 -2 -1 -1 -1 -1 -3 -2 -2 -1
K -4 -4 -4 1 -2 -2 -3 1 -2 -2 -3 -1 -1 -1 -1
D -1 -4 -3 -1 -1 -3 -2 -1 -1 -3 -2 -1 -1 -2 -1
B -4 -1 -3 -1 -3 -1 -2 -1 -3 -1 -2 -1 -2 -1 -1
N -2 -2 -1 -2 -1 -1 -1 -2 -1 -1 -1 -1 -1 -1 -1
(underlined values are default ones)
代替行列のギャップペナルティは、線形に 点としよう。すると、使われるキャラクターは四つの主要な塩基だけで、キャラクターが一致するとき点をもらい、間違ったとき点、ギャップペナルティでをもらう。
理解を助けるため、エクセルで簡単に実装してみよう。
Step 1. クエリシーケンスを行に、リファレンスシーケンスを列にして初期化する。
Step 2. 各セルでスコアを計算する。
C3(3行3列)から次のように関数を入力して、全てのマスにコピーすればいい。
=MAX(B2+IF(C$1=$A3,5,-4), C2-5,B3-5,0)
Output. 右下からトレースバックする。
右下の隅から次のルールに従って逆に登っていく。
- 赤 ↖: 行と列がマッチしていないので、どちらかを選んでも構わない。
- オレンジ ↖: 行と列がマッチしているので、その塩基を選ぶ。
- 灰色 ← もしくは ↑: ギャップ、インデルindelを意味する。上と左のうち、相対的にスコアが高い方を選ぶ。
コード
動的計画法として、例で見たようにエクセルで簡単に実装することもできる。勉強目的ならいいが、これをずっと再利用するのは明らかに愚かなことだ。次はジュリアで同じ作業を簡単かつ迅速に実行するコードだ。
using BioAlignments
s1 = "ATTAGCTCAC";
s2 = "ACTATAGCGCAG";
scoremodel = AffineGapScoreModel(EDNAFULL, gap_open=-5, gap_extend=0);
local_result = pairalign(LocalAlignment(), s1, s2, scoremodel)
実行結果
julia> using BioAlignments
julia> s1 = "ATTAGCTCAC";
julia> s2 = "ACTATAGCGCAG";
julia> scoremodel = AffineGapScoreModel(EDNAFULL, gap_open=-5, gap_extend=0);
julia> local_result = pairalign(LocalAlignment(), s1, s2, scoremodel)
PairwiseAlignmentResult{Int64,String,String}:
score: 26
seq: 1 ATTAGCTCA 9
|| ||| ||
ref: 4 AT-AGCGCA 11
Del C. Jones, Pavel A. Pevzner. (2009). An Introduction to Bioinformatics Algorithms (Computational Molecular Biology): p181. ↩︎