使用 Python 中的 statsmodels 减少动态因子模型估计的时间

我试图按照示例 https://www.statsmodels.org/dev/examples/notebooks/generated/statespace_dfm_coincident.html在 Python 中使用 statsmodels 估计动态因子模型 但是我没有使用示例数据集,而是使用了自己的数据集 282变量,有 124 个观察值(不同国家的月通货膨胀率)。然而,在运行代码超过六个小时后,我没有得到任何结果。尝试使用不同数量的变量和不同的求解器,我得到了这些时间估计:


Number of variables Initial params in seconds   Model estimate in seconds

Powell solver: 

    10                  57,3                        4,9

    20                  167,6                       19,9

    40                  1498,8                      137,8

BFGS

    10                  9,1                         6,3

    20                  89,2                        18,5

    40                  597,5                       138,2

根据这些计算,时间正在增长 n^2*log(n),这意味着要使用 Powell 求解器计算所有 280 个变量的模型,我将需要大约 30 个小时,这太长了。BFGS 更快,但是对于 20 和 40 个变量,我发现似然优化无法收敛。


我在我的笔记本电脑(WIN10、32gb、i7-4700MQ、2.40GHz)上运行它,它看起来并没有用完所有资源,只使用了大约 10gb 的内存和大约 25-50% 的 CPU。所以问题是如何使 DFM 模型的估计更快并收敛?如果我在云上运行此代码(比如 Amazone 或 Google,具有 32-64 个 CPU),多线程是否有助于提高速度,或者统计模型的并行性几乎没有改进?切换到 Matlab 或其他软件进行此类计算是否有意义?scipy.optimize(如 krylov、broyden2 或 anderson)中有一些大型问题的求解器,但我不确定它们是否可以与 statsmodels.LikelihoodModel.fit 一起使用。


我将非常感谢任何关于如何加快估算速度的想法!我运行的代码:


 import statsmodels.api as sm

    import time

    # Create the model

    mod = sm.tsa.DynamicFactor(data_cpi, k_factors=3, factor_order=1, error_order=1)

    tic = time.perf_counter()

    initial_res = mod.fit(method='powell', disp=True)

    toc = time.perf_counter()

    print(f"Initial params in {toc - tic:0.4f} seconds")

    res = mod.fit(initial_res.params, disp=True)

    tic = time.perf_counter()

    print(f"Model estimate in {tic - toc:0.4f} seconds")

    print(res.summary(separate_params=False)) 


沧海一幻觉
浏览 221回答 1
1回答

动漫人物

如果不需要参数的标准误差,减少拟合时间的一种方法是传递cov_type='none'给fit方法。但它仍然会很慢。当使用像 BFGS 这样的拟牛顿方法,甚至像 Powell 这样的无导数方法时,对具有大量变量的动态因子模型的参数进行数值优化将非常缓慢。大型动态因素模型通常通过使用 EM 算法优化参数来实现。Statsmodels 在 v0.11 中没有该选项,但它很可能会在 v0.12 版本中用于动态因子模型。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python