Автоматически создавать формулы для всех возможных линейных моделей
Скажем, у меня есть обучающий набор в кадре данных 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)
...
Как я могу автоматически генерировать формулы для каждой возможной линейной модели, содержащей столбцы кадра данных?
Ответы
Ответ 1
Скажем, мы работаем с этим нелепым примером:
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 - число столбцов.
Убедитесь, что это то, что вы хотите, в целом такого рода сравнение моделей настоятельно рекомендуется. Забудьте о любых выводах, когда вы это сделаете.
Ответ 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 > формулы
[[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]]
~ Ьp >
[[10]]
~ b + c
[[11]]
~ b + d
[[12]]
~ b + c + d
[[13]]
~ С
[[14]]
~ c + d
[[15]]
~ Д