2015-07-12 27 views
8

Sto provando a creare una matrice modello con una formula con molti termini di interazione (alcuni continui, alcuni 0-1, alcuni fattori con molti livelli). La creazione di questa matrice del modello è il collo di bottiglia del mio script. Alla fine la matrice del modello è di 8 milioni di righe con 1000 colonne. Poiché i fattori con molti livelli sono codificati 0-1, la matrice risultante che rappresenta le interazioni è molto sparsa, quindi utilizzo già lo sparse.model.matrix.R: metodo rapido per creare una matrice di modelli sparsi

C'è un modo più veloce per generare questa matrice? Forse in Rcpp?

+1

forse profilo 'sparse.model.matrix' per vedere dove sono i colli di bottiglia? –

+5

Sarebbe bello se fornissi anche un MWE in modo che potessimo avere una migliore idea di ciò che hai a che fare. –

+0

Per ulteriori confronti, consultare: http://stackoverflow.com/questions/31373710/r-fast-way-to-create-a-sparse-model-matrix –

risposta

2

Hai considerato l'utilizzo di caret 's dummyVars? Funziona per me e sembra abbastanza veloce.

?dummyVars confronta il comportamento predefinito di model.matrix e dummyVars, ma non dice molto a riguardo.

Per una piccola benchmark prestazioni su un reproducible example:

n = 1e3 # observations 
m = 1e2 # variables 
some_levels <- sort(c(LETTERS, letters)) 
library('microbenchmark') 
set.seed(1234) 

df <- data.frame(
     lapply(1:m, function(x){ 
        switch(sample.int(3,1),  
          # "some continuous, some 0-1" 
          '1' = rnorm(n), '2' = rbinom(n, 1, 0.5), 
          # "some factors with many levels"  
          '3' = factor(sample(some_levels, n, TRUE), 
             levels=some_levels) 
         ) 
         }) 
       ) 
names(df) <- paste0('V',1:m) 

#------------- it sounds like you are doing something like this -------------- 
frm <- as.formula(paste('~', paste(names(df), collapse='+'))) 
library('Matrix') 
microbenchmark(
    mm <- sparse.model.matrix(frm, df) 
) # mean = .133 sec (YMMV) 

#---------------- you could try something like this -------------------------- 
library('caret') 
microbenchmark(
    mm2 <- dummyVars(frm, df, fullRank=TRUE) 
) # mean = .00954 sec (YMMV) 

Nota fullRank = TRUE modo che "fattori sono codificati essere coerenti con model.matrix e la conseguente non [sic] sono dipendenze lineari indotte tra le colonne," per ?dummyVars. È possibile rimuovere fullRank = TRUE per indurre il comportamento di sparse=TRUE in contr.ltrf come in sparse.model.matrix. Non ho trovato documentazione chiara.

+0

Non 'dummyVars' basta creare una mappa? Non hai bisogno anche di una dichiarazione di previsione? Come 'mm3 <- prevedere (mm2, df)'? – screechOwl

Problemi correlati