用Python对时间序列数据进行ARIMA建模

4

我正在尝试使用ARIMA模型进行预测,但我对此还很陌生。我尝试绘制我的数据集(每小时数据)的季节性分解图,以下是该图:

enter image description here

我想要理解这些图表,简短的描述将非常有帮助。我看到一开始没有趋势,过了一段时间后出现了上升趋势。我不确定我是否说得正确?我想要了解如何正确地读取这些图表,请给出一些好的描述。

当我尝试应用Dickey-Fuller测试来检查我的数据是否平稳以及是否需要进一步差分时,我得到了以下结果:

Test Statistic                   -4.117543
p-value                           0.000906
Lags Used                       30.000000
Number of Observations Used    4289.000000
Critical Value (1%)              -3.431876
Critical Value (5%)              -2.862214
Critical Value (10%)             -2.567129

我提供两个链接以了解此问题:http://www.seanabu.com/2016/03/22/time-series-seasonal-ARIMA-model-in-python/和另一个链接。前者表示当测试统计量大于临界值时,数据是平稳的;而后者则相反。我对此感到困惑,我还参考了otexts.org,它说我们应该根据p值进行检查。请建议如何解释ADF测试给出的结果?
此外,当我尝试在数据集上应用ARIMA模型时:
from statsmodels.tsa.arima_model import ARIMA
model = ARIMA(df.y, order=(0,1,0))
model_fit = model.fit()

我的数据框中有一个日期时间列作为索引,y列具有浮点值。当我在这个数据框上应用模型时,会出现以下错误:
IndexError: 列表索引超出范围。
当我尝试使用以下命令打印模型摘要时,此错误就会出现:
print(model_fit.summary())

请帮我解决这个问题,以便我更好地理解ARIMA。

3个回答

11
ARIMA(自回归积分移动平均)时间序列的交叉验证: K折交叉验证不适用于时间序列。相反,使用类似前向逐步滚动窗口的回测技术。

自回归的K折交叉验证:虽然交叉验证通常不适用于时间序列(ARIMA)模型,但只要所考虑的模型具有不相关的误差,并且您已使用Ljung Box Test进行过测试,K折交叉验证对于自回归是有效的,以在时间序列应用中实现可解释的人工智能(XAI)。

有一些Python统计库提供了这些方法,下面是两个示例:Python Stats TestsPython StatsModels

要获取值的差异,您可以简单地使用Python 3.6+ PEP 487 Descriptors强制执行int8,其中您可以强制执行始终返回int8的类型列表,以实现更快的计算(list : list -> list of ints)

list_a = [1,2,3]
list_b = [2,3]
print(set(list_a).difference(set(list_b)))
`answer is` set([1])

0

当使用ADF统计量为您的模型生成ARIMA模型摘要时,您应该注意ADF测试、临界值和p值,以帮助您获得洞察力。

当您的临界值小于您的ADF统计量时,那么您很可能有一个非平稳序列,即您的序列显示季节性或某些趋势。然后要注意的是您的p值;如果它小于值0.05,则您的序列无疑是平稳的,否则它是季节性的。

关于您的IndexError,我觉得这是因为您没有提供滞后值给您的模型,您的模型基于从残差图和acf图中获得的观测结果。或者您可以尝试使用简单模型(1,0,0)或(1,1,0)。希望这能帮到您!


0
关于解释ARIMA模型,我只能向您推荐

https://en.wikipedia.org/wiki/Autoregressive_integrated_moving_average

关于您在调用model_fit.summary()时遇到的问题,我认为这是因为order=(0,1,0)。模型没有pq参数来估计,只有一个常数差异。
如果您运行下面的代码,您可以看到常数差异只是差分值的平均值:
#differences in forecasted values
pd.Series(model_fit.forecast(steps=10)[0]).diff(1)

#results
#0              NaN
#1    107904.396563
#2    107904.396563
#3    107904.396563
#4    107904.396563

#mean of the original time series differenced once
model_fit.model.endog.mean()
#107904.3965625

当您将其更改为order=(0,1,1)order=(1,1,0)时,摘要将正常打印,但这显然是不同的模型,并对随机过程如何随时间演变做出了不同的假设。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接