在 R 中使用 bnstruct 为动态贝叶斯网络设置层

Setting layers for a Dynamic Bayesian Network with bnstruct in R

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

很容易实现

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

如果我在layering =中使用:

我允许来自 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 中你可以创建一个你不想看到的 "blacklist" 边,但我在 bnstruct 中没有看到任何等效的参数。任何想法?

使用默认使用的 mmhc 算法,您可以使用 layer.struct 参数指定允许哪些层对在它们之间有边。 layer.struct 采用二元矩阵,其中单元格 i,j1 如果存在从层 i 中的变量到层 j 中的变量的边,并且 0 否则。

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

完美,参数 layering =layer.struct = 的组合满足了我的要求。

我post我这里用的只是举个例子:

## 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)))

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