R bnlearn包错误重新分配条件概率

时间:2017-08-24 23:05:56

标签: r bayesian-networks bnlearn

我使用R中的包bnlearn来构建一个使用数据和专家知识的自定义拟合离散贝叶斯网络。 http://www.bnlearn.com/examples/custom/

这需要使用bn.fit()创建一个bn.fit对象并修改感兴趣的节点的局部分布。对于离散贝叶斯网络(或条件高斯网络中的离散节点),可以使用coef()从bn.fit对象中提取条件概率表,更新并重新保存。

library(bnlearn)
dag = model2network("[A][C][F][B|A][D|A:C][E|B:F]")  #creates a network
fitted <- bn.fit(dag, learning.test) #(determines conditional probability 
given data in learning.test)
fitted[[3]]  #CP for node [C] as example, fitted$C also works 
cpt <- coef(fitted[[3]]) #extract coefficients from table
cpt[1:length(cpt)] = c(0.50, 0.25, 0.25)  #new CPs
fitted$C<-cpt #assign new CPs to joint CP table
fitted$C #Works

Parameters of node C (multinomial distribution)

Conditional probability table:
a    b    c 
0.50 0.25 0.25 

我想通过索引bn.fit对象来更新大量节点,即

fitted[[3]][[4]][1:3]<-cpt  #returns error
fitted[[3]][[4]]<-cpt       #returns error

Error in check.nodes(name, x) : 
nodes must be a vector of character strings, the labels of the nodes.

鉴于[[和$运算符]之间的等价性,任何人都可以解释为什么会出现这种情况并且可能会解决这个问题。

identical(fitted$C,fitted[[3]])
TRUE

由于

1 个答案:

答案 0 :(得分:1)

由于示例的最后一行显示对象相同,因此表明$<-[[<-的调度方法可能不同或实际未定义,但是,不是这里发生的事情。

fitted$C<-cpt行的相关功能是bnlearn:::'$<-.bn.fit'。查看代码导致 bnlearn:::'[[<-.bn.fit'。因此,为[[$定义了方法。  再次查看代码,导致bnlearn:::check.nodes,并快速阅读最后一个函数,表明您需要将character传递给name的{​​{1}}参数,并且它需要位于图中的节点名称集中。因此,为什么bnlearn:::'[[<-.bn.fit'fitted[[3]] <- cpt以及其他迭代不起作用(因为您传递fitted[[3]][[4]]<-cpt,既不是3也不是节点名称。

作为替代方案,如果您可以稍微更改工作流程,则可以使用character,这比通过索引传递更安全。如果您确实希望通过索引传递,则可以通过索引来提取cpd节点名称。