基于给定的网络结构,我为六个二进制变量(x1 到 x6)创建了一个包含 100 个实例的数据框。因此,它是存储在变量“input_params”中的 0/1 值的 100 x 6 数据帧。使用语句创建一个空图:
library(bnlearn)
bn_graph = empty.graph(names(input_params))
但是当我尝试使用以上参数('input_params')在网络中拟合时
bn_nw <- bn.fit(bn_graph, input_params)
我收到一条错误消息
Error in data.type(x) :
variable x1 is not supported in bnlearn (type: integer).
我应该进行什么数据类型转换才能避免此错误?现在它的值是 0 或 1。
尝试使用 BNlearn 创建 BN,但我一直收到错误消息;
Error in check.data(data, allowed.types = discrete.data.types) : variable Variable1 must have at least two levels.
Run Code Online (Sandbox Code Playgroud)
它给了我每个变量的错误,即使它们都是因素并且有超过 1 个级别,正如您所看到的 - 在这种情况下,我的变量“模型”有 4 个级别
由于我无法共享变量和数据集,因此我创建了一个小集并属于数据集的代码。我遇到同样的问题。我知道我只共享了 2 个变量,但是所有变量都出现了相同的错误。
library(tidyverse)
library (bnlearn)
library(openxlsx)
DataFull <- read.xlsx("(.....)/test.xlsx", sheet = 1, startRow = 1, colNames = TRUE)
set.seed(600)
DataFull <- as_tibble(DataFull)
DataFull$Variable1 <- as.factor(DataFull$Variable1)
DataFull$TargetVar <- as.factor(DataFull$TargetVar)
DataFull <- na.omit(DataFull)
DataFull <- droplevels(DataFull)
DataFull <- DataFull[sample(nrow(DataFull)),]
Data <- DataFull[1:as.integer(nrow(DataFull)*0.70)-1,]
Datatest <- DataFull[as.integer(nrow(DataFull)*0.70):nrow(DataFull),]
nrow(Data)+nrow(Datatest)==nrow(DataFull)
FocusVar <- as.character("TargetVar")
BN.naive <- naive.bayes(Data, FocusVar)
Run Code Online (Sandbox Code Playgroud)
使用str(data) …
我正在尝试使用bnlearn在R中绘制一个Bsyesian网络。这是我的R代码
library(bnlearn)
library(Rgraphviz)
first_variable <- rnorm(100)
second_variable <- rnorm(100)
third_variable <- rnorm(100)
v <- data.frame(first_variable,second_variable,third_variable)
b <- hc(v)
hlight <- list(nodes = nodes(b), arcs = arcs(b),col = "grey", textCol = "red")
pp <- graphviz.plot(b, highlight = hlight)
Run Code Online (Sandbox Code Playgroud)
上面的代码可以工作,但是情节中文本的大小比我预期的要小得多。这里是:
我认为这是因为我的变量名很长。在我的真实数据中,变量名称甚至更长。这是我的真实数据集的BN图:
有什么办法可以增加图中文字的大小吗?
我正在使用 R 中的 bnlearn 包来训练贝叶斯网络。我在使用以下代码时遇到了麻烦(稍微修改了 bnlearn 示例代码):
library(bnlearn)
data(learning.test)
fitted = bn.fit(hc(learning.test), learning.test)
myfuncBN=function(){
var = names(learning.test)
obs = 2
str = paste("(", names(learning.test)[-3], "=='",
sapply(learning.test[obs,-3], as.character), "')",
sep = "", collapse = " & ")
str2 = paste("(", names(learning.test)[3], "=='",
as.character(learning.test[obs, 3]), "')", sep = "")
cpquery(fitted, eval(parse(text = str2)), eval(parse(text = str)))
}
myfuncBN()
Run Code Online (Sandbox Code Playgroud)
此代码引发错误:
结束时出错:无法将类型“闭包”强制转换为“字符”类型的向量
但是,如果 str 和 str2 是在函数 myfuncBN() 之外定义的,则它有效。有谁知道这是什么原因?
我试图了解这两种方法之间的差异bayes以及包mle的bn.fit功能bnlearn。
我知道频率论者和贝叶斯方法之间关于理解概率的争论。在理论上,我认为最大似然估计mle是一种简单的频率论方法,将相对频率设置为概率。但是进行了哪些计算才能得到bayes估计值?我已经查看了bnlearn 文档、bn.fit 函数的描述和一些应用示例,但没有任何地方对正在发生的事情进行真正的描述。
我还尝试通过首先检出bnlearn::bn.fit、导致bnlearn:::bn.fit.backend、导致来理解 R 中的函数,bnlearn:::smartSapply但后来我被卡住了。
当我将软件包用于学术工作时,我会非常感谢您的帮助,因此我应该能够解释会发生什么。
我正在尝试自定义bnlearn使用图表学习的图表RGraphviz.当我有无向边时,RGraphviz当我尝试自定义图形的外观时,将它们转向两个方向的有向边.
一个可重复的例子可能是:
set.seed(1)
x1 = rnorm(50, 0, 1)
x2 = rnorm(50, 0, 1)
x3 = x2 + rnorm(50, 0, 1)
x4 = -2*x1 + x3 + rnorm(50, 0, 1)
graph = data.frame(x1, x2, x3, x4)
library(bnlearn)
library(Rgraphviz)
res = gs(graph)
options(repr.plot.width=3, repr.plot.height=3)
g1 <- graphviz.plot(res)
Run Code Online (Sandbox Code Playgroud)
图未定制:
到现在为止还挺好.但是,如果我尝试自定义它:
plot(g1, attrs = list(node = list(fontsize=4, fillcolor = "lightgreen")))
Run Code Online (Sandbox Code Playgroud)
自定义图表
无向边缘被转换.
即使我只使用情节(g1),我也会遇到这个问题.问题是这(保存g1然后使用绘图)似乎改变了图形的外观.