我用bnlearn构建了一个网络,但有一些节点没有连接到另一个节点的边,所以我想删除它们。有从bn对象中删除特定节点的命令吗?
发布于 2018-02-08 11:20:10
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设置有向边。
发布于 2016-11-16 18:58:02
因此,我的尝试是使用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个),并且你只想从列表中删除几个节点,那么这是可行的。
希望这能有所帮助!
发布于 2016-12-15 09:20:37
Fabiola的回答对我帮助很大。
在这里,它是一种执行相同操作的方法,但不必手动更改模型字符串。
这是我第一次回答一个问题,所以,请在格式上对我宽松一点。
"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]https://stackoverflow.com/questions/40608753
复制相似问题