如何根据 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]
目前,您正在将列表对象与 stepAIC
和 AIC
方法以及 运行 在特定组件上的方法混为一谈。具体来说,
MASS
包 运行 中的函数 stepAIC
对单个模型对象(例如,lm
class 类型),不是模型对象的摘要,也不是模型对象列表(即 polys),您的尝试失败:stepAIC(polys)
.
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)]
假设我有以下 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]
目前,您正在将列表对象与 stepAIC
和 AIC
方法以及 运行 在特定组件上的方法混为一谈。具体来说,
MASS
包 运行 中的函数stepAIC
对单个模型对象(例如,lm
class 类型),不是模型对象的摘要,也不是模型对象列表(即 polys),您的尝试失败:stepAIC(polys)
.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)]