2016-06-29 18 views
0

Ich bin neu in dieser Gemeinschaft, r, und Programmierung im Allgemeinen. (Vielen Dank im Voraus für Ihre Geduld!) Ich arbeite an einem Projekt, das bayesianische Netzwerke beinhaltet.Bayesian Netzwerke mit dem Catnet-Paket: Umgang mit fehlenden Daten

Straße zu der Frage. Der folgende Code auf dieser Seite als Antwort auf eine Frage gestellt wurde dem Titel „NA/NaN-Werte in bnlearn Paket 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 

Allerdings, wenn ich kopieren, einfügen und führen Sie den Code, den ich ein anderes Ergebnis erhalten (siehe unten) .

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 

Könnte jemand erklären, warum meine Ergebnisse anders sind? Ich frage, weil ich versuche zu verstehen, wie Catnet fehlende Daten behandelt.

Best,

John

Antwort

0

Die oben/unten Code identisch sind - sie sollten die gleichen Ergebnisse ausgegeben. Ich überprüfte die catnet Funktionen für andere Pakete, die die gleiche Funktion verwenden - könnte Ihr Problem sein. Es empfiehlt sich, bei Nicht-Basisfunktionen die Notation :: zu verwenden.

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

Wenn Sie 'catnet ::' vor die entsprechende Funktion stellen, sollte es in beiden Läufen funktionieren. Probieren Sie es mit beiden aus und prüfen Sie, ob Sie eine gemeinsame Funktion verwenden. –

+0

Danke für Ihre Hilfe, Bob! Ist das die Ausgabe, die Sie bekommen haben, als Sie es ausgeführt haben? Der Tisch am Ende interessiert mich. Die Tabelle in Ihrem Beitrag ist die gleiche wie die, die ich bekommen habe, aber anders als im Originalbeitrag. Aus meiner Ausgabe (und der Ausgabe in Ihrem Post) geht hervor, dass die Zeilen mit fehlenden Daten (meine.data) bei der Berechnung der bedingten Wahrscheinlichkeiten (die in der Tabelle am Ende angegeben sind) einfach ignoriert werden. Dies scheint im ursprünglichen Beitrag nicht der Fall zu sein. Wie auch immer, danke nochmal dafür, dass du mir geholfen hast, mich um dieses Zeug zu kümmern. – John

+0

Die Notation funktioniert, danke nochmal Bob! Allerdings gibt es mir immer noch eine andere Ausgabe als das ursprüngliche Poster. Vielleicht benutzte er/sie eine gemeinsame Funktion ... Gibt es eine Möglichkeit, dieses "Original-Poster" (@pes) zu fragen, das ich immer wieder erwähne? Ich hätte seinen Beitrag kommentiert, wenn ich dazu in der Lage wäre. – John