Question 0

Décrire votre intuition

Les tirages pour déterminer les parents seront uniformes (1 parmi la taille de P0, avec remise à chaque tirage), et de même pour le choix de l’allèle. On aura donc (environ) la même chance de tomber sur un allèle bleu qu’un allèle marron à chaque génération. Ainsi, il y a de fortes chances pour que la population aux yeux bleus conserve sa proportion au cours du temps, qu’elle soit élevée ou faible. On remarquera certainement de légères variations, mais d’assez faible importance.

Question 1 : Cas d’une petite population

set.seed(42)

#Génère un nombre aléatoire entre 1 et N
Alea = function(N) {
  sample(1:N,1);  
}

#génère une population P0 de longueur P, avec BB individus à deux allèles bleus et MM individus avec deux allèles marrons.
genP0 = function(P ,BB, MM) {
    p0 = c();
    p0[1:P] = 1;
    p0[1:BB] = 2;
    p0[BB+1:MM] = 0;
    p0;
}

# Renvoie une population de P individus à partir d'un autre population dont les proportions d'alleles sont BB, BM et MM. Cette population s'exprime en nombre d'alleles bleues
genPi = function(P_current) {
  N = length(P_current);
  
  P_next = c(); #La génération suivante qui va être générée
  for(i in 1:N) {
    #Je ne prends pas en compte de si le père = la mère. Dans une grande population, c'est peu représentatif. On sélectionne ici les deux parents qui vont donner un de leurs allèles
    Pere = P_current[Alea(N)];
    Mere = P_current[Alea(N)];
    
    # On choisit une allele du parent au hasard (1 si l'allele est bleue, 0 sinon)
    #Récupération des allèles des parents
    A1 = selectAllele(Pere);
    A2 = selectAllele(Mere);
    
    #formation de l'enfant et ajout dans la future génération
    Enfant = A1+A2;
    P_next[i] = Enfant;
  }
  
  P_next;
}

#Fonction de simulation de l'évolution d'une population P0 au cours des Imax générations qui vont suivre
sim = function(P0, Imax){ 
  N = length(P0);
  
  P_evol = matrix(ncol=N, nrow=Imax); #Matrice de dimension N, Imax, représentant toutes les générations de la population, entre 0 et Imax
  P_evol[1,] = P0; #Placement de la première génération

  for(i in 2:Imax) {
    P_evol[i,] = genPi(P_evol[i-1,]); #Calcul de la génération suivante en fonction de l'actuelle
  }
  
  P_evol;
}

#simule une sélection d'allèle sur les deux possédés par un individu
selectAllele = function(nbA) {
  ifelse(nbA == 2,1, ifelse(nbA == 0,0,if(runif(1)>=0.5) 1 else 0))
}

#Fonction de récupération de l'évolution du gène nbAllele (Bleu) de la population Pn au cours de toutes ses générations.
getVariation = function(Pn, nbAllele = 2) {
  Imax = length(Pn[,1]);
  pct = c();
  
  for(i in 1:Imax) {
    #Calcul effectué sur les lignes (une ligne = une génération)
    pct[i] = sum(Pn[i,]==nbAllele)/length(Pn[i,]);
  }
  
  pct;
}

#Affichage graphique de l'évolution des allèles (différence entre BB et MM) d'une population P0 au cours de ses Imax futures générations, sur N itérations
render = function(P0, Imax, N, title="Evolution des allèles d'une population") {
  plot(NULL,ylim=c(0,1.5),xlim=c(1,Imax),main=title, sub="BB en bleu, MM en marron", ylab="Taux d'alléles", xlab="Génération")
  for(i in 1:N){
    Pi = sim(P0, Imax);
    
    txM = getVariation(Pi,0); #Calcul du taux de d'apparition du gène MM sur les générations pour la population Pi.
    txB = getVariation(Pi,2); #idem avec le gène BB
      
    # Affichage des courbes
    lines(txM, col='brown',type='l')
    lines(txB, col='blue',type='l')
  }
  legend(0,1.6,c("Allèles MM", "Allèles BB"),lty=c(1,1), lwd=c(2.5,2.5), col=c("brown","blue"));
}

Afin d’analyser la situation, on utilise diverses simulations :

render(genP0(20,4,12), 20, 10, "Evolution d'une petite population P0 = (4, 12) sur 20 générations")

render(genP0(20,12,4), 20, 10, "Evolution d'une petite population P0 = (12, 4) sur 20 générations")