5SOO_O 의 개발 공부 일지
[Python] [Rosalind] Independent Alleles 본문
멘델의 제 2 법칙, 독립의 법칙과 관련된 문제이다.

톰의 genotype은 Aa Bb이다. 톰은 Aa Bb 배우자를 만나 2명의 자녀를 낳는다.
두 아이가 자라, 각각 2명의 아이씩 낳는다.
이 때 각각의 아이는 항상 유전자형이 Aa Bb인 배우자를 만날 때,
k 세대 이후 유전자형이 Aa Bb인 아이 N명이 태어날 확률을 구하는 문제이다.
문제를 풀기 위해서는 확률의 AND 계산과 이항 분포를 알아야 한다.
1. punnett square
1. Aa와 Aa 유전자가 만나 Aa 이형 접합이 나올 확률 : 0.5
| A | a | |
| A | AA | Aa |
| a | Aa | aa |
2. Bb와 Bb 유전자가 만나 Bb 이형 접합이 나올 확률 : 0.5
| B | b | |
| B | BB | Bb |
| b | Bb | bb |
AaBb는 두 확률이 동시에 일어날(AND) 확률이므로 두 확률을 곱해서 구한다
= 0.25
2. 이항 분포
일반적으로, 확률변수 K가 매개변수 n과 p를 가지는 이항분포를 따른다면, K ~ B(n,p)라고 쓴다.
n번 시행 중 k번 성공할 확률은 확률 질량 함수로 주어진다:

이번 문제에서 각각의 자녀는 항상 Aa Bb 배우자와 만나 두 명의 자녀를 낳는다는 조건이 있기 때문에,
k개월 뒤 태어나는 아이는 2 ** k 로 증가한다.
팩토리얼을 직접 구현하려니까 헷갈려서 ㅎㅎ 그냥 math 라이브러리의 factorial 함수를 갖다 썼다.
import math
def nCr(n, r): # 이항 계수 구하기
factorial_ = math.factorial
return factorial_(n) / (factorial_(r)*factorial_(n-r))
def prob(k, N):
prob_AaBb = 0.25 # 이형 접합 확률
prob = []
total = 2 ** k # k개월 뒤 총 자녀의 수
for r in range(N, (total+1)): # 최소 필요한 N명의 Aa Bb ~ 최대 자녀의 수 까지
# 이항 분포 따르는 자녀 확률값 구해 모두 더하기
prob.append(nCr(total, r) *(prob_AaBb ** r)*((1-prob_AaBb)**(total-r)))
return sum(prob)
print("%.3f" % prob(5, 7))
728x90
'자료구조 및 바이오 인포매틱스' 카테고리의 다른 글
| [Bioinformatics] 코돈-단백질 테이블, 단백질 질량 테이블 (0) | 2022.04.14 |
|---|---|
| [Python] [Rosalind] Enumerating Gene Orders (0) | 2022.04.14 |
| [Python] [Rosalind] Calculating Expected Offspring (0) | 2022.04.12 |
| [Python] [Rosalind] Mortal Fibonacci Rabbits (0) | 2022.04.11 |
| [Python] [Rosalind] Consensus and Profile (0) | 2022.04.11 |