2017-01-04 31 views
1

随着我现在了解如何正确输入软证据(请参阅Prediction with cpdist using "probabilities" as evidence),这导致我出现了一个新问题(我认为这是一个很常见的问题),我又准备了一个可重现的问题例如:NaN值。 我可以也应该早些时候遇到过这种情况,但从未偶然。在bnlearn处理未记录的调理病例和NaN参数

NaN的参数可重复实施例

library(bnlearn) 
Learning.set4=cbind(c("Yes","Yes","Yes","No","No","No"),c("Blue","Green","Blue","Green","Green","Green"),c(9,10,8,3,2,1)) 
Learning.set4=as.data.frame(Learning.set4) 
Learning.set4[,c(3)]=as.numeric(as.character(Learning.set4[,c(3)])) 
colnames(Learning.set4)=c("Cause1","Cause2","Cons") 
b.network=empty.graph(colnames(Learning.set4)) 
struct.mat=matrix(0,3,3) 
colnames(struct.mat)=colnames(Learning.set4) 
rownames(struct.mat)=colnames(struct.mat) 
struct.mat[2,3]=1 
struct.mat[1,3]=1 
bnlearn::amat(b.network)=struct.mat 
haha=bn.fit(b.network,Learning.set4) 

print(haha) 

#NaN value 
prediction_with_soft=cpdist(haha,nodes="Cons",evidence=TRUE,method="lw") 
#print(prediction_with_soft) 
print(mean(prediction_with_soft[,c(1)])) 

我明白为什么该算法不能估计的分布的“缺点”节点中的一个参数。事实上,“否”和“蓝色”在玩具数据集中永远不会一起出现,因此该算法无法获知相关参数。 这可以在print(haha)部分看到。

在我现实生活中的例子中,这可能会发生很多,因为我的数据集通常不会很大,所以某些情况下可能没有数据记录。当使用软证据时,我的cpdist观测数组中有一些可能会经常发生,因为软证据会很多次允许这些条件案例在10 000次以上的观测中出现几次(如您在此看到的如果你这样做print(prediction_with_soft)

这将以下问题引入环:我应该如何处理这些NaN值,如何防止它们?

是否有可能在参数估计之前对初始数据集进行某种外推以将这些特定的调节情况添加到其中,从而防止获得NaN参数?

我能不能直接产生观察结果,直到我得到我想要的非NaN观测数量,或者这是一个统计异端? (或许是肯定的,因为这将意味着在欺骗我的软性证据不采取某些情况下考虑,对吧?)

____________________________________________________________________________

UPDATE编辑:

这里有一些与某人快速交换邮件后的新元素:

“当您通过最大可能性估计参数时,3210 NaN值确实是稀疏网络中的常见问题;如果您使用后验估计,则问题会消失,因为先前的论文会覆盖缺少的参数值。这对于离散变量很容易做到,对于连续变量来说就不那么容易了,因为对于前者而言,非信息先验很容易定义,而对于后者则不容易定义。 “

” 尽管目前对bnlearn中连续变量的后验参数估计不支持,但可以单独估计参数并将其替换为拟合模型。 “

enter image description here

现在我不知道......我怎么估计这个参数seperately? 难道我离散化‘缺点’节点,然后使用‘贝叶斯’的方法,以适应新的离散网络?这一次,由于贝叶斯方法有先验论文的NaN值,我可以从中猜出参数。

这里有一个想法:

#Discretize 
Learning.set4[,c(3)]=as.factor(Learning.set4[,c(3)]) 
#Compute new network 
haha2=bn.fit(b.network,Learning.set4,method="bayes",iss=2) 

#Estimate of the missing parameter 
param_est=sum(haha2$Cons$prob[1:6]*as.numeric(as.character(Learning.set4[,c(3)]))) 

param_est是5.5,看起来像“缺点”的价值观,以我的平均 做什么,我在这里做什么意义?这是要走的路吗? 是否有其他更好的方法来估计这些NaN参数,然后将它们粘贴回模型中?

____________________________________________________________________________

回答

0

我将张贴了部分答案,这也是在这里希望燃料(目前不存在)的争论更多一些。

-Estimate缺少一个seperately和粘贴:

与老师讨论,祈求神灵互联网,并抛出自己的盐到这里混合一些潜在的想法,让缺少的参数的估计后,他们回到模型中,例如glm

- 使用每个分类变量的一些模态。假设我有一个4级的变量;非常不同意,不同意,同意,非常同意=> 不同意/同意。不是一个非常普遍的解决方案。

- 创建数据集中缺失的组合;但我还没有找到明确的方法。 (例如,有一件事是使用“最近邻居”)

- 我会打电话给平滑的东西。而不是NaN只是把一个没有极端的参数,使事件发生只有一个“小”的概率

没有这些方法是非常明确的我(尤其是何时使用哪一个,或者如果其中任何一个更好) ;所以我会为任何发展和建议感到高兴。