对于即将到来的生物信息学课程的准备,我做从rosalind.info一些任务。 我目前停留在分配“ 孟德尔第一定律 ”。
我想我可以蛮力自己通过这一点,但是,不知怎的,我的想法一定是太令人费解。 我的做法是这样的:
建设有三个层次概率的树。 有迹象表明,交配,生物A和B.生物第一级是,什么是用于拾取作为生物甲纯合显性(k)的概率,杂合子(米)或纯合隐性(n)的两个生物。 似乎例如用于纯合显性的,因为总共有第(k + M + N)的生物,其中k的是纯合显性的概率是K /(K + M + N)。
然后,在这棵树,每下这些会来的动物B为概率K / M / N因为我们知道得到选为什么生物。 例如,如果生物是被选中是杂合(米),则概率该生物乙也将是杂合的是(M-1)/(K + M + N-1),因为现在有少一个杂合的动物离开。
这将使概率的两个层次,并且将涉及大量的代码只是为了得到这一步,我会从字面上来建立一个树状结构,每个分支都手工编写代码的一部分。
现在,选择生物A和B后,他们每个人都有两条染色体。 其中一个染色体可以随意采摘。 所以对于一个染色体1或2可以被拾取并同为B.因此,有4个不同的选项:选择A 1,B的1选择A 2,B的1选择A 1,2 B的接A的2,2 B的每一个的这些的概率将是1/4。 所以最后这棵树将有这些叶概率。
然后从那里不知何故被魔法我想补充了所有这些概率的,看看有什么是两种生物会产生生物与显性等位基因的概率。
我怀疑,这个作业的目的是要花费几个小时来解决。 我在想什么太辛苦?
更新:
最可笑的蛮力可能的方式解决了这个。 刚跑数千个模拟交配并想通了,最后不得不显性等位基因,直到有足够的精度,通过分配的部分。
import random
k = 26
m = 18
n = 25
trials = 0
dominants = 0
while True:
s = ['AA'] * k + ['Aa'] * m + ['aa'] * n
first = random.choice(s)
s.remove(first)
second = random.choice(s)
has_dominant_allele = 'A' in [random.choice(first), random.choice(second)]
trials += 1
if has_dominant_allele:
dominants += 1
print "%.5f" % (dominants / float(trials))
Answer 1:
与显性等位基因物种要么是AA
或Aa
。
你的总ppopulation( k + n + m
由k
( hom
)与纯合显性的生物体AA
, m
( het
)杂合显性的生物体用Aa
和n
( rec
)为纯合隐性的生物体与aa
。每个这些可以与任何其他配合。
与显性等位基因的概率有机体是:
P_dom = n_dominant/n_total or 1 - n_recessive/n_total
这样做的旁氏表对每一个组合是不是一个坏主意:
hom + het
| A | a
-----------
A | AA | Aa
a | Aa | aa
het + rec
| a | a
-----------
A | Aa | Aa
a | aa | aa
显然,的四种可能的两个孩子的有机体结果交配。 hom
+ het
产率1 4的生物体与隐性等位基因, het
+ rec
产量4组的生物体与隐性等位基因2。
你可能会想这样做,对其他组合也是如此。
因为我们不只是交配生物体一对一,但拼凑一个整体k + m + n
一堆,后代的总数和“儿童与特定的等位基因数将是很好的了解。
如果你不介意一点的Python, comb
从scipy.misc
可能会有所帮助在这里。 在计算中,不要忘了(一),你得到4
从每个组合以及(b)你需要一个因素(从旁氏表),以确定从上述组合中的隐性(或主导)的后代子女。
更新
# total population
pop_total = 4 * comb(hom + het + rec, 2)
# use PUNNETT squares!
# dominant organisms
dom_total = 4*comb(hom,2) + 4*hom*het + 4*hom*rec + 3*comb(het,2) + 2*het*rec
# probability for dominant organisms
phom = dom_total/pop_total
print phom
# probability for dominant organisms +
# probability for recessive organisms should be 1
# let's check that:
rec_total = 4 * comb(rec, 2) + 2*rec*het + comb(het, 2)
prec = totalrec/totalpop
print 1 - prec
Answer 2:
克劳斯的解决方案有大部分改正; 然而,在计算具有至少一个显性等位基因的组合的数量时发生错误。 这部分是不正确的,因为同时也有组合2点的等位基因时,以形成后代,实际上只执行一个可能性4点的可能性。 因此,克劳斯的解决方案计算出百分比,明显高于它应该是。
计算与至少一个显性等位基因生物的连击数的正确方法如下:
# k = number of homozygous dominant organisms
# n = number of heterozygous organisms
# m = number of homozygous recessive organisms
dom_total = comb(k, 2) + k*m + k*n + .5*m*n + .75*comb(m, 2)
# Instead of:
# 4*comb(k,2) + 4*k*n + 4*k*m + 3*comb(n,2) + 2*n*m
上面的代码段适用于计算显性连击的总数,因为它通过的百分比(100%是1),这将产生一个显性后代乘以每个部分。 你能想到各部分的作为小篮平方为每种类型(K&K,K&M,K&N,M&N,M&M)的连击数。
所以整个正确的代码段是这样的:
# Import comb (combination operation) from the scipy library
from scipy.special import comb
def calculateProbability(k, m, n):
# Calculate total number of organisms in the population:
totalPop = k + m + n
# Calculate the number of combos that could be made (valid or not):
totalCombos = comb(totalPop, 2)
# Calculate the number of combos that have a dominant allele therefore are valid:
validCombos = comb(k, 2) + k*m + k*n + .5*m*n + .75*comb(m, 2)
probability = validCombos/totalCombos
return probability
# Example Call:
calculateProbability(2, 2, 2)
# Example Output: 0.783333333333
Answer 3:
你不需要在while循环运行数千模拟。 您可以运行一个模拟,并从它的结果计算概率。
from itertools import product
k = 2 # AA homozygous dominant
m = 2 # Aa heterozygous
n = 2 # aa homozygous recessive
population = (['AA'] * k) + (['Aa'] * m) + (['aa'] * n)
all_children = []
for parent1 in population:
# remove selected parent from population.
chosen = population[:]
chosen.remove(parent1)
for parent2 in chosen:
# get all possible children from 2 parents. Punnet square
children = product(parent1, parent2)
all_children.extend([''.join(c) for c in children])
dominants = filter(lambda c: 'A' in c, all_children)
# float for python2
print float(len(list(dominants))) / len(all_children)
# 0.7833333
Answer 4:
这比编码概率/计数问题。 它很容易计算出第一只具有隐性性状的后代的概率。 让我知道如果您有任何无法理解任何东西。 我跑到下面的代码和我的输出通过罗莎琳德年级。
def mendel(x, y, z): #calculate the probability of recessive traits only total = x+y+z twoRecess = (z/total)*((z-1)/(total-1)) twoHetero = (y/total)*((y-1)/(total-1)) heteroRecess = (z/total)*(y/(total-1)) + (y/total)*(z/(total-1)) recessProb = twoRecess + twoHetero*1/4 + heteroRecess*1/2 print(1-recessProb) # take the complement #mendel(2, 2, 2) with open ("rosalind_iprb.txt", "r") as file: line =file.readline().split() x, y, z= [int(n) for n in line] print(x, y, z) file.close() print(mendel(x, y, z))
Answer 5:
我刚刚找到的答案的公式。 你有8间可能的交配的互动,可以产生一个占主导地位的后代:
DDxDD, DDxDd, DdxDD, DdxDd, DDxdd, ddxDD, Ddxdd, ddxDd
随着生产的主导后代的相应概率:
1.0, 1.0, 1.0, 0.75, 1.0, 1.0, 0.5, 0.5
最初,它似乎有些奇怪,我认为DDxdd
和ddxDD
是两个独立的交配活动,但如果你仔细想想,他们是略有不同的概念。 的概率DDxdd
是k/(k+m+n) * n/((k-1)+m+n)
和概率ddxDD
是n/(k+m+n) * k/(k+m+(n-1))
数学这些是相同的,但是从概率的立场角度上来讲,这是两个独立的事件。 所以,你的总概率是每一个不同的交配活动乘以该交配事件产生主导后代的概率的概率之和。 我不会在这里简化它一步一步,但是,让你的代码:
total_probability = ((k ** 2 - k) + (2 * k * m) + (3 / 4 * (m ** 2 - m)) + (2* k * n) + (m * n)) / (total_pop ** 2 - total_pop)
所有你需要做的就是插上你的价值观k
, m
和n
,你会得到他们要求的可能性。
Answer 6:
我怀疑,这个作业的目的是要花费几个小时来解决。 我在想什么太辛苦?
我也有同样的问题。 阅读整个线程后,我想出了一个代码。
我希望代码本身将解释概率计算:
def get_prob_of_dominant(k, m, n):
# A - dominant factor
# a - recessive factor
# k - amount of organisms with AA factors (homozygous dominant)
# m - amount of organisms with Aa factors (heterozygous)
# n - amount of organisms with aa factors (homozygous recessive)
events = ['AA+Aa', 'AA+aa', 'Aa+aa', 'AA+AA', 'Aa+Aa', 'aa+aa']
# get the probability of dominant traits (set up Punnett square)
punnett_probabilities = {
'AA+Aa': 1,
'AA+aa': 1,
'Aa+aa': 1 / 2,
'AA+AA': 1,
'Aa+Aa': 3 / 4,
'aa+aa': 0,
}
event_probabilities = {}
totals = k + m + n
# Event: AA+Aa -> P(X=k, Y=m) + P(X=m, Y=k):
P_km = k / totals * m / (totals - 1)
P_mk = m / totals * k / (totals - 1)
event_probabilities['AA+Aa'] = P_km + P_mk
# Event: AA+aa -> P(X=k, Y=n) + P(X=n, Y=k):
P_kn = k / totals * n / (totals - 1)
P_nk = n / totals * k / (totals - 1)
event_probabilities['AA+aa'] = P_kn + P_nk
# Event: Aa+aa -> P(X=m, Y=n) +P(X=n, Y=m):
P_mn = m / totals * n / (totals - 1)
P_nm = n / totals * m / (totals - 1)
event_probabilities['Aa+aa'] = P_mn + P_nm
# Event: AA+AA -> P(X=k, Y=k):
P_kk = k / totals * (k - 1) / (totals - 1)
event_probabilities['AA+AA'] = P_kk
# Event: Aa+Aa -> P(X=m, Y=m):
P_mm = m / totals * (m - 1) / (totals - 1)
event_probabilities['Aa+Aa'] = P_mm
# Event: aa+aa -> P(X=n, Y=n) + P(X=n, Y=n) = 0 (will be * 0, so just don't use it)
event_probabilities['aa+aa'] = 0
# Total probability is the sum of (prob of dominant factor * prob of the event)
total_probability = 0
for event in events:
total_probability += punnett_probabilities[event] * event_probabilities[event]
return round(total_probability, 5)
文章来源: Rosalind “Mendel's First Law” IPRB