Crea automaticamente formule per tutti i possibili modelli lineari

Supponiamo di avere un set di allenamento in un train dati con colonne ColA , ColB , ColC , ecc. Una di queste colonne indica una class binaria, ad esempio Class colonna, con valori “sì” o “no”.

Sto provando alcuni classificatori binari, ad esempio:

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

Vorrei eseguire il codice precedente in un ciclo, generando automaticamente tutte le possibili combinazioni di colonne nella formula, ad esempio:

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

Come posso generare automaticamente formule per ogni ansible modello lineare che coinvolga colonne di un frame di dati?

Diciamo che lavoriamo con questo ridicolo esempio:

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

Quindi ottieni i nomi delle colonne

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

Costruisci tutte le combinazioni possibili

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

Li incollate alle formule

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

E ti ricolleghi per applicare i modelli.

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

Attenzione però: se si dispone di più di una manciata di colonne, questo diventerà rapidamente molto pesante sulla memoria e si tradurrà in letteralmente in migliaia di modelli. Hai 2 ^ n - 1 diversi modelli con n che è il numero di colonne.

Assicurati che sia quello che vuoi, in generale questo tipo di confronto tra modelli è fortemente sconsigliato. Dimentica qualsiasi tipo di inferenza anche quando fai questo.

Ecco un eccellente post sul blog di Mark Heckman, che spiega come build tutti i possibili modelli di regressione, dato un insieme di variabili esplicative e una variabile di risposta. Tuttavia, come sottolineato da Joris, vorrei assolutamente evitare di utilizzare tale approccio poiché (a) il numero di regressioni aumenta esponenzialmente e (b) gli esperti statistici non raccomandano la pesca di dati di questo tipo, poiché è irto di tutti i tipi di rischi.

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

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