我用bnlearn构建了一个网络,但是有一些节点没有到另一个节点的边,所以我想删除它们。有没有从 bn 对象中删除特定节点的命令?
bnlearn
有内置的 arc 操作(文档也这里)就是为此而设计的。 这些函数还具有检查图中循环的优点,因为贝叶斯网络需要是非循环的(有向非循环图或 DAG),否则您会得到无限循环并且无法计算条件概率。 还有一个 check.illegal
参数,用于在添加弧时检查模型是否存在其他违规情况(请参阅文档)。
但是,他们的例子并不好,文档也不是很好。 这些操作返回一个模型,因此您必须用返回的模型覆盖旧模型。
data(learning.test)
# model ends up the same every time here, but may want
# to set random seed for reproducibility in other cases
set.seed(42)
model = tabu(learning.test) # tabu is a better algo than hc I think
plot(model)
model <- set.arc(model, "A", "F")
plot(model)
model <- drop.arc(model, "A", "F")
plot(model)
set.edge
设置无向边,而 set.arc
设置有向边。
所以我的尝试是使用
modelstring
函数。获取字符串,删除节点(我知道它没有任何弧/边) - 我手动执行此操作 - 保存到新的修改字符串,然后使用命令 model2network
再次将字符串转换为网络。以下是命令序列:
model.string <- modelstring(mymodel)
model.string
new.string <- "your string except the node you want to remove from the output above"
new.model <- model2network(new.string)
我想如果您总共没有很多节点(我有 22 个)并且您只想从列表中删除一些节点,那么这会起作用。
希望有帮助!
法比奥拉的回答对我帮助很大。
这是一种执行相同操作但无需手动更改模型字符串的方法。
这是我第一次回答问题,所以请对我的格式宽松一点。
“net”是我的网络,“TARGET_NODE”是我想要预测的节点(我将其包含在列表中以确保我不会删除它)和“uniq”我的数据集。
model.string <- modelstring(net)
final_nodes <- unique(c(unlist(list(net$arcs)), TARGET_NODE))
nodes_to_delete <- paste("\\[",setdiff(names(net$nodes), final_nodes),"]", sep = "")
for (i in 1:length(nodes_to_delete)) {model.string <- gsub(nodes_to_delete[i], "", model.string)}
net <- model2network(model.string)
cols <- c(match(final_nodes, names(uniq)))
uniq <- uniq[,cols]
我对这个问题的解释有点不同,对我来说,在 R 中这是我的方法: 鉴于我们有一个网络 iam:
all_nodes <- nodes(iam)
# Find connected nodes
connected_nodes <- unique(unlist(
lapply(all_nodes, function(n) mb(iam, n))))
# Create a subgraph with only the connected nodes
connected_graph <- subgraph(iam, connected_nodes)