我正在使用R中的bnlearn
包来处理Bayesian networks
中的大量数据。变量是离散的,有超过300万个观测值。
使用bn.fit
函数,我可以轻松获得条件概率分布。但是,一些变量具有未观察到的值(即NA或NaN)。
在某些测试中,我得到了这个:
nw.fit <-bn.fit (nw, date, method = 'bayes')
Error in check.data (date): the data set contains NULL/NaN/NA values.
所以, 我怎样才能处理数据并获得条件概率分布?
有人可以帮助我吗?
谢谢!
答案 0 :(得分:3)
catnet软件包可以处理丢失的数据,专为离散数据而设计
你可以使用cnProb(bnet,which)获得条件概率
这是一个例子
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
答案 1 :(得分:0)
有些变量有近100万个未观察到的值。这只是删除它们很多。所以我想继续NAs。 下面有一个小数据示例
A B C D E F G
1 1 2 2 NA 2 1
0 1 2 2 1 3 3
1 3 1 1 NA 2 2
0 3 1 1 1 2 1
0 4 1 1 1 2 3
答案 2 :(得分:0)
根据bnlearn的所有者:Marco Scutari提到here,解决方案似乎是对缺失值进行EM估算。
正如@pes上面指出的那样,如果所有变量都是分类的,那么catnet就是一个可以使用的包。
第三种方法是删除缺少值的行或填充它们或使用样条技术(另一族MV估算)。