2017-08-24 3 views
1

J'utilise le paquetage bnlearn dans R pour construire un réseau bayésien discret ajusté personnalisé en utilisant à la fois des données et des connaissances spécialisées. http://www.bnlearn.com/examples/custom/R erreur de paquet bnlearn réaffectation des probabilités conditionnelles

Cela implique la création d'un objet en utilisant bn.fit bn.fit() et modifier les distributions locales des noeuds d'intérêt. Pour les réseaux bayésiens discrets (ou les nœuds discrets dans les réseaux gaussiens conditionnels), la table de probabilité conditionnelle peut être extraite de l'objet bn.fit avec coef(), mise à jour et réenregistrée.

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 

Je voudrais mettre à jour un grand nombre de nœuds par l'indexation l'objet bn.fit, à savoir

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. 

Compte tenu de l'équivalence entre [[et les opérateurs $, quelqu'un peut-il expliquer pourquoi il en est cas et un travail potentiel autour.

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

Merci

Répondre

1

En raison de la dernière ligne de votre exemple montrant que les objets sont identiques, il suggère que les méthodes d'expédition pour $<- et [[<- peuvent être différents ou non réellement défini, cependant, ce n'est pas tout à fait ce que arrive ici. La fonction pertinente pour la ligne fitted$C<-cpt est bnlearn:::'$<-.bn.fit'. En regardant le code pour cela conduit à bnlearn:::'[[<-.bn.fit'. Donc, il existe des méthodes définies à la fois pour [[ et $. Encore une fois en regardant le code, conduit à bnlearn:::check.nodes, et une lecture rapide de cette dernière fonction montre que vous devez passer un character à l'argument name de bnlearn:::'[[<-.bn.fit', et il doit être dans l'ensemble des noms de nœuds dans le graphique. Dès lors, pourquoi fitted[[3]] <- cpt et fitted[[3]][[4]]<-cpt, et d'autres itérations ne fonctionnent pas (comme vous passez 3, qui est ni character ni un nom de noeud.

Comme alternative, si vous pouvez modifier votre flux de travail un peu, vous pouvez utiliser fitted[["C"]] <- cpt Si vous voulez passer par l'index, vous pouvez extraire le nom des noeuds cpd par l'indexation

+0

Amour et respect si quelqu'un peut trouver comment ajouter les guillemets, plutôt que les simples guillemets dans les fonctions 'bnlearn :::' – user20650

+0

Merci d'extraire les noms des noeuds en indexant l'objet bn.fit travaillé monté [[fitted [[3]] [[1]]]] <- cpt – DRBG

+0

you ' De rien. Vous pourriez probablement le ranger un peu en disant en utilisant 'nms <- names (fitted)' et en utilisant ensuite l'index sur ce 'fitted [[nms [3]]] <- cpt' – user20650