2017-01-03 4 views
2

J'ai une question très rapide avec un exemple reproductible facile qui est lié à mon travail sur la prévision avec bnlearnprédiction avec cpdist en utilisant « probabilités » comme preuve

library(bnlearn) 
    Learning.set4=cbind(c("Yes","Yes","Yes","No","No","No"),c(9,10,8,3,2,1)) 
    Learning.set4=as.data.frame(Learning.set4) 
    Learning.set4[,c(2)]=as.numeric(as.character(Learning.set4[,c(2)])) 
    colnames(Learning.set4)=c("Cause","Cons") 
    b.network=empty.graph(colnames(Learning.set4)) 
    struct.mat=matrix(0,2,2) 
    colnames(struct.mat)=colnames(Learning.set4) 
    rownames(struct.mat)=colnames(struct.mat) 
    struct.mat[1,2]=1 
    bnlearn::amat(b.network)=struct.mat 
    haha=bn.fit(b.network,Learning.set4) 


    #Some predictions with "lw" method 

    #Here is the approach I know with a SET particular modality. 
    #(So it's happening with certainty, here for example I know Cause is "Yes") 
    classic_prediction=cpdist(haha,nodes="Cons",evidence=list("Cause"="Yes"),method="lw") 
    print(mean(classic_prediction[,c(1)])) 


    #What if I wanted to predict the value of Cons, when Cause has a 60% chance of being Yes and 40% of being no? 
    #I decided to do this, according the help 
    #I could also make a function that generates "Yes" or "No" with proper probabilities. 
    prediction_idea=cpdist(haha,nodes="Cons",evidence=list("Cause"=c("Yes","Yes","Yes","No","No")),method="lw") 
    print(mean(prediction_idea[,c(1)])) 

Voici ce que l'aide dit:

"Dans le cas d'un noeud discret ou ordinal, deux ou plusieurs valeurs peuvent également être fournies, auquel cas la valeur de ce noeud sera échantillonnée avec une probabilité uniforme de l'ensemble des valeurs spécifiées"

la valeur d'une variable en utilisant la catégorie al variables, je viens d'utiliser juste une certaine modalité de cette variable comme dans la première prédiction dans l'exemple. (Avoir la preuve définie sur "Oui" obtient Cons pour prendre une valeur élevée)

Mais si je voulais prédire Cons sans connaître la modalité exacte de la variable Cause avec certitude, pourrais-je utiliser ce que j'ai fait dans la deuxième prédiction (Juste en connaissant les probabilités)? Est-ce une façon élégante ou y sont les mieux mises en œuvre, je ne sais pas hors?

+0

Joel; pas lié à votre question, mais peut-être vous pouvez aider: à partir de votre exemple, 'cpdist (haha, noeuds = « Cons », la preuve = liste (« Cause »= « Non »), méthode = « pv »)' cela semble donner (l'attendu par moi) moyenne de deux, de regarder les années cpd de votre exemple, mais pourquoi quand ' « cause »= « Oui »)' est la moyenne ~ zéro? (je m'attendrais à neuf) – user20650

+0

Bonjour user20650. Pouvez-vous poster le code complet qui vous donne la moyenne de 0? En définissant le réseau comme ci-dessus, puis en faisant cela 'mean (cpdist (haha, nodes =" Cons ", evidence = list (" Cause "=" Oui "), méthode =" lw ") [, c (1)] J'obtiens la moyenne attendue autour de 9 –

+0

Joel, si je copie et colle ton code directement dans une nouvelle session R (sans rien changer), j'obtiens 'classic_prediction' à peu près à zéro. – user20650

Répondre

2

Je suis entré en contact avec le créateur du paquet, et je vais coller sa réponse liée à la question ici:

L'appel à cpquery() est erroné:

Prediction_idea=cpdist(haha,nodes="Cons",evidence=list("Cause"=c("Yes","Yes","Yes","No","No")),method="lw") 
print(mean(prediction_idea[,c(1)])) 

Une requête avec la preuve douce de 40% -60% vous oblige à placer ces nouvelles probabilités dans le premier réseau

haha$Cause = c(0.40, 0.60) 

puis exécuter la requête sans argument de preuve. (Parce que vous n'avez pas de preuves tangibles, vraiment, juste une distribution de probabilité différente pour cause.)


Je vais poster le code qui me permet de faire ce que je voulais hors du réseau équipé de l'exemple.

change=haha$Cause$prob 
change[1]=0.4 
change[2]=0.6 
haha$Cause=change 
new_prediction=cpdist(haha,nodes="Cons",evidence=TRUE,method="lw") 
print(mean(new_prediction[,c(1)])) 
+0

cela m'a rappelé un exemple dans '? GRAIN :: querygrain' sur des preuves doux. – user20650