我尝试使用bnlearn package来计算条件概率,但在循环中使用"cpquery"函数时遇到了问题。我已经使用包中包含的数据创建了一个示例,如下所示。在循环中使用cpquery函数时,该函数无法识别在循环中创建的变量(本例中为“evi”)。我收到以下错误:
Error in parse(text = evi) : object 'evi' not found"evi“的创建步骤基于作者提供的示例。
你能提供的任何帮助都将是最好的。我迫切地想要找到一种方法,可以将cpquery函数应用于大量的观察。
library(bnlearn)
data(learning.test)
fitted = bn.fit(hc(learning.test), learning.test)
bn.function <- function(network, evidence_data) {
a <- NULL
b <- nrow(evidence_data)
for (i in 1:b) {
evi <- paste("(", names(evidence_data), "=='",
sapply(evidence_data[i,], as.character), "')",
sep = "", collapse = " & ")
a[i] <- cpquery(network, (C=='c'), eval(parse(text=evi)))
}
return(a)
}
test <- bn.function(fitted, learning.test)提前感谢!
发布于 2016-10-02 21:22:20
为了避免作用域问题,您可以推迟对eval的调用,并在cpquery函数中执行此操作。如果您直接将evi (字符变量)传递给cpquery,然后在定义中对其进行解析,则环境链将发生变化,cpquery将能够访问evi。
您可以使用m.cpquery <- edit(cpquery)派生您自己版本的函数,并在其开头插入以下行:
evidence = parse(text = evidence)然后保存您的新函数。
因此m.cpquery的标题将如下所示:
> m.cpquery
function (fitted, event, evidence, cluster = NULL, method = "ls",
..., debug = FALSE)
{
evidence = parse(text = evidence)
check.fit(fitted)
check.logical(debug)
...现在,您可以像以前一样在自己的函数中使用m.cpquery,只是我们将把普通字符变量传递给它:
a[i] <- m.cpquery(network, (C=='c'), evi)请注意,在m.cpquery的第一行中,我们只解析了证据字符变量,并没有对其调用eval。cpquery是conditional.probability.query的前端(参见here),我们依赖于conditional.probability.query对eval的后续调用。
我应该说,这是一个相当丑陋的变通方法。而且它只有在使用逻辑采样(method='ls')时才有效。但是,如果要使用似然加权,check.mutilated.evidence函数将引发错误。我还没有检查在调用之前注入eval表达式是否会导致后续错误的混乱,从而导致地狱。
发布于 2018-05-07 17:56:33
我不知道这是由于错误修复还是仅仅是因为我尝试了另一种方法--不管怎样,如果你在cpquery-function之外迭代地构建证据列表,循环就会起作用。
下面是一个通过名为evidenceData的列表进行迭代的示例,该列表具有全正证据:
for(i in names(evidenceData)){
loopEvidenceList <- list()
loopEvidenceList[[i]] <- "TRUE"
a =cpquery(fitted = bayesNet, event = queryNode == "TRUE",
evidence = loopEvidenceList, method = "lw", n = 100000)
print(a)
}根据证据可用的方式,您可能需要更复杂的"loopEvidenceList“准备,但一旦准备就绪,它就可以正常工作。
发布于 2021-08-06 11:26:33
我觉得问题是你在证据和事件中使用了相同的变量。Learning.test包含"C“变量的值。然后我们尝试预测C作为事件。也许使用不包括C的原始数据集的子集可以解决这个问题
https://stackoverflow.com/questions/19260580
复制相似问题