2016-06-29 5 views
0

저는이 커뮤니티 r 및 프로그래밍에 익숙하지 않습니다. (미리 양해 해 주셔서 감사합니다!) 베이지안 네트워크와 관련된 프로젝트를 진행하고 있습니다.catnet 패키지가있는 베이지안 네트워크 : 누락 된 데이터 처리

해협에 의문의 여지가 있습니다. 내가 복사, 붙여 넣기 내가 다른 결과를 얻을 코드를 실행하면 다음과 같은 코드라는 질문에 대한 응답으로이 사이트에 게시 된

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 

"NA는/NaN의 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 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 

누군가 내 결과가 다른 이유를 설명해 줄 수 있습니까? Catnet이 누락 된 데이터를 처리하는 방법을 이해하려고하기 때문에 묻습니다.

최저

,

답변

0

정상은/아래 코드는 동일합니다 - 그들은 같은 결과를 출력해야한다. 동일한 기능을 사용하는 다른 패키지에 대해 catnet 기능을 검사했는데 문제가 될 수 있습니다. 비 기본 함수를 사용할 때는 :: 표기법을 사용하는 것이 좋습니다.

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

관련 기능 앞에'catnet ::'을 추가하면 두 가지 실행 모두에서 효과가 있습니다. 둘 다 시도해보고 공유 기능을 사용하고 있는지 확인하십시오. –

+0

도와 줘서 고마워, 밥! 그것이 당신이 그것을 실행했을 때 얻은 결과입니까? 끝에있는 테이블이 내가 관심있는 부분입니다. 게시물의 테이블은 원래 게시물과 동일하지만 원래 게시물의 테이블과 다릅니다. 내 출력 (및 게시물의 출력)에서 누락 된 데이터 (my.data)가 포함 된 행은 조건부 확률을 계산할 때 무시됩니다 (마지막 테이블에 있음). 이것은 원래 게시물의 경우에는 나타나지 않습니다. 어쨌든,이 물건들에 대한 내 머리를 갖도록 도와 주신 것에 다시 한번 감사드립니다. – John

+0

표기법이 작동합니다. 다시 Bob에게 감사드립니다! 그러나 그것은 여전히 ​​나에게 원래의 포스터보다 다른 출력을 제공합니다. 어쩌면 그/그녀는 공유 된 기능을 사용하고 있었을 것입니다 ...이 "원래 포스터"(@pes)에 계속 언급하는 방법이 있습니까? 내가 할 수 있었다면 그/그녀의 게시물에 댓글을 달았을 것입니다. – John