在bnlearn中处理未记录的调节情况和NaN参数

时间:2017-01-04 13:37:55

标签: r bayesian bayesian-networks bnlearn

现在让我了解如何正确输入软证据(见Prediction with cpdist using "probabilities" as evidence),这引出了一个新问题(我认为是一个非常常见的问题),我再次准备了一个可重现的例子: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)]))

我理解为什么算法无法估计“Cons”节点的分布的一个参数。实际上,玩具数据集中从不出现“否”和“蓝色”,因此算法无法学习相关参数。 这可以在print(haha)部分看到。

在我的实际例子中,这可能会发生很多,因为我的数据集通常不会很大,因此一些条件案例可能没有数据记录。 当使用软证据时,我的NaN观察阵列中有一些cpdist s可能会经常发生,因为软证据很多时候会允许这些调节情况 在10000多次观察中发生几次(如你所做print(prediction_with_soft),你可以在这里看到)

这会引发以下问题:我应该怎么处理这些NaN值,如何预防它们?

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

在获得所需数量的非NaN观察之前,我是否可以发表观察结果,或者这是否是统计异端? (可能是的,因为这意味着在不考虑某些案件的情况下欺骗我的软证据,对吗?)

____________________________________________________________________________

更新编辑:

以下是与某人快速邮件交换后的一些新元素:

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

” 虽然目前不支持bnlearn中连续变量的后验参数估计,但您可以单独估算参数并在拟合模型中替换它们。 “

enter image description here

现在我想知道......我如何单独估算这个参数? 我是否将“Cons”节点离散化,然后使用“bayes”方法来适应新的离散化网络?这一次,因为贝叶斯方法在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,看起来像是对我的“Cons”值的意思 我在这里做的事情是否有意义?这是要走的路吗? 是否有其他/更好的方法来估计这些NaN参数,然后将它们粘贴回模型中?

____________________________________________________________________________

1 个答案:

答案 0 :(得分:0)

我将发布一个部分答案,这也是希望能够推动(目前不存在)辩论的更多内容。

在与老师讨论之后,向网络神灵祈祷,并将自己的盐投入到混合中,这是一些潜在的想法来估计缺失的参数:

- 单独估算缺失的那个并将它们粘贴回模型中,例如使用glm

- 使用每个分类变量的一些形式。让我们说我有一个4级变量;非常不同意,不同意,同意,非常同意=> 不同意/同意。虽然不是一般的解决方案。

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

- 我称之为平滑的东西。而不是NaN只是把一个不是极端的参数,并使事件只发生在"小"概率

这些方法对我来说都不是很清楚(尤其是何时使用哪种方法,或者如果它们中的任何一方更好);所以我对任何发展和建议感到高兴。