簡體   English   中英

如何通過 R 中的 For 循環創建多個線性回歸模型?

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

我的問題是對於 R 中的 mtcars 數據集,我需要創建所有可能的加性線性回歸模型,其中我要回歸 mpg 變量。 null model 很簡單,因為有

10選0方式獲取null model,10選1方式在mpg上創建單反; 10 選擇 2 種方法在 mpg 上創建二變量回歸; 10 選擇3種方式在mpg上創建單反; ETC。,

所以總的來說,因為這相當於帕斯卡三角中第 10 行的總和,所以我需要考慮的模型總數為 1,024。

現在,另一個棘手的部分是我需要以某種方式將每個 model 存儲在一些單獨的 object 中,以便將所有 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]]

我目前擁有它的方式將其生成為 output:

[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 個最佳模型是什么,但也許只是因為我一直盯着這個問題太久了,但我不知道如何實際保存線性 model並且可以訪問它,例如,如果我想 plot 它或其他東西。 我知道我可以用我的 output 輕松地重新創建它,但我也在努力提高我的編碼效率,而不是總是求助於硬編碼,你知道嗎? 我也不知道如何根據 model 中包含的變量數量來存儲模型,因此我可以從每個模型中訪問前兩個模型。

在發布之前,我檢查了這些鏈接:

  1. 如何在 R 中循環/重復線性回歸

  2. 帶有變化變量的 for 循環回歸

  3. R 循環變量名稱以運行線性回歸 model

我承認,因為我是新手,所以我的問題的答案可能完全存在於這三個答案的某種線性組合中,我只是很難看到它並將它放在一起,但是雖然我認為第一個鏈接我分享的確實有很多與我的問題相關的內容,最后一個也很相關,我不確定第二個有多大幫助。 這就是為什么我將其作為一個新問題發布。

感謝您花時間閱讀這篇冗長的帖子,並考慮在這里幫助我解決我的問題!

你的方法還不錯。 這就是我按照您的描述復制您的作品的方式:

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 package 中的 foreach。

我像您一樣創建子集,並以幾乎相同的方式安裝 model,只需在一個 go 中完成即可。

然后你只需要了解 sort() 和 order() 就可以在我認為開始的集合中回顧一下。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM