[BONUS] Comment Simuler l’Évolution de l’ADN en Python
Автор: Évoluscope
Загружено: 2024-06-01
Просмотров: 174
Dans cette vidéo bonus je vous montre comment simuler l'évolution d'une séquence d'ADN en utilisant le modèle de Jukes-Cantor avec le langage de programmation Python. Je vous comment définir des fonctions pour substituer des nucléotides et calculer la p-distance entre deux séquences. La simulation demande à l'utilisateur le nombre de séquences, leur longueur et le nombre de mutations successives à appliquer. Les résultats sont tracés sur un graphique comparant les distances réelles, observées, et calculées par le modèle de Jukes-Cantor, démontrant la justesse du modèle.
Lien vers l'épisode correspondant :
Distance Génétique : Comment Mesure-t-on nos Différences ? : • [Ép. 1] Distance Génétique : Comment Mesur...
Lien vers l'autre vidéo BONUS :
Démonstration de la Relation de Jukes-Cantor : • [BONUS] Démonstration de la Relation de Ju...
Programme Python complet de la simulation (version 3.12.2) :
***
import random as rd
import numpy as np
import matplotlib.pyplot as plt
def substitute(seq):
pos = rd.randint(0, len(seq) - 1)
b = rd.choice("ATCG".replace(seq[pos], ""))
newseq = seq[:pos] + b + seq[pos + 1:]
return newseq
def pdist(seq1, seq2):
diff = 0
long = min(len(seq1), len(seq2))
for pos in range(long):
if seq1[pos] != seq2[pos]:
diff += 1
return diff / long
n = int(input("Combien de séquences voulez-vous simuler ? "))
L = int(input("Quelle est la longueur des séquences que vous voulez simuler ? "))
t = int(input("Combien de mutations voulez-vous leur faire subir ? "))
seqs = []
for _ in range(n):
seq = ""
for _ in range(L):
seq += rd.choice("ATCG")
seqs.append(seq)
iniseqs = seqs.copy()
real_dist = []
obs_dist = []
jc_dist = []
for i in range(t):
mean_dist = 0
for s in range(n):
seqs[s] = substitute(seqs[s])
mean_dist += pdist(seqs[s], iniseqs[s])
mean_dist /= n
real_dist.append((i + 1) / L)
obs_dist.append(mean_dist)
jc_dist.append((3/4) * (1 - np.exp(-(4/3) * (i + 1) / L)))
plt.plot(real_dist, real_dist, label="y = x", linestyle="--", color="red")
plt.plot(real_dist, obs_dist, marker=".", label="Distances moyennes observées", linestyle="none")
plt.plot(real_dist, jc_dist, label="Prédiction de Jukes-Cantor", linestyle="-", color="green")
plt.title("Distance moyenne observée en fonction de la distance réelle")
plt.xlabel("Distances réelles")
plt.ylabel("Distances observées")
plt.legend()
plt.show()
***
Доступные форматы для скачивания:
Скачать видео mp4
-
Информация по загрузке: