Автоматически создавать формулы для всех возможных линейных моделей - PullRequest
18 голосов
/ 14 марта 2011

Скажем, у меня есть обучающий набор во фрейме данных train со столбцами ColA, ColB, ColC и т. Д. Один из этих столбцов обозначает двоичный класс, скажем, столбец Class, с "да" "или" нет "значений.

Я пробую некоторые двоичные классификаторы, например ::1008 *

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 ]

22 голосов
/ 14 марта 2011

Скажем, мы работаем с этим нелепым примером:

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 голосов
/ 15 марта 2011
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]] ~ a

[[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]] ~ c

[[14]] ~ c + d

[[15]] ~ d

3 голосов
/ 14 марта 2011

Вот отличное сообщение в блоге Марка Хекмана, подробно описывающее, как построить все возможные регрессионные модели, учитывая набор объясняющих переменных и переменную ответа.Однако, как отметил Йорис, я бы строго предостерегал от использования такого подхода, поскольку (а) число регрессий увеличивается экспоненциально, и (б) статистические эксперты не рекомендуют подобный сбор данных, так как это чревато всеми видамирисков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...