r-创建后代的可能结果基因型

时间:2018-12-02 10:10:27

标签: r genetics population

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

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

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

1 个答案:

答案 0 :(得分:1)

(注意:在较早的草案中,我在后代计算中建立了索引错误。)

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

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
  }
}