2016-12-06 69 views
1

我使用regsubsets來搜索模型。是否可以從參數選擇列表中自動創建所有lm獲取所有型號的飛躍regsubsets

library(leaps) 
leaps<-regsubsets(y ~ x1 + x2 + x3, data, nbest=1, method="exhaustive") 
summary(leaps)$which 
    (Intercept)  x1  x2 x3                     
1  TRUE FALSE  FALSE TRUE                     
2  TRUE FALSE  TRUE TRUE                     
3  TRUE TRUE  TRUE TRUE                     

現在我會手動做model_1 <- lm(y ~ x3)等等。如何自動將它們列入清單?

回答

3

我不知道你爲什麼要一個所有型號的列表。 summarycoef方法應該很好地爲您服務。但我會首先從純粹的編程方面回答你的問題,然後回到這一點。


一個簡單的方法做,這是通過reformulate

reformulate(termlabels, response = NULL, intercept = TRUE) 

方法如下:

## you are masking `leaps` and `data` function!! 
leaps <- regsubsets(y ~ x1 + x2 + x3, data, nbest = 1, method = "exhaustive") 
X <- summary(leaps)$which 

xvars <- dimnames(X)[[2]][-1] ## column names (all covariates except intercept) 
responsevar <- "y" ## name of response 

lst <- vector("list", dim(X)[1]) ## set up an empty model list 

## loop through all rows/model specifications 
for (i in 1:dim(X)[1]) { 
    id <- X[i, ] 
    form <- reformulate(xvars[which(id[-1])], responsevar, id[1]) 
    lst[[i]] <- lm(form, data) 
    } 

沒有必要爲*apply解決方案。 lm是昂貴的,所以for循環根本沒有開銷。


一種更快的辦法是建立一個包含所有協變量的模型矩陣,並動態地選擇它的列(使用模型矩陣的assign屬性;尤其如此,當你有因子變量)。模型擬合然後通過.lm.fit。然而,除非你是線性模型專家,否則你將難以產生模型總結/預測,原始產出爲.lm.fit,但我認爲summary(leaps)應該會返回各種有用的統計數據。

leaps:::coef.regsubsets功能等同於此.lm.fit路線。簡單地做:

coef(leaps, 1:dim(X)[1], TRUE) 

你會得到所有模型的係數和方差 - 協方差矩陣。