R语言 基于留一法交叉验证的贝叶斯建模的平均绝对误差计算

4xrmg8kj  于 2023-04-27  发布在  其他
关注(0)|答案(1)|浏览(243)

bounty还有4天到期。回答此问题可获得+50声望奖励。user8460166希望引起更多关注此问题。

我正在使用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
rqmkfv5c

rqmkfv5c1#

为了使用loo包基于LOO计算MAE,您需要使用brms包中的brm函数拟合贝叶斯模型,然后使用loo函数执行留一法交叉验证。此外,需要从brmsfit对象中提取逐点对数似然矩阵,并计算期望对数逐点预测密度(ELPD)差异使用loo::loo_compare函数。最后,您必须计算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)

相关问题