我正在使用r-package“bnlearn”来处理我构建的贝叶斯网:
bn.gs <- gs(x = dat, cluster = NULL, whitelist = wl, blacklist = bl, test = NULL, alpha = 0.05, B = NULL, debug = FALSE, optimized = TRUE, strict = FALSE, undirected = FALSE)
它给了我一个很好的情节,一切似乎都运作良好。所有变量都是连续的,介于-1和1之间。喂养变量(没有父母的变量)的生成如下(N = 1000):
A <- runif(N, min=-1, max=1)
让我们假设我的变量是A,B,... Z,我知道C,G和M的值。现在我想预测其余节点的值(A,B,D) ,...)给定C,G和M.就我而言,predict()一次适用于一个节点。
是否有同时预测多个节点的方法,或者我是否应该通过对每个节点应用predict()来获得正确的值?我已经尝试预测节点“A”的值,给定“C”的值:
predict(bn.gs, node = "A", testdata, debug = TRUE)
其中testdata是这种形式的数据框:
A B C D E ...
0.0 0.0 0.7 0.0 0.0 ...
但我明白了:
* predicting values for node A.
> prediction for observation 1 is nan with predictor:
(0.000000) + (0.000000) * (nan) + (0.000000) * (nan)
[1] NA
我很肯定我在这里做错了什么。在我的网络中有弧C - > S - &gt;答:“nan”也很奇怪,因为我的网络应该很好地定义。
谢谢你:)。
答案 0 :(得分:0)
为了防止其他人也在寻找答案,我确实使用rbmn包解决了这个问题。在使用bnlearn创建bn对象之后,我做了以下操作:
my.bn.par <- bn.fit(x = bn.gs, data = dat)
library("rbmn")
my.bn.par.rbmn <- bnfit2nbn(my.bn.par)
print8nbn(my.bn.par.rbmn)
my.bn.par.mn <- nbn2mn(my.bn.par.rbmn)
# This is the names vector for my nodes:
names <- c("A","B","C","D","E")
# Names of given variables
obsnames <- c("C","E")
# Values for given variables
obsval <- c(0.51,-0.24)
# Names of variables to be predicted
prednames <- setdiff(names, obsnames)
# Then predict all the unknown variables
print8mn(condi4joint(my.bn.par.mn, par = prednames, pour = obsnames, x2 = obsval))
该方法在Marco Scutari的书&#34;贝叶斯网络&#34;中提出。