我正在尝试了解如何使用statsmodels
提前1步以上验证ARIMAX模型。
我的理解是results.get_prediction(start=, dynamic=)
api可以做到这一点,但是我很难理解它是如何工作的。我的训练数据通过15T频率的本地化DateTimeIndex(tz ='Sydney \ Australia')进行索引。我想使用直至之前预测的内生值的'2019-02-04 06:00:00 + 1100'的单步预测来预测'2019-02-04 00:00:00 + 1100'的整天在一天的剩余时间内。
下面的代码正确吗?看来statsmodel会将开始转换为TimeStamp,并将动态视为频率的倍数,因此这应该从1步开始进行仿真,直到06:00,然后再使用先前的预测内生值。结果看起来不太好,所以我想确认这是一个模型问题,而不是我有错误的诊断。
dt = '2019-02-04'
predict = res.get_prediction(start='2019-02-04 00:00:00+11:00')
predict_dy = res.get_prediction(start='2019-02-04 00:00:00+11:00', dynamic=4*6)
fig = plt.figure(figsize=(10,10)) ax = fig.gca()
y_train[dt].plot(ax=ax, style='o', label='Observed')
predict.predicted_mean[dt].plot(ax=ax, style='r--', label='One-step-ahead forecast')
predict_dy.predicted_mean[dt].plot(ax=ax, style='g', label='Dynamic forecast')
答案 0 :(得分:1)
似乎statsmodel将开始转换为TimeStamp
是的,如果给它一个字符串值,那么它将尝试将其映射到数据集中的索引(如时间戳记)。
并将动态视为频率的倍数
但这是不正确的。 dynamic
是start
的整数偏移量。因此,如果使用dynamic=0
,则表示动态预测始于start
;如果使用dynamic=1
,则意味着动态预测始于start+1
。
我不清楚您的示例中发生了什么(或者您对所生成的预测不满意),因此这里描述了dynamic
的工作方式可能会有所帮助:
这是一个示例,可以帮助解释事情的工作方式。此练习的几个关键点将是:
endog
的所有元素都设置为等于1 现在,示例代码为:
ix = pd.date_range(start='2018-12-01', end='2019-01-31', freq='D')
endog = pd.Series(np.ones(len(ix)), index=ix)
mod = sm.tsa.SARIMAX(endog, order=(1, 0, 0), concentrate_scale=True)
res = mod.smooth([0.5])
p1 = res.predict(start='January 1, 2019', end='January 5, 2019').rename('d=False')
p2 = res.predict(start='January 1, 2019', end='January 5, 2019', dynamic=0).rename('d=0')
p3 = res.predict(start='January 1, 2019', end='January 5, 2019', dynamic=1).rename('d=2')
print(pd.concat([p1, p2, p3], axis=1))
这给出了:
d=False d=0 d=2
2019-01-01 0.5 0.50000 0.5000
2019-01-02 0.5 0.25000 0.5000
2019-01-03 0.5 0.12500 0.2500
2019-01-04 0.5 0.06250 0.1250
2019-01-05 0.5 0.03125 0.0625
第一列(d = False)是默认情况,其中dynamic=False
。在此,所有预测都是一步一步的预测。因为我将endog
的每个元素都设置为1,并且我们有一个参数为0.5的AR(1)模型,所以所有的单步预测将等于0.5 * 1 = 0.5。
在第二列(d = 0)中,我们指定dynamic=0
,以便动态预测从第一个预测开始。这意味着我们在形成预测时不会使用endog
之后的任何start - 1
数据,在这种情况下,我们不会在进行预测时使用2018年12月31日之后的任何数据。首次预测将等于2018年12月31日观测值的0.5倍,即0.5 * 1 = 0.5。每个后续预测将等于0.5 *先前的预测,因此第二个预测为0.5 * 0.5 = 0.25,依此类推。
第三列(d = 1)与第二列类似,只是此处dynamic=1
使得动态预测从第二预测开始。这意味着我们不会使用endog
之后(即2019年1月1日之后)的任何start
数据。