不清楚如何从 Statsmodels 中的多变量 ARX 获得单个预测向量

unclear how to get single vector of predictions from multivariate ARX in Statsmodels

免责声明,我在使用时间序列模型方面的经验非常有限。

我正在尝试为一组 23 座建筑物训练 ARX 模型一年的每小时能源数据。给定训练数据中的一组时间戳,我希望得到一个单一的预测向量。由此,我可以根据涵盖相同时间戳的子集的测试数据进行验证。我正在尝试使用 statsmodels 作为 VAR(p) 模型,在添加外生项之前进行初步尝试。我认为这是一个 VAR 模型,因为它是每个时间戳的多变量。我尝试将 VARMAX 与 order(3,0) 结合使用来创建 VARX 模型,结果导致 运行 模型非常长,但无法正常工作,因此我首先转而使用简单的 VAR 模型。

我的最终目标是用下面的数据集以及每小时的平均值作为外生项来拟合 VARX 模型。我希望这会导致长度等于滞后项的单个参数向量。然后,我将使用它来预测训练数据集中每一行的 y_hat 个预测向量。然后我可以将此输出与我的测试数据集中相同时间的子集进行比较。

我的归一化小时能量数据训练数据集如下所示(请原谅 bldg5 后的格式,它没有很好地复制):

start_time          Bldg1               Bldg2               Bldg3               Bldg4                    Bldg5               Bldg7  Bldg8   Bldg9   Bldg10  Bldg11  Bldg12  Bldg13  Bldg14  Bldg15  Bldg16  Bldg17  Bldg18  Bldg19  Bldg20  Bldg21  Bldg22  Bldg23 
2014-01-05 00:00:00 0.2345679012345679  0.08234295415959253 0.02127659574468085 0.006535947712418301    0.3939393939393939  0.020325203252032523    0.034013605442176874    0.11003236245954694 0.013307984790874526    0.013513513513513514    0.06734006734006734 0.02840909090909091 0.3116883116883117  0.5301204819277109  0.03793103448275862 0.058064516129032254    0.3546511627906977  0.009523809523809523    0.47887323943661975 0.9228571428571428  0.04154302670623146 0.2773109243697479
2014-01-05 01:00:00 0.2345679012345679  0.07045840407470289 0.07092198581560284 0.006535947712418301    0.3939393939393939  0.04065040650406505 0.03741496598639456 0.07119741100323625 0.020912547528517112    0.013513513513513514    0.03367003367003367 0.02840909090909091 0.5194805194805195  0.4487951807228916  0.020689655172413793    0.06451612903225806 0.4476744186046512  0.009523809523809523    0.5014084507042254  0.6914285714285714  0.03560830860534124 0.2605042016806723
2014-01-05 02:00:00 0.2345679012345679  0.07555178268251274 0.056737588652482275    0.026143790849673203    0.3636363636363636  0.020325203252032523    0.03741496598639456 0.07119741100323625 0.011406844106463879    0.013513513513513514    0.04377104377104377 0.02840909090909091 0.4675324675324675  0.4728915662650603  0.017241379310344827    0.05161290322580645 0.436046511627907   0.009523809523809523    0.4732394366197183  0.66    0.03857566765578635 0.13165266106442577
2014-01-05 03:00:00 0.2345679012345679  0.07045840407470289 0.02127659574468085 0.006535947712418301    0.25757575757575757 0.036585365853658534    0.03741496598639456 0.07119741100323625 0.020912547528517112    0.010135135135135136    0.037037037037037035    0.02840909090909091 0.4285714285714286  0.39457831325301207 0.020689655172413793    0.08387096774193549 0.19767441860465118 0.006349206349206349    0.47887323943661975 0.7771428571428572  0.04154302670623146 0.16246498599439776
2014-01-05 04:00:00 0.2345679012345679  0.07045840407470289 0.02127659574468085 0.006535947712418301    0.2727272727272727  0.02845528455284553 0.030612244897959183    0.06796116504854369 0.011406844106463879    0.010135135135135136    0.03367003367003367 0.0625  0.3766233766233766  0.009036144578313253    0.020689655172413793    0.1032258064516129  0.0872093023255814  0.009523809523809523    0.49295774647887325 0.19714285714285712 0.03264094955489614 0.12324929971988796

. . . 

测试数据集(也是标准化的每小时能量数据)如下所示(形状 168x1):

TestTime            TestBldg
2014-09-07 00:00:00 0.09427609427609428
2014-09-07 01:00:00 0.037037037037037035
2014-09-07 02:00:00 0.0404040404040404
2014-09-07 03:00:00 0.037037037037037035
2014-09-07 04:00:00 0.037037037037037035
. . . 

当我拟合如下模型时:

from statsmodels.tsa.api import VAR
var_mod = VAR(train_norm.iloc[:,3:])
var_res = var_mod.fit()
var_res.summary()

我得到数据集中每个建筑物的滞后系数,这是出乎意料的。我也不明白如何对我的拟合模型 var_res 进行预测,因为我希望对 AR 的单变量 AutoReg() [=21] 进行 var_res.predict() =]

(旁白:statsmodels 中的 forecast 和 predict 函数有什么区别。拟合前模型中的 predict 有什么区别,即 var_mod 和拟合模型 var_res.predict() ? )

请让我知道我可以提供哪些额外的说明。

一般 VAR 模型允许在先前的 p 时间步长内影响任何 K 状态(使用 statsmodels 的符号)。听起来您想要的不一定是 VECTOR 自回归(b/c 您不希望一栋建筑依赖另一栋建筑之前的时间步长),而只是使用 "panel" 数据集的 AR 模型(多个时间序列观察)。我确信在 statsmodels 中有一种方法可以做到这一点,但老实说,快速搜索并没有找到。您始终可以构建自己的版本作为标准 OLS 模型,方法是旋转数据集,以便每个观察都是一个 buildingXtime 观察,然后创建新特征,这些特征是从 t-1t-p 的滞后能量使用。然后你可以简单地 运行 OLS 就可以了。但是我可能缺少在 sm 中执行此操作的功能。

至于你的 predict/forecast 问题,predict 看起来像是 VAR 对象(你的代码中的 var_mod )的方法而不是 VARResultsvar_res 在您的代码中),并要求您指定参数。所以这取决于您的样本数据,并且似乎只能接受规定的参数而不是使用您的拟合参数。如果你愿意,你可以做类似

的事情
var_mod.predict(var_res.params, start=train_norm.index[p], end=train_norm.index[-1], lags=p)

但我认为您正在寻找的是 forecast,因为您想将其应用于任意测试建筑。