【发布时间】:2015-06-30 11:46:12
【问题描述】:
我有 500K 个用户,我需要为每个用户计算线性回归 (带截距)。
每个用户大约有 30 条记录。
我尝试使用dplyr 和lm,这太慢了。
用户大约 2 秒。
df%>%
group_by(user_id, add = FALSE) %>%
do(lm = lm(Y ~ x, data = .)) %>%
mutate(lm_b0 = summary(lm)$coeff[1],
lm_b1 = summary(lm)$coeff[2]) %>%
select(user_id, lm_b0, lm_b1) %>%
ungroup()
)
我尝试使用lm.fit,它已知更快,但它似乎与dplyr 不兼容。
有没有快速按组进行线性回归的方法?
【问题讨论】:
-
答案可能取决于效率低下的来源。你做了一些分析吗?拆分数据是缓慢的过程,还是拟合模型是缓慢的部分?如果是后者,您可能需要查看例如
fastLm来自RcppArmadillo包。 -
慢的部分是:
do(lm = lm(Y ~ x, data = .))&mutate(lm_b0 = summary(lm)$coeff[1], lm_b1 = summary(lm)$coeff[2])。如何有效地在 50 万用户上使用 fastLm? -
@psql 我必须做这个确切的事情,我能想到的最有效的方法就是这样做,它最终花费了大约 2 个小时
dplyr这是来自 a 的一些基准测试问题stackoverflow.com/questions/29641366/… -
在我的情况下大约需要 10 天,所以我真的需要加快这个解决方案! :) ps:如果结果粗糙,那完全没问题!。
-
为什么不使用
user_id作为因子和交互项来拟合单个回归?Y ~ x * user_id + 0将为每个用户提供不同的斜率和截距(假设user_id是一个因素)。使用lm会快很多,使用fastLm会更快。