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();