【问题标题】:How to create many Linear Regression models via a For Loop in R?如何通过 R 中的 For 循环创建许多线性回归模型?
【发布时间】:2021-05-26 06:50:21
【问题描述】:

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

10 选择0种方式获取空模型, 和 10 选择 1 方式在 mpg 上创建单反; 10 选择 2 种方法在 mpg 上创建二变量回归; 10 选择3种方式在mpg上创建单反;等等,

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

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

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 个最佳模型是什么,但也许只是因为我一直盯着这个问题太久了,但我不知道如何实际保存线性模型并可以访问它,例如,如果我想绘制它或其他东西。我知道我可以很容易地用我的输出重新创建它,但我也在努力提高我的编码效率,而不是总是求助于硬编码,你知道吗?我也不知道如何根据模型中包含的变量数量来存储模型,以便我可以访问每个模型的前两个模型。

在发布之前,我查看了以下链接:

  1. How to Loop/Repeat a Linear Regression in R

  2. Regression with for-loop with changing variables

  3. R Loop for Variable Names to run linear regression model

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

感谢您抽出宝贵时间阅读这篇冗长的帖子并考虑在这里帮助我解决我的问题!

【问题讨论】:

  • 只是好奇,您的目标是做这件具体的事情(当然是根据您的数据),还是这是您选择最佳模型的策略?如果是后者,您可能需要阅读“正则化”和其他避免过度拟合的方法,这是通过生成超过 1,000 个模型而带来的风险。其中之一,套索回归,(据我了解)对附加项施加惩罚,帮助您确定哪些变量组合提供了最大的预测能力。
  • 这个问题听起来非常相似,虽然他们是专门用broom包来总结结果的:stackoverflow.com/questions/65330247/…

标签: r dataframe linear-regression


【解决方案1】:

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

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() 就可以在我认为开始的集合中回顾一下。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-30
    • 2018-07-29
    • 2019-01-02
    • 1970-01-01
    • 2023-03-11
    • 2021-07-02
    • 2022-01-12
    • 1970-01-01
    相关资源
    最近更新 更多