Tout d’abord, on initialise le DM en fixant une Seed.

set.seed(456762);

Question 1 : Cas d’une petite population

Grace à l’algo suivant, on génère à l’aide du nombre de personnes P ayant des allèles BB et MM pour une population de taille donnée pop, sur Imax génèrations.

# P   => Vecteur des proba, de taille 2, (BB,MM)
# pop => Taille de la population 
# I   => Nombre de génération voulue
population <- function(P, pop, I){ 
  df <- data.frame();
  df <- rbind(df,data.frame(P[1],P[2]));
  for(j in 1:I){
      proba <- c(P[1]/pop,P[2]/pop,1-(P[1]+P[2])/pop);#On recalcule les probabilité à chaque génération d'enfant
      P[1]<-0;
      P[2]<-0;
      for (i in 1:pop) {
        parents <- sample(c("B","M","BM"),2,T,proba); # on tire les parents
        if (parents[1] == "BM" && parents[2] == "BM"){ # si les 2 parents on les allèlles BM
          enfant <- sample(c("B","M","BM"),1,T,c(0.25,0.25,0.5));
        }
        else{
          if ((parents[1] == "B" && parents[2] == "M")||(parents[2] == "B" && parents[1] == "M")){ # si un parent à les allèlles BB et l'autres MM
            enfant <- "BM";
          }
          else{ # si un parent à l'allele BM et l'autre l'allèle BB ou MM
            enfant <- sample(parents,1);
          }
        }
        # On incrémente en fonction des allèles de l'enfant
        if(enfant == "B") {
         P[1] <- P[1]+1; 
        } else if(enfant == "M") {
         P[2] <- P[2]+1; 
        }

      }
      df <- rbind(df,data.frame(P[1],P[2])); # on stock les resultats dans un taleau
  }
  df
}

Cette fonction suivante permet de tracer l’évolution des allèles dans une population et de répeter l’experience un nombre de fois voulu, N.

Les courbes marron représenteront le nombre d’individus avec l’allèle MM (yeux marrons) et les courbes bleues représenteront le nombre d’individus avec l’allèle BB (yeux bleus).

rendu <- function(P, pop, I, N, titre="") {
  plot(NULL, xlim = c(0,I), ylim = c(0, pop), main=titre, ylab="Nombre d'individus", xlab = "Génération");
  ratio <- 0
  for(i in 1:N) {
    res <- population(P,pop,I);
    lines(0:I,res$P.1,type="l",col="blue"); # representation du nombre de personne avec l'allele BB
    lines(0:I,res$P.2,type="l",col="brown"); # idem mais des MM
    #lines(0:I,pop-(res$P.1+res$P.2),type="l",col="green"); # decommenter si on veux les BM
  }
}
Analyse des différents cas :
INTUITION :

Dans le cas d’une petite population, il y aura une dominance de la part de l’allèle dominant et peut-être disparition de l’autre allèle.

SIMULATION :
  • P0 = (4, 12)

Comme prévu, il n’y a rien de déductible si ce n’est que l’allèle dominant reste généralement dominant.

Essayons avec un Imax plus grand, comme il est suggeré dans l’énoncé :

On remarque qu’une dominance intervient assez rapidement : En effet, il semble que lorsqu’un allèle prend l’avantage, il fait totalement disparaitre l’autre.

Essayons avec un Imax encore plus grand :

Cette tendance semble se confirmer. On peut remarquer que même si l’allèle BB est minoritaire, il arrive parfois à dominer la population.

Essayons de calculer un ratio de dominance : (On néglige les cas où il reste des BM dans la population car lorsqu’il y a dominance, elle est totale (dans le cas où Imax est grand))

# Calcule le pourcentage de MM en dominance totale sur N itérations
calcul_ratio <- function(P, pop, I, N) {
  ratio <- 0
  for(i in 1:N) {
    res <- population(P,pop,I);
    if (res[I,2]==pop) { # si le nombre de MM est égale à la taille de la population -> Il y a dominance totale 
      ratio <- ratio + 1; # donc on incremente le compteur
    }
  }
  ratio/N;
}
calcul_ratio(c(4,12),20,100,200);
## [1] 0.67

On obtient un résultat proche de 12/20 => 0.6 (/! à changer : Dire que on a calculé le ratio plusieurs fois mais pour ne pas charger la génération du HTML, la moyenne a été faite à l’arache)

Essayons avec P0 = (12,4), on s’attend à un ratio de 4/20 => 0.25

calcul_ratio(c(12,4),20,100,200);
## [1] 0.27

Notre intuition se confirme.

Essayons maintenant avec P0 = (5,5)

calcul_ratio(c(5,5),20,100,200);
## [1] 0.48

Ici on remarque que le ratio tend vers 1/2, ce qui parait logique. En effet, si l’on part avec autant d’allèle B que M, on a 50% de chance d’observer une dominance de l’un des 2 allèles.

  • P0 = (12, 4)

Mêmes résultats que précédement (problème symètrique).

  • P0 = (5, 5)

Répetons nos premières experiences afin de confirmer ce que nous venons d’observer :

On remarque que la dominance d’une allèle est plus “partagée” que sur les premières experiences, comme prévu.

Question 2 : Cas d’une grande population

Analyse des différents cas :
INTUITION :

On espère pouvoir observer les mêmes résultats, c’est a dire une dominance allélique prononcée.

SIMULATION:
  • P0 = (400, 1200)

A l’aide de ces 2 experiences, on dirait que la dominance alléllique est plus difficile a atteindre du fait de la grande population. On a aussi l’impression d’une stabilisation autour d’une certaine valeur.

De plus, on remarque qu’en début de génération, les personnes d’allèlles pures (BB ou MM) subissent une décroissance systématique.

  • P0 = (1200, 400)

  • P0 = (500, 500)

Le phénomène de décroissance en début de génération disparait ici. Peut-être qu’il y a une limite à ce phénomène que nous allons tenter de trouver :

  • P0 = (1000, 1000)

Après plusieurs observations, Hypothèse 1 : Losque l’on part d’un état d’équilibre, les populations générées ont tendance à converger vers un même point : (MM,BB,BM) => (PopTotale/4, PopTotale/4, PopTotale/2)

Hypothèse 2 : Losqu’il n’y a pas de dominance au départ, Il y a soit convergence vers le point (MM,BB,BM) => (PopTotale/4, PopTotale/4, PopTotale/2), soit dominance d’un allèles.

Avec les outils à notre disposition, il nous est impossible de continuer l’analyse.

Question 3 : Cas d’une petite population avec préservation

On redéfini notre fonction de population pour avoir de la préservation :

# P   => Vecteur des proba, de taille 2, (BB,MM)
# pop => Taille de la population 
# I   => Nombre de génération voulue
populationAvecPreservation <- function(P, pop, I){ 
  df <- data.frame();
  df <- rbind(df,data.frame(P[1],P[2]));
  for(j in 1:I){
      proba <- c(P[1]/pop,P[2]/pop,1-(P[1]+P[2])/pop);#On recalcule les probabilité à chaque génération d'enfant
      P[1]<-0;
      P[2]<-0;
      for (i in 1:(pop-2)) {
        parents <- sample(c("B","M","BM"),2,T,proba); # on tire les parents
        if (parents[1] == "BM" && parents[2] == "BM"){ # si les 2 parents on les allèlles BM
          enfant <- sample(c("B","M","BM"),1,T,c(0.25,0.25,0.5));
        }
        else{
          if ((parents[1] == "B" && parents[2] == "M")||(parents[2] == "B" && parents[1] == "M")){ # si un parent à les allèlles BB et l'autres MM
            enfant <- "BM";
          }
          else{ # si un parent à l'allele BM et l'autre l'allèle BB ou MM
            enfant <- sample(parents,1);
          }
        }
        # On incrémente en fonction des allèles de l'enfant
        if(enfant == "B") {
         P[1] <- P[1]+1; 
        } else if(enfant == "M") {
         P[2] <- P[2]+1; 
        }
      }
      P[1] <- P[1]+1;
      P[2] <- P[2]+1;
      df <- rbind(df,data.frame(P[1],P[2])); # on stock les resultats dans un taleau
  }
  df
}

Ainsi que notre fonction de rendu. C’est la même que pour la question 1, mais qui utilise la fonction avec préservation :

renduPr <- function(P, pop, I, N, titre="") {
  plot(NULL, xlim = c(0,I), ylim = c(0, pop), main=titre, ylab="Nombre d'individus", xlab = "Génération");
  ratio <- 0
  for(i in 1:N) {
    res <- populationAvecPreservation(P,pop,I);
    lines(0:I,res$P.1,type="l",col="blue"); # representation du nombre de personne avec l'allele BB
    lines(0:I,res$P.2,type="l",col="brown"); # idem mais des MM
  }
}

Essayons en comparant la version sans préservation et celle avec :

On remarque qu’il n’y a pas de dominance car on garde toujours au moins une personne pour chacun des allèles “pures” (BB et MM). Cela semble normal au vues de nos précédents résultats.

Question 4 : Avez-vous changé d’avis ?

Notre intuition première était, dans le cas d’une petite population, qu’il y aurait une dominance de la part de l’allèle dominant au début, ainsi qu’une possible disparition de l’autre allèle. Notre intuition c’est avérée presque bonne car les cas où l’allèle en dominance ne dominais pas après quelques générations étaient rares. Nous avons également démontré qu’il y avait relation entre le ratio de dominance et le nombre d’allèles à la génération 0.

Dans le cas d’une grande population, nous espérions remarquer les mêmes résultats. Cependant, ceux-ci ne se sont pas re-vérifié mais nous en avons tirés deux hypothèses, rappellons les : Hypothèse 1 : Losque l’on part d’un état d’équilibre, les populations générées ont tendance à converger vers un même point : (MM,BB,BM) => (PopTotale/4, PopTotale/4, PopTotale/2). Hypothèse 2 : Losqu’il n’y a pas de dominance au départ, Il y a soit convergence vers le point (MM,BB,BM) => (PopTotale/4, PopTotale/4, PopTotale/2), soit dominance d’un allèles.

Dans le cas d’une population avec préservation, il n’y a plus de situation de dominance totale. Le système ne se stabilise plus. Ce comportement a été anticiper une fois les résultats des deux premières questions assimilés.

J’ai donc changé d’avis depuis mes premières intuitions, surement faussées par mes cours de SVT du lycée (et les travaux sur les allèles “yeux bleus”/“yeux marrons”).

Nous aurions pu tester avec des nombres encore plus grand de population et générations pour vérifier si le nombre d’individus avec tel allèle fini par diverger ou pas (disparation d’un type d’allèle) ou trouver le critère de convergence (s’il existe).

Pour améliorer ce modèle, il faudrait, pourquoi pas, faire un tirage sans remise avec 2 enfants par couple. Les personnes de ce couple, comme le tirage est sans remise, ne pourront plus avoir d’enfant. De plus, dans une étape suivante (moins prioritaire), ajouter le sexe de la personne pour ajouter encore une pointe de realisme.