自动为所有可能的线性模型创建公式

时间:2011-03-14 15:19:24

标签: r

假设我在数据框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)
...

如何为涉及数据框列的每个可能的线性模型自动生成公式?

3 个答案:

答案 0 :(得分:22)

假设我们使用这个荒谬的例子:

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是列数。

确保这是你想要的,一般来说强烈建议不要使用这种模型比较。当你这样做时,忘记任何类型的推断。

答案 1 :(得分:3)

这是Mark Heckman的优秀blog post,详细介绍了如何构建所有可能的回归模型,给出一组解释变量和响应变量。然而,正如Joris所指出的,我会严格警告不要使用这种方法,因为(a)回归数量呈指数增长;(b)统计专家不建议采用此类数据,因为它充满了各种各样的风险。

答案 2 :(得分: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&GT;公式

[[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