我正在拟合贝叶斯模型以使用
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
要使用
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)