我用bnlearn构建了一个网络,但是有一些节点没有边缘到另一个节点,所以我想删除它们。是否有命令从bn对象中删除特定节点?
答案 0 :(得分:3)
bnlearn
内置了arc operations(文档也here)。这些函数还具有检查图中循环的好处,因为贝叶斯网络需要是非循环的(有向无环图或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
设置有向边。
答案 1 :(得分:1)
所以我的尝试就是使用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个)并且你只想从列表中删除一些节点,那就行了。
希望有所帮助!
答案 2 :(得分:1)
Fabiola的回答对我很有帮助。
这是一种做同样的方法,但无需手动更改模型字符串。
这是我第一次回答问题,因此,关于格式,请放轻松。
&#34;净&#34;是我的网络,&#34; TARGET_NODE&#34;是我想要预测的节点(我将其包括在列表中以确保我不会删除它)和&#34; uniq&#34;我的数据集。
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]