2015-07-12 102 views
8

我正在嘗試創建一個具有許多交互項(有些連續的,有些0-1,有很多關卡的因素)公式的模型矩陣。這個模型矩陣的創建是我的腳本的瓶頸。最後,模型矩陣是8列,1000列。由於具有許多級別的因子是0-1編碼的,因此表示交互作用的矩陣非常稀疏,所以我已經使用sparse.model.matrixR:創建稀疏模型矩陣的快速方法

有沒有更快的方法來產生這個矩陣?也許在Rcpp?

+1

也許配置文件'sparse.model.matrix'看到哪裏瓶頸? –

+5

如果您也提供MWE,那就太好了,所以我們可以更好地瞭解您處理的內容。 –

+0

欲瞭解更多的比較,請參閱:http://stackoverflow.com/questions/31373710/r-fast-way-to-create-a-sparse-model-matrix –

回答

2

您是否考慮過使用caretdummyVars?它適用於我,似乎相當快。

?dummyVars比較model.matrixdummyVars的默認行爲,但沒有多說這件事。

有關一個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) 

注意fullRank = TRUE使「因素被編碼爲與model.matrix一致,並將所得有[原文如此]是在列之間引起不存在線性相關性,」根據?dummyVars。您可能需要刪除fullRank = TRUE以引起中sparse=TRUE的行爲,如sparse.model.matrix中的行爲。我找不到明確的文檔。

+0

不'dummyVars'只是創建一個地圖?你也不需要預測語句嗎?像'mm3 < - 預測(mm2,df)'? – screechOwl