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

时间:2015-07-12 23:52:03

标签: r

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

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

1 个答案:

答案 0 :(得分:3)

您是否考虑过使用caret的{​​{1}}?它适合我,似乎相当快。

dummyVars会比较?dummyVarsmodel.matrix的默认行为,但对此并未说太多。

对于reproducible example的小型效果基准:

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) 以便“将因子编码为与fullRank = TRUE一致,并且结果[sic]在列之间不会产生线性相关性,”每model.matrix。您可能希望删除?dummyVars以引导fullRank = TRUEsparse=TRUE的行为,如contr.ltrf中所示。我找不到清晰的文档。