2011-03-14 33 views
15

decir que tengo un conjunto de entrenamiento en una trama de datos train con columnas ColA, ColB, ColC, etc. Una de estas columnas designa una clase binaria, por ejemplo la columna Class, con un "sí" o valores "no"Creación automática de fórmulas para todos los posibles modelos lineales

Estoy intentando algunos clasificadores binarios, por ejemplo:

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

me gustaría para ejecutar el código de seguridad en un bucle, la generación automática de todas las combinaciones posibles de las columnas en la fórmula, es decir:

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) 
... 

¿Cómo puedo generar fórmulas automáticamente para cada posible modelo lineal que involucre columnas de un marco de datos?

+2

ver la respuesta de @ gd047 [aquí] (htt p: //stats.stackexchange.com/questions/6856/aggregating-results-from-linear-model-runs-r) – Chase

+0

Gracias, @Chase! ¡El enlace fue extremadamente útil! – Leo

Respuesta

17

decimos que trabajamos con este ejemplo ridícula:

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

A continuación, obtener los nombres de las columnas

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

que la construcción de todas las combinaciones posibles

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

pegarlos a fórmulas

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

Y las recorre para aplicar los modelos.

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

Se advierte sin embargo: si usted tiene más de un puñado columnas, esto se convertirá rápidamente en muy pesado en la memoria y el resultado en literalmente miles de modelos. Tienes 2^n - 1 modelos diferentes, siendo n el número de columnas.

Asegúrese de que eso es lo que desea, en general este tipo de modelo de comparación se desaconseja. Olvídate de cualquier tipo de inferencia también cuando hagas esto.

3

Aquí hay una excelente blog post de Mark Heckman, que detalla cómo construir todos los posibles modelos de regresión, dado un conjunto de variables explicativas y una variable de respuesta. Sin embargo, como señaló Joris, sería estrictamente cauteloso en contra de utilizar dicho enfoque ya que (a) el número de regresiones aumenta exponencialmente y (b) los expertos en estadística no recomiendan la pesca de datos de este tipo, ya que está plagado de todo tipo de riesgos

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 

Genera:

R> fórmulas

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

+0

Advertencia en install.packages: paquete 'gregmisc' no está disponible (para R versión 3.2.2) – Mox

Cuestiones relacionadas