Accessibility Tools

- Le blog participatif de bioinformatique francophone depuis 2012 -

Alignement de séquences : bien comprendre l'incontournable algorithme de Needleman-Wunsch

Mots à aligner

Introduction

L'analyse des séquences bio­lo­giques (ADN, ARN ou pro­téines) est un sujet cen­tral de la bio­lo­gie molé­cu­laire et de la bio­in­for­ma­tique. Dans ce cadre, cher­cher à savoir à quel point deux séquences sont simi­laires ou dis­si­mi­laires est une des ques­tions qu'on se pose le plus sou­vent (par exemple dans le but d'analyser des rela­tions phy­lo­gé­né­tiques). Alors com­ment fait-on pour quan­ti­fier cette dis­si­mi­la­ri­té ?

La dis­si­mi­la­ri­té entre deux séquences peut se mesu­rer sim­ple­ment par le nombre mini­mal de trans­for­ma­tions qui sont néces­saires pour pas­ser de l'une à l'autre. On pour­rait donc comp­ter les dif­fé­rences posi­tion par posi­tion. Disons que l'on ait les deux séquences de 11 nucléo­tides sui­vantes :

Com­bien de dif­fé­rences comp­tez-vous ? Posi­tion par posi­tion on compte 9 dif­fé­rences. En fait, seuls le pre­mier et le der­nier nucléo­tides sont iden­tiques. Le pro­blème est que si nous déca­lons les séquences, comme ci-des­sous, nous obte­nons un résul­tat dif­fé­rent.

Même en comp­tant les deux lacunes (ou gaps) repré­sen­tées par des tirets comme des dif­fé­rences, cet ali­gne­ment n'en com­porte plus que 7. Ici nous n'avons fait que déca­ler la tota­li­té de la deuxième séquence d'un cran par rap­port à la pre­mière, mais nous pour­rions aus­si pla­cer des lacunes à l'intérieur des séquences pour amé­lio­rer l'alignement et ain­si dimi­nuer leur dis­si­mi­la­ri­té.

Ain­si dans l'alignement ci-des­sus on ne compte plus que 5 dif­fé­rences. Il est tout à fait légi­time de cher­cher à pla­cer des lacunes au sein même des séquences puisque les muta­tions bio­lo­giques peuvent être non seule­ment des sub­sti­tu­tions (rem­pla­ce­ments de nucléo­tides) mais aus­si des inser­tions ou des délé­tions (sup­pres­sions) de nucléo­tides.

Peut-on faire encore mieux ? Peut-on amé­lio­rer cet ali­gne­ment pour dimi­nuer encore le nombre de dif­fé­rences ? Juger de l'optimalité d'un ali­gne­ment à l'œil nu est impos­sible. Il nous faut un algo­rithme per­met­tant de le véri­fier.

C'est là qu'entre en jeu l'algo­rithme de Need­le­man-Wunsch, un grand clas­sique de la bio­in­for­ma­tique. Mais ses appli­ca­tions vont bien au-delà du domaine de la bio­lo­gie. Par exemple, c'est ce même algo­rithme qu'on uti­lise pour cal­cu­ler la dis­tance d'édition entre tous les mots du dic­tion­naire et le mot que vous avez mal ortho­gra­phié (donc absent du dic­tion­naire) et qui est sou­li­gné avec des zig­zags rouges par votre logi­ciel de trai­te­ment de texte, afin de vous sug­gé­rer une petite liste de mots très simi­laires pour le rem­pla­cer.

Je ne ren­tre­rai pas ici dans les détails com­plexes de l'alignement mul­tiple de séquences (ou MSA pour Mul­tiple Sequence Ali­gne­ment) ni dans la jungle des logi­ciels per­met­tant de pro­duire de tels ali­gne­ments. L'objectif de cet article est plu­tôt de vous expli­quer le prin­cipe de base per­met­tant d'aligner seule­ment deux séquences. En bonus je vous offre une implé­men­ta­tion de Need­le­man-Wunsch en annexe à la fin de l'article.

Capture d'écran d'EduAlign
Si vous sou­hai­tez obser­ver de manière inter­ac­tive le dérou­le­ment de l'algorithme de Need­le­man-Wunsch vous pou­vez aller vous amu­ser à ali­gner tout ce que vous vou­lez avec ma petite appli­ca­tion en ligne EduA­li­gn ! Mais je vous conseille d'abord de finir votre lec­ture du pré­sent article. 🙂

1. La distance d'édition

La dis­tance d'édition est le nombre mini­mal d'opérations néces­saires pour trans­for­mer une chaîne de carac­tères en une autre. Les trois opé­ra­tions auto­ri­sées sont l'insertion d'un carac­tère, la sup­pres­sion (délé­tion) d'un carac­tère, et le rem­pla­ce­ment (sub­sti­tu­tion) d'un carac­tère.

Quelle est par exemple la dis­tance d'édition entre les mots SANG et ETANG ? Une manière simple de pro­cé­der serait de sup­pri­mer les 4 carac­tères de SANG puis d'insérer les 5 carac­tères de ETANG, ce qui fait 9 opé­ra­tions. Ce n'est évi­dem­ment pas opti­mal.

Vous avez sans doute remar­qué que les trois der­nières lettres sont iden­tiques. Il est donc pos­sible de trans­for­mer le mot SANG en insé­rant un E au début puis en rem­pla­çant le S par un T. Il n'est pas pos­sible de faire plus court, la dis­tance d'édition est par consé­quent de 2 (remar­quez que rem­pla­cer une lettre par une autre n'est pas équi­valent à une délé­tion sui­vie d'une inser­tion car cela comp­te­rait comme deux opé­ra­tions et non une seule).

En fait, toute suite d'opérations trans­for­mant une séquence en une autre cor­res­pond à un ali­gne­ment par­ti­cu­lier. Par exemple sup­pri­mer toutes les lettres de SANG et insé­rer toutes les lettres de ETANG cor­res­pond à cet ali­gne­ment :

Les deux opé­ra­tions opti­males, insé­rer le E et chan­ger le S en T, cor­res­pondent à l'alignement sui­vant :

2. Dénombrer et représenter les alignements

Com­bien d'alignements dif­fé­rents existe-t-il ? La réponse à cette ques­tion s'appelle le nombre de Delan­noy (m et n étant les lon­gueurs des deux séquences) :

D(m,n)=\sum_{k=0}^{\min(m,n)} \binom{m}{k}\binom{n}{k}2^k

Ce qu'il faut en rete­nir c'est que ce nombre croît très rapi­de­ment. Pour notre tout petit cas de 4 et 5 lettres, cela donne déjà 681 ali­gne­ments dif­fé­rents ! Et pour le couple de séquences de 11 nucléo­tides vu en intro­duc­tion cela donne 45 046 719 ali­gne­ments. Il est clair qu'on ne va pas tous les exa­mi­ner un par un… Quoique ?

Bien qu'il ne soit pas envi­sa­geable de lis­ter expli­ci­te­ment tous ces ali­gne­ments dif­fé­rents, il est pos­sible de les repré­sen­ter comme des che­mins dans une matrice en deux dimen­sions.

Les lettres de la pre­mière séquence sont uti­li­sées comme indices des lignes et les lettres de la deuxième séquence sont uti­li­sées comme indices des colonnes. On peut alors des­si­ner le che­min sui­vant où une flèche allant vers le bas indique qu'on sup­prime la lettre de la ligne sui­vante (puisqu'on par­court les indices de la séquence SANG alors que l'indice de la séquence ETANG ne change pas), et où une flèche allant vers la droite indique qu'on insère la lettre de la colonne sui­vante (puisque l'indice de la séquence SANG ne change pas alors qu'on par­court les indices de ETANG).

ETANG
S
A
N
G
Ce che­min se lit : sup­pri­mer S, sup­pri­mer A, sup­pri­mer N, sup­pri­mer G, insé­rer E, insé­rer T, insé­rer A, insé­rer N, insé­rer G.

Nous avons bien sûr vu pré­cé­dem­ment que cet ali­gne­ment n'était pas du tout opti­mal. Voi­ci main­te­nant le che­min sui­vi par le meilleur ali­gne­ment, la flèche en dia­go­nal signi­fie qu'on réa­lise une sub­sti­tu­tion de la lettre de la ligne sui­vante par la lettre de la colonne sui­vante, ou bien que ces deux lettres sont iden­tiques :

ETANG
S
A
N
G
Ce che­min se lit : insé­rer E, rem­pla­cer S par T, ne rien chan­ger au A, ne rien chan­ger au N, ne rien chan­ger au G.

Les che­mins repré­sen­tés dans ces matrices doivent tou­jours relier la cel­lule tout en haut à gauche et la cel­lule tout en bas à droite.

3. Les paramètres de score

Dans ces matrices chaque mou­ve­ment réa­li­sé a un coût. Ces coûts s'ajoutent lorsqu'on par­court le che­min, et on obtient ain­si un score d'alignement lorsqu'on atteint la cel­lule d'arrivée. Trou­ver l'ali­gne­ment opti­mal revient donc à trou­ver le che­min qui maxi­mise ce score d'alignement. Lorsque les indels (insertions/​délétions ou gaps) et les sub­sti­tu­tions (mis­matches) ont une péna­li­té de -1 et que les iden­ti­tés (matches) ont un coût de 0, alors le score d'alignement est égal à l'opposé de la dis­tance d'édition. On uti­lise géné­ra­le­ment ces para­mètres dans les cor­rec­teurs d'orthographe, mais ils ne sont pas adap­tés aux séquences d'ADN ou de pro­téines, où il est impor­tant d'attribuer une récom­pense posi­tive aux iden­ti­tés.

Avec les para­mètres match = 1 /​ mis­match = -1 /​ gap = -1, l'alignement sui­vant a un score d'alignement de 1 (-1, -1, +1, +1, +1) :

Et l'alignement sui­vant a un score d'alignement de 2 (+1, -1, +1, +1, -1, +1, +1, -1, +1, -1, -1, +1) :

On peut bien sûr uti­li­ser des para­mètres beau­coup plus com­plexes (par exemple péna­li­ser davan­tage les trans­ver­sions que les tran­si­tions) mais cela ne change rien au prin­cipe de l'algorithme. Le score d'alignement peut être posi­tif ou néga­tif, cela ne change rien non plus au fait qu'on cherche à le maxi­mi­ser.

4. La notion d'homologie moléculaire

Mais pour­quoi au juste est-il néces­saire de récom­pen­ser les iden­ti­tés pour les séquences bio­lo­giques ? Obser­vons atten­ti­ve­ment l'exemple sui­vant.

Ali­gne­ment opti­mal avec les para­mètres match = 0 /​ mis­match = -1 /​ gap = -1 :

Ali­gne­ment opti­mal avec les para­mètres match = 1 /​ mis­match = -1 /​ gap = -1 :

Si on ne récom­pense pas les iden­ti­tés le pre­mier ali­gne­ment a un score de -11 à cause de 11 sub­sti­tu­tions, alors que le deuxième a un score de -12 à cause des 12 indels, le pre­mier est donc opti­mal. On voit pour­tant que le deuxième a bio­lo­gi­que­ment plus de sens, puisqu'il aligne la sous-chaîne de 5 A. L'interprétation du pre­mier ali­gne­ment serait que cette sous-chaîne de 5 A est appa­rue indé­pen­dam­ment dans les deux séquences.

Au contraire l'interprétation du deuxième ali­gne­ment serait que cette sous-chaîne de 5 A est homo­logue dans les deux séquences et donc qu'elle a été héri­tée d'un ancêtre com­mun. La simi­la­ri­té entre deux séquences est un indice de leur poten­tielle homo­lo­gie qui doit être pris en compte lors de l'alignement. En attri­buant une récom­pense de 1 aux iden­ti­tés le pre­mier ali­gne­ment a main­te­nant un score de -5 (à cause des 6 T iden­tiques) et le deuxième ali­gne­ment a un score de -1 (à cause des 6 T et des 5 A iden­tiques), le deuxième est donc opti­mal.

Il existe plu­sieurs cri­tères clas­siques (que nous ne détaille­rons pas) per­met­tant de for­mu­ler une hypo­thèse d'homologie entre deux carac­tères ana­to­miques, et ce sont les mêmes cri­tères qu'on uti­lise en bio­lo­gie molé­cu­laire. Le pre­mier d'entre eux est évi­dem­ment la simi­la­ri­té des struc­tures. Plus deux carac­tères ana­to­miques sont simi­laires et moins il est pro­bable qu'ils soient appa­rus indé­pen­dam­ment, cela est d'autant plus vrai que ces carac­tères sont com­plexes. En termes molé­cu­laires, cela revient à juger comme plus pro­ba­ble­ment homo­logues les sous-chaînes qui sont davan­tage simi­laires, sur­tout si elles sont longues. Le fait de récom­pen­ser les iden­ti­tés dans le cal­cul du score reflète bien ce cri­tère intui­ti­ve­ment.

Il arrive cepen­dant qu'une struc­ture ana­to­mique soit tel­le­ment modi­fiée au cours de l'évolution que la simi­la­ri­té ne soit plus un cri­tère suf­fi­sant pour recon­naître cette homo­lo­gie, par exemple une aile de chauve-sou­ris et une nageoire de dau­phin qui sont tous les deux des membres chi­ri­diens homo­logues. Dans de tels cas c'est le cri­tère de posi­tion qui peut nous venir en aide : deux struc­tures homo­logues devraient être posi­tion­nées de la même façon par rap­port aux struc­tures voi­sines, elles-mêmes déjà recon­nues comme homo­logues (ce cri­tère a été for­mu­lé par Étienne Geof­froy Saint-Hilaire sous le nom de "prin­cipe des connexions").

Ain­si l'aile de la chauve-sou­ris et la nageoire du dau­phin s'articulent sur le même os, la sca­pu­la (omo­plate), avec les mêmes muscles, et reçoivent les mêmes nerfs et les mêmes artères. En bio­lo­gie molé­cu­laire, si deux sous-chaînes dis­si­mi­laires dans dif­fé­rentes séquences sont enca­drées par des sous-chaînes homo­logues, alors elles pour­raient être consi­dé­rées comme homo­logues elles aus­si. Obser­vons ce der­nier exemple pour com­ment ce cri­tère s'applique concrè­te­ment aux séquences bio­lo­giques.

Ali­gne­ment opti­mal avec les para­mètres match = 0 /​ mis­match = -1 /​ gap = -1 :

Ali­gne­ment opti­mal avec les para­mètres match = 1 /​ mis­match = -1 /​ gap = -1 :

On voit que la récom­pense pour les iden­ti­tés nous per­met de recon­naître comme homo­logues les 3 posi­tions cen­trales occu­pées par AAA et GGG dans les deux séquences alors qu'il n'y a aucune iden­ti­té entre ces deux sous-chaînes ! Cela est dû au fait que cette récom­pense per­met la recon­nais­sance de l'homologie des deux sous-chaînes qui flanquent ces 3 posi­tions cen­trales : à gauche TTTATT dans la pre­mière séquence et TTTTTT dans la deuxième séquence (une seule dif­fé­rence sur 6 posi­tions), à droite TTTAGTT dans la pre­mière séquence et TTTTTTT (deux dif­fé­rences sur 7 posi­tions). C'est donc parce que les sous-chaînes flan­quantes ont été recon­nues comme homo­logues que les sous-chaînes cen­trales ont été ali­gnées.

5. La relation de récurrence de Needleman-Wunsch

L'algorithme de Need­le­man-Wunsch repose sur le prin­cipe de la pro­gram­ma­tion dyna­mique pour résoudre le pro­blème de l'alignement glo­bal opti­mal (le pro­blème de l'alignement local uti­lise une variante, l'algorithme de Smith-Water­man, que nous n'aborderons pas ici). L'idée est de décom­po­ser le pro­blème en sous-pro­blèmes plus simples. Ain­si, au lieu de ten­ter d'aligner direc­te­ment les deux séquences de lon­gueurs m et n, on cherche d'abord à ali­gner des séquences plus courtes, les i (de 0 à m) pre­miers carac­tères de la pre­mière séquence et les j (de 0 à n) pre­miers carac­tères de la deuxième séquence. L'ensemble de ces ali­gne­ments peut donc être repré­sen­té dans une matrice des scores maxi­maux S de dimen­sions (m+1) \times (n+1).

Tout d'abord, l'alignement opti­mal et le score maxi­mal cor­res­pon­dant sont évi­dents si l'une des deux chaînes est vide (0 carac­tère). Le seul moyen d'aligner les i pre­miers carac­tères de la pre­mière séquence avec 0 carac­tère de la deuxième séquence, c'est tout sim­ple­ment de sup­pri­mer ces i carac­tères pour obte­nir la séquence vide. Le score sera donc égal à S(i, 0) = i \times gap. De même, le seul moyen d'aligner 0 carac­tère de la pre­mière séquence avec j carac­tères de la deuxième séquence c'est d'insérer ces j carac­tères dans la pre­mière chaîne vide. Le score sera donc égal à S(0, j) = j \times gap. Ces deux types d'alignements tri­viaux cor­res­pondent res­pec­ti­ve­ment à l'initialisation de la pre­mière colonne et de la pre­mière ligne de la matrice S.

ETANG
0-1-2-3-4-5
S-1
A-2
N-3
G-4
Exemple de matrice des scores ini­tia­li­sée avec les ali­gne­ments tri­viaux contre des séquences vides.

On veut main­te­nant déter­mi­ner S(i,j).

Admet­tons que l'alignement opti­mal cor­res­pon­dant est connu et donc que S(i,j) est bien le score maxi­mal. La der­nière opé­ra­tion pour trans­for­mer de manière opti­male la pre­mière séquence en la deuxième séquence est néces­sai­re­ment :

  • l'insertion du der­nier carac­tère j-1 de la deuxième séquence ;
  • la délé­tion du der­nier carac­tère i-1 de la pre­mière séquence ;
  • ou bien la "sub­sti­tu­tion" du der­nier carac­tère i-1 de la pre­mière séquence par le der­nier carac­tère j-1 de la deuxième séquence (ce qu'on compte comme un match si les deux carac­tères sont iden­tiques).

Ces trois opé­ra­tions cor­res­pondent à l'une des trois flèches pos­sibles que nous avons vu pré­cé­dem­ment (cf. Sec­tion 2).

Disons qu'on se trouve dans le pre­mier cas de figure et que la der­nière opé­ra­tion est l'insertion du carac­tère j-1 de la deuxième séquence. Cela signi­fie que juste avant cette der­nière inser­tion on a déjà ali­gné les i pre­miers carac­tères de la pre­mière séquence et les j-1 pre­miers carac­tères de la deuxième séquence (Atten­tion à la numé­ro­ta­tion : le i-ième carac­tère d'une séquence se trouve en posi­tion i-1 dans ladite séquence puisque la pre­mière posi­tion est en posi­tion 0 !). Si cet ali­gne­ment a un score A, alors S(i,j)=A+gap, puisque gap est le coût de la der­nière opé­ra­tion. On remarque alors que si A n'est pas maxi­mi­sé alors S(i,j) ne peut pas non plus être maxi­mi­sé, ce qui contre­dit notre hypo­thèse. Cette démons­tra­tion par l'absurde prouve donc que A=S(i,j-1).

Par un rai­son­ne­ment simi­laire on peut démon­trer que si S(i,j) est maxi­mal et que la der­nière opé­ra­tion trans­for­mant la pre­mière séquence en la deuxième séquence est la délé­tion du der­nier carac­tère i-1 de la pre­mière séquence, alors S(i,j)=S(i-1,j)+gap. De même si S(i,j) est maxi­mal et que la der­nière opé­ra­tion trans­for­mant la pre­mière séquence en la deuxième séquence est une "sub­sti­tu­tion" du der­nier carac­tère i-1 de la pre­mière séquence par le der­nier carac­tère j-1 de la deuxième séquence alors S(i,j)=S(i-1,j-1)+t(i,j) avec t(i,j)=match si les carac­tères i-1 de la pre­mière séquence et j-1 de la deuxième séquence sont iden­tiques, et t(i,j)=mismatch sinon.

Dans un cas réel on ne connaît pas la der­nière opé­ra­tion, mais on veut que S(i,j) soit maxi­mi­sé, donc on choi­sit l'opération qui abou­tit au score le plus grand. Ain­si on éta­blit la rela­tion de récur­rence sui­vante :

S(i,j)=\max(S(i-1,j)+gap,S(i,j-1)+gap,S(i-1,j-1)+t(i,j))

Grâce à l'initialisation de la matrice, on connaît déjà toutes les valeurs de S(i,0) et de S(0,j). On peut donc faci­le­ment cal­cu­ler S(1,1) à l'aide de S(0,0), S(1,0) et S(0,1). Puis on passe à $S(1,2)$, etc. On peut ain­si rem­plir toute la matrice ligne par ligne. Notez qu'on peut aus­si effec­tuer ce rem­plis­sage colonne par colonne, ou bien en sui­vant les anti-dia­go­nales suc­ces­sives, le résul­tat sera le même. Une fois le rem­plis­sage ter­mi­né on trouve le score maxi­mal dans la der­nière cel­lule en bas à droite S(m,n).

ETANG
0-1-2-3-4-5
S-1-1-2-3-4-5
A-2-2-2-1-2-3
N-3-3-3-20-1
G-4-4-4-3-11
Exemple de matrice des scores com­plè­te­ment rem­plie. Appli­quez vous-mêmes la rela­tion de récur­rence pour véri­fier ces valeurs ! Le score maxi­mal pour cet ali­gne­ment est 1 (cel­lule en bas à droite).

6. Le retour sur trace (backtracking)

Une fois que la matrice des scores S est rem­plie le pro­blème de l'alignement glo­bal est presque réso­lu, il ne reste qu'à recons­ti­tuer le che­min qui relie les cel­lules S(0,0) et S(m,n). Pour cela on doit avoir préa­la­ble­ment sto­cké dans une seconde matrice B l'opération qui a per­mis d'aboutir au score maxi­mal de chaque cel­lule S(i,j). Le rem­plis­sage de cette seconde matrice se fait donc en même temps que le rem­plis­sage de la matrice S.

Par exemple, si par­mi les trois scores pos­sibles, S(i-1,j)+gap, S(i,j-1)+gap, S(i-1,j-1)+t(i,j), qu'on peut attri­buer à la cel­lule S(i,j), c'est le pre­mier qui est le plus grand, alors cela signi­fie que l'opération opti­male à cet endroit est une délé­tion du carac­tère i-1 de la pre­mière séquence. Dans la matrice des traces B on ins­crit alors une flèche vers le haut ⭡ ou tout autre code signi­fiant que le score maxi­mal pré­cé­dent cette opé­ra­tion se situe sur la ligne pré­cé­dente dans la même colonne, c'est-à-dire dans S(i-1,j).

Si c'est le second score qui est le plus grand on ins­crit une flèche vers la gauche ⭠ indi­quant que le score maxi­mal pré­cé­dent la der­nière opé­ra­tion se trouve dans la cel­lule juste à gauche, c'est-à-dire S(i,j-1). Et enfin si c'est le troi­sième score qui est le plus grand on ins­crit une flèche en dia­go­nal ⭦ indi­quant que le score maxi­mal pré­cé­dent se trouve dans S(i-1,j-1).

En cas d'égalité entre plu­sieurs de ces scores cela signi­fie que l'alignement opti­mal n'est pas unique, plu­sieurs alter­na­tives ont le même score maxi­mal. On peut alors soit déci­der d'inscrire plu­sieurs flèches dans la même cel­lule, si on sou­haite énu­mé­rer exhaus­ti­ve­ment tous les ali­gne­ments opti­maux, ou bien arbi­trai­re­ment une seule, si on ne sou­haite obte­nir qu'un seul des ali­gne­ments opti­maux. Géné­ra­le­ment c'est la seconde option est choi­sie, par sou­ci d'efficacité des cal­culs.

ETANG
S
A
N
G
Exemple de matrice des traces, construite en même temps que la matrice des scores.

L'idée est ensuite de suivre les flèches qui mènent de la cel­lule B(m,n) (le coin infé­rieur droit de la matrice) jusqu'à la cel­lule B(0,0) (le coin supé­rieur gauche). Cette étape s'appelle le retour sur trace (back­tra­cking) car on ne fait que suivre les traces qu'on a lais­sées lors de la phase de rem­plis­sage. On démarre tout en bas à droite. Si dans la case B(i,j) on ren­contre :

  • Une flèche en dia­go­nale, alors on copie dans l'alignement final le carac­tère i-1 de la pre­mière séquence ali­gnée et le carac­tère j-1 de la deuxième séquence ali­gnée.
  • Une flèche vers la gauche, alors on copie un carac­tère de gap "-" dans la pre­mière séquence ali­gnée et le carac­tère j-1 dans la deuxième séquence ali­gnée.
  • Une flèche vers le haut, alors on copie le carac­tère i-1 dans la pre­mière séquence ali­gnée et un carac­tère de gap "-" dans la deuxième séquence ali­gnée.

On conti­nue ain­si à rebours jusqu'à ce que i=0 et j=0.

Dans notre exemple avec SANG et ETANG on construit ain­si suc­ces­si­ve­ment les ali­gne­ments sui­vants :

  • B(4,5)= ⭦ , c'est une sub­sti­tu­tion (match) du carac­tère 3 de la pre­mière séquence par le carac­tère 4 de la deuxième séquence :
  • B(3,4)= ⭦ , c'est une sub­sti­tu­tion (match) du carac­tère 2 de la pre­mière séquence par le carac­tère 3 de la deuxième séquence :
  • B(2,3)= ⭦ , c'est une sub­sti­tu­tion (match) du carac­tère 1 de la pre­mière séquence par le carac­tère 2 de la deuxième séquence :
  • B(1,2)= ⭦ , c'est une sub­sti­tu­tion (mis­match) du carac­tère 0 de la pre­mière séquence par le carac­tère 1 de la deuxième séquence :
  • B(0,1)= ⭠ , c'est une inser­tion du carac­tère 0 de la deuxième séquence (ce qui cor­res­pond donc à un gap dans la pre­mière séquence) :

Et voi­là main­te­nant vous savez com­ment effec­tuer un ali­gne­ment glo­bal de deux séquences !

Conclusion

L'algorithme de Need­le­man-Wunsch a été plu­sieurs fois redé­cou­vert ou réin­ven­té dans dif­fé­rents domaines. Le nom de l'algorithme vient bien sûr de la publi­ca­tion de 1970 par Saul Need­le­man et Chris­tian Wunsch, mais ils ne sont ni les pre­miers (Vint­syuk, 1968) ni les der­niers à avoir publié cette idée (Wag­ner & Fischer, 1974). Je n'ai d'ailleurs pas pré­sen­té la ver­sion ori­gi­nale de Need­le­man et Wunsch, mais une ver­sion moder­ni­sée telle qu'elle est aujourd'hui géné­ra­le­ment ensei­gnée aux débu­tants.

Diverses amé­lio­ra­tions de cet algo­rithme sont pos­sibles, que ce soit pour le rendre plus effi­cace en termes de com­plexi­té spa­tiale ou tem­po­relle, ou bien en termes d'adé­qua­tion des para­mètres à la réa­li­té bio­lo­gique.

Par exemple en ce qui concerne les pos­sibles éco­no­mies de sto­ckage, on peut remar­quer que la matrice des scores S n'est pas utile dans son entiè­re­té. En fait seule la ligne pré­cé­dente et la ligne cou­rante sont néces­saires pour cal­cu­ler le score d'une cel­lule et ain­si enre­gis­trer le mou­ve­ment dans la matrice des traces B. Cela per­met d'économiser poten­tiel­le­ment beau­coup de place. Ima­gi­nez que vous vou­liez ali­gner deux séquences de 100000 nucléo­tides cha­cune, cela impli­que­rait de sto­cker une matrice S de 1010 cel­lules sto­ckant des nombres entiers sur 32 bits, ce qui ferait envi­ron 40 Go de don­nées occu­pant la RAM, sans même comp­ter la matrice B et le reste des don­nées…

En ce qui concerne l'adéquation aux méca­nismes bio­lo­giques, il est clas­sique de poin­ter du doigt l'irréalisme de la modé­li­sa­tion des péna­li­tés des gaps par des fonc­tions linéaires. Autre­ment dit un gap de lon­gueur k ajou­te­ra une péna­li­té de k \times d au score d'alignement, d étant la péna­li­té asso­ciée à l'insertion ou la délé­tion d'un seul nucléo­tide.

On pré­fère presque tou­jours les fonc­tions affines qui asso­cient à un gap une forte péna­li­té d'ouverture d_{ouverture} au pre­mier carac­tère "-" et une faible péna­li­té d'extension d_{extension} pour tout carac­tère "-" sup­plé­men­taire. Un gap de lon­gueur k ajou­te­ra ain­si une péna­li­té de d_{ouverture} + (k-1) \times d_{extension} au score. Cela a pour effet de pro­duire des ali­gne­ments avec des gaps moins nom­breux mais plus longs. C'est bio­lo­gi­que­ment plus plau­sible car une inser­tion ou une délé­tion peut affec­ter plu­sieurs nucléo­tides conti­gus en un seul évè­ne­ment muta­tion­nel, alors que de petits gaps dis­per­sés néces­si­te­raient la sur­ve­nue de nom­breux évè­ne­ments muta­tion­nels. De manière géné­rale, le cali­brage empi­rique pré­cis des diverses récom­penses et péna­li­tés impac­tant le score est un enjeu cen­tral dans le domaine de l'alignement des séquences.

Enfin sou­li­gnons que l'algorithme tel que je l'ai pré­sen­té ici n'est valable que pour l'alignement glo­bal de deux séquences seule­ment. Si on sou­haite ali­gner davan­tage de séquences en éten­dant naï­ve­ment la logique de Need­le­man-Wunsch, alors il fau­drait rem­plir une matrice des scores cubique pour 3 séquences, puis un hyper­cube à 4 dimen­sions pour 4 séquences, etc. Ain­si la com­plexi­té tem­po­relle de ce genre d'algorithme serait O(n^k) pour k séquences de n nucléo­tides. Il est impos­sible de recou­rir à ce genre d'algorithmes en pra­tique, et c'est pour­quoi le pro­blème de l'ali­gne­ment mul­tiple de séquences fait l'objet d'une recherche inten­sive pour trou­ver les meilleures heu­ris­tiques.

Références

  • Torres, A., Caba­da, A., & Nie­to, J. J. (2003). An exact for­mu­la for the num­ber of ali­gn­ments bet­ween two DNA sequences. DNA Sequence14(6), 427-430.
  • Gus­field, D. (1997). Algo­rithms on Strings, Trees, and Sequences : Com­pu­ter Science and Com­pu­ta­tio­nal Bio­lo­gy. Cam­bridge : Cam­bridge Uni­ver­si­ty Press.
  • Wag­ner, R. A., & Fischer, M. J. (1974). The string-to-string cor­rec­tion pro­blem. Jour­nal of the ACM (JACM), 21(1), 168-173.
  • Need­le­man, S. B., & Wunsch, C. D. (1970). A gene­ral method appli­cable to the search for simi­la­ri­ties in the ami­no acid sequence of two pro­teins. Jour­nal of mole­cu­lar bio­lo­gy, 48(3), 443-453.
  • Vint­syuk, T. K. (1968). Speech dis­cri­mi­na­tion by dyna­mic pro­gram­ming. Cyber­ne­tics, 4(1), 52-57.

Annexe : implémentation de Needleman-Wunsch en Python

Mer­ci à Léo­pold Car­ron et ZaZo0o pour la relec­ture.

Vous avez aimé ? Dites-le nous !

Moyenne : 5 /​ 5. Nb de votes : 3

Pas encore de vote pour cet article.

We are sor­ry that this post was not use­ful for you !

Let us improve this post !

Tell us how we can improve this post ?

Partagez cet article




Commentaires

Laisser un commentaire

Pour insérer du code dans vos commentaires, utilisez les balises <code> et <\code>.