2015-07-12 99 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