Tutti i livelli di un fattore in una matrice modello in R


Answers

(Cercando di riscattarmi ...) In risposta al commento di Jared sulla risposta di @Fabians sull'automazione, si noti che tutto ciò che è necessario fornire è una lista nominata di matrici di contrasto. contrasts() prende un vettore / fattore e produce la matrice di contrasti da esso. Per questo quindi possiamo usare lapply() per eseguire contrasts() su ogni fattore nel nostro set di dati, ad esempio per l'esempio testFrame fornito:

> lapply(testFrame[,4:5], contrasts, contrasts = FALSE)
$Fourth
        Alice Bob Charlie David
Alice       1   0       0     0
Bob         0   1       0     0
Charlie     0   0       1     0
David       0   0       0     1

$Fifth
        Edward Frank Georgia Hank Isaac
Edward       1     0       0    0     0
Frank        0     1       0    0     0
Georgia      0     0       1    0     0
Hank         0     0       0    1     0
Isaac        0     0       0    0     1

Quale slot ben inserito nella risposta di @fabians:

model.matrix(~ ., data=testFrame, 
             contrasts.arg = lapply(testFrame[,4:5], contrasts, contrasts=FALSE))
Question

Ho un data.frame costituito da variabili numeriche e fattoriali come visto di seguito.

testFrame <- data.frame(First=sample(1:10, 20, replace=T),
           Second=sample(1:20, 20, replace=T), Third=sample(1:10, 20, replace=T),
           Fourth=rep(c("Alice","Bob","Charlie","David"), 5),
           Fifth=rep(c("Edward","Frank","Georgia","Hank","Isaac"),4))

Voglio costruire una matrix che assegni le variabili dummy al fattore e lasci da solo le variabili numeriche.

model.matrix(~ First + Second + Third + Fourth + Fifth, data=testFrame)

Come previsto quando si esegue lm questo lascia un livello di ciascun fattore come livello di riferimento. Tuttavia, voglio costruire una matrix con una variabile dummy / indicatore per ogni livello di tutti i fattori. Sto costruendo questa matrice per glmnet quindi non sono preoccupato per la multicollinearità.

C'è un modo per avere model.matrix creare il manichino per ogni livello del fattore?




Sto attualmente imparando il modello di Lasso e glmnet::cv.glmnet() , model.matrix() e Matrix::sparse.model.matrix() (per la matrice ad alte dimensioni, usando model.matrix si ucciderà il nostro tempo come suggerito dal autore di glmnet .).

Basta condividere ci ha un codice in ordine per ottenere la stessa risposta di @fabians e la risposta di @ Gavin. Nel frattempo, @ asdf123 ha introdotto anche un'altra library('CatEncoders') pacchetti library('CatEncoders') .

> require('useful')
> # always use all levels
> build.x(First ~ Second + Fourth + Fifth, data = testFrame, contrasts = FALSE)
> 
> # just use all levels for Fourth
> build.x(First ~ Second + Fourth + Fifth, data = testFrame, contrasts = c(Fourth = FALSE, Fifth = TRUE))

Fonte: R per tutti: Analytics e grafica avanzata (pagina 273)




Utilizzo del pacchetto R "CatEncoders"

library(CatEncoders)
testFrame <- data.frame(First=sample(1:10, 20, replace=T),
           Second=sample(1:20, 20, replace=T), Third=sample(1:10, 20, replace=T),
           Fourth=rep(c("Alice","Bob","Charlie","David"), 5),
           Fifth=rep(c("Edward","Frank","Georgia","Hank","Isaac"),4))

fit <- OneHotEncoder.fit(testFrame)

z <- transform(fit,testFrame,sparse=TRUE) # give the sparse output
z <- transform(fit,testFrame,sparse=FALSE) # give the dense output



caret implementato una bella funzione dummyVars per ottenere questo risultato con 2 linee:

library(caret) dmy <- dummyVars(" ~ .", data = testFrame) testFrame2 <- data.frame(predict(dmy, newdata = testFrame))

Controllo delle colonne finali:

colnames(testFrame2)

"First"  "Second"         "Third"          "Fourth.Alice"   "Fourth.Bob"     "Fourth.Charlie" "Fourth.David"   "Fifth.Edward"   "Fifth.Frank"   "Fifth.Georgia"  "Fifth.Hank"     "Fifth.Isaac"   

Il punto più bello qui è ottenere il frame di dati originale, oltre alle variabili dummy che hanno escluso quelle originali utilizzate per la trasformazione.

Maggiori informazioni: http://amunategui.github.io/dummyVar-Walkthrough/




Links