我目前正在R中使用bnstruct包创建一个DBN。我在每6个时间步长中有9个变量。我有生物和非生物变量。我想防止生物变量成为非生物变量的父母。对于贝叶斯网络来说,在learn.dynamic.network()
中使用layering = c(1,1,2,2,2)
是非常容易实现的。
但动态部分出现了一个问题:我想在每个时间步长中不断防止生物变量成为非生物变量的父母,同时防止从t+1到t的任何变量之间出现边缘。
如果我在layering =
:中使用
- 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,j
为1
,否则为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