R:创建稀疏模型矩阵的快速方法
问题描述:
我正在尝试创建一个具有许多交互项(有些连续的,有些0-1,有很多关卡的因素)公式的模型矩阵。这个模型矩阵的创建是我的脚本的瓶颈。最后,模型矩阵是8列,1000列。由于具有许多级别的因子是0-1编码的,因此表示交互作用的矩阵非常稀疏,所以我已经使用sparse.model.matrix
。R:创建稀疏模型矩阵的快速方法
有没有更快的方法来产生这个矩阵?也许在Rcpp?
答
您是否考虑过使用caret
的dummyVars
?它适用于我,似乎相当快。
?dummyVars
比较model.matrix
和dummyVars
的默认行为,但没有多说这件事。
有关一个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 screechOwl
也许配置文件'sparse.model.matrix'看到哪里瓶颈? –
如果您也提供MWE,那就太好了,所以我们可以更好地了解您处理的内容。 –
欲了解更多的比较,请参阅:http://*.com/questions/31373710/r-fast-way-to-create-a-sparse-model-matrix –