【发布时间】:2022-01-13 15:31:14
【问题描述】:
出于性能原因,我正在尝试使用函数 RcppArmadillo::fastLM 而不是 lm。
这是我对lm的函数调用
test_dt = structure(list(A= c(168.08, 166.65, 167.52, 167.16, 165.77,
167.65, 169.84, 170.45, 171.29, 173.15, 174.12, 174.45, 174.18,
172.92, 174.5, 173.94, 172.61, 168.74, 167.28, 167.12), `B` = c(1801.599976,
1783, 1795.099976, 1788.699951, 1763.599976, 1793, 1816.400024,
1827.400024, 1830.199951, 1847.599976, 1863.199951, 1867.900024,
1866.099976, 1853.599976, 1869.699951, 1861, 1851.199951, 1806,
1783.5, 1784.099976)), row.names = c(NA, -20L), class = c("data.table",
"data.frame"))
coef(lm(A ~ B + 0,data = test_dt))[1]
> 0.0934728
由于 lm 大部分时间都在解释公式,所以我不想使用公式。相反,我想把它变成一些东西-
RcppArmadillo::fastLM(X = test_dt$B + 0, y = test_dt$A)
但我不知道如何添加+ 0,如公式所示。
我已经尝试了以下
library(data.table)
dt = copy(test_dt)
dt[, C := 0]
coef(RcppArmadillo::fastLm(X = dt[,2:3], y = dt[,1]))[[1]]
但这会出错。
Error in fastLm.default(X = dt[, 2:3], y = dt[, 1]) :
(list) object cannot be coerced to type 'double'
有人可以告诉我将公式A ~ B + 0 转换为变量X 和y 以用于fastLm 函数的正确方法吗?
这是性能结果。
microbenchmark::microbenchmark(
formula = coef(lm(A ~ B + 0, dt))[1],
fastLm = with(dt, coef(RcppArmadillo::fastLm(B, A)))[1],
flm = with(dt, collapse::flm(A, cbind(B)))[1],
times = 100)
Unit: microseconds
expr min lq mean median uq max neval cld
formula 1157.822 1173.249 1191.57071 1183.0080 1197.5560 1714.430 100 c
fastLm 219.785 228.086 240.30415 235.2545 244.7465 405.353 100 b
flm 67.595 71.902 76.91765 74.7790 77.2050 228.320 100 a
【问题讨论】:
-
你能不能试试公式法ie。
fastLm(A ~ B + 0, data = dt) -
公式方法工作正常。唯一的问题是使用公式要慢 3 倍。
-
在第一个公式中您使用的是
A ~ B + 0,但在第二个公式中您使用的是y作为B,这是一个错字 -
是的,这是一个错字,我已经更正了。谢谢。
-
你需要
fastLm(X = dt[, 2:3], y = dt[[1]])
标签: r data.table rcpparmadillo