2011-03-14 63 views
15

說我有一個訓練在數據幀train的列ColAColBColC等,其中這些列的指定二進制類設置自動創建公式,說柱Class,用「是」或「否」的值。所有可能的線性模型

我嘗試一些二元分類,例如:

library(klaR) 
mynb <- NaiveBayes(Class ~ ColA + ColB + ColC, train) 

我想在一個循環中運行上面的代碼,自動生成所述式中的列的所有可能組合,即:

mynb <- append(mynb, NaiveBayes(Class ~ ColA, train) 
mynb <- append(mynb, NaiveBayes(Class ~ ColA + ColB, train) 
mynb <- append(mynb, NaiveBayes(Class ~ ColA + ColB + ColC, train) 
... 
mynb <- append(mynb, NaiveBayes(Class ~ ColB + ColC + ColD, train) 
... 

如何自動爲涉及數據框的列的每個可能的線性模型生成公式?

+2

看到@ gd047的答案[這裏](HTT p://stats.stackexchange.com/questions/6856/aggregating-results-from-linear-model-runs-r) – Chase 2011-03-14 15:24:45

+0

謝謝,@Chase!該鏈接非常有用! – Leo 2011-03-15 09:17:07

回答

17

說我們這個荒謬的例子的工作:

DF <- data.frame(Class=1:10,A=1:10,B=1:10,C=1:10) 

然後,你列的名稱

Cols <- names(DF) 
Cols <- Cols[! Cols %in% "Class"] 
n <- length(Cols) 

您構建所有可能的組合

id <- unlist(
     lapply(1:n, 
       function(i)combn(1:n,i,simplify=FALSE) 
     ) 
     ,recursive=FALSE) 

你把它們粘貼到公式

Formulas <- sapply(id,function(i) 
       paste("Class~",paste(Cols[i],collapse="+")) 
      ) 

然後你循環它們以應用模型。

lapply(Formulas,function(i) 
    lm(as.formula(i),data=DF)) 

即使被警告:如果你有超過少數列的更多,這將很快成爲記憶非常重,導致成千上萬的機型。你有2^n - 1個不同的模型,其中n是列數。

確信這就是你想要的,一般來說這種模型比較是強烈建議不要的。當你這樣做的時候,忘記任何類型的推理。

3

這是Mark Heckman的優秀blog post,詳細介紹瞭如何構建所有可能的迴歸模型,給出一組解釋變量和響應變量。但是,正如Joris所指出的那樣,我將嚴格禁止使用這種方法,因爲(a)迴歸的數量呈指數增長,(b)統計專家不建議這類數據捕撈,因爲它充滿了各種各樣的的風險。

3
vars<-c('a','b','c','d') 
library(gregmisc) 
indexes<-unique(apply(combinations(length(vars), length(vars), repeats=T), 1, unique)) 
gen.form<-function(x) as.formula(paste('~',paste(vars[x],collapse='+'))) 
formulas<-lapply(indexes, gen.form) 
formulas 

生成:

R>公式

[[1]] 〜了

[[2]] 〜A + B

[[3] ] 〜a + c

[[4]] 〜A + d

[[5]] 〜A + B + C

[[6]] 〜A + B + d

[[7]] 〜A + C + d

[[8]] 〜A + b + C + d

[[9]] 一b

[[10] ] 〜B + C

[[11]] 〜B + d

[[12]] 〜B + C + d

[[13]] 〜Ç

[[14]] 〜C + d

[[15]] 〜d

+0

install.packages中的警告: 軟件包'gregmisc'不可用(對於R版本3.2.2) – Mox 2016-11-05 16:40:05