2014-12-19 30 views
13

Mam macierz x z 8 kolumnami. Chcę uruchomić glmnet, aby przeprowadzić regresję lasso. Wiem, że muszę zadzwonić:Jak wykonać wszystkie interakcje przed użyciem glmnet

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

Jednak, jak mogę dostać x rozważyć wszystkie jeden sposób interakcji, jak również? Czy muszę ręcznie przerobić ramkę danych: jeśli tak, czy istnieje łatwiejszy sposób? Przypuszczam, że miałem nadzieję, że coś zrobię, używając formuły R.

Odpowiedz

20

Tak, istnieje wygodny sposób na to. Ważne są dwa kroki.

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] jest usunąć „przechwytywania”, kolumnę, która jest utworzona za pomocą automatycznego model.matrix w tym przykładzie. – theforestecologist

+0

czy można to zrobić z caret? Kiedy karmię matrycę modelu w pociąg karetki z tymi samymi ustawieniami, to nie uruchamiaj zmiennych interakcji – KillerSnail

+0

@KillerSnail, spróbuj 'f <- as.formula (~. *.)' I 'x <- model.matrix (f, TrainData) [, -1] ', a następnie weź' train (x = x, ...) '. – Julius

1

f <- as.formula(~ .^2) powinny również działać w tym Główne wpływy i interakcje wszystkich parach