Simulation du modèle de Hardy-Weinberg avec le langage de programmation Python

Il s'agit ici de simuler le modèle de Hardy-Weinberg pour un gène avec 2 allèles A et a.

1 - Choix de la fréquence des allèles

  • p correspond à la fréquence de l'allèle A
  • q correspond à la fréquence de l'allèle a

Compléter le code ci-dessous en indiquant la fréquence de p. Puis, cliquer dans la cellule ci-dessous et cliquer sur le bouton "Exécuter".

In [ ]:
p = # Indiquer ici la valeur de p
q = 1 - p

2 - Choix du nombre d'individus dans la population

Dans la cellule ci-dessous, choisir un nombre d'individus qui sera stocké dans la variable x.

In [ ]:
x = # Indiquer ici le nombre d'individus

3 - Une fonction pour générer aléatoirement x individus avec des zygotes générés aléatoirement en suivant les probabilités p et q

La commande ci-dessous permet d'importer un module pour générer des nombres pseudo-aléatoires (exécuter la cellule ci-dessous).

In [ ]:
import random

La fonction permettant de générer une population comportant x individus est définie ci-dessous (exécuter la cellule).

In [ ]:
def generation_population(x):
    zygotes = []
    i = 0
    while i < x:
        # Génération du gamète 1
        if random.random() < p:
            gamete1 = "A"
        else:
            gamete1 = "a"

        # Génération du gamète 2
        if random.random() < p:
            gamete2 = "A"
        else:
            gamete2 = "a"
        # Formation du zygote et ajout à la population des zygotes
        zygotes.append(gamete1+gamete2)

        i += 1
        
    return zygotes

Dans la cellule ci-dessous, compléter le code pour utiliser la fonction précédente et afficher le résultat pour une population de 100 individus.

In [ ]:
print(generation_population(# Compléter le code ici

4 - Choix du nombre de générations

Dans la cellule ci-dessous, choisir le nombre de générations au bout duquel on veut regarder la composition de la population.

In [ ]:
generation = # Indiquer ici le nombre de générations

5 - Simulation du modèle sur le nombre de générations choisi

Pour connaître la composition de la population au bout de n générations, il faut répéter la fonction précédente n fois.

De plus, comme la composition de la population évolue, il faut à chaque génération dénombrer le nombre d'allèles A et a afin de suivre l'évolution des probabilités p et q.

Compléter le code ci-dessous afin qu'il soit fonctionnel.

In [ ]:
evo_p = [p]
evo_q = [q]

j = 0
while j < generation:

    zygotes = generation_population(x)

    # Dénombrement des allèles A et a
    nbA = 0
    nba = 0
    for i in range(len(zygotes)):
        if zygotes[i] == "AA":
            nbA += 2
        elif zygotes[i] == "aa":
            nba += # Compléter ici
        else:
            nbA += # Compléter ici
            nba += # Compléter ici

    # Nouvelles valeurs de p et q
    p = nbA/(nbA+nba)
    q = nba/(nbA+nba)

    # Sauvegarde des valeurs de p et q
    evo_p.append(p)
    evo_q.append(q)

    j += 1

6 - Présentation des résultats sous forme d'un graphique

Exécuter le code ci-dessous.

In [ ]:
import matplotlib.pyplot as plt

plt.plot(range(len(evo_p)), evo_p, label="p : Fréquence de l'allèle A")
plt.plot(range(len(evo_q)), evo_q, label="q : Fréquence de l'allèle a")
plt.legend()
plt.xlabel("Nombre de générations")
plt.ylabel("Fréquence des allèles")
plt.ylim(0, 1)
plt.title('Simulation du modèle de Hardy-Weinberg sur ' + str(generation) +
          ' générations avec ' + str(x) + ' individus par génération')
plt.show()

7 - Essayer avec d'autres valeurs

Essayer en modifiant p, le nombre d'individus (x) ou le nombre de générations (variable generation dans le code ci-dessous).

Ou alors réessayer en conservant les mêmes valeurs pour voir si le résultat est toujours le même.

In [ ]:
# Modifier une ou plusieurs des 4 variables ci-dessous pour observer les changements

p = 0.5
q = 1 - p

x = 100

generation = 100

# =================================================================================== #

evo_p = [p]
evo_q = [q]

j = 0
while j < generation:

    zygotes = generation_population(x)

    # Dénombrement des allèles A et a
    nbA = 0
    nba = 0
    for i in range(len(zygotes)):
        if zygotes[i] == "AA":
            nbA += 2
        elif zygotes[i] == "aa":
            nba += 2
        else:
            nbA += 1
            nba += 1

    # Nouvelles valeurs de p et q
    p = nbA/(nbA+nba)
    q = nba/(nbA+nba)

    # Sauvegarde des valeurs de p et q
    evo_p.append(p)
    evo_q.append(q)

    j += 1

# Ci-dessous, le code pour tracer le graphique
plt.plot(range(len(evo_p)), evo_p, label="p : Fréquence de l'allèle A")
plt.plot(range(len(evo_q)), evo_q, label="q : Fréquence de l'allèle a")
plt.legend()
plt.xlabel("Nombre de générations")
plt.ylabel("Fréquence des allèles")
plt.ylim(0, 1)
plt.title('Simulation du modèle de Hardy-Weinberg sur ' + str(generation) +
          ' générations avec ' + str(x) + ' individus par génération')
plt.show()

Une des hypothèses du modèle de Hardy-Weinberg est que la population est infinie. En quoi peut-on voir ici que c'est une hypothèse importante ?