罗莎琳德:孟德尔的第一部法律

时间:2014-10-15 15:10:20

标签: python probability bioinformatics rosalind

我试图在http://rosalind.info/problems/iprb/

解决问题
  

给定:代表人口的三个正整数kmn   包含k+m+n生物:k个体是纯合子的   一个因子,m是杂合的,而n是纯合的隐性。

     

返回:两个随机选择的交配生物的概率   将产生一个拥有显性等位基因的个体(因此   显示显性表型)。假设任何两种生物都可以   伴侣。

我的解决方案适用于样本,但不适用于生成的任何问题。经过进一步的研究,似乎我应该找到随机选择任何一个生物体的概率,找到选择第二个生物体的概率,然后是配对产生后代与显性等位基因的概率。

我的问题是:我的代码在下面找到了什么概率?对于所有可能的交配,它是否找到具有显性等位基因的后代的百分比 - 因此,如果对所有对进行测试,我的代码是否正在解决具有显性等位基因的后代的百分比?

f = open('rosalind_iprb.txt', 'r')
r = f.read()
s = r.split()
############# k = # homozygotes dominant, m = #heterozygotes, n = # homozygotes recessive
k = float(s[0])
m = float(s[1])
n = float(s[2])
############# Counts for pairing between each group and within groups
k_k = 0
k_m = 0
k_n = 0

m_m = 0
m_n = 0

n_n = 0


##############
if k > 1:
    k_k = 1.0 + (k-2) * 2.0

k_m = k * m

k_n = k * n

if m > 1:
    m_m = 1.0 + (m-2) * 2.0

m_n = m * n

if n> 1:
    n_n = 1.0 + (n-2) * 2.0
#################
dom = k_k + k_m + k_n + 0.75*m_m + 0.5*m_n
total = k_k + k_m + k_n + m_m + m_n + n_n

chance = dom/total
print chance

3 个答案:

答案 0 :(得分:3)

看看你的代码,我很难搞清楚它应该做些什么。我将在这里解决这个问题。

让我们简化措辞。有n1类型1,n2类型2和n3类型3项。

在所有项目中有多少种方式可以选择一组2号? (n1 + n2 + n3)选择2。

每对项目的项目类型都对应于以下六个无序多重集合中的一个:{1,1},{2,2},{3,3},{1,2},{1,3} ,{2,3}

{i,i}形式有多少多个集合?你选择2。

{i,j}形式有多少多个集合,其中i!= j? ni * nj。

六个多重集的概率如下:

  • P({1,1})= [n1选择2] / [(n1 + n2 + n3)选择2]
  • P({2,2})= [n2选择2] / [(n1 + n2 + n3)选择2]
  • P({3,3})= [n3选择2] / [(n1 + n2 + n3)选择2]
  • P({1,2})= [n1 * n2] / [(n1 + n2 + n3)选择2]
  • P({1,3})= [n1 * n3] / [(n1 + n2 + n3)选择2]
  • P({2,3})= [n2 * n3] / [(n1 + n2 + n3)选择2]

这些总和为1.注意,[X选择2]对于X>只是[X *(X-1)/ 2]。 1和0表示X = 0或1。

  

返回:两个随机选择的交配生物将产生具有显性等位基因的个体(从而显示显性表型)的概率。

要回答这个问题,您只需要确定六个多重集中的哪一个对应于此事件。由于缺乏遗传学知识来回答这个问题,我将把它留给你。

例如,假设如果两个父母中的任何一个是1型,则会产生显性等位基因。然后感兴趣的事件是{1,1},{1,2},{1,3}以及事件是P({1,1})+ P({1,2})+ P({1,3})。

答案 1 :(得分:2)

如果您有兴趣,我只是找到了解决方案并将其放入C#。

    public double mendel(double k, double m, double n)
    {
        double prob;

        prob = ((k*k - k) + 2*(k*m) + 2*(k*n) + (.75*(m*m - m)) + 2*(.5*m*n))/((k + m + n)*(k + m + n -1)); 

        return prob;
    }

我们的参数是k(显性),m(杂),和n(隐性)。 首先,我发现每个可能的育种配对选择的概率就人口百分比而言。因此,k的第一轮选择看起来像k /(k + m + n),并且在第一轮选择k之后的第二轮选择k看起来像(k-1)/(k + m + n) )。然后乘以这两个得到结果。由于有三个确定的人群,有九种可能的结果。

然后我将每个结果乘以它的优势概率 - 对于k为任何东西为100%,m& m为75%,m& n为50%,n& m为0%,n& n为0%。现在将结果一起添加,您就可以获得解决方案了。

http://rosalind.info/problems/iprb/

答案 2 :(得分:2)

我在这个问题上花了一些时间,所以,在python中澄清一下:

lst = ['2', '2', '2']
k, m, n = map(float, lst)
t = sum(map(float, lst))
# organize a list with allele one * allele two (possibles) * dominant probability
# multiplications by one were ignored
# remember to substract the haplotype from the total when they're the same for the second haplotype choosed
couples = [
            k*(k-1),  # AA x AA
            k*m,  # AA x Aa
            k*n,  # AA x aa
            m*k,  # Aa x AA
            m*(m-1)*0.75,  # Aa x Aa
            m*n*0.5,  # Aa x aa
            n*k,  # aa x AA
            n*m*0.5,  # aa x Aa
            n*(n-1)*0  # aa x aa
]
# (t-1) indicate that the first haplotype was select
print(round(sum(couples)/t/(t-1), 5))