【问题标题】:Computing the probability of an offspring having at least one dominant allele计算具有至少一个显性等位基因的后代的概率
【发布时间】:2014-07-21 10:41:30
【问题描述】:

我正在尝试解决 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 ]

【问题讨论】:

  • 我认为您应该将您的功能拆分为不同的单独任务。恕我直言,该功能做得太多并且不完全可读。 getMultiplier 也可以通过匹配0.750.50.0 来减少,并让其他所有内容为1.0getMultiplier (_, _) = 1.0。奇怪的是我今天做了同样的练习。如果您需要灵感,可以找到我的解决方案here。 :)
  • 我们还需要知道cartProd 做了什么。不过,我想这是笛卡尔积。如果您可以发布SSCCE,这将增加您获得答案的变化。
  • 感谢您的回复。我在编写 getMultiplier 时就知道我没有高效地完成它,但我现在意识到大多数模式匹配是多么冗余。我会尝试改变我的解决方案,如果需要,我会看看你的解决方案。
  • 如果您能够提供 SSCCE(只需提供可编译版本,Ideone 或其他任何内容),我将很乐意为您提供帮助。
  • “一点点”是多少?

标签: haskell bioinformatics genetics rosalind


【解决方案1】:

我建议通过三步计算来稍微改变你的想法:

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

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

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

为每个 (X, Y) 对求和步骤 1-3。

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

【讨论】:

  • 这是我使用这种方法提出的解决方案:traitProb' k m n = let j = k + n + m a = k + n + m - 1 in ((k/j) * (((k-1)/a) + (n/a) + (m/a))) + ((n/j) * ((k/a) + (m/a/2))) + ((m/j) * ((k/a) + (n/a/2) + ((m-1)/a * 0.75 ))) 它基本上是一个只写的解决方案,但它确实有效。我最初尝试过,但由于某种原因无法得到正确的答案。
猜你喜欢
  • 2021-05-08
  • 1970-01-01
  • 1970-01-01
  • 2015-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-18
相关资源
最近更新 更多