如何通过 R 中的 For 循环创建多个线性回归模型?

How to create many Linear Regression models via a For Loop in R?

我的问题是 R 中的 mtcars 数据集,我需要创建所有可能的加性线性回归模型,我在 mpg 变量上进行回归。空模型很简单,因为有

10选择0种方法得到空模型, 以及 10 种选择 1 种方式在 mpg 上创建单反; 10 选择 2 种方法来创建 mpg 的二元回归; 10 选择3 种方式在mpg 上创建单反;等等,

总的来说,这相当于对帕斯卡三角形中第 10 行求和,我需要考虑的模型总数为 1,024。

现在,另一个棘手的部分是我需要以某种方式将每个模型存储在某个单独的对象中,以便将所有 2 个变量模型组合在一起,将所有三个变量模型组合在一起,等等,此外还存储所有这些都在一起(尽管也许有更有效的方法来做到这一点)。这样做的原因是我的任务是查看所有这些模型,获取它们的 AIC 分数和它们的 Mallow's Cp 分数,将它们存储在数据框中,然后将这些分数从最低到最高排序并保留前 10 名。在顶部其中,我还需要能够通过两个最佳 10 变量模型存储、查看和访问 to/use 两个最佳 1 变量模型,因为我需要提供 r 平方值和调整后的 r这些不同模型的平方值以及误差均方值。总的来说,我仍然是 pretty/relatively R/coding 的新手,但我在下面提供了我的尝试:

library(rje)   # provides the powerSet function
library(olsrr) # provides the ols_mallows_cp function to calculate the Mallow's Cp values

mtcars <- datasets::mtcars

x <- powerSet(colnames(mtcars[,-1]))

datalist <- list()
for(i in c(2:1024)){
  datalist[[i]] <- mtcars[,colnames(mtcars) %in% c("mpg",x[[i]]) ]
}

full_model <- lm(mpg ~ ., data = mtcars)
Cp_vec <- c()

for (i in c(2:1024)){
  model <- lm(mpg ~ ., data = datalist[[i]])
  Cp_vec[i] <- ols_mallows_cp(model, full_model)
}

names(Cp_vec) <- as.character(c(1:1024)) 
TenSmallestCp <- Cp_vec[cpvec %in% head(sort(Cp_vec),10)]
Small_List <- list()

for (i in 1:10){
  Small_List[[i]] <- x[[as.numeric(names(TenSmallestCp))[i]]]
}

Small_List[[1]]
Small_List[[2]]
Small_List[[3]]
Small_List[[4]]
Small_List[[5]]
Small_List[[6]]
Small_List[[7]]
Small_List[[8]]
Small_List[[9]]
Small_List[[10]]

我目前使用它的方式将其作为输出:

[1] "cyl" "wt" 
[1] "hp" "wt"
[1] "cyl" "hp"  "wt" 
[1] "cyl"  "wt"   "qsec"
[1] "hp" "wt" "am"
[1] "wt"   "qsec" "am"  
[1] "disp" "wt"   "qsec" "am"  
[1] "hp"   "wt"   "qsec" "am"  
[1] "cyl"  "wt"   "carb"
[1] "wt"   "qsec" "am"   "carb"

所以这告诉我关于 Mallow 的 Cp 分数的 10 个最佳模型是什么,但也许这只是因为我已经盯着这个问题太久了,但我不知道如何实际上保存线性模型并可以访问它,比如说,如果我想绘制它或其他东西。我知道我可以很容易地用我的输出重新创建它,但我也在努力提高我的编码效率,而不是总是求助于硬编码,你知道吗?我也不知道如何根据模型中包含的变量数量来存储模型,因此我可以从每个模型中访问前两个模型。

在 post 之前,我查看了这些 link:

我承认,因为我是新手,所以我的问题的答案可能完全存在于这三个答案的某种线性组合中,我只是很难看到它并将它们放在一起,但是虽然我认为我分享的第一个 link 确实有很多与我的问题相关,最后一个也很相关,我不确定第二个有多大帮助。这就是为什么我 post 将其作为一个新问题。

感谢您花时间阅读这篇冗长的文章 post 并考虑在这里帮助我解决我的问题!

你的方法还不错。这就是我如何按照您的描述复制您的作品:

library(rje)   # provides the powerSet function
library(olsrr) # provides the ols_mallows_cp function to calculate the Mallow's Cp values

x <- powerSet(colnames(mtcars[,-1]))
full_model <- lm( mpg ~ ., data=mtcars )

your_models <- lapply( x, function(n) {
    d_i <- mtcars[,c( "mpg", n), drop=FALSE] # use drop=FALSE to make sure it stays a 2d structure
    return( lm( mpg ~ ., data = d_i ) )
})

Cp_vec <- sapply( your_models, function(m) {
    ols_mallows_cp( m, full_model )
})

TenSmallestIndeces <- head( order( Cp_vec ), n=10 )

TenSmallestCp <- head( sort( Cp_vec ), n=10 )

TenSmallestSets <- x[ TenSmallestIndeces ]

## inspect one of your models:
your_models[[ TenSmallestIndeces[1] ]]

从循环中收集时最好使用某种应用。在从循环构建数据框或其他二维结构时,我也经常使用 foreach 包中的 foreach。

我像你一样创建子集,并以几乎相同的方式拟合模型,一次完成。

那么你只需要仔细了解 sort() 和 order() 以便在我认为你开始的集合中回顾。