首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在循环中使用bnlearn函数"cpquery“

在循环中使用bnlearn函数"cpquery“
EN

Stack Overflow用户
提问于 2013-10-09 07:51:53
回答 3查看 1.9K关注 0票数 8

我尝试使用bnlearn package来计算条件概率,但在循环中使用"cpquery"函数时遇到了问题。我已经使用包中包含的数据创建了一个示例,如下所示。在循环中使用cpquery函数时,该函数无法识别在循环中创建的变量(本例中为“evi”)。我收到以下错误:

代码语言:javascript
复制
Error in parse(text = evi) : object 'evi' not found

"evi“的创建步骤基于作者提供的示例。

你能提供的任何帮助都将是最好的。我迫切地想要找到一种方法,可以将cpquery函数应用于大量的观察。

代码语言:javascript
复制
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)

提前感谢!

EN

回答 3

Stack Overflow用户

发布于 2016-10-02 21:22:20

为了避免作用域问题,您可以推迟对eval的调用,并在cpquery函数中执行此操作。如果您直接将evi (字符变量)传递给cpquery,然后在定义中对其进行解析,则环境链将发生变化,cpquery将能够访问evi

您可以使用m.cpquery <- edit(cpquery)派生您自己版本的函数,并在其开头插入以下行:

代码语言:javascript
复制
evidence = parse(text = evidence)

然后保存您的新函数。

因此m.cpquery的标题将如下所示:

代码语言:javascript
复制
> m.cpquery
function (fitted, event, evidence, cluster = NULL, method = "ls", 
    ..., debug = FALSE) 
{
    evidence = parse(text = evidence)
    check.fit(fitted)
    check.logical(debug)
...

现在,您可以像以前一样在自己的函数中使用m.cpquery,只是我们将把普通字符变量传递给它:

代码语言:javascript
复制
a[i] <- m.cpquery(network, (C=='c'), evi)

请注意,在m.cpquery的第一行中,我们只解析了证据字符变量,并没有对其调用evalcpqueryconditional.probability.query的前端(参见here),我们依赖于conditional.probability.queryeval的后续调用。

我应该说,这是一个相当丑陋的变通方法。而且它只有在使用逻辑采样(method='ls')时才有效。但是,如果要使用似然加权,check.mutilated.evidence函数将引发错误。我还没有检查在调用之前注入eval表达式是否会导致后续错误的混乱,从而导致地狱。

票数 0
EN

Stack Overflow用户

发布于 2018-05-07 17:56:33

我不知道这是由于错误修复还是仅仅是因为我尝试了另一种方法--不管怎样,如果你在cpquery-function之外迭代地构建证据列表,循环就会起作用。

下面是一个通过名为evidenceData的列表进行迭代的示例,该列表具有全正证据:

代码语言:javascript
复制
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“准备,但一旦准备就绪,它就可以正常工作。

票数 0
EN

Stack Overflow用户

发布于 2021-08-06 11:26:33

我觉得问题是你在证据和事件中使用了相同的变量。Learning.test包含"C“变量的值。然后我们尝试预测C作为事件。也许使用不包括C的原始数据集的子集可以解决这个问题

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19260580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档