在 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 =
中使用:
- 1 对于 t1 的非生物变量
- t1 时的生物变量为 2
- 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
中你可以创建一个你不想看到的 "blacklist" 边,但我在 bnstruct 中没有看到任何等效的参数。任何想法?
使用默认使用的 mmhc
算法,您可以使用 layer.struct
参数指定允许哪些层对在它们之间有边。 layer.struct
采用二元矩阵,其中单元格 i,j
为 1
如果存在从层 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)))
感谢您的快速回答和顺便说一句的包裹
我目前正在使用 R 中的 bnstruct 包创建 DBN。我在每 6 个时间步长中有 9 个变量。我有生物和非生物变量。我想防止生物变量成为非生物 variables.For 贝叶斯网络的父代,使用 layering = c(1,1,2,2,2)
in learn.dynamic.network()
.
但是动态部分出现了一个问题:我想在每个时间步中继续防止生物变量成为非生物变量的父代,同时防止边缘出现在从 t+1 到 t 的任何变量之间。
如果我在layering =
中使用:
- 1 对于 t1 的非生物变量
- t1 时的生物变量为 2
- 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
中你可以创建一个你不想看到的 "blacklist" 边,但我在 bnstruct 中没有看到任何等效的参数。任何想法?
使用默认使用的 mmhc
算法,您可以使用 layer.struct
参数指定允许哪些层对在它们之间有边。 layer.struct
采用二元矩阵,其中单元格 i,j
为 1
如果存在从层 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)))
感谢您的快速回答和顺便说一句的包裹