我目前正在使用R中的bnstruct包创建一个DBN,我在每6个时间步骤中有9个变量。我有生物和非生物变量。我想防止生物变量成为非生物variables.For的父母--一种贝叶斯网络,很容易实现,例如在learn.dynamic.network()
中使用layering = c(1,1,2,2,2)
。
但动态部分出现了一个问题:我希望在每一时间步骤中防止生物变量成为非生物变量的父母,同时防止从t+1到t的任何变量之间出现边缘。
如果我在layering =
中使用
F 212
我允许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中没有看到任何等价的参数。有什么想法吗?
发布于 2020-05-08 08:25:32
使用默认的mmhc
算法,您可以使用layer.struct
参数来指定哪些层之间允许有边缘。layer.struct
采用二进制矩阵,其中单元格i,j
为1
,如果可以从层i
中的变量到层j
中的变量,则为0
。
使用此方法的最佳方法是将其与手动指定的第一个解决方案分层相结合。
发布于 2020-05-08 13:58:59
很好,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)))
谢谢你的快速答复和包裹
https://stackoverflow.com/questions/61662014
复制相似问题