我使用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
由于
答案 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节点名称。