我试图在http://rosalind.info/problems/iprb/
解决问题给定:代表人口的三个正整数
k
,m
和n
包含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
答案 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。
六个多重集的概率如下:
这些总和为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%。现在将结果一起添加,您就可以获得解决方案了。
答案 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))