본문 바로가기
기본적인프로그래밍/python

[Rosalind, python] Mendel's First Raw

by 인포메틱스 2022. 6. 21.
반응형

오늘은 Mendel의 첫번째 법칙! 우열의 법칙에 대한 문제에 대한 풀이를 하려고 합니다.

 

참고로 Rosalind 결과 스포가 있을 수 있습니다.

 

휴우.. 대학교때 공부를 못해서 그런지 이번에도 오답이 많았습니다. (실수도 많이 하구요)

 

문제에서는 일단 확률 이야기를 합니다. 조합(Combination) 이야기도 나오고 합니다만 잘 읽어보시고,

 

그래서 문제를 잘 읽어 보셔야합니다. k, m, n을 주는데 k는 homo(dominant), m은 hetero, n은 homo (recessive) 입니다(이것 순서 때문에 오답 한번 추가했습니다.).

 

k=2,m=2,n=2일 경우 짝을 지어서 자식을 낳을경우 만들 수 있는 표현형 중에 dominant를 포함하는 확률을 구해라 입니다.

 

1. Homo(dominant == AA, recessive ==aa ), Hetero(Aa)에서 Homo(dominant == 2, recessive == 2), hetero == 2 에서의 경우의 수

 1-1. AA, AA (Homo)

  A A
A AA AA
A AA AA

 1-2. aa, aa (Homo)

  a a
a aa aa
a aa aa

 1-3. AA, Aa (Homo, Hetero)

  A a
A AA Aa
A AA Aa
  A a
a Aa aa
a Aa aa

 1-4. Aa, Aa (Hetero, Hetero)

  A a
A AA Aa
a Aa aa

 

2. 해결방법

 우리가 구해야할 genotype은 AA, Aa입니다.

 2-1. Recessive Homo가 나올 확률를 구해서 전체에서 빼기

  aa가 나오는 경우의 수는 1-2, 1-3, 1-4

  확률을 구해보면 전체의 샘플의 개수는 6개

   1-2. (aa,aa) aa 확률 구하기 = 2/6 (Recessive homo/total) * 1/5 (Recessive homo/total-1)

   1-3. (AA,Aa) aa 확률 구하기 = ( 2/6 (Recessive homo/total) * 2/5 (Hetero/total-1) )*2  (%순서가 Hetero - Recessive로 변경가능) *1/2 (aa가 4개 genotype중 한개)

   1-4. (Aa,Aa) aa확률 구하기 = ( 2/6 (Hetero/total) * 1/5 (Hetero/total-1) ) * 1/4 (aa가 4개 genotype중 한개)

   계산해보면 0.216666...이 나옴니다.

   여기서 1- 0.216666을 진행하면 결과가 동일하게 나옵니다.

 2-2. python code 만들기

domi, hetero,rece = 2,2,2 # k,m,n

total = domi+ hetero + rece
re_re = rece/total * (rece-1)/(total-1) # recessive , recessive
re_he = (rece/total * hetero/(total-1)) * 2 * 1/2 # recessive, hetero
he_he = (hetero/total * (hetero-1)/(total-1)) * 1/4 # hetero, hetero

1-(re_re+re_he+he_he)
 
# 0.78333...

 2-3 python code 만들기 2

(참고 https://noobest.medium.com/rosalind-mendels-first-law-192864d81c45)

다음은 재미나게 코드를 짠 사람 것을 공유하도록 하겠습니다.

from enum imort Enum
class Allele(Enum):
	DOMINANT = 1,
	RECESSIVE = 2,
	HET = 3
    
    
# mate시에 경우의 수를 다 제작함.
def mate(x,y):
	if x == Allele.DOMINANT and y == Allele.DOMINANT:
		return [Allele.DOMINANT] * 4
	if x == Allele.RECESSIVE and y == Allele.RECESSIVE:
		return [Allele.RECESSIVE] * 4
	if x == Allele.HET and y == Allele.HET:
		return [Allele.DOMINANT, Allele.HET, Allele.HET, Allele.RECESSIVE]
	if x == Allele.HET :
		return [Allele.HET, Allele.HET, y, y]
	if y == Allele.HET:
		return [Allele.HET, Allele.HET, x, x]
 	else:
		return [Allele.HET] * 4
       
def get_pairs(organisms):
	if len(organisms) < 2:
		return list()
	first = organisms[0] # 첫번째 주자!
	pairs = [(first, organisms[i]) for i in range(1,len(organisms))] # 첫번째 주자에 대한 mate pairs
	other_pairs = get_pairs(organisms[1:]) # 첫번째를 제외하고 다음 주자에 대한 mate pair (끝까지 계산됨)
	pairs.extend(other_pairs) # list로 결과 나온것들 풀어줌
	return(pairs)
	
    
def f(k,m,n):
	organisms = list()
    for i in range(k): # DOMINANT!!!!
		organisms.append(Allele.DOMINANT)
	for i in range(m): # HETERO!!
		organisms.append(Allele.HET)
	for i in range(n):
		organisms.append(Allele.RECESSIVE)
	pairs = get_pairs(organisms) # 총 organisms에 대한 pair 모두 구함.
	mate_gt = [mate(*p) for p in pairs]
    child_gt = [child for gt in mate_gt for child in gt] # mate로 인해 나온 모든 gt(genotype)를 가져옴
	total = len(child_gt)
	domi = 0 # domiant gt 개수
	for gt in child_gt:
		if gt is not Allele.RECESSIVE: # RECESSIVE가 아닌경우는 모두 dominant한 표현형을 갖는다.
			domi += 1
	return domi/total

 

이렇게 Mendel's first law에 대한 해설을 마치도록 하겠습니다.

 

 

 

728x90
반응형

댓글