从模拟网格的历史中查找单元的合并时间

时间:2019-02-17 23:09:20

标签: r grid-layout phylogeny

我正在写一个包含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

下面的树显示了我尝试捕获的关系 enter image description here

这是另外两个示例: 测试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

如果有人觉得有帮助,这是我在每个时间点的每个网格状态的半粗略绘图(忽略顶部的两行): enter image description here

非常感谢您的帮助!

2 个答案:

答案 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()函数将其转换为系统对象。 。 一旦将采样的单元存储为树,apeggtree中的现有函数将使其余操作变得容易。

请参见data(acme)软件包中的data.tree和此处的#Tree示例:https://rdrr.io/cran/data.tree/man/as.Node.data.frame.html