【问题标题】:r - Create possible outcome genotypes of offspringr - 创建后代的可能结果基因型
【发布时间】:2018-12-02 10:10:26
【问题描述】:

设两个二元向量p1p2,长度为20,代表两个父母个体的基因型。

p1 <- sample(c(0,1), 20, replace=T)
p2 <- sample(c(0,1), 20, replace=T)

那么前 10 个数字代表一个染色体上的等位基因,第二个 10 个数字代表第二个染色体上的等位基因,即我们正在查看 10 个双等位基因位点。现在我想生成父母双方的后代个体可以拥有的所有可能的基因型。如何在假设重组的情况下创建这些序列(即,如果从p2 的 2 个等位基因中选择基因座 i 处的一个等位基因,则必须从p1 中获取位置 i+10 处的第二个等位基因,反之亦然)?

【问题讨论】:

  • 听起来你的数据结构让事情变得更难了。如果将每个父母都表示为具有 10 行(代表 10 个基因座)和 2 列(代表每个基因座的两个等位基因)的矩阵或数据框,会不会更容易?然后重组将对应于从每个父项中选择一列。
  • 感谢@user2554330 的提问。是的,这是查看它的另一种方式。尽管如此,我仍然不知道如何有效地生成可能的后代基因型。有什么想法吗?
  • 每个亲本有 2^10 种可能的等位基因选择。您可以通过以二进制形式写入数字 0 到 1023 来编码。然后你只有一个从 0 到 1023 的循环用于一个父母,并在其中嵌套另一个从 0 到 1023 的循环。解码选择以构建后代基因型。
  • 嗯,我认为有 2^20 种可能的选择(每个基因座 2 个等位基因)。而且解决方案听起来很慢;)但也许没有更好的机会......谢谢
  • 每个父母 2^10,总共 2^20。这只是一百万,并非不可行。

标签: r genetics population


【解决方案1】:

(注意:我在早期草稿中的后代计算中的索引错误。)

这是基于我上面的 cmets 的解决方案。

library(compositions)

p1 <- matrix(sample(0:1, 20, replace = TRUE), ncol = 2)
p2 <- matrix(sample(0:1, 20, replace = TRUE), ncol = 2)

for (choice1 in 0:1023) {
  p1choices <- bit(choice1, 0:9) + 1
  for (choice2 in 0:1023) {
    p2choices <- bit(choice2, 0:9) + 1
    offspring <- cbind(p1[cbind(1:10, p1choices)], p2[cbind(1:10, p2choices)])
    # record this somehow
  }
}

我省略了记录所有后代基因型的步骤。您可以使用

offspring 的列转换为 0:1023 中的两个数字
apply(offspring, 2, function(x) sum(x*2^(0:9)))

但您可以自行决定如何处理这些内容。

编辑添加:

上面的循环产生了大约一百万个后代,但在许多情况下,这不是必需的。如果 p1p2 是纯合子(两列中的值相等), 你选择哪一个并不重要。使用简单的模型,平均每个亲本中大约一半的基因座是纯合的,所以实际上只需要大约一千个选择。这个版本的代码考虑到了这一点。它更复杂(因此更可能包含错误!),但速度快了一千倍:

library(compositions)

p1 <- matrix(sample(0:1, 20, replace = TRUE), ncol = 2)
hetero1 <- p1[,1] != p1[,2]
count1 <- sum(hetero1)
p1choices <- rep(1, 10)
p2 <- matrix(sample(0:1, 20, replace = TRUE), ncol = 2)
hetero2 <- p2[,1] != p2[,2]
count2 <- sum(hetero2)
p2choices <- rep(1, 10)

for (choice1 in 0:(2^count1 - 1)) {
  p1choices[hetero1] <- bit(choice1, 0:(count1 - 1)) + 1
  for (choice2 in 0:(2^count2 - 1)) {
    p2choices[hetero2] <- bit(choice2, 0:(count2 - 1)) + 1
    offspring <- cbind(p1[cbind(1:10, p1choices)], p2[cbind(1:10, p2choices)]) 
    # record this somehow
  }
}

【讨论】:

  • 好的,知道了。非常感谢!
猜你喜欢
  • 2021-03-05
  • 1970-01-01
  • 2023-03-20
  • 2018-02-10
  • 1970-01-01
  • 2021-12-01
  • 2022-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多