随着我现在了解如何正确输入软证据(请参阅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中连续变量的后验参数估计不支持,但可以单独估计参数并将其替换为拟合模型。 “
现在我不知道......我怎么估计这个参数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参数,然后将它们粘贴回模型中?
____________________________________________________________________________