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



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

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

如果我在layering =:中使用

t1时非生物变量的
  • 1
  • t1时的生物变量为2
  • t2时的非生物变量为3
  • t2时的生物变量为4

我允许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中没有看到任何等效的参数。知道吗?

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

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

完美,参数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)))

感谢你的快速回答和包btw

相关内容

  • 没有找到相关文章

最新更新