我认为我对如何实现这一点有一个非常合理的想法,但我并不是100%肯定所有步骤。这个问题主要是为了确保我能以最有效的方式做到这一点,并且我的数学实际上是合理的(因为我的统计知识并不完全完美)。
无论如何,关于我尝试做什么的一些解释:
我有很多时间序列数据,我想对其进行一些线性回归。特别是,我对500个不同的变量进行了大约2000次观察。对于每个变量,我需要使用两个解释变量(大约2000个观察值的两个附加向量)执行回归。因此,对于500个不同的Y中的每一个,我需要在以下回归a
中找到b
和Y = aX_1 + bX_2 + e
。
到目前为止,我一直在使用statsmodels包中的OLS函数来执行回归。但是,据我所知,如果我想使用statsmodels包来完成我的问题,我将不得不称它为数百次,这看起来通常效率低下。
相反,我决定重新审视一些我很久没有真正触及的统计数据。如果我的知识仍然正确,我可以将我的所有观察结果放入一个大约2000 x 500的大Y矩阵中。然后我可以将我的解释变量粘贴到大约2000 x 2的X矩阵中,并获得所有结果通过计算(X'Y)/(X'X)
得出500回归。如果我使用基本的numpy东西(矩阵乘法使用*和使用矩阵的迭代。我)这样做,我猜它会比做数百个statsmodel OLS调用快得多。
以下是我的问题:
答案 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。所以,我认为,这可以通过一些矢量化计算来完成。