我正在嘗試創建一個具有許多交互項(有些連續的,有些0-1,有很多關卡的因素)公式的模型矩陣。這個模型矩陣的創建是我的腳本的瓶頸。最後,模型矩陣是8列,1000列。由於具有許多級別的因子是0-1編碼的,因此表示交互作用的矩陣非常稀疏,所以我已經使用sparse.model.matrix
。R:創建稀疏模型矩陣的快速方法
有沒有更快的方法來產生這個矩陣?也許在Rcpp?
我正在嘗試創建一個具有許多交互項(有些連續的,有些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
中的行爲。我找不到明確的文檔。
不'dummyVars'只是創建一個地圖?你也不需要預測語句嗎?像'mm3 < - 預測(mm2,df)'? – screechOwl
也許配置文件'sparse.model.matrix'看到哪裏瓶頸? –
如果您也提供MWE,那就太好了,所以我們可以更好地瞭解您處理的內容。 –
欲瞭解更多的比較,請參閱:http://stackoverflow.com/questions/31373710/r-fast-way-to-create-a-sparse-model-matrix –