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

标签 r bnlearn

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

我们来做一个结构,我可以找到BIC分数如下

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 为我提供了有关如何计算此分数的更详细信息,

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 -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 。但我不知道它如何推广到联合高斯(多元正态)情况。

肯定它可能与近似可能性和惩罚项有关,并且包进程似乎计算每个节点的可能性和惩罚,然后将它们相加。

bnlearn::score(Network, X, type="loglik-g", debug=TRUE)

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

我发现了material这解释了拉普拉斯近似(请参阅第 57 页),但我无法将其联系起来。

有谁能帮帮我吗?

最佳答案

BIC 的计算方式为

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

但在 bnlearn 中,这会按 -2 重新调整(参见?score)以给出

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

因此,对于您的示例,在没有边的情况下,使用边际均值和误差(或更一般地说,对于每个节点,参数数量通过求和 1(截距)+ 1(残差)+ 来计算可能性) parent 的数量),例如

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

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

Network = set.arc(Network, "A", "B")

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

(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 的条件概率

m = lm(B ~ A, X)
(llB = with(X, sum(dnorm(B, fitted(m), stats::sigma(m), log=TRUE))))
#[1] -86.73894

给予

(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

关于r - bnlearn如何计算连续数据的BIC?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54878957/

相关文章:

r - 有人可以解释在 data.table 中执行更新时,mult 是如何工作的吗(使用 .EACHI 和 mult)

r - R : variable is not supported in bnlearn (type: integer) 中 bn.fit() 的数据类型错误

R:环境查找

regex - 持续模式匹配来识别 SQL 子句

r - 在 R 中使用 bnstruct 设置动态贝叶斯网络的层

r - BNlearn R 错误 “variable Variable1 must have at least two levels.”

r - 如何使用 bnlearn 和 graphviz 绘制具有实例化节点的贝叶斯网络?

regex - 在 data.frame 中的任何单元格上使用 grep

r - 在 data.table R 中使用 lapply .SD