首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >bnlearn如何计算连续数据的BIC?

bnlearn如何计算连续数据的BIC?
EN

Stack Overflow用户
提问于 2019-02-26 13:30:24
回答 1查看 474关注 0票数 1

我在R中使用bnlearn包,我想知道这个包是如何计算BIC-g (高斯分布中的BIC )的。

让我们建立一个结构,我可以找到BIC分数,如下所示

代码语言:javascript
复制
library(bnlearn)
X = iris[, 1:3]
names(X) = c("A", "B", "C")
Network = empty.graph(names(X))
bnlearn::score(Network, X, type="bic-g")

bnlearn为我提供了关于如何计算这个分数的更详细的信息,

代码语言:javascript
复制
bnlearn::score(Network, X, type="bic-g", debug=TRUE)

这就导致了

代码语言:javascript
复制
----------------------------------------------------------------
* processing node A.
  > loglikelihood is -184.041441.
  > penalty is 2.505318 x 2 = 5.010635.
----------------------------------------------------------------
* processing node B.
  > loglikelihood is -87.777815.
  > penalty is 2.505318 x 2 = 5.010635.
----------------------------------------------------------------
* processing node C.
  > loglikelihood is -297.588727.
  > penalty is 2.505318 x 2 = 5.010635.
[1] -584.4399

我知道如何计算贝叶斯网络中离散数据的BIC,参考here。但我不知道它如何推广到联合高斯(多变量正态)的情况。

当然,这可能与近似似然和惩罚项有关,似乎软件包过程计算每个节点的可能性和惩罚,然后对它们求和。

代码语言:javascript
复制
bnlearn::score(Network, X, type="loglik-g", debug=TRUE)

但我想知道,在给定数据的情况下,我如何具体计算可能性和惩罚。

我找到了解释Laplace Approximationmaterial (请参阅第57页),但我无法将其联系起来。

有谁能帮帮我吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-01 18:18:02

BIC的计算方式为

BIC = -2* logLik + nparams* log(nobs)

但在bnlearn中,这被重新缩放到-2 (参见?score),以给出

BIC = logLik -0.5* nparams* log(nobs)

因此,对于您的示例,在没有边的情况下,使用边际均值来计算似然率,而误差(或者更一般地,对于每个节点,参数的数量是通过将1(截取)+1(残差)+父节点的数量相加得到的),例如

代码语言:javascript
复制
library(bnlearn)
X = iris[, 1:3]
names(X) = c("A", "B", "C")
Network = empty.graph(names(X))

(ll = sum(sapply(X, function(i) dnorm(i, mean(i), sd(i), log=TRUE)))) 
#[1] -569.408
(penalty = 0.5* log(nrow(X))* 6)
#[1] 15.03191

ll - penalty
#[1] -584.4399

如果存在边缘,则使用拟合值和残差计算对数似然。对于网络:

代码语言:javascript
复制
Network = set.arc(Network, "A", "B")

我们需要来自节点A和C的对数似然分量

代码语言:javascript
复制
(llA = with(X, sum(dnorm(A, mean(A), sd(A), log=TRUE))))
#[1] -184.0414
(llC = with(X, sum(dnorm(C, mean(C), sd(C), log=TRUE))))
#[1] -297.5887

我们从线性回归中得到B的条件概率

代码语言:javascript
复制
m = lm(B ~ A, X)
(llB = with(X, sum(dnorm(B, fitted(m), stats::sigma(m), log=TRUE))))
#[1] -86.73894

给予

代码语言:javascript
复制
(ll = llA + llB + llC)
#[1] -568.3691
(penalty = 0.5* log(nrow(X))* 7)
#[1] 17.53722
ll - penalty
#[1] -585.9063 

#  bnlearn::score(Network, X, type="bic-g", debug=TRUE)
# ----------------------------------------------------------------
# * processing node A.
#    loglikelihood is -184.041441.
#    penalty is 2.505318 x 2 = 5.010635.
# ----------------------------------------------------------------
# * processing node B.
#    loglikelihood is -86.738936.
#    penalty is 2.505318 x 3 = 7.515953.
# ----------------------------------------------------------------
# * processing node C.
#    loglikelihood is -297.588727.
#    penalty is 2.505318 x 2 = 5.010635.
# [1] -585.9063
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54878957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档