Bien que je m’empêche de réagir à chaud, l’actualité médiatique est une source permanente d’inspiration. Alors quand les mathématiciens avertissent du desintérêt croissant pour leur discipline et que l’apparition de virus HINI mutants crée des frayeurs, l’envie me prend de dire quelques mots mêlant modèle mathématique et mutations dans des séquences d’ADN.
Attention le billet est long mais à la fin puisse votre persévérance être récompensée. Non seulement vous connaîtrez une formule estimant la distance entre deux séquences d’ADN, mais vous serez aussi passés par toutes les étapes du calcul (ce qui est généralement négligé partout ailleurs sur internet). Et puis le fait de rentrer dans le coeur d’un modèle, suivant pas à pas la démarche du modélisateur, pourrait réconcilier certains lecteurs avec les maths ? En tout cas moi ça m’a bien servi d’écrire ce billet.
On l’a vu précédemment, l’ADN est la molécule support de l’information génétique. Elle est formée de quatre “briques” appelées nucléotides, chacune symbolisée par une lettre: A, T, G et C. Chaque cellule possède une molécule d’ADN qui est copiée dans son intégralité au moment de la division cellulaire. Or, lors de cette réplication, des erreurs peuvent être commises, par exemple un A remplacé par un G. On parle alors de mutation (de substitution pour être plus précis). Par simplicité on ne traite pas le cas des insertions/délétions.
Depuis les années 1970, avec la possibilité de séquencer de l’ADN, on peut observer un fragment du génome d’un organisme et le comparer avec le même fragment mais provenant d’un autre organisme. En alignant ces deux séquences, on peut avoir une idée du nombre de match (:) et mismatch (*) les séparant, comme le montre l’image ci-dessous:

figure 1: un alignement global entre deux séquences d’ADN
En voyant cela, on se rappelle qu’une séquence d’ADN est une chaîne de caractères de longueur finie. Chaque position est appelée un site. Chaque site est dans un état particulier parmi quatre possibles (A, T, G ou C). Lorsque plusieurs séquences ont un ancêtre commun, on parle de séquence homologues. Sur la figure 1 la séquence
et la séquence
ont la même longueur
, 20 nucléotides, l’alignement résultant a donc 20 sites.
Pour mesurer la distance entre deux séquences, le plus simples est de calculer la proportion de sites différents. Sur la figure 1 une distance de 0.1 sépare la séquence
de la séquence
(2 mismatches sur 20 sites). Le problème c’est qu’en faisant cela on néglige les mutations cachées. Par exemple au site n°2 supposons que l’ancêtre commun ait été le nucléotide A. La séquence
n’a pas eu de mutation mais la séquence
aurait pu en avoir deux, d’abord de A vers C puis de C vers A. Or avec la distance décrite ci-dessus on ne compte pas de mutation puisque les deux séquences sont dans l’état A au 2e site. Dans la même veine, au 8e site supposons que la séquence ancestrale ait été dans l’état G. Aujourd’hui on observe que la séquence
est toujours dans l’état G mais la séquence
est dans l’état A, on compte donc une mutation, mais qui nous dit qu’il n’y en a pas eu plusieurs, par exemple de G vers T puis de T vers A ? Alors allons-y, écrivons un modèle mathématique prenant cela en compte !
On suppose que tous les sites suivent la même distribution de probabilités et que chaque site évolue de façon indépendante des autres. Ainsi la probabilité de passer de la séquence
à la séquence
(toutes les deux de longueur
) est donnée par:
![\mathbb{P}( S_1 \rightarrow S_2 ) = \displaystyle \prod_{i = 1} ^L \mathbb{P}( S_1[i] \rightarrow S_2[i] ) \mathbb{P}( S_1 \rightarrow S_2 ) = \displaystyle \prod_{i = 1} ^L \mathbb{P}( S_1[i] \rightarrow S_2[i] )](http://s0.wp.com/latex.php?latex=%5Cmathbb%7BP%7D%28+S_1+%5Crightarrow+S_2+%29+%3D+%5Cdisplaystyle+%5Cprod_%7Bi+%3D+1%7D+%5EL+%5Cmathbb%7BP%7D%28+S_1%5Bi%5D+%5Crightarrow+S_2%5Bi%5D+%29&bg=ffffff&fg=333333&s=0)
Dire que deux probabilités sont indépendantes revient à les multiplier. Comme on suppose que tous les suites suivent la même loi de probabilité, on peut se concentrer sur l’évolution d’un seul site. Grâce à la formule ci-dessus, si on arrive à modéliser
on arrivera à modéliser
.
Supposons maintenant que le temps avance en “tic”, comme les aiguilles d’une horloge, et qu’à chaque “tic” une mutation peut subvenir ou non. Pour modéliser cela on va utiliser une chaîne de Markov. Une chaine de Markov est un processus stochastique (synonyme de probabiliste). Par exemple, si on note
l’évènement “le dé jeté affiche la valeur
“, on dit que
est une variable aléatoire prenant les valeurs
. Et bien, si on étudie plusieurs lancés de dé au cours du temps, on se retrouve à étudier un processus probabiliste: pas compliqué…
Si maintenant on considère que la probabilité au temps
ne dépend que de l’état présent, c’est-à-dire du temps
, et non des états passés, les temps
, etc, on dit que le processus possède la propriété de Markov. Résumé d’une autre façon: “le futur ne dépend du passé qu’au travers de l’instant présent”. Et c’est tout naturellement ce qui arrive en génétique: une mutation à la génération des petit-enfants ne va pas dépendre du nucléotide en question à la générations des grand-parents mais uniquement du nucléotide en question à la génération des parents.
Une chaîne de Markov est caractérisée par sa matrice de transition P. Quand on modélise l’évolution d’une séquence d’ADN, la chaîne a 4 états (pour A, T, G et C), et la matrice aura 4 lignes et 4 colonnes. La valeur au croisement de la ligne
et de la colonne
est la probabilité
d’être dans l’état
et de passer dans l’état
.
En 1969, Jukes et Cantor proposaient de modéliser l’évolution d’une séquence via une chaîne de Markov sous l’hypothèse que la probabilité
de passer d’un nucléotide à un autre pendant la durée
était constante au cours du temps. Voici la matrice de transition correspondante:

Je précise de manière arbitraire que les 1e ligne et colonne correspondent au nucléotide A, les 2e au nucléotide T, les 3e à G et les 4e à C:
à l’intersection de la 2e ligne et de la 3e colonne est la probabilité que le site soit dans l’état T et mute vers l’état G.


Si on est à la génération
et que le nucléotide que l’on est en train d’analyser est un “A”, deux scénarios sont possibles:
- il y a une mutation, de A vers T, G ou C, chaque évènement ayant une probability
d’arriver;
- il n’y a pas de mutation, ceci avec une probabilité
(la somme de tous les évènements doit faire 1).
Maintenant calculons
et pour ceci commençons par différencier la matrice de transition
, c’est-à-dire regardons ce que vaut cette matrice P à l’instant
(c’est-à-dire très peu de temps après l’instant
) on a:

Donc si maintenant on fait tendre
vers
(ça vous rappelle la définition de la dérivée n’est-ce pas ?):





Ainsi: 

Posons
, on a alors:

En multipliant, par exemple, la 1e ligne de
avec la 2e colonne de
on obtient:


Or on sait aussi que si
, on a
.
C’est-à-dire: 
Et maintenant on intègre cette équation différentielle:





Il nous faut maintenant calculer
qui est la constance d’intégration. Pour cela supposons que
ce qui signifie qu’au temps
on commence dans un état constant. Par exemple, si à
on est dans l’état A alors la probabilité d’avoir une substitution de ce “A” à
vaut
. Ainsi:

On a donc: 
Pour calculer
on se place à
puisque
, et on appelle
la probabilité d’être dans l’état i au temps
(
):




Finalement:

C’est bien gentil vous allez me dire, on connaît maintenant
mais ça ne résout pas notre problème initial qui était de prendre en compte les mutations cachées… En fait si mais il reste encore un peu de calcul à faire. Pour cela on doit estimer la valeur de la variable
, c’est-à-dire la distance qui sépare nos deux séquences
et
. Grâce à notre modèle décrit ci-dessus cette distance est bien sûr reliée aux nombres de mutations observées entre les deux séquences tout en prenant en compte le fait que certaines mutations soient arrivées sans qu’on puisse les voir.
Afin d’estimer
on va appliquer la méthode du maximum de vraisemblance. Je rappelle que la vraisemblance (notée
pour likelihood) est la probabilité d’observer les données sachant le modèle:
. Dans notre cas on veut calculer la probabilité que la séquence
(de taille
) ait pu évoluer en
, ce qui s’écrit:
![L = P(S_{1}[1]) P(S_{1}[1] -> S_{2}[1]/t) P(S_{1}[2]) P(S_{1}[2] -> S_{2}[2]/t) ... P(S_{1}[n]) P(S_{1}[n] -> S_{2}[n]/t) L = P(S_{1}[1]) P(S_{1}[1] -> S_{2}[1]/t) P(S_{1}[2]) P(S_{1}[2] -> S_{2}[2]/t) ... P(S_{1}[n]) P(S_{1}[n] -> S_{2}[n]/t)](http://s0.wp.com/latex.php?latex=L+%3D+P%28S_%7B1%7D%5B1%5D%29+P%28S_%7B1%7D%5B1%5D+-%3E+S_%7B2%7D%5B1%5D%2Ft%29+P%28S_%7B1%7D%5B2%5D%29+P%28S_%7B1%7D%5B2%5D+-%3E+S_%7B2%7D%5B2%5D%2Ft%29+...+P%28S_%7B1%7D%5Bn%5D%29+P%28S_%7B1%7D%5Bn%5D+-%3E+S_%7B2%7D%5Bn%5D%2Ft%29&bg=ffffff&fg=333333&s=0)
avec
la probabilité d’observer le nucléotide en question au i-ème site de la séquence
, et
la probabilité d’avoir muté au i-ème site du nucléotide de
vers le nucléotide de
pendant le temps
.
Quand on a un produit (multiplications) on aime bien le transformer en somme (additions). Pour cela on utilise la fonction logarithme:
![ln L = ln P(S_1[1]) + ... + ln P(S_1[n]) + ln P(S_1[1] \rightarrow S_2[1]/t) + ... + ln P(S_1[n] \rightarrow S_2[n]/t) ln L = ln P(S_1[1]) + ... + ln P(S_1[n]) + ln P(S_1[1] \rightarrow S_2[1]/t) + ... + ln P(S_1[n] \rightarrow S_2[n]/t)](http://s0.wp.com/latex.php?latex=ln+L+%3D+ln+P%28S_1%5B1%5D%29+%2B+...+%2B+ln+P%28S_1%5Bn%5D%29+%2B+ln+P%28S_1%5B1%5D+%5Crightarrow+S_2%5B1%5D%2Ft%29+%2B+...+%2B+ln+P%28S_1%5Bn%5D+%5Crightarrow+S_2%5Bn%5D%2Ft%29&bg=ffffff&fg=333333&s=0)
Afin de trouver le maximum de cette vraisemblance on fait comme au lycée: on dérive la fonction
et on cherche les valeurs auxquelles la dérivée s’annule. Les
premiers termes de la formule valent une constante donc leur dérivée est nulle. Pour les
autres on peut poser que
correspond aux mutations d’un nucléotide vers un autre (
) et
correspond aux mutations d’un nucléotide vers lui-même (
).

Comme on a calculé un peu plus haut
et que
on peut remplacer dans l’équation ci-dessus. Je vous épargne les calculs mais à la fin on obtient:

Et pour résoudre enfin notre problème on peut définir
comme étant la proportion de sites différents entre nos deux séquences. Ainsi, alors qu’on a commencé par estimer la distance entre nos deux séquences par:

on estime maintenant cette distance par:

Et c’est cela qu’on appelle la distance de Jukes-Cantor. Dans le cas de la figure 1,
alors que
. La distance de Jukes-Cantor est bien légèrement plus grande car elle prend en compte des mutations qui ont pu arriver mais qu’on ne voit pas.

Alors bien sûr, comme toujours en modélisation, on simplifie beaucoup, mais depuis l’article de Jukes Cantor en 1969 les modèles ont été perfectionnés et cela permet de bien mieux comprendre le génome des êtres vivants: vitesse d’apparition des mutations, importance fonctionnelle de certaines séquences, relations phylogénétiques entre les espèces… Mais ce serait trop pour ce billet !
ps: une bonne revue sur ces questions est disponible ici.