【发布时间】:2017-03-29 06:30:48
【问题描述】:
我用 bnlearn 建立了一个网络,但是有一些节点没有到另一个节点的边缘,所以我想删除它们。是否有从 bn 对象中删除特定节点的命令?
【问题讨论】:
标签: r nodes bayesian-networks
我用 bnlearn 建立了一个网络,但是有一些节点没有到另一个节点的边缘,所以我想删除它们。是否有从 bn 对象中删除特定节点的命令?
【问题讨论】:
标签: r nodes bayesian-networks
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 设置有向边。
【讨论】:
所以我的尝试是使用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 个)并且您只想从列表中删除一些节点,这会起作用。
希望有帮助!
【讨论】:
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]
【讨论】: