使用 statsmodels SARIMAX 手动创建平均响应的置信区间
Manually creating confidence intervals for the mean response using statsmodels SARIMAX
我使用 python 中的 statsmodels 库创建了一个时间序列 SARIMAX 模型。
目前,我们正在遵循以下管道:
- 训练模型
- 对未来的一步进行预测,并使用内置的 statsmodels 功能,为这一平均预测生成置信区间。
- 每天重复此过程以预测第二天。
我们的总体目标是每周只训练一次模型。这意味着我们希望从模型训练之日起对超过 1 个步骤进行预测。由于我们将进行每个预测,因此在收集前一天的实际数据后,我们希望使用 SARIMAX 中的参数来生成预测。这一步相当简单,您只需要使用系数并将它们乘以滞后分量的第一级差。
然而,我正在努力为我的预测重新创建置信区间,有没有人知道 statsmodels 用来创建这些的数学或我应该使用的数学?
提前致谢,
詹姆斯
可能最简单的方法是让 Statsmodels 为您计算它们,但使用经过训练的参数和新数据集。这是一个例子:
首先,训练模型(您的第 1 步)并保存参数以便稍后使用
# 1. Train the model
mod = sm.tsa.SARIMAX(endog_train, order=(p, d, q))
res = mod.fit()
# Save the parameters for use later
res.params.to_csv('trained_params.csv')
然后使用更新后的数据集创建一个新模型,但不是重新训练参数(使用 fit
方法),而是将旧参数应用于新数据(使用 smooth
方法)。
# 2. Use the saved parameters with a new dataset
mod = sm.tsa.SARIMAX(endog_updated, order=(p, d, q))
params = pd.read_csv('trained_params.csv', index_col=[0])['0']
res = mod.smooth(params)
# Produce forecasts and 95% confidence intervals
fcast = res.get_forecast(steps=5, alpha=0.05)
print(fcast.summary_frame())
对于我使用的数据,打印出:
realgdp mean mean_se mean_ci_lower mean_ci_upper
2009Q4 1.682724 3.717418 -5.603282 8.968729
2010Q1 1.031580 4.360360 -7.514567 9.577728
2010Q2 0.632402 4.578709 -8.341702 9.606506
2010Q3 0.387689 4.658123 -8.742065 9.517443
2010Q4 0.237670 4.687621 -8.949899 9.425239
您可以多次执行此操作,然后当需要重新训练模型时,只需返回上面的 #1。
我使用 python 中的 statsmodels 库创建了一个时间序列 SARIMAX 模型。
目前,我们正在遵循以下管道:
- 训练模型
- 对未来的一步进行预测,并使用内置的 statsmodels 功能,为这一平均预测生成置信区间。
- 每天重复此过程以预测第二天。
我们的总体目标是每周只训练一次模型。这意味着我们希望从模型训练之日起对超过 1 个步骤进行预测。由于我们将进行每个预测,因此在收集前一天的实际数据后,我们希望使用 SARIMAX 中的参数来生成预测。这一步相当简单,您只需要使用系数并将它们乘以滞后分量的第一级差。
然而,我正在努力为我的预测重新创建置信区间,有没有人知道 statsmodels 用来创建这些的数学或我应该使用的数学?
提前致谢, 詹姆斯
可能最简单的方法是让 Statsmodels 为您计算它们,但使用经过训练的参数和新数据集。这是一个例子:
首先,训练模型(您的第 1 步)并保存参数以便稍后使用
# 1. Train the model
mod = sm.tsa.SARIMAX(endog_train, order=(p, d, q))
res = mod.fit()
# Save the parameters for use later
res.params.to_csv('trained_params.csv')
然后使用更新后的数据集创建一个新模型,但不是重新训练参数(使用 fit
方法),而是将旧参数应用于新数据(使用 smooth
方法)。
# 2. Use the saved parameters with a new dataset
mod = sm.tsa.SARIMAX(endog_updated, order=(p, d, q))
params = pd.read_csv('trained_params.csv', index_col=[0])['0']
res = mod.smooth(params)
# Produce forecasts and 95% confidence intervals
fcast = res.get_forecast(steps=5, alpha=0.05)
print(fcast.summary_frame())
对于我使用的数据,打印出:
realgdp mean mean_se mean_ci_lower mean_ci_upper
2009Q4 1.682724 3.717418 -5.603282 8.968729
2010Q1 1.031580 4.360360 -7.514567 9.577728
2010Q2 0.632402 4.578709 -8.341702 9.606506
2010Q3 0.387689 4.658123 -8.742065 9.517443
2010Q4 0.237670 4.687621 -8.949899 9.425239
您可以多次执行此操作,然后当需要重新训练模型时,只需返回上面的 #1。