计算python中许多回归的最快方法是什么?

时间:2016-10-27 14:20:55

标签: python python-3.x numpy linear-regression

我认为我对如何实现这一点有一个非常合理的想法,但我并不是100%肯定所有步骤。这个问题主要是为了确保我能以最有效的方式做到这一点,并且我的数学实际上是合理的(因为我的统计知识并不完全完美)。

无论如何,关于我尝试做什么的一些解释:

我有很多时间序列数据,我想对其进行一些线性回归。特别是,我对500个不同的变量进行了大约2000次观察。对于每个变量,我需要使用两个解释变量(大约2000个观察值的两个附加向量)执行回归。因此,对于500个不同的Y中的每一个,我需要在以下回归a中找到bY = aX_1 + bX_2 + e

到目前为止,我一直在使用statsmodels包中的OLS函数来执行回归。但是,据我所知,如果我想使用statsmodels包来完成我的问题,我将不得不称它为数百次,这看起来通常效率低下。

相反,我决定重新审视一些我很久没有真正触及的统计数据。如果我的知识仍然正确,我可以将我的所有观察结果放入一个大约2000 x 500的大Y矩阵中。然后我可以将我的解释变量粘贴到大约2000 x 2的X矩阵中,并获得所有结果通过计算(X'Y)/(X'X)得出500回归。如果我使用基本的numpy东西(矩阵乘法使用*和使用矩阵的迭代。我)这样做,我猜它会比做数百个statsmodel OLS调用快得多。

以下是我的问题:

  • 我做的numpy东西比以前多次调用statsmodels的方法要快吗?如果是这样,它是实现我想要的最快/最有效的方式吗?我假设它是,但如果你知道一个更好的方式,那么我会很高兴听到它。 (当然,我不是第一个需要以这种方式计算许多回归的人。)
  • 如何处理矩阵中缺失的数据?我的时间序列数据不会很好而且完整,偶尔会丢失值。如果我只是尝试在numpy中进行常规矩阵乘法,NA值将会传播,并且我最终会得到一个主要是NA的矩阵作为我的最终结果。如果我独立进行每个回归,我可以在执行回归之前删除包含NA的行,但如果我在大型2000 x 500矩阵上执行此操作,我将最终从其他一些变量中删除实际的非NA数据,我显然不希望这种情况发生。
  • 在我将时间序列数据放入矩阵之前,确保我的时间序列数据实际排列正确的最有效方法是什么?我的观察的开始和结束日期不一定相同,有些系列可能有其他人没有的日子。如果我要选择一种方法,我会将所有观察结果放入由日期索引的pandas数据框中。然后,熊猫将最终完成所有工作,为我调整一切,我可以在完成之后提取底层的ndarray。这是最好的方法,还是大熊猫有一些开销,我可以通过不同的方式进行矩阵构造来避免这种开销?

1 个答案:

答案 0 :(得分:3)

一些简短的答案

1)重复调用statsmodels并不是最快的方法。如果我们只需要参数,预测和残差,并且我们有相同的解释变量,那么我通常只使用params = pinv(x).dot(y),其中y是2维,并从那里计算其余部分。问题是推理,置信区间和类似需要工作,因此除非速度至关重要且只需要一组有限的结果,否则statsmodels OLS仍然更方便。

这仅适用于所有y和x具有相同的观察指数,没有缺失值且没有间隙的情况。

除此之外:该设置是一个多变量线性模型,将由未来很远的统计模型支持。

2)和3)案例1)的快速简单线性代数在缺少单元格或观察(指数)没有完全重叠时不起作用。在模拟到面板数据中,第一种情况需要"平衡"面板,其他情况暗示"不平衡"数据。标准方法是以块对角形式将数据与解释变量堆叠在一起。由于这会大量增加内存,因此使用稀疏矩阵和稀疏线性代数会更好。具体情况取决于构建和解决稀疏问题是否比循环单个OLS回归更快。

专业代码:(只是一个想法):

如果情况2)没有完全重叠或单元格缺失值,我们仍然需要计算所有y的所有x&x; x和x&y; y矩阵,即其中的500。鉴于您只有两个回归量500 x 2 x 2仍然不需要大内存。因此,可以通过在交叉积计算中使用非缺失掩模作为权重来计算参数,预测和残差。 据我所知,numpy已经矢量化了linalg.inv。所以,我认为,这可以通过一些矢量化计算来完成。