Dans la note précédente, nous avions montré comment par un processus de “randonnée aveugle”, qui s’apparente fort à de la sélection naturelle, nous pouvions reconstruire une phrase (methinks it is a weasel) à partir de n’importe quelle séquence de 19 lettres. Aujourd’hui, il est temps d’entrer dans des considérations plus génétiques, en nous lançant dans le chapitre 2 du livre Evolutionary Genetics de John Maynard Smith, intitulé “Modèles de population”.
La question que l’on se pose est toute simple : à partir d’une population ayant une diversité génétique N, et se reproduisant de manière asexuée, combien de génération sont nécessaires pour qu’il ne reste plus qu’un haplotype au sein de cette population, suite à la dérive génétique?
Pour estimer une réponse à cette question, nous allons procéder de la manière suivante.
- Ecrire une fonction permettant de générer la dérive génétique, sur une population aléatoire de diversité N
- Regarder comment évolue la diversité au cours du temps, sur 10 populations indépendantes, pour estimer le nombre de générations à atteindre pour obtenir une diversité de 1
- Répéter l’expérience suffisamment de fois pour obtenir une distribution du temps nécessaires pour obtenir une diversité de 1
La fonction qui génère de la dérive est simple, pour peu que la package seqinr
soit installé.
drift<-function(init.div)
{
pop<-words(length = 5, alphabet = s2c("atcg"))
pop<-sample(pop, init.div, replace = FALSE)
startpop<-pop
startdiv<-length(startpop)
div<-startdiv
ngen<-init.div*6
for(i in 1:ngen){
pop<-sample(pop, length(pop), replace = TRUE)
div<-c(div,length(levels(as.factor(pop))))
}
return(div)
}
Le plus difficile sans doute à réécrire aurait été les fonction words
et s2c
, qui génèrent respectivement des mots à partir d’un vecteur de lettres, et un vecteur de lettres à partir d’une chaîne… Rien de bien sorcier, donc.
Si on lance notre fonction sur 10 populations, on obtient le résultat suivant:
A partir d’une diversité initiale de 30, il faut entre 20 et 110 générations pour arriver à une diversité de 1. Comment se distribue précisément le nombre de générations nécessaires, pour une diversité donnée? Au lieu de regarder 10 populations, prenons-en 500, et représentons la densité du nombre de générations nécessaires.
Le résultat est représenté ci-dessous:
En rouge, j’ai représenté 2N, et en pointillés, 2N±N, autrement dit 1, 2 et 3 fois la diversité initiale. En gris (trait continu) j’ai représenté la moyenne obtenue du nombre de générations, et en gris pointillé, ±1 écart type. Ca semble correspondre pas mal! Pour le vérifier, on va donc faire quelque chose de beaucoup plus gourmand en temps de calcul, qui aurait pu se faire en calcul parallèle: répéter plusieurs fois notre fonction de dérive, pour une diversité variant de 2 à 200.
Le résultat est le suivant:
Ce qui est représenté en rouge est… 2*N! On a donc une approximation acceptable du temps nécessaire pour passer d’une diversité N à une diversité 1. Mais on remarquera que plus on avance, plus l’écart type est grand : entre 150 et 1000 générations pour résoudre une population de diversité initiale 200…
Pour la fin, et pour montrer que R peut faire de très jolies choses — il manque un bon handbook de visualisation graphique francophone, en R — j’ai représenté le devenir de 4 allèles, de probabilité égale au départ, subissant une dérive génétique. Leur proportion se lit sur l’axe de gauche. La diversité totale se lit sur l’axe de droite (trait noir interrompu).
Télécharger le fichier :
Drift (3.4 KiB, 1 hits)