2016-06-29 1 views
0

Je suis nouveau dans cette communauté, et je suis habitué à programmer. (Merci d'avance pour votre patience!) Je travaille sur un projet impliquant des réseaux bayésiens.Réseaux bayésiens avec le paquet catnet: gérer les données manquantes

Détroit à la question. Le code suivant a été publié sur ce site en réponse à une question intitulée « NA/NaN valeurs dans le paquet de bnlearn R »

rm(list=ls()) 

### generate random data (not simply independent binomials) 
set.seed(123) 
n.obs <- 10 
a1 <- rbinom(n.obs,1,.3) 
a2 <- runif(n.obs) 
a3 <- floor(-3*log(.25+3*a2/4)) 
a3[a3>=2] <- NA 
a2 <- floor(2*a2) 
my.data <- data.frame(a1,a2,a3) 
### discretize data into proper categories 
my.data <- cnDiscretize(my.data,numCategories=2) 

my.data 
## a1 a2 a3 
## 1 1 2 1 
## 2 2 1 2 
## 3 1 2 1 
## 4 2 2 2 
## 5 2 1 NA 
## 6 1 2 1 
## 7 1 1 NA 
## 8 2 1 NA 
## 9 1 1 NA 
## 10 1 2 1 

## say we want a2 conditional on a1,a3 

## first generate a network with a1,a3 ->a2 
cnet <- cnNew(
     nodes = c("a1", "a2", "a3"), 
     cats = list(c("1","2"), c("1","2"), c("1","2")), 
     parents = list(NULL, c(1,3), NULL) 
    ) 


## set the empirical probabilities from data=my.data 
cnet2 <- cnSetProb(cnet,data=my.data) 

## to get the conditional probability table 
cnProb(cnet2,which='a2') 

##$a2 
##   a1  a3   0   1 
## A 0.0000000 0.0000000 0.0000000 1.0000000 
## B 0.0000000 1.0000000 0.5712826 0.4287174 
## A 1.0000000 0.0000000 0.0000000 1.0000000 
## B 1.0000000 1.0000000 0.5685786 0.4314214 

Cependant quand je copier, coller et exécuter le code, je reçois un résultat différent (voir ci-dessous) .

rm(list=ls()) 

### generate random data (not simply independent binomials) 
set.seed(123) 
n.obs <- 10 
a1 <- rbinom(n.obs,1,.3) 
a2 <- runif(n.obs) 
a3 <- floor(-3*log(.25+3*a2/4)) 
a3[a3>=2] <- NA 
a2 <- floor(2*a2) 
my.data <- data.frame(a1,a2,a3) 
### discretize data into proper categories 
my.data <- cnDiscretize(my.data,numCategories=2) 

my.data 
## a1 a2 a3 
## 1 1 2 1 
## 2 2 1 2 
## 3 1 2 1 
## 4 2 2 2 
## 5 2 1 NA 
## 6 1 2 1 
## 7 1 1 NA 
## 8 2 1 NA 
## 9 1 1 NA 
## 10 1 2 1 

## say we want a2 conditional on a1,a3 
## first generate a network with a1,a3 ->a2 
cnet <- cnNew(
    nodes = c("a1", "a2", "a3"), 
    cats = list(c("1","2"), c("1","2"), c("1","2")), 
    parents = list(NULL, c(1,3), NULL) 
    ) 


## set the empirical probabilities from data=my.data 
cnet2 <- cnSetProb(cnet,data=my.data) 

## to get the conditional probability table 
cnProb(cnet2,which='a2') 
## $a2 
## a1 a3 1 2 
## A 1.0 1.0 0.0 1.0 
## B 1.0 2.0 0.5 0.5 
## A 2.0 1.0 0.5 0.5 
## B 2.0 2.0 0.5 0.5 

Quelqu'un pourrait-il expliquer pourquoi mes résultats sont différents? Je demande parce que j'essaie de comprendre comment Catnet gère les données manquantes.

Best,

John

Répondre

0

Le top/code en bas sont identiques - ils devraient produire les mêmes résultats. J'ai vérifié par les fonctions catnet pour d'autres paquets qui utilisent la même fonction - pourrait être votre problème. Il est recommandé d'utiliser la notation :: lors de l'utilisation de fonctions autres que de base.

rm(list=ls()) 
library(catnet) 

### generate random data (not simply independent binomials) 
set.seed(123) 
n.obs <- 10 
a1 <- rbinom(n.obs,1,.3) 
a2 <- runif(n.obs) 
a3 <- floor(-3*log(.25+3*a2/4)) 
a3[a3>=2] <- NA 
a2 <- floor(2*a2) 
my.data <- data.frame(a1,a2,a3) 
### discretize data into proper categories 
my.data <- catnet::cnDiscretize(my.data,numCategories=2) 

my.data 
## a1 a2 a3 
## 1 1 2 1 
## 2 2 1 2 
## 3 1 2 1 
## 4 2 2 2 
## 5 2 1 NA 
## 6 1 2 1 
## 7 1 1 NA 
## 8 2 1 NA 
## 9 1 1 NA 
## 10 1 2 1 

## say we want a2 conditional on a1,a3 

## first generate a network with a1,a3 ->a2 
cnet <- catnet::cnNew(
    nodes = c("a1", "a2", "a3"), 
    cats = list(c("1","2"), c("1","2"), c("1","2")), 
    parents = list(NULL, c(1,3), NULL) 
) 


## set the empirical probabilities from data=my.data 
cnet2 <- catnet::cnSetProb(cnet,data=my.data) 

## to get the conditional probability table 
catnet::cnProb(cnet2,which='a2') 

# $a2 
# a1 a3 1 2 
# A 1.0 1.0 0.0 1.0 
# B 1.0 2.0 0.5 0.5 
# A 2.0 1.0 0.5 0.5 
# B 2.0 2.0 0.5 0.5 
+0

Si vous placez 'catnet ::' devant la fonction correspondante, cela devrait fonctionner pour vous dans les deux exécutions. Essayez-le avec les deux, et voyez si vous utilisez une fonction partagée. –

+0

Merci pour votre aide, Bob! Est-ce la sortie que vous avez obtenue lorsque vous l'avez exécuté? La table à la fin est ce qui m'intéresse. Le tableau dans votre message est le même que celui que j'ai reçu, mais différent de celui dans le message original. Il ressort de ma sortie (et de la sortie de votre message) que les lignes contenant des données manquantes (my.data) sont simplement ignorées lors du calcul des probabilités conditionnelles (données dans le tableau à la fin). Cela ne semble pas être le cas dans le message original. Quoi qu'il en soit, merci encore de m'avoir aidé à comprendre ce genre de choses. – John

+0

La notation fonctionne, merci encore Bob! Cependant, il me donne encore des résultats différents de l'affiche originale. Peut-être utilisait-il une fonction partagée ... Y a-t-il un moyen de demander cette "affiche originale" (@pes) que je n'arrête pas de mentionner? J'aurais commenté sur son poste si je pouvais. – John