Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python “罗莎琳”;孟德尔';“第一定律”;IPRB_Python_Bioinformatics_Rosalind - Fatal编程技术网

Python “罗莎琳”;孟德尔';“第一定律”;IPRB

Python “罗莎琳”;孟德尔';“第一定律”;IPRB,python,bioinformatics,rosalind,Python,Bioinformatics,Rosalind,为了准备即将到来的生物信息学课程,我正在rosalind.info上做一些作业。我目前被困在作业“”中 我想我可以强迫自己通过这件事,但不知何故,我的想法肯定太复杂了。我的做法是: 建立一个三级概率树。有两种生物交配,生物A和生物B。第一个层次是,选择纯合子显性(k)、杂合子(m)或纯合子隐性(n)作为生物的概率是多少。例如,对于纯合显性,由于总共有(k+m+n)种生物,其中k种为纯合显性,因此概率为k/(k+m+n) 然后在这棵树上,在每一棵树下都会出现生物B被k/m/n的概率,因为我们知道A

为了准备即将到来的生物信息学课程,我正在rosalind.info上做一些作业。我目前被困在作业“”中

我想我可以强迫自己通过这件事,但不知何故,我的想法肯定太复杂了。我的做法是:

建立一个三级概率树。有两种生物交配,生物A和生物B。第一个层次是,选择纯合子显性(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之后,它们每个都有两条染色体。其中一条染色体可以随机挑选。因此,对于一条染色体,1或2可以被选择,B也可以被选择。所以有4种不同的选择:A的选择1,B的选择1,A的选择2,B的选择1,A的选择2,B的选择2。每种选择的概率都是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))

具有显性等位基因的物种为
AA
AA

你的总人口(
k+n+m
k
hom
)纯合优势生物和
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
产生4个生物体中的1个具有隐性等位基因,
het
+
rec
产生4个生物体中的2个具有隐性等位基因

对于其他组合,您可能也希望这样做

因为我们不仅仅是一对一地与生物体交配,而是将整个
k+m+n
组合在一起,所以很想知道后代的总数以及具有特定等位基因的“儿童”的数量

如果你不介意一点Python的话,
scipy.misc
中的
comb
在这里可能会有所帮助。在计算中,不要忘记(a)你从每个组合中得到
4个子代,以及(b)你需要一个因子(来自punnet方块)来确定组合中的隐性(或显性)子代

更新


这更像是一个概率/计数问题,而不是编码问题。首先计算后代只有隐性特征的概率更容易。如果你在理解任何东西方面有任何困难,请告诉我。我运行了以下代码,我的输出通过了rosalind分级机

def孟德尔(x,y,z):
#只计算隐性性状的概率
总计=x+y+z
两个凹槽=(z/总计)*(z-1/(总计1))
twoHetero=(y/总计)*((y-1)/(总计1))
异侧隐窝=(z/总计)*(y/(总计-1))+(y/总计)*(z/(总计-1))
凹槽Prob=两个凹槽+两个异形*1/4+异形凹槽*1/2
打印(1-recessProb)#取补码
#孟德尔(2,2,2)
打开(“rosalind_iprb.txt”、“r”)作为文件:
line=file.readline().split()
x、 y,z=[int(n)代表n行]
打印(x、y、z)
file.close()文件

印刷品(孟德尔(x,y,z))
克劳斯的解决方案大部分是正确的;但是,在计算至少有一个显性等位基因的组合数时会出现错误。这部分是不正确的,因为当组合两个等位基因形成后代时有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&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

您不需要在while循环中运行数千个模拟。您可以运行一个模拟,并根据其结果计算概率

来自itertools导入产品的

k=2#AA纯合显性
m=2#Aa杂合子
n=2#aa纯合隐性
人口=(['AA']*k)+(['AA']*m)+(['AA']*n)
所有儿童=[]
给爸爸
# 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
DDxDD, DDxDd, DdxDD, DdxDd, DDxdd, ddxDD, Ddxdd, ddxDd
1.0, 1.0, 1.0, 0.75, 1.0, 1.0, 0.5, 0.5
total_probability = ((k ** 2 - k) + (2 * k * m) + (3 / 4 * (m ** 2 - m)) + (2* k * n) + (m * n)) / (total_pop ** 2 - total_pop)