【问题标题】:R: Fast way to create a sparse model matrixR:创建稀疏模型矩阵的快速方法
【发布时间】:2015-07-12 23:52:03
【问题描述】:

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

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

【问题讨论】:

  • 也许配置文件sparse.model.matrix 看看瓶颈在哪里?
  • 如果您也能提供 MWE,那就太好了,这样我们就可以更好地了解您处理的内容。

标签: r


【解决方案1】:

您是否考虑过使用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=TRUEcontr.ltrf 中的行为,就像在 sparse.model.matrix 中一样。我找不到明确的文件。

【讨论】:

  • dummyVars 不只是创建地图吗?你也不需要预测语句吗?喜欢mm3 &lt;- predict(mm2, df)
猜你喜欢
  • 2015-04-07
  • 1970-01-01
  • 2017-12-05
  • 2018-12-14
  • 2016-01-13
  • 2020-07-08
  • 1970-01-01
  • 2016-11-22
  • 1970-01-01
相关资源
最近更新 更多