假设我在数据框train
中有一个训练集ColA
,ColB
,ColC
等。其中一列指的是二进制类,比如说列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)
...
如何为涉及数据框列的每个可能的线性模型自动生成公式?
答案 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