R:创建稀疏模型矩阵的快速方法

JCW*_*ong 7 r

我正在尝试使用具有许多交互项的公式创建模型矩阵(一些连续,一些0-1,一些具有多个级别的因素).这个模型矩阵的创建是我脚本的瓶颈.最后,模型矩阵是8M行,1000列.由于具有多个级别的因子是0-1编码的,因此表示交互的结果矩阵非常稀疏,因此我已经使用了sparse.model.matrix.

有没有更快的方法来生成这个矩阵?也许在Rcpp?

C8H*_*4O2 5

您考虑过使用caret'sdummyVars吗?它对我有用并且看起来相当快。

?dummyVarsmodel.matrix比较了和的默认行为dummyVars,但没有对此进行太多说明。

对于可重现示例的小型性能基准:

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)
Run Code Online (Sandbox Code Playgroud)

请注意fullRank = TRUE,“因子被编码为一致model.matrix,并且由此产生的结果[原文如此]在列之间不存在线性依赖性” ?dummyVars。您可能想要删除以诱导infullRank = TRUE的行为,如 in 。我找不到明确的文档。sparse=TRUEcontr.ltrfsparse.model.matrix