2

我目前正在使用 R 中的 bnstruct 包创建 DBN。每 6 个时间步长有 9 个变量。我有生物和非生物变量。我想防止生物变量成为非生物变量的父母。对于贝叶斯网络,使用例如layering = c(1,1,2,2,2)learn.dynamic.network().

但是动态部分出现了一个问题:我想在每个时间步中继续防止生物变量成为非生物变量的父母,同时防止从 t+1 到 t 的任何变量之间出现边。

如果我使用layering =

  • 1 用于 t1 的非生物变量
  • 2 用于 t1 的生物变量
  • 3 用于 t2 的非生物变量
  • 4 用于 t2 的生物变量...

我允许来自 t-1 的生物变量来解释 t 处的非生物变量(我不希望这样)。

所以我尝试了:

## 9 variables for 6 time steps 
test1 <- BNDataset(data = timedData,
                   discreteness = rep('d', 54),
                   variables = colnames(timedData),
                   node.sizes = rep(c(3,3,3,2,2,3,3,3,3), 6)
                   # num.time.steps = 6
                   )


## the 5 first variables are abiotic, the 4 last are biotics
dbn <- learn.dynamic.network(test1, 
                             num.time.steps = 6, 
                             layering = rep(c(1,1,1,1,1,2,2,2,2),6))

所以现在,我没有从生物到非生物的任何边缘(这很好),但我有从 variable_t(n+1) 到 variable_t(n) 的边缘。

我知道bnlearn您可以创建一个您不想看到的边缘“黑名单”,但我在 bnstruct 中看不到任何等效参数。任何的想法?

4

2 回答 2

2

使用默认使用的mmhc算法,您可以使用layer.struct参数指定允许哪些层对在它们之间有边。layer.struct取一个二进制矩阵,其中 celli,j是否1存在从 layeri中的变量到 layer 中的变量的边j0否则。

使用它的最佳方法是将它与您的第一个解决方案的手动指定分层相结合。

于 2020-05-08T08:25:32.670 回答
2

完美,两种论点的结合,layering =layer.struct =做了我想要的。

我在这里发布我使用的内容只是为了提供一个示例:

## DBN study
dbn <- learn.dynamic.network(test1, 
                             num.time.steps = 6, 
                             layering = rep(c(1,1,1,1,1,2,2,2,2,  # set 2 layers per time step
                                              3,3,3,3,3,4,4,4,4,
                                              5,5,5,5,5,6,6,6,6,
                                              7,7,7,7,7,8,8,8,8,
                                              9,9,9,9,9,10,10,10,10,
                                              11,11,11,11,11,12,12,12,12)),
                             layer.struct = matrix(c(1,0,0,0,0,0,0,0,0,0,0,0,  ## allow certain layers to connect to others by hand
                                                     1,1,0,0,0,0,0,0,0,0,0,0,
                                                     1,0,1,0,0,0,0,0,0,0,0,0,
                                                     1,1,1,1,0,0,0,0,0,0,0,0,
                                                     1,0,1,0,1,0,0,0,0,0,0,0,
                                                     1,1,1,1,1,1,0,0,0,0,0,0,
                                                     1,0,1,0,1,0,1,0,0,0,0,0,
                                                     1,1,1,1,1,1,1,1,0,0,0,0,
                                                     1,0,1,0,1,0,1,0,1,0,0,0,
                                                     1,1,1,1,1,1,1,1,1,1,0,0,
                                                     1,0,1,0,1,0,1,0,1,0,1,0,
                                                     1,1,1,1,1,1,1,1,1,1,1,1),c(12,12)))

感谢您的快速回答和包装顺便说一句

于 2020-05-08T13:58:59.333 回答