如何使用 R 中的 Brms 包计算基于留一法交叉验证的贝叶斯建模的平均绝对误差

问题描述 投票:0回答:1

我正在拟合贝叶斯模型以使用

Brms
包预测测试分数。 我想知道如何使用
LOO
包计算基于“留一法交叉验证”(LOO)的“平均绝对误差”,但我找不到任何与如何实现它相关的信息我自己。

如果有人向我展示如何基于 LOO 计算 MAE,我将不胜感激。

这里是一个可复制的示例代码:

set.seed(123) # for reproducibility
n <- 100 # number of observations
predictor_1 <- rnorm(n)
predictor_2 <- rnorm(n)
test_score <- 5 + 2*predictor_1 + 3*predictor_2 + rnorm(n)
data <- data.frame(test_score, predictor_1, predictor_2)
head(data)

fit <- brm(test_score ~ predictor_1 + predictor_2, data = data)
predicted_test_score <- predict(fit)

# calculate mean absolute error
mae <- mean(abs(predicted_test_score - data$test_score))
mae
r prediction bayesian brms leave-one-out
1个回答
0
投票

要使用

MAE
包根据
LOO
计算
loo
,需要使用
brm
包中的
brms
函数拟合贝叶斯模型,然后进行留一法交叉-使用
loo
函数进行验证。此外,您还需要从
brmsfit
对象中提取逐点对数似然矩阵,并使用
loo::loo_compare
函数计算预期的对数逐点预测密度 (ELPD) 差异。最后,您必须计算 LOO 平均绝对误差。

if (!requireNamespace("brms", quietly = TRUE)) {
  install.packages("brms")
}
library(brms)
if (!requireNamespace("loo", quietly = TRUE)) {
install.packages("loo")
}
library(loo)
fit <- brm(test_score ~ predictor_1 + predictor_2, data = data, save_all_pars = TRUE)
loo_fit <- loo(fit, save_psis = TRUE)
log_lik <- log_lik(fit)
elpd_diff <- loo::loo_compare(loo_fit, loo_fit)
loo_mae <- mean(abs(exp(elpd_diff$diff)))
print(loo_mae)
© www.soinside.com 2019 - 2025. All rights reserved.