将 R 中 bnlearn 包的爬山算法结果绘制为 Reingold-Tilford 树图时出错

Error plotting the results of a hill-climbing algorithm from bnlearn package in R as a Reingold-Tilford tree graph

我是第一次发帖,但是这个网站的长期学习者。这是我的问题的答案第一次没有从以前的帖子中逆向工程,所以我希望有人能帮我解决它。

我正在尝试将爬山搜索算法的结果(hc 来自 R 中的 bnlearn 包)运行 绘制在相关矩阵上作为 Reingold-蒂尔福德树图。

说我 运行:

    hc.obj<-hc(corr.matrix)
    hc.plot<-qgraph(hc.obj, directed = "TRUE", layout = "spring")

我得到了定向关系的 Fruchterman-Reingold 布局没问题。

但是无论我如何格式化 hc.obj 中的信息,我都无法使用树状布局。例如,运行将上面的代码与 "layout = tree" 结合起来,我得到错误:"Error in l[, 1] : incorrect number of dimensions"。

这是一个可重现的例子:

    require("bnlearn")
    require("qgraph")
    cm <- matrix(runif(100), ncol=10)
    cm <- (cm * lower.tri(cm)) + t(cm * lower.tri(cm))
    diag(cm) <- 1 
    cm.df<-as.data.frame(cm)
    hc.obj<-hc(cm.df)
    hc.plot<-qgraph(hc.obj, directed = "TRUE", layout = "tree")

同样,如果我尝试通过 igraph 运行 作为:

    layout_as_tree(hc.obj)

我收到错误 "Error in layout_as_tree(hc.obj) : Not a graph object"

您似乎在尝试使用绘图函数做一些他们不打算做的事情。

hc.obj 是 class bn 的模型对象,而 qplot() 例如支持以下内容:

...either a weights matrix or an edgelist. Can also be an object of class "sem" (sem), "mod" (sem), "lavaan" (lavaan), "principal" (psych), "loadings" (stats), "factanal" (stats), "graphNEL" (Rgraphviz), "pcAlgo" (pcalg), "huge" (huge), "select" (huge) or the output of glasso".

但是您可以 plot a bn object。一种方法是简单地使用 plot().

if(!require(pacman)) install.packages("pacman")
pacman::p_load(qgraph,bnlearn,Rgraphviz)
cm <- matrix(runif(100), ncol=10)
cm <- (cm * lower.tri(cm)) + t(cm * lower.tri(cm))
diag(cm) <- 1 
cm.df<-as.data.frame(cm)
hc.obj<-hc(cm.df)
plot(hc.obj)

另一种方法是使用graphviz.plot()

bnlearn::graphviz.plot(hc.obj)

如果您进行搜索或查看 the relevant CRAN task view,您可能会找到更多支持 bn class 对象的软件包。