对于简单的离散人工数据,bnlearn的cpquery函数始终返回0

时间:2019-04-02 17:39:18

标签: r bayesian-networks bnlearn

我想根据贝叶斯网络基于我创建的一些二进制数据来计算条件概率。但是,使用bnlearn::cpquery总是返回0值,而bnlearn::bn.fit则适合正确的模型。

# Create data for binary chain network X1->Y->X2 with zeros and ones.
# All base rates are 0.5, increase in probability due to parent = .5 (from .25 to.75)
X1<-c(rep(1,9),rep(1,3),1,rep(1,3),rep(0,3),0,rep(0,3),rep(0,9))
Y<-c(rep(1,9),rep(1,3),0,rep(0,3),rep(1,3),1,rep(0,3),rep(0,9))
X2<-c(rep(1,9),rep(0,3),1,rep(0,3),rep(1,3),0,rep(1,3),rep(0,9))
dag1<-data.frame(X1,Y,X2)

# Fit bayes net to data.
res <- hc(dag1)
fittedbn <- bn.fit(res, data = dag1)
# Fitting works as expected, as seen by graph structure and coefficients in fittedbn:
plot(res)
print(fittedbn)

# Conditional probability query
cpquery(fittedbn, event = (Y==1), evidence = (X1==1), method = "ls")
# Using LW method
cpquery(fittedbn, event = (Y==1), evidence = list(X1 = 1), method = "lw")

'cpquery'仅返回0。我也尝试使用predict函数,但是这将返回错误:

predict(object = fittedbn, node = "Y", data = list(X1=="1"), method = "bayes-lw", prob = True)
# Returns:
# Error in check.data(data, allow.levels = TRUE) : 
#  the data must be in a data frame.

在以上cpquery中,预期结果为.75,但返回0。这并非特定于此事件或证据,无论我输入了什么事件或证据(例如event = (X2==1), evidence = (X1==0)event = (X2==1), evidence = (X1==0 & Y==1)),该函数都会返回0。

我尝试过一件事,因为我认为少量的观察值可能是一个问题,只是增加观察值的数量(即,将上述数据框与自身垂直连接很多次),但这并没有改变输出。

我在cpquery上看到了很多线程,并且该线程可能很脆弱,但是没有一个线程指示此问题。请注意:“ cpquery”文档中的示例按预期工作,因此问题似乎不是由于我的环境造成的。

任何帮助将不胜感激!

0 个答案:

没有答案