8

我正在尝试在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
4

3 回答 3

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 > 1,[X 选择 2] 只是 [X * (X - 1) / 2],对于 X = 0 或 1,则为 0。

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

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

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

于 2014-10-16T17:10:00.787 回答
3

我在这个问题上花了一些时间,所以,在 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))
于 2017-06-26T02:03:13.950 回答
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、n&m 为 50%,n&n 为 0%。现在将结果加在一起,您就有了解决方案。

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

于 2015-03-08T01:37:55.990 回答