在python中计算多个回归的最快方法?

在python中计算多个回归的最快方法?,python,python-3.x,numpy,linear-regression,Python,Python 3.x,Numpy,Linear Regression,我想我有一个相当合理的想法,关于如何做到这一点,但我不是100%确定所有的步骤。这个问题主要是作为一个理智的检查,以确保我以最有效的方式做这件事,并且我的数学实际上是正确的(因为我的统计知识并不完全完美) 不管怎样,对我要做的事情有一些解释: 我有很多时间序列数据,我想对它们进行一些线性回归。特别是,我对500个不同变量进行了大约2000次观察。对于每个变量,我需要使用两个解释变量(大约2000个观测值的两个附加向量)执行回归。因此,对于500个不同的Y中的每一个,我需要在下面的回归中找到a和b

我想我有一个相当合理的想法,关于如何做到这一点,但我不是100%确定所有的步骤。这个问题主要是作为一个理智的检查,以确保我以最有效的方式做这件事,并且我的数学实际上是正确的(因为我的统计知识并不完全完美)

不管怎样,对我要做的事情有一些解释:

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

到目前为止,我一直在使用statsmodels包中的OLS函数来执行回归。然而,据我所知,如果我想使用statsmodels包来完成我的问题,我必须调用它数百次,这看起来通常效率很低

因此,我决定重温一些我很久没有真正接触过的统计数据。如果我的知识仍然正确,我可以将我所有的观察结果放入一个大约为2000 x 500的大Y矩阵中。然后,我可以将我的解释变量粘贴到一个大约为2000 X 2的X矩阵中,并通过计算
(X'Y)/(X'X)
得到所有500个回归的结果。如果我使用基本的numpy方法(使用*进行矩阵乘法,使用matrix.I进行逆运算),我猜这将比执行数百个statsmodel调用快得多

以下是我的问题:

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

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

      仅当所有y和x具有相同的观测指标、无缺失值和间隙时,此方法才有效

      旁白:该设置是一个多元线性模型,将由statsmodels支持,希望在不久的将来

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

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

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

      也许是解决您问题的更好地方?请参阅。缺失数据和时间序列对齐是一个大问题。有很多文档,很多经验,很多用户;查看和