贝叶斯网络“catnet”包 cnPlot 返回 null

问题描述

我第一次使用贝叶斯网络,我在 R 中使用 Catnet 包。原因是我的数据充满了分类变量和很多缺失的数据。我尝试了在 StackOverflow 其他地方发布的简单示例,只是为了了解它是如何工作的。虽然它能够生成网络中每个节点的条件概率,但我无法以图形方式可视化网络以便于理解。 cnPlot(catNetwork) 只返回 null。我想知道是否有使用 CatNet 经验的人可以指出我的方法存在的问题。谢谢。

创建猫网络:

 cnet <- catnet::cnNew(
  nodes = c("sport","high_hc","high_hg"),cats = list(c("1","2"),c("1","2")),parents = list(NULL,NULL,c(1,2))
)

设置经验概率

cnet2 <- catnet::cnSetProb(cnet,data=ais_v2.sub)

绘制网络

Sys.setenv(R_CATNET_USE_IGRAPH=TRUE)

cnPlot(cnet2)

绘图最终返回空值。我还导入了 igraph 库。不知道发生了什么。

对于可重现的示例,我尝试了与此 thread 相同的方法:

代码示例如下:

#rm(list=ls())

### generate random data (not simply independent binomials)
set.seed(123)
n.obs <- 10
a1 <- rbinom(n.obs,1,.3)
a2 <- runif(n.obs)
a3 <- floor(-3*log(.25+3*a2/4))
a3[a3>=2] <- NA
a2 <- floor(2*a2)
my.data <- data.frame(a1,a2,a3 )
### discretize data into proper categories
my.data <- cnDiscretize(my.data,numCategories=2)

my.data

## say we want a2 conditional on a1,a3

## first generate a network with a1,a3 ->a2
cnet <- cnNew(
      nodes = c("a1","a2","a3"),3),NULL)
      )


## set the empirical probabilities from data=my.data
cnet2 <- cnSetProb(cnet,data=my.data)

## to get the conditional probability table
cnProb(cnet2,which='a2')

cnProb 的输出为:

$a2
   a1  a3   1   2
A 1.0 1.0 0.0 1.0
B 1.0 2.0 0.5 0.5
A 2.0 1.0 0.5 0.5
B 2.0 2.0 0.5 0.5

但是在尝试绘图时,

cnPlot(cnet2)

它返回,

NULL

解决方法

对我来说类似,?cnPlot 中的示例也生成 NULL 并且没有 R 图。添加文件参数也不会产生任何输出。 cnDot(cnet,"cnet") 生成外部 dot 文件,可以使用 graphviz 呈现,但这并不理想。

如果您可以获得邻接矩阵或边列表,您可以将其传递给 igraphRgraphiz 以手动绘制网络; catnet 具有 cnMatParents 函数来返回邻接矩阵。

然后只需要定义一个以邻接矩阵作为输入的绘图函数。在下面的函数中,绘图类型可以设置为 "i" 来自 igraph"d" for graphviz/dot via Rgraphviz

plotAdj <- function(adjMAT,type="d",...){
    
    if(type == "d") {
          g = new("graphAM",adjMat=t(adjMAT),edgemode="directed")
          Rgraphviz::plot(g,...)
           
    } else if(type == "i"){
          g = igraph::graph_from_adjacency_matrix(t(adjMAT))
          plot(g,...)
    }
    invisible(g) # return the graph object
}

并使用like

library(catnet)
set.seed(123)
cnet1 <- cnRandomCatnet(numnodes=4,maxParents=2,numCategories=2)
adj <- cnMatParents(cnet1) # extract adjacency matrix

p <- plotAdj(adj,type="i",vertex.color="lightblue")
p # return igraph object

library(Rgraphviz)
p <- plotAdj(adj,attrs = list(node = list(fillcolor = "lightblue")))
p # return Rgraphviz object

bnlearngRain 都有很好的绘图方法。


catnet reference doc 的第 3 页显示了如何呈现 dot 文件并自动打开 pdf 查看器。在 linux 上,以下打开带有情节的 pdf

Sys.setenv(R_DOTVIEWER="/usr/bin/dot") # path to dot on my system
cnPlot(cnet1)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...