贝叶斯网络 'catnet' 包 cnPlot 返回 null
Bayesian networks 'catnet' package cnPlot returning null
我是第一次使用贝叶斯网络,我在 R 中使用 Catnet 包。原因是我的数据充满了分类变量和大量缺失数据。我尝试了 Whosebug 其他地方发布的简单示例,只是为了了解它是如何工作的。虽然它能够生成网络中每个节点的条件概率,但我无法以图形方式可视化网络以便于理解。 cnPlot(catNetwork)
只是 returns 空。我想知道是否有使用 CatNet 经验的人可以指出我的方法存在的问题。谢谢。
正在创建猫网络:
cnet <- catnet::cnNew(
nodes = c("sport", "high_hc", "high_hg"),
cats = list(c("1","2"), 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)
剧情,到头来,returns无效。我还导入了 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"),
cats = list(c("1","2"), c("1","2"), c("1","2")),
parents = list(NULL, c(1,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)
它returns,
NULL
与我类似,?cnPlot
中的示例也产生了 NULL
并且没有 R 图。添加文件参数也不会产生任何输出。 cnDot(cnet, "cnet")
生成一个外部 dot
文件,可以用 graphviz
渲染,但这并不理想。
如果您可以获得邻接矩阵或边列表,您可以将其传递给 igraph
或 Rgraphiz
以手动绘制网络; catnet
对 return 邻接矩阵具有 cnMatParents
函数。
然后只需要定义一个以邻接矩阵为输入的绘图函数。在下面的函数中,可以通过 Rgraphviz
.[=33 将绘图类型从 igraph
设置为 "i"
或 graphviz
/dot
的 "d"
=]
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
}
并使用喜欢
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, type="d", attrs = list(node = list(fillcolor = "lightblue")))
p # return Rgraphviz object
bnlearn
和 gRain
都有很好的绘图方法。
catnet reference doc
的第 3 页展示了如何呈现 dot
文件并自动打开 pdf 查看器。在 linux 上,以下内容打开了一个带有情节
的 pdf
Sys.setenv(R_DOTVIEWER="/usr/bin/dot") # path to dot on my system
cnPlot(cnet1)
我是第一次使用贝叶斯网络,我在 R 中使用 Catnet 包。原因是我的数据充满了分类变量和大量缺失数据。我尝试了 Whosebug 其他地方发布的简单示例,只是为了了解它是如何工作的。虽然它能够生成网络中每个节点的条件概率,但我无法以图形方式可视化网络以便于理解。 cnPlot(catNetwork)
只是 returns 空。我想知道是否有使用 CatNet 经验的人可以指出我的方法存在的问题。谢谢。
正在创建猫网络:
cnet <- catnet::cnNew(
nodes = c("sport", "high_hc", "high_hg"),
cats = list(c("1","2"), 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)
剧情,到头来,returns无效。我还导入了 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"),
cats = list(c("1","2"), c("1","2"), c("1","2")),
parents = list(NULL, c(1,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)
它returns,
NULL
与我类似,?cnPlot
中的示例也产生了 NULL
并且没有 R 图。添加文件参数也不会产生任何输出。 cnDot(cnet, "cnet")
生成一个外部 dot
文件,可以用 graphviz
渲染,但这并不理想。
如果您可以获得邻接矩阵或边列表,您可以将其传递给 igraph
或 Rgraphiz
以手动绘制网络; catnet
对 return 邻接矩阵具有 cnMatParents
函数。
然后只需要定义一个以邻接矩阵为输入的绘图函数。在下面的函数中,可以通过 Rgraphviz
.[=33 将绘图类型从 igraph
设置为 "i"
或 graphviz
/dot
的 "d"
=]
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
}
并使用喜欢
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, type="d", attrs = list(node = list(fillcolor = "lightblue")))
p # return Rgraphviz object
bnlearn
和 gRain
都有很好的绘图方法。
catnet reference doc
的第 3 页展示了如何呈现 dot
文件并自动打开 pdf 查看器。在 linux 上,以下内容打开了一个带有情节
Sys.setenv(R_DOTVIEWER="/usr/bin/dot") # path to dot on my system
cnPlot(cnet1)