为了准备即将到来的生物信息学课程,我正在做一些来自rosalind.info的作业。我目前被困在作业"孟德尔第一定律“中。
我想我可以用暴力强迫自己度过这一切,但不知何故,我的想法一定太复杂了。我的方法是:
建立一个概率树,它有三个层次。交配的生物有A和B两种,第一级是选择A纯合显性(k)、杂合(m)或纯合隐性(n)的概率。以纯合子优势为例,由于共有(k+m+n)生物,其中k为纯合子优势,其概率为k/(k+m+n)。
然后在这棵树下,每一棵树下都会出现生物B是k/m/n的概率,因为我们知道A被挑选为什么生物。例如,如果生物A被选择为杂合子(m),那么生物B也是杂合子的概率是(m-1)/(k+m+n-1),因为现在只剩下一个杂合生物了。
这将给出两级的概率,并将涉及到大量的代码来达到这个目的,因为我实际上是在构建一个树结构,并且每个分支都为该部分手动编写了代码。

现在,在选择生物A和B之后,它们每个都有两条染色体。这些染色体中的一条可以随机挑选。因此,对于A染色体1或2,B可以选择4种不同的选择: A选择1,A选择2,B选择1,A选择2,B选择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))发布于 2014-08-04 16:45:07
具有优势等位基因的物种为AA或Aa。
k + n + m包括k (hom)和AA的纯合子显性生物、Aa的m (het)杂合子显性生物和n (rec)具有aa的纯合子隐性生物。它们中的每一种都可以与其他任何一种交配。
具有显性等位基因的生物的概率是:
P_dom = n_dominant/n_total or 1 - n_recessive/n_total为这些组合中的每一个做Punnett正方形并不是一个坏主意:
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产生2/4的隐性等位基因。
对于其他组合,您可能也需要这样做。
既然我们不仅仅是一对一地交配,而是把所有的k + m + n组合在一起,那么后代的总数和带有特定等位基因的“孩子”的数量就很好了。
如果您不介意使用Python,scipy.misc的scipy.misc在这里可能会有所帮助。在计算中,不要忘记(a)从每个组合中得到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发布于 2017-07-19 03:32:15
这与其说是编码,不如说是概率/计数问题。首先计算后代只具有隐性性状的可能性比较容易。如果你有任何困难请告诉我。我运行了下面的代码,输出通过了rosalind分级器。
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))
发布于 2017-07-27 18:44:53
Klaus的解决方案大部分是正确的;然而,当计算至少有一个显性等位基因的组合数时,就会出现错误。这部分是不正确的,因为当结合两个等位基因形成后代时有4种可能性,但实际上只有一种可能性被执行。因此,Klaus的解决方案计算出的百分比明显高于应该达到的百分比。
计算具有至少一个显性等位基因的有机体的组合数的正确方法如下:
# 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.783333333333https://stackoverflow.com/questions/25119106
复制相似问题