为什么内置的lm函数在R中这么慢?

阿达恩

我一直认为该lm函数在R中非常快,但是如本例所示,使用该solve函数计算的封闭解的速度更快。

data<-data.frame(y=rnorm(1000),x1=rnorm(1000),x2=rnorm(1000))
X = cbind(1,data$x1,data$x2)

library(microbenchmark)
microbenchmark(
solve(t(X) %*% X, t(X) %*% data$y),
lm(y ~ .,data=data))

有人可以解释一下这个玩具例子是不好的例子还是lm真的很慢?

编辑:正如Dirk Eddelbuettel所建议,由于lm需要解决公式,因此比较是不公平的,因此最好使用lm.fit不需要解决公式的公式

microbenchmark(
solve(t(X) %*% X, t(X) %*% data$y),
lm.fit(X,data$y))


Unit: microseconds
                           expr     min      lq     mean   median       uq     max neval cld
solve(t(X) %*% X, t(X) %*% data$y)  99.083 108.754 125.1398 118.0305 131.2545 236.060   100  a 
                      lm.fit(X, y) 125.136 136.978 151.4656 143.4915 156.7155 262.114   100   b
德克·埃德尔布特

你忽略了

  • solve() 只返回您的参数
  • lm()返回具有很多成分的(非常丰富的)对象,用于后续分析,推断,绘图等。
  • lm()通话的主要成本不是预测,而是公式的分辨率,y ~ .需要从公式中建立模型矩阵。

为了说明Rcpp,我们编写了一些函数的变体,以完成fastLm()更多工作lm()(即比lm.fit()基数R多一些)并对其进行了测量。参见例如该基准脚本该脚本明确表明较小数据集的主要成本在于解析公式和构建模型矩阵

简而言之,您正在使用基准测试来做正确的事,但是在尝试比较大多数无可比拟的事情时,您所做的并不是正确的事情:具有更大任务的子集。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章