假设有两个长度为20的二进制向量p1和p2,它们代表两个亲本个体的基因型。
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位置的第二个等位基因,反之亦然)?
发布于 2018-12-03 01:32:00
(注:在较早的草案中,我在后代计算中的索引是错误的。)
这里有一个基于我上面的评论的解决方案。
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)))但要由你自己决定如何处理这些数据。
编辑后添加:
上面的循环生成了大约一百万个后代,但在许多情况下,这是不必要的。如果p1或p2是纯合的(两列中的值相等),那么您选择哪一个都无关紧要。使用简单的模型,平均大约一半的位点在每个父母中是纯合的,所以实际上只需要大约一千个选择。这个版本的代码考虑到了这一点。它更复杂(因此更有可能包含but!),但速度要快1000倍:
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
}
}https://stackoverflow.com/questions/53579261
复制相似问题