如何在循环中存储多因变量回归模型并基于AIC/BIC比较模型?
解决方法
1. 将模型对象保存到列表中
你当前的循环里每次都会覆盖est_model,所以得用列表来存储每个回归模型,这样后续才能对多个模型做比较。修改后的代码如下:
library(rcompanion) depvar <- c("qsec", "hp") indepvar <- paste(c("mpg", "wt", "am", "disp"), collapse = " + ") # 初始化空列表存模型 model_list <- list() for(i in 1:length(depvar)){ # 把每个模型存入列表,用因变量名当元素名称,方便后续识别 model_list[[depvar[i]]] <- lm(paste(depvar[i],"~", indepvar), data=mtcars) } # 可以查看下存储好的模型 model_list
2. 基于AIC/BIC比较模型
方法一:用rcompanion::compareLM()
直接把列表里的模型传入compareLM(),就能得到包含AIC、BIC在内的多维度对比结果:
# 对比两个模型 model_compare <- compareLM(model_list[[1]], model_list[[2]]) print(model_compare)
如果后续模型数量变多,不用逐个写参数,用do.call一次性传入所有模型更高效:
model_compare <- do.call(compareLM, model_list) print(model_compare)
方法二:手动提取AIC/BIC
要是不想依赖rcompanion包,也可以直接用基础函数提取指标并整理成表格:
# 提取每个模型的AIC和BIC值 aic_values <- sapply(model_list, AIC) bic_values <- sapply(model_list, BIC) # 整理成直观的数据框 model_metrics <- data.frame( 模型 = names(model_list), AIC = aic_values, BIC = bic_values, row.names = NULL ) print(model_metrics)
补充说明
compareLM()还会输出R²、调整R²等统计量,适合全面评估模型表现- AIC和BIC的数值越小,代表模型在平衡拟合度与复杂度上的表现越好
内容的提问来源于stack exchange,提问作者user10904839
相关产品推荐
相关产品推荐

