如何自动选择具有最低AIC/BIC的最优线性模型?
自动选择最低AIC的线性模型方案
需求说明
我想要自动创建具有最低AIC值的线性模型,已经写好了获取AIC的代码,通过step()函数得到了基于AIC准则的model_aic和基于BIC准则的model_bic。现在需要实现一套自动化流程,不用手动查看输出,就能从这两个模型里选出最优的,方便适配不同数据集。之前试过Stack Overflow上的循环遍历代码,但没成功,相关代码如下:
现有模型构建代码
fullModel = lm(data$num ~ data$age + data$sex + data$chol + data$hd + data$ca) nullModel = lm(num ~ 1) model_aic = step(nullModel, scope=list(lower=nullModel, upper=fullModel), direction='both') n = dim(data)[1] model_bic <- step(nullModel, scope=list(lower=nullModel, upper=fullModel), direction='both', k=log(n))
尝试过的遍历选择代码(未成功)
mod_headers <- names(data[1:ncol(data)-1]) f <- function(mod_headers) { models <- list() k <- 1 for (i in 1:length(mod_headers)) { tab <- combn(mod_headers, i) for(j in 1:ncol(tab)) { mod_tab_new <- c(tab[, j], "Data") models[[k]] <- glm(data$num ~ ., data = data[mod_tab_new], family = binomial(link = "logit")) k <- k + 1 } } models[[which.min(sapply(models, AIC))]] } f(mod_headers)
自动化选择最优模型的实用方案
不用复杂遍历,直接针对需求给出高效解决方法:
方案1:从已有的model_aic和model_bic中选AIC最低的模型
直接对比两个模型的AIC值,自动返回最优模型:
# 提取两个模型的AIC值 aic_scores <- c(AIC(model_aic), AIC(model_bic)) # 选择AIC最低的模型 best_model <- list(model_aic, model_bic)[[which.min(aic_scores)]]
方案2:替代失败的全遍历代码,高效筛选所有子模型中的最优AIC模型
之前的遍历代码存在逻辑错误(比如多余的"Data"参数),且变量多的时候组合数爆炸,效率极低。推荐用leaps包快速筛选:
library(leaps) # 生成所有变量子集的模型结果 subset_results <- regsubsets(num ~ age + sex + chol + hd + ca, data = data, nvmax = 5) summary_results <- summary(subset_results) # 找到AIC最低的模型对应的索引 best_idx <- which.min(summary_results$aic) # 获取该模型包含的变量 selected_vars <- names(summary_results$which[best_idx, ])[summary_results$which[best_idx, ]] # 构建最终的最优线性模型 best_model <- lm(paste("num ~", paste(selected_vars[-1], collapse = " + ")), data = data)
关键提示
step()函数默认就是基于AIC逐步筛选的,生成的model_aic已经是AIC最优的逐步回归模型,无需额外遍历- 全量遍历所有变量组合仅适合变量数≤5的场景,变量增多后会导致计算量指数级增长,完全不实用
内容的提问来源于stack exchange,提问作者Dylan Conway
相关产品推荐
相关产品推荐

