考虑以下演示数据:
set.seed(1)
n <- 1000000
x1 <- rnorm(n)
x2 <- rnorm(n)
x3 <- rnorm(n)
如果我使用 model.matrix()
构建矩阵 mt
,则需要很长时间:
system.time(mt <- model.matrix(~x1+x2+x3))
usuário sistema decorrido
0.916 0.185 1.135
但是如果我对矩阵做同样的事情,它会非常快:
system.time(mt2 <- matrix(c(rep(1, n), x1, x2, x3), byrow=FALSE, ncol=4))
usuário sistema decorrido
0.085 0.021 0.105
为什么有区别?是什么让 model.matrix()
变慢对于 lm()
和相关函数来说真的有必要吗?
最佳答案
使用debugonce(model.matrix.default)
,并在其中使用tracemem(data)
model.matrix.default
调用 model.frame
返回一个 data.frame
。在 model.matrix.default
中,此 data.frame 至少被复制 3 次。
为什么lm
使用model.matrix
--> lm
通常用data.frame
调用、list
或 environment
作为 data
参数。 model.frame
并返回 data.frame
确保公式中的项可以通过后续调用 lm
找到,并且将引用相同的项值。
关于r - 为什么 model.matrix 这么慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21715549/