我尝试了一些线性回归,虽然标准的回归都很好(例如,
lm.fit
真的非常快),https://www.rdocumentation.org/packages/RcppEigen/versions中的
fastLM
/0.3.4.0.2/topics/fastLm 得到了蛋糕。 这确实快得惊人。 谢谢 Doug、Dirk、Romain 和 Yixuan。
唉,它的文档中有一条注释,二元回归的特殊形式可以更快地完成。 如果我只需要斜率,我应该使用 R 中的原生
cov(x,y)/var(x)
,还是应该在 Rcpp 中编写它,或者......?
似乎
.lm.fit
在这种情况下获胜,尽管这可能取决于你的数据集的大小......我不知道你是否可以用 Rcpp 式的东西做得更好 - 如果你想做很多真正的事情小回归各种函数调用开销将变得重要......(fastR
有一个快速协方差计算器,但它表示它在高维情况下具有竞争力/旨在用于高维情况...)
simfun <- function(n = 100) {
data.frame(y = rnorm(n), x = rnorm(n))
}
set.seed(101)
dd <- simfun()
mylm <- function(x, y) { v <- var(cbind(x,y)); v[2,1]/v[1,1] }
mylm2 <- function(x, y) { cov(x,y) / var(x) }
library(RcppEigen)
with(dd,
bench::mark(
lm.fit(cbind(1, x), y)$coefficients[2],
.lm.fit(cbind(1, x), y)$coefficients[2],
fastLmPure(cbind(1, x), y)$coefficients[2],
mylm(x, y),
mylm2(x, y),
check = FALSE
)
)
expression min median `itr/sec` mem_alloc `gc/sec` n_itr n_gc total_time
<bch:expr> <bch:t> <bch:t> <dbl> <bch:byt> <dbl> <int> <dbl> <bch:tm>
1 lm.fit(cb… 24.68µs 26.45µs 36555. 7.34KB 14.6 9996 4 273.4ms
2 .lm.fit(c… 5.86µs 6.67µs 144591. 4.88KB 14.5 9999 1 69.2ms
3 fastLmPur… 12.85µs 13.99µs 70384. 3.27KB 14.1 9998 2 142ms
4 mylm(x, y) 10.05µs 11.16µs 86832. 1.61KB 26.1 9997 3 115.1ms
5 mylm2(x, … 22.68µs 24.32µs 40539. 0B 20.3 9995 5 246.6ms
# ℹ 4 more variables: result <list>, memory <list>, time <list>, gc <list>