【发布时间】:2020-10-16 21:34:47
【问题描述】:
我正在对时间序列数据执行组件明智回归。这基本上是我们将 y 与 x1,仅针对 x2 的 y,...,并采用最减少平方残差之和的回归并将其添加为基学习器。这被重复 M 次,最终模型是许多简单线性回归的总和,形式为 y 对 xi(仅 1 个外生变量),基本上使用线性回归作为基础学习器进行梯度提升.
问题在于,由于我正在对时间序列数据执行滚动窗口回归,因此我必须执行超过一百万个 OLS 的 N × M × T 回归。虽然每个 OLS 都非常快,但在我弱小的笔记本电脑上运行需要几个小时。
目前,我正在使用 statsmodels.OLS.fit() 作为获取每个 y 的参数与 xi 这样的线性回归的方法。 z_matrix 是数据矩阵,i 表示要对回归进行切片的第 ith 列。行数约为 100,z_matrix 的大小约为 100 × 500。
ols_model = sm.OLS(endog=endog, exog=self.z_matrix[:, i][..., None]).fit()
return ols_model.params, ols_model.ssr, ols_model.fittedvalues[..., None]
我从 2016 年 Fastest way to calculate many regressions in python? 的前一篇文章中读到,使用重复调用 statsmodels 效率不高,我尝试了其中一个答案,其中建议使用 numpy 的 pinv,但不幸的是速度较慢:
# slower: 40sec vs 30sec for statsmodel for 100 repeated runs of 150 linear regressions
params = np.linalg.pinv(self.z_matrix[:, [i]]).dot(endog)
y_hat = self.z_matrix[:, [i]]@params
ssr = sum((y_hat-endog)**2)
return params, ssr, y_hat
有没有人有更好的建议来加快线性回归的计算?我只需要估计的参数、残差平方和和预测的 ŷ 值。谢谢!
【问题讨论】:
-
参考问题是针对常见的 exog X 的情况。这里,X 不同,y 相同。最有可能最快的是基于矢量化相关系数。 scipy.stats.linregress 仅使用普通协方差来计算回归系数。我想这可以向量化。
-
我认为,对于“减少平方残差和的回归”的排名,在这种情况下,也可以直接从简单的相关性中获得,而不需要计算回归结果。
-
您好约瑟夫,感谢您的回复。您如何建议在不计算回归的情况下获得最大程度地降低 SSR 的预测变量?仅仅是与 y 最相关的预测变量 Xi 吗?
标签: python numpy regression linear-regression statsmodels