BIC рассчитывается как
BIC = -2 * logLik + nparams * log (nobs)
, но в bnlearn
это масштабируется до -2 (см. ?score
)
BIC = logLik -0.5 * nparams * log (nobs)
Так что для вашего примера без ребер вероятность вычисляется с использованием предельных средних и ошибок (или, в более общем случае,для каждого узла число параметров задается суммированием 1 (перехват) + 1 (остаточная ошибка) + количество родителей), например:
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