Evolution de la couleur des yeux au fil des âges

Question 0

Instinctivement on aurait envie de dire que les personnes aux yeux bleus seront de plus en plus rares étant donné qu’il est “plus compliqué” d’avoir les yeux bleus. En effet il faut deux alèles bleus. Or Apparemment dans la population il y a plus de personnes avec les aléles marrons. Sauf qu’en y réfléchissant, le nombre d’alèle devrait rester plus ou moins constant, vu que l’on choisit au hasard les alèles parmi ceux des parents qui sont eux aussi choisis au hasard. Par conséquent je dirais que le nombre de personne aux yeux bleus devrait rester plus ou moins constant au fil des âges.

Question 1

Tout d’abord générons un vecteur \(P^0\) représentant de notre population initiale. \(P^0\) est de taille \(N\) = 20. Ce vecteur doit être généré de manière uniforme afin de garantir l’aléa dans notre population. Soit \(Nbb\) le nombre de personnes avec les alèles bleus souhaitées, \(Nmm\) le nombre de personnes avec les alèles marrons souhaités et \(Nbm\).

library('ggplot2');
set.seed(5);

#Fonction pour mélanger notre vecteur de population de début
shuffle = function(P){
    P0 = sample(c(1:length(P)))
    for (i in 1:length(P)){
        P0[i] = P[P0[i]]
    }
    P0
}

Ensuite il suffit de choisir aléatoirement deux “parents” dans notre vecter \(P0\) et de regarder le nombre d’alèle bleu(s) qu’ils portent. Si les deux alèles du parent sont bleus alors il donnera forcément un alèle bleu. De la même manière si les deux sont marrons alors il donnera un marron. Si l’un des deux est marron alors il donnera un bleu avec une probabilité de 0.5 ou un marron avec une probabilité de 0.5. Ceci est une hypothèse que nous faisons.

# La fonction qui génère une génération d'enfants (donnée dans la correction du TD n°2)
new_child = function(P0) {
  Pere_index = sample(1:length(P0), 1);
  Mere_index = sample(1:length(P0), 1);
  Pere = P0[Pere_index];
  Mere = P0[Mere_index];
  
  Enfant_P=ifelse(Pere==0,0,
                  ifelse(Pere==1,sample(x=c(0,1), size = 1, replace=T),1));
  Enfant_M=ifelse(Mere==0,0,
                  ifelse(Mere==1,sample(x=c(0,1), size = 1, replace=T),1));
  Enfant = Enfant_M + Enfant_P;
  Enfant
}

new_gen = function(Pinit) {
    Psuivant = rep(x = 0, length(Pinit));
    for (i in 1:length(Pinit)){
        Psuivant[i] = new_child(P0 = Pinit);
    }
    Psuivant
}

Il faut désormais étendre cette simulation à l’horizon max pour voir ce qu’il se passe.

simulation = function(I = 20, N = 20, Nbb = 12, Nmm = 4, Nt = 10){
    ##
    Nbm = N - Nmm - Nbb; # nombre de 1 alèle bleu, 1 alèle marron
    P0 = c(rep(x = 0, Nmm), c(rep(x = 1, Nbm),  rep(x = 2, Nbb)));
    P0 = shuffle(P0);
    ##
    
    df_res = data.frame();
    for (t in 1:Nt) {
        Pinit = P0;
        res_bb = rep(x = 0, I);
        res_bm = rep(x = 0, I);
        res_mm = rep(x = 0, I);
        df_res_gen0 = data.frame(Generation = 0, bb = sum(Pinit == 2)/N, bm = sum(Pinit == 1)/N, mm = sum(Pinit == 0)/N, sim = t);
        df_res = rbind(df_res, df_res_gen0);
        for (i in 2:I){
            Psuiv = new_gen(Pinit = Pinit);
            Psuiv;
            df_res_gen = data.frame(Generation = i, bb = sum(Psuiv == 2)/N, bm = sum(Psuiv == 1)/N, mm = sum(Psuiv == 0)/N, sim = t);
            df_res = rbind(df_res, df_res_gen);
            Pinit = Psuiv;
        }
    }
    ggplot(data = df_res, aes(x=Generation, group = sim)) + geom_line(aes(y=bb), color = 'blue') + geom_line(aes(y=bm), color = 'green') + geom_line(aes(y=mm), color = 'brown')+theme_bw();
}

simulation();


On observe qu’apparemment les yeux bleus ont de l’avenir et qu’ils devraient exterminer les yeux marrons. En revanche c’est pas joli joli pour les yeux marrons.

simulation(I = 20, N = 20, Nbb = 4, Nmm = 12);


Là ca se passe moins bien tout de suite pour les yeux bleus qui se prennent un tsunami d’alèles marrons quand reproduction il y a. Du coup les yeux marrons prennent le dessus.

simulation(I = 20, N = 20, Nbb = 5, Nmm = 5);


C’est trop petit comme échantillon pour conclure, mais il semblerait que dès qu’une couleur prend le dessus, c’est la fin de l’autre petit à petit.
Voyons voir sur plus de générations

simulation(I = 250, N = 20, Nbb = 8, Nmm = 8);


Ce graphe confirme le ressenti sur la simulation précédente. Il faut absolument que le phénomène d’éxctinction soit évité.

Question 2

On change maintenant la taille des échantillons. Voyons ce qui se passe Essayons de voir avec 400 personnes avec double alèles bleus et 1200 personnes double alèles marrons.

simulation(I = 100, N = 2000, Nbb = 400, Nmm = 1200);


Les yeux bleus ne sont pas très présents mais leur nombre reste plus ou moins constant.Il semblerait que la taille de l’échantillon ait considérablement augmenté la stabilité au fil du temps.

simulation(I = 100, N = 2000, Nbb = 1200, Nmm = 400);


Les yeux bleus sont plus présent et restent à peu près a la même proportion globalement. On observe une bonne stabilité au fil du temps.

simulation(I = 100, N = 2000, Nbb = 500, Nmm = 500);


On voit que dans ces conditions le nombre d’yeux marrons et bleus restent à peu près constant aussi. Si une couleur va à la hausse l’autre va à la baisse mais pas de variations trop brusque. On note même quelques inversions de tendance.
On peut donc imaginer que la quantité d’yeux bleus dans la population est déterminée par la quantité initiale de personne aux doubles alèles bleus. En revanche leur nombre ne semble pas grandement changer au fil des générations si l’échantillon de base est conséquent.

Question 3

Modifions légèrement notre code R de manière à intégrer cette nouvelle condition.

new_gen2 = function(Pinit) {
    Psuivant = rep(x = 0, length(Pinit));
    Psuivant[0] = 0; # On force une personne avec 2 alèles marrons.
    for (i in 1:length(Pinit)-1){
        Psuivant[i] = new_child(P0 = Pinit);
    }
    Psuivant[length(Pinit)-1] = 2; # On force une personne avec 2 alèles bleus
    Psuivant = shuffle(Psuivant);
    Psuivant
}

simulation2 = function(I = 20, N = 20, Nbb = 12, Nmm = 4, Nt = 10){
     ##
    Nbm = N - Nmm - Nbb; # nombre de 1 alèle bleu, 1 alèle marron
    P0 = c(rep(x = 0, Nmm), c(rep(x = 1, Nbm),  rep(x = 2, Nbb)));
    P0 = shuffle(P0);
    ##
    
    df_res = data.frame();
    for (t in 1:Nt) {
        Pinit = P0;
        res_bb = rep(x = 0, I);
        res_bm = rep(x = 0, I);
        res_mm = rep(x = 0, I);
        df_res_gen0 = data.frame(Generation = 0, bb = sum(Pinit == 2)/N, bm = sum(Pinit == 1)/N, mm = sum(Pinit == 0)/N, sim = t);
        df_res = rbind(df_res, df_res_gen0);
        for (i in 2:I){
            Psuiv = new_gen2(Pinit = Pinit);
            Psuiv;
            df_res_gen = data.frame(Generation = i, bb = sum(Psuiv == 2)/N, bm = sum(Psuiv == 1)/N, mm = sum(Psuiv == 0)/N, sim = t);
            df_res = rbind(df_res, df_res_gen);
            Pinit = Psuiv;
        }
    }
    ggplot(data = df_res, aes(x=Generation, group = sim)) + geom_line(aes(y=bb), color = 'blue') + geom_line(aes(y=bm), color = 'green') + geom_line(aes(y=mm), color = 'brown')+theme_bw();
}

On peut maintenant voir l’évolution.

simulation2(I = 20, N = 20, Nbb = 4, Nmm = 12);


Les yeux bleus sont toujours minoritaires mais ils restent stables aussi apparemment. On note que la couleur ne peut pas disparaitre grâce au système de préservation. Les yeux marrons semblent égralement stables.

simulation2(I = 20, N = 20, Nbb = 5, Nmm = 5);


Comme précédemment ça reste stable globalement, avec quelques petites variations de temps en temps.
Voyons au bout de plusieurs générations pour voir ce que ça donne.

simulation2(I = 600, N = 20, Nbb = 5, Nmm = 5);


Sur de nombreuses générations on peut constater des phénomènes de tendances. Dès qu’une couleur semble prendre le dessus, le fait que l’autre ne puisse s’éteindre fait que celle-ci remonte en apparition. Par contre on a une énorme instabilité. Les zones attractrices sont celles ou une couleur va disparraitre jusqu’à ce qu’elle touche le seuil et remonte ensuite. Par conséquent on préserve les deux couleurs dans la population.

Question 4

Mon intuition initiale s’avère juste dans le cas ou l’on a un très petit échantillon d’individu et pas de préservation. Les yeux bleus ont tendance à disparaitre si leur nombre initial est insuffisant.
Par contre quand la population est conséquente alors là on se rend compte qu’une stabilité “naturele” semble apparaitre. Je ne m’attendais pas du tout à cela.
Si l’on devait modifier le modèle je suggèrerais ceci : * Qu’on ne puisse pas avoir un enfant avec soi-même * Qu’on prenne en compte le sexe (des alèles pourraient être perdus par exemple si deux hommes ou deux femmes sont les derniers porteurs de l’alèle bleu) * Qu’on observe ce qu’il se passe entre deux générations pour observé comment la reproduction modifie les proportions entre deux générations.