2014-12-19 63 views
13

Ho una matrice x di 8 colonne. Voglio eseguire glmnet per eseguire una regressione lazo. So che ho bisogno di chiamare:Come rendere tutte le interazioni prima di utilizzare glmnet

glmnet(x, y, family = "binomial", ...). 

Tuttavia, come faccio ad ottenere x di prendere in considerazione tutte le interazioni in un modo così? Devo rifare manualmente il frame dei dati: se sì, c'è un modo più semplice? Suppongo che speravo di fare qualcosa usando una formula R.

risposta

20

Sì, c'è un modo conveniente per quello. Due passaggi in esso sono importanti.

library(glmnet) 
# Sample data 
data <- data.frame(matrix(rnorm(9 * 10), ncol = 9)) 
names(data) <- c(paste0("x", 1:8), "y") 
# First step: using .*. for all interactions 
f <- as.formula(y ~ .*.) 
y <- data$y 
# Second step: using model.matrix to take advantage of f 
x <- model.matrix(f, data)[, -1] 
glmnet(x, y) 
+0

[, -1] è quello di rimuovere una colonna di 'intercettare' che è auto creata usando model.matrix in questo esempio. – theforestecologist

+0

è possibile farlo con il caret? Quando inserisco la matrice del modello in un treno con le stesse impostazioni, non esegue le variabili di interazione – KillerSnail

+0

@KillerSnail, prova 'f <- as.formula (~. *.)' E 'x <- model.matrix (f, TrainData) [, -1] 'e quindi prendi' treno (x = x, ...) '. – Julius

1

f <- as.formula(~ .^2) dovrebbe funzionare anche per l'inclusione di effetti principali e tutte le interazioni a coppie

Problemi correlati