如何根据 R 中 lapply 的结果根据 AIC 从最好到最差排序模型

How to order models from best to worst based on AIC from the result of lapply in R

假设我有以下 df。

ind1 <- rnorm(100)
ind2 <- rnorm(100)
ind3 <- rnorm(100)
ind4 <- rnorm(100)
ind5 <- rnorm(100)
dep <- rnorm(100, mean=ind1)

df <- data.frame(dep,ind1, ind2, ind3, ind4, ind5)

我分别使用 dep 变量和每个 ind 变量计算了三阶多项式回归 lapply() 如下:

polys <- lapply(df[,-1], function(x) summary(lm(dep ~ poly(x, 3, raw = 
TRUE), data = df)))

现在我想 list/order 基于 AIC 的最佳模型。我尝试了这些但没有成功。

stepAIC(polys)
polys$AIC

你知道我应该如何在 R 中执行此操作吗?

提前致谢!

这是一种解决方案:

ind1 <- rnorm(100)
ind2 <- rnorm(100)
ind3 <- rnorm(100)
ind4 <- rnorm(100)
ind5 <- rnorm(100)
dep <- rnorm(100, mean=ind1)

df <- data.frame(dep,ind1, ind2, ind3, ind4, ind5)

# Create all the models
polys <- lapply(df[,-1], function(x) (lm(dep ~ poly(x, 3, raw = TRUE), data = df)))

# Find the best predictors using `setpAIC()`
mod <- lapply(polys, MASS::stepAIC)

# Calculate the AIC of each model and sort it increasingly.
i <- order(unlist(lapply(mod, AIC)))

# Show the models starting with the lowest AIC first
mod[i]

目前,您正在将列表对象与 stepAICAIC 方法以及 运行 在特定组件上的方法混为一谈。具体来说,

  1. MASS 包 运行 中的函数 stepAIC 对单个模型对象(例如,lm class 类型),不是模型对象的摘要,也不是模型对象列表(即 polys),您的尝试失败:stepAIC(polys).

  2. MASS 包 运行 中的函数 AIC 通常在 stepAIC 调用之后在单个模型对象上,并且不是return 尝试失败:polys$AIC.

考虑使用种子数据对代码进行以下重构,以便通过升序 AIC 值对 lm 对象列表 polys 进行排序:

library(MASS)

set.seed(50619)    
#... same data build code ...

# LIST OF lm OBJECTS (NO SUMMARY)
polys <- lapply(df[,-1], function(x) lm(dep ~ poly(x, 3, raw = TRUE), data = df))

# SORTED VECTOR OF AIC VALUES (USING sapply)
AIC_vec <- sort(sapply(polys, function(x) AIC(stepAIC(x))))
AIC_vec
#     ind1     ind3     ind2     ind4     ind5 
# 297.1865 352.3694 352.8260 352.8260 352.8260

# SORTED polys BY AIC (BEST TO WORST)
sorted_polys <- polys[names(AIC_vec)]