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
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. –
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
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