在 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))
})
我正在尝试轻松测试一大堆不同的模型,并将 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))
})