计算具有至少一个显性等位基因的后代的概率

时间:2014-05-31 23:45:25

标签: haskell bioinformatics genetics rosalind

我正在努力解决“孟德尔第一定律”#39;问题http://rosalind.info/

我尝试了几种不同的方法,但我无法让我的解决方案返回与其页面上的示例问题相同的答案。我知道他们的样本输出是正确的。

这就是我所拥有的:

traitProb :: Int -> Int -> Int -> Double
traitProb k m n = getProb list
      where list = cartProd genotypes genotypes
            genotypes = (replicate k Dominant) ++ (replicate m Heterozygous) ++ (replicate n Recessive)
            getProb = sum . map ((flip (/)) total . getMultiplier)
            total = fromIntegral $ length list
            getMultiplier (Dominant, Dominant) = 1.0
            getMultiplier (Recessive, Dominant) = 1.0
            getMultiplier (Dominant, Recessive) = 1.0
            getMultiplier (Dominant, Heterozygous) = 1.0
            getMultiplier (Heterozygous, Dominant) = 1.0
            getMultiplier (Heterozygous, Heterozygous) = 0.75
            getMultiplier (Heterozygous, Recessive) = 0.5
            getMultiplier (Recessive, Heterozygous) = 0.5
            getMultiplier (Recessive, Recessive) = 0.0

我不确定代码是否错误,或者我的计算概率的方法是错误的。基本上,这个想法是获得所有可能父母的清单,然后根据他们是纯合子,隐性还是杂合子,计算每对父母生产一个至少有一个显性等位基因的孩子的概率。然后将每个结果除以父母对的总数。之后,我只是总结清单。但我的答案有点错误。

有人能指出我正确的方向吗?

编辑:cartProd是笛卡尔产品'如果你愿意的话,传递给它的两个清单。

cartProd :: [a] -> [a] -> [(a, a)]
cartProd xs ys = [ (x, y) | x <- xs, y <- ys ]

1 个答案:

答案 0 :(得分:2)

我建议您通过三个步骤进行计算,略微改变您的想法:

  1. 第一个父母获得基因型X的概率是多少? (另外,X有多少种不同的选择?)

  2. 第二个父母获得基因型Y的概率是多少?

  3. 鉴于父母的基因型X和Y,孩子显示显性基因型的概率是多少?

  4. 每个(X,Y)对的步骤1-3。

    当我手工绘制树形图时,我发现更容易计算出没有显性等位基因的孩子的概率。总和的选择较少,然后你可以从1中减去这个总和。