在 R 中创建模型选择循环

Create a loop for model selection in R

我正在尝试轻松测试一大堆不同的模型,并将 AIC / R-sq 值与 select 正确的模型进行比较。我在列表和数据框之间保存我想要的东西时遇到了一些麻烦。

我要建模的数据框:

set.seed(1)
df <- data.frame(response=runif(50,min=50,max=100),
                 var1 = sample(1:20,50,replace=T),
                 var2 = sample(40:60,50,replace = T))

要测试的公式列表:

formulas  <- list( response ~ NULL,
                   response ~ var1,
                   response ~ var2,
                   response ~ var1 + var2,
                   response ~ var1 * var2)

所以,我想做的是创建一个循环,对所有这些公式进行建模,将公式、AIC 和 R-sq 值提取到 table 中,然后让我对其进行排序以找到最好的。我遇到的问题是我无法将公式名称提取为 "Response ~ var1",相反,如果我尝试提取为字符对象,它会一直显示为 "Response" "~" "var1"。或者,如果我提取为列表(如下所示),则结果如下:

[[1]]
response ~ NULL

[[2]]
[1] 415.89

[[3]]
[1] 0

而且我无法轻松地将这些列表元素插入数据框。这是我尝试过的:

selection <- matrix(ncol=3)
colnames(selection) <- c("formula","AIC","R2") # create a df to store results in
for ( i in 1:length(formulas)){
  mod <- lm( formula = formulas[[i]], data= df)
  mod_vals <- c(extract(formulas[[i]]), 
                round(AIC(mod),2), 
                round(summary(mod)$adj.r.squared,2)
  )
  selection[i,] <- mod_vals[]
}

有什么想法吗?我也不必将它保留为 for 循环,我只是想要一种方法来一起测试一长串模型。

谢谢。

您可以使用 lapply 循环每个公式并从模型中提取相关统计数据并将数据集绑定在一起。

do.call(rbind, lapply(formulas, function(x) {
   mod <- lm(x, data= df)
   data.frame(formula = format(x), 
              AIC = round(AIC(mod),2), 
              r_square = round(summary(mod)$adj.r.squared,2))
}))

#                formula    AIC r_square
#1        response ~ NULL 405.98     0.00
#2        response ~ var1 407.54    -0.01
#3        response ~ var2 407.90    -0.02
#4 response ~ var1 + var2 409.50    -0.03
#5 response ~ var1 * var2 410.36    -0.03

或者用purrr

purrr::map_df(formulas, ~{
  mod <- lm(.x, data= df)
 data.frame(formula = format(.x), 
            AIC = round(AIC(mod),2), 
            r_square = round(summary(mod)$adj.r.squared,2))
})