我正在写一个包含n x n单元格的模拟。在模拟的不同时间,随机绘制一个单元以“划分”。当一个细胞分裂时,它死亡并创建两个子细胞。一个女儿替换了原来的单元格,另一个女儿随机替换了网格中8个邻居中的一个。
网格由一个数据帧编码,该数据帧的开头为n ^ 2行,每个单元格为一行(每个单元格的起始时间为birth_time = 0,death_time = 50,parent = 0)。随着模拟的进行,为每个分裂事件添加了代表子单元格的两行,并更新了父级(和相邻前体)的死亡时间。为女儿分配了birth_time!= 0,death_time = 50和一个父母(请参见下面的示例)。
在模拟运行了指定的一段时间后(在下面的示例中为50),我对所有具有相同x坐标的单元格进行了采样。对于这些细胞,我想使用在网格数据框中编码的历史信息来查找它们的合并时间,即最终样本中两个或多个细胞的祖先所有细胞的死亡时间。我正在寻找一个可以在R中完成此功能的函数(或帮助构建自己可以在R中编写代码的算法)。
下面是三个示例,希望它们能使我的要求明确:
测试1:
> grid1
cellID x_coordinate y_coordinate onEdge parent birth_time death_time
1 1 1 1 1 0 0 50
2 2 2 1 1 0 0 50
3 3 3 1 1 0 0 2
4 4 4 1 1 0 0 50
5 5 5 1 1 0 0 50
6 6 1 2 1 0 0 50
7 7 2 2 0 0 0 50
8 8 3 2 0 0 0 2
9 9 4 2 0 0 0 50
10 10 5 2 1 0 0 50
11 11 1 3 1 0 0 50
12 12 2 3 0 0 0 50
13 13 3 3 0 0 0 12
14 14 4 3 0 0 0 50
15 15 5 3 1 0 0 50
16 16 1 4 1 0 0 50
17 17 2 4 0 0 0 50
18 18 3 4 0 0 0 21
19 19 4 4 0 0 0 50
20 20 5 4 1 0 0 50
21 21 1 5 1 0 0 50
22 22 2 5 1 0 0 50
23 23 3 5 1 0 0 50
24 24 4 5 1 0 0 50
25 25 5 5 1 0 0 50
26 26 3 2 0 8 2 12
27 27 3 1 1 8 2 50
28 28 3 2 0 26 12 33
29 29 3 3 0 26 12 21
30 30 3 3 0 29 21 33
31 31 3 4 0 29 21 45
32 32 3 3 0 30 33 45
33 33 3 2 0 30 33 50
34 34 3 4 0 31 45 50
35 35 3 3 0 31 45 50
我对结束时间(50)处存在且x坐标= 3的隐窝进行采样。请注意,尽管我在此测试用例中对所有5个隐窝进行了采样,但在实际模拟中将对其中的一个子集进行采样。
> sample1
cellID x_coordinate y_coordinate onEdge parent birth_time death_time
23 23 3 5 1 0 0 50
27 27 3 1 1 8 2 50
33 33 3 2 0 30 33 50
34 34 3 4 0 31 45 50
35 35 3 3 0 31 45 50
在此示例中,(3,5)处的单元格与其他单元格无关(除了所有单元格(0)的伪父节点之外。其他四个单元格都相关并且存在3个除法事件)有关系统发育的信息。
> res1
cellID x_coordinate y_coordinate onEdge parent birth_time death_time
1 8 3 2 0 0 0 2
3 29 3 3 0 26 12 21
5 31 3 4 0 29 21 45
这是另外两个示例: 测试2:
> grid2
cellID x_coordinate y_coordinate onEdge parent birth_time death_time
1 1 1 1 1 0 0 50
2 2 2 1 1 0 0 2
3 3 3 1 1 0 0 50
4 4 4 1 1 0 0 45
5 5 5 1 1 0 0 50
6 6 1 2 1 0 0 50
7 7 2 2 0 0 0 2
8 8 3 2 0 0 0 45
9 9 4 2 0 0 0 21
10 10 5 2 1 0 0 21
11 11 1 3 1 0 0 50
12 12 2 3 0 0 0 50
13 13 3 3 0 0 0 33
14 14 4 3 0 0 0 50
15 15 5 3 1 0 0 50
16 16 1 4 1 0 0 50
17 17 2 4 0 0 0 33
18 18 3 4 0 0 0 12
19 19 4 4 0 0 0 50
20 20 5 4 1 0 0 50
21 21 1 5 1 0 0 50
22 22 2 5 1 0 0 50
23 23 3 5 1 0 0 50
24 24 4 5 1 0 0 12
25 25 5 5 1 0 0 50
26 26 2 2 0 7 2 50
27 27 2 1 1 7 2 50
28 28 3 4 0 18 12 50
29 29 4 5 1 18 12 50
30 30 4 2 0 9 21 50
31 31 5 2 1 9 21 50
32 32 2 4 0 17 33 50
33 33 3 3 0 17 33 50
34 34 3 2 0 8 45 50
35 35 4 1 1 8 45 50
> sample2
cellID x_coordinate y_coordinate onEdge parent birth_time death_time
3 3 3 1 1 0 0 50
23 23 3 5 1 0 0 50
28 28 3 4 0 18 12 50
33 33 3 3 0 17 33 50
34 34 3 2 0 8 45 50
sample2中的单元完全不相关(它们最近的公共祖先是0伪节点)。该函数应不返回任何内容(或仅返回时间0)。
Test3:
> grid3
cellID x_coordinate y_coordinate onEdge parent birth_time death_time
1 1 1 1 1 0 0 50
2 2 2 1 1 0 0 50
3 3 3 1 1 0 0 50
4 4 4 1 1 0 0 50
5 5 5 1 1 0 0 50
6 6 1 2 1 0 0 50
7 7 2 2 0 0 0 31
8 8 3 2 0 0 0 34
9 9 4 2 0 0 0 37
10 10 5 2 1 0 0 50
11 11 1 3 1 0 0 50
12 12 2 3 0 0 0 22
13 13 3 3 0 0 0 8
14 14 4 3 0 0 0 8
15 15 5 3 1 0 0 6
16 16 1 4 1 0 0 50
17 17 2 4 0 0 0 2
18 18 3 4 0 0 0 2
19 19 4 4 0 0 0 3
20 20 5 4 1 0 0 50
21 21 1 5 1 0 0 50
22 22 2 5 1 0 0 50
23 23 3 5 1 0 0 50
24 24 4 5 1 0 0 50
25 25 5 5 1 0 0 50
26 26 2 4 0 17 2 50
27 27 3 4 0 17 2 3
28 28 3 4 0 27 3 45
29 29 4 4 0 27 3 6
30 30 4 4 0 29 6 50
31 31 5 3 1 29 6 50
32 32 4 3 0 14 8 50
33 33 3 3 0 14 8 22
34 34 3 3 0 33 22 45
35 35 2 3 0 33 22 31
36 36 2 3 0 35 31 50
37 37 2 2 0 35 31 34
38 38 2 2 0 37 34 50
39 39 3 2 0 37 34 37
40 40 3 2 0 39 37 49
41 41 4 2 0 39 37 50
42 42 3 3 0 34 45 49
43 43 3 4 0 34 45 50
44 44 3 3 0 42 49 50
45 45 3 2 0 42 49 50
> sample3 <- subset(grid3, x_coordinate==3 & death_time==50)
> sample3
cellID x_coordinate y_coordinate onEdge parent birth_time death_time
3 3 3 1 1 0 0 50
23 23 3 5 1 0 0 50
43 43 3 4 0 34 45 50
44 44 3 3 0 42 49 50
45 45 3 2 0 42 49 50
此网格具有许多与x坐标3重叠的事件,但是只有两个事件提供了信息:
> res3
cellID x_coordinate y_coordinate onEdge parent birth_time death_time
1 42 3 3 0 34 45 49
2 34 3 3 0 33 22 45
如果有人觉得有帮助,这是我在每个时间点的每个网格状态的半粗略绘图(忽略顶部的两行):
非常感谢您的帮助!
答案 0 :(得分:0)
您的问题很难理解,我不完全了解您需要什么以及为什么要为结果选择每个数据行。我的职能将检查在当地社区幸存的每一代祖先,并返回他们的信息。也许这将为解决您的问题提供指导。
find.elders = function(x, dead, dat){
locals = dat[dat$x_coordinate == x & dat$death_time != dead,]
survivors = dat[dat$x_coordinate == x & dat$death_time == dead,]
anc = survivors$parent
res = NULL
while(any(anc != 0)){
anc = anc[anc > 0]
cat("Ancestors:", anc, "\n")
res = c(res, which(locals$parent %in% anc))
survivors = locals[locals$cellID %in% anc,]
anc = survivors$parent
}
#res = c(res, which(locals$parent %in% anc))
locals[res,]
}
find.elders(3, 50, grid1)
答案 1 :(得分:0)
对于将来的读者,我意识到这个问题相当复杂且难以理解。我为此表示歉意。
我最终通过在网格数据帧中添加属性“ pathString”(格式为0 / 1、0 / 1/27等)来解决我的问题,其中对于每个单元格,该单元格都存储了其所有祖先以及“自身” 。
然后,我可以使用R中as.Node()
包中的data.tree
函数将网格转换为树对象,随后可以使用ape中的as.phylo()
函数将其转换为系统对象。 。
一旦将采样的单元存储为树,ape
和ggtree
中的现有函数将使其余操作变得容易。
请参见data(acme)
软件包中的data.tree
和此处的#Tree示例:https://rdrr.io/cran/data.tree/man/as.Node.data.frame.html