首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >罗莎琳德“孟德尔第一定律”

罗莎琳德“孟德尔第一定律”
EN

Stack Overflow用户
提问于 2014-08-04 12:50:31
回答 7查看 6.7K关注 0票数 2

为了准备即将到来的生物信息学课程,我正在做一些来自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。最后,这棵树具有这些叶概率。

然后,通过魔法,我会把所有这些概率加起来,看看两个有机体产生一个具有显性等位基因的生物的概率是多少。

我怀疑这项任务的设计是否要花上几个小时才能解决。我在想什么?

更新:

以最荒谬的蛮力方式解决了这件事。只是运行了数千个模拟配对,并找出了部分,最终有一个主要的等位基因,直到有足够的精确度通过分配。

代码语言:javascript
复制
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))
EN

回答 7

Stack Overflow用户

发布于 2014-08-04 16:45:07

具有优势等位基因的物种为AAAa

k + n + m包括k (hom)和AA的纯合子显性生物、Aam (het)杂合子显性生物和n (rec)具有aa的纯合子隐性生物。它们中的每一种都可以与其他任何一种交配。

具有显性等位基因的生物的概率是:

代码语言:javascript
复制
P_dom = n_dominant/n_total or 1 - n_recessive/n_total

为这些组合中的每一个做Punnett正方形并不是一个坏主意:

代码语言:javascript
复制
  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.miscscipy.misc在这里可能会有所帮助。在计算中,不要忘记(a)从每个组合中得到4子级,以及(b)需要一个因子(来自旁尼特平方)来确定组合中的隐性(或显性)后代。

更新

代码语言:javascript
复制
    # 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
票数 6
EN

Stack Overflow用户

发布于 2017-07-19 03:32:15

这与其说是编码,不如说是概率/计数问题。首先计算后代只具有隐性性状的可能性比较容易。如果你有任何困难请告诉我。我运行了下面的代码,输出通过了rosalind分级器。

代码语言:javascript
复制
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))

票数 1
EN

Stack Overflow用户

发布于 2017-07-27 18:44:53

Klaus的解决方案大部分是正确的;然而,当计算至少有一个显性等位基因的组合数时,就会出现错误。这部分是不正确的,因为当结合两个等位基因形成后代时有4种可能性,但实际上只有一种可能性被执行。因此,Klaus的解决方案计算出的百分比明显高于应该达到的百分比。

计算具有至少一个显性等位基因的有机体的组合数的正确方法如下:

代码语言:javascript
复制
# 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)的组合的格数。

因此,完整正确的代码段如下所示:

代码语言:javascript
复制
# 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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25119106

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档