【发布时间】:2022-01-17 07:30:53
【问题描述】:
我有一个相当大的数据集(大约 1200 万行),我需要对包含过去 30 行条目的每一行运行滚动回归。这是一个简单的线性回归,但回归需要考虑两个因素:股票和需要运行的时间窗口。我已经找到了一种方法来运行我的 1200 万次回归,但不幸的是,这种方法需要的时间太长了。 lm() 做的工作太多,因为我只需要回归的截距和系数,但使用更简单的线性回归,例如 lmfit/lm.fit/lmList 等,到目前为止我还无法包含我的两个条件。 我也尝试过并行化回归,但由于我是初学者,我没有成功。 你能帮我尽可能加快这个计算吗?
代码:
regression <- df %>%
rowwise() %>%
droplevels()%>%
mutate(mod = list(lm(returns ~ Factor1 + Factor2 + Factor3 + Factor4,
data = filter(df,
Stock == .env$Stock,
date <= .env$date,
date >= .env$datemonthbefore))))
regressionestimates <- regression %>%
mutate(res = list(broom::tidy(mod)),
broom::glance(mod)) %>%
select(date,
Stock,
res,
nobs) %>%
unnest(res)
【问题讨论】:
-
我发现
rowwise让一切变得非常缓慢。也许一次做一个Stock。如果数据按date排序,则使用 for 循环并按顺序对 30 个连续行进行子集化。 -
@MichaelDewar 非常感谢您的回答!所以你会做两个嵌套循环,一个用于股票,一个用于日期?我有大约 5000 只股票要回归。到目前为止,我对大量数据进行循环的经验并不是很好。
-
是的。我尝试了两个循环的答案。 (
purrr::map隐含地是一个循环。)
标签: r regression large-data lm