在本文中,我将介绍ARMA,ARIMA(Box-Jenkins),SARIMA和ARIMAX模型如何用于预测时间序列数据。python
咱们可使用backshift滞后算子来执行计算。例如,滞后算子可用于计算的时间序列值的滞后差分, 函数
其中k表示的差分滞后期。对于k=1,咱们得到普通的差分,而对于k=2咱们得到相对于一阶的差分。让咱们考虑R中的一个例子。测试
使用R,咱们可使用diff
函数计算滞后差分。函数的第二个参数表示所需的滞后k,默认设置为k=1。例如:spa
By <- diff(y) # y\_i - B y\_i B3y <- diff(y, 3) # y\_i - B^3 y\_i message(paste0("y is: ", paste(y, collapse =
## y is: 1,3,5,10,20 ## By is: 2,2,5,10 ## B^3y is: 9,17
滞后k的自相关定义为:code
要计算自相关,咱们可使用如下R函数:对象
get_autocor <- function(x, lag) { x.left <- x\[1:(length(x) - lag)\] x.right <- x\[(1+lag):(length(x))\] autocor <- cor(x.left, x.right) return(autocor) }
get_autocor(y, 1) ## \[1\] 0.9944627 # 相隔2个时间点(滞后期2)测量值的相关性 get_autocor(y, 2) ## \[1\] 0.9819805
数据的高度自相关代表数据具备明确的时间趋势。ip
因为观察到较大滞后的自相关能够是较低滞后的相关结果,所以一般值得考虑偏自相关函数(pACF)。pACF的想法是计算偏相关性,这种相关性决定了对变量的最近观察样本的相关性。pACF定义为:rem
使用pACF能够识别是否存在实际滞后的自相关或这些自相关是不是由其余样本引发的。get
计算和绘制ACF和pACF的最简单方法是分别使用acf
和pacf
函数:数据分析
par(mfrow = c(1,2)) acf(y) # ACF pacf(y) # pACF
在ACF可视化中,ACF或pACF被绘制为滞后的函数。指示的水平蓝色虚线表示自相关显著的水平。
执行分解的方式取决于时间序列数据是加法仍是乘法。
加法模型假设数据能够分解为
另外一方面,乘法模型假设数据能够被分解为
AirPassengers
数据集提供了乘法时间序列的示例。
data(AirPassengers) plot(AirPassengers)
AirPassengers
数据集:
plot(log(AirPassengers))
正如咱们所看到的,采用对数已经使季节性成分的变化均衡。请注意,整体增加趋势没有改变。
要分解R中的时间序列数据,咱们可使用该decompose
函数。请注意,咱们应该经过type
参数提供时间序列是加法的仍是乘法的。
对于AirPassengers
数据集,咱们指定数据是乘法的并得到如下分解:
plot(decompose(AirPassengers, type = "multiplicative"))
分解代表,多年来航空公司乘客总数在增长。此外,咱们已经观察到的季节性影响已被清楚地捕捉到。
让咱们考虑能够EuStockMarkets
数据集的分解:
daxData <- EuStockMarkets\[, 1\] #数据彷佛不是可乘的,请使用加法分解 decomposed <- decompose(daxData, type = "additive") plot(decomposed)
该图显示了1992年至1998年的DAX数据中的如下内容:
生成时间序列数据的过程能够是平稳的也能够是非平稳的。 例如,数据EuStockMarkets
和AirPassengers
数据都是非平稳的,由于数据有增长的趋势。为了更好地区分平稳和非平稳过程,请考虑如下示例:
par(mfrow = c(1,2))# data(nino) x <- nino3.4 plot(x, main = "Stationary process")# 飞机旅客数据 plot(AirPassengers, main = "Non-stationary process")
左图显示了一个平稳过程,其中数据在全部测量中表现类似。右图显示了一个非平稳过程,其中平均值随着时间的推移而增长。
介绍了与时间序列数据分析相关的最重要概念后,咱们如今能够开始研究预测模型。
ARMA表明自回归移动平均模型。ARMA模型仅适用于平稳过程,并具备两个参数:
使用backshift运算符,咱们能够经过如下方式制定ARMA模型:
经过定义和
,ARMA模型简化为
。
总之,ARIMA模型具备如下三个参数:
在ARIMA模型中,经过将替换差分,将结果转换为差分yt
而后经过指定模型
在下文中,让咱们考虑ARIMA模型的三个参数的解释。
咱们可使用该arima.sim
函数模拟自回归过程。经过该函数,能够经过提供要使用的MA和AR项的系数来指定模型。在下文中,咱们将绘制自相关图,由于它最适合于发现自回归的影响。
第一个例子代表,对于ARIMA(1,0,0)过程,阶数1的pACF很是高,而对于ARIMA(2,0,0)过程,阶数1和阶数2自相关都很重要。所以,能够根据pACF显着的最大滞后来选择AR项的阶数。
ARIMA(0,1,0)模型简化为随机游走模型
如下示例演示了差分对AirPassengers
数据集的影响:
虽然第一个图表显示数据显然是非平稳的,但第二个图代表差分时间序列是至关平稳的。
其中当前估计值取决于先前测量值的残差。
能够经过绘制自回归函数来研究移动平均的影响:
请注意,对于自回归图,咱们须要注意第一个x轴位置表示滞后为0(即标识向量)。在第一个图中,只有第一个滞后的自相关是显着的,而第二个图代表前两个滞后的自相关是显着的。为了找到MA的阶数,适用与AR相似的规则:MA的阶数对应于自相关显着的最大滞后期。
为了肯定哪一个更合适,AR或MA,咱们须要考虑ACF(自相关函数)和PACF(偏ACF)。
AR和MA的组合获得如下时间序列数据:
auto.arima
`forecast`
咱们将使用数据展现ARMA的使用,该数据tseries
给出了Nino Region 3.4指数的海面温度。让咱们验证数据是否平稳:
d=0
为了验证是否存在任何季节性趋势,咱们将分解数据:
没有总体趋势,这是平稳过程的典型趋势。可是,数据存在强烈的季节性因素。所以,咱们确定但愿包含对季节性影响进行建模的参数。
对于季节性模型,咱们须要指定额外的参数参数(P,D,Q)S。因为季节性趋势在时间序列数据中不占主导地位,咱们将设置D=0。此外,因为尼诺数据中的季节性趋势是一种年度趋势,咱们能够设置S=12个月。为了肯定季节性模型的其余参数,咱们考虑季节性成分的图。
咱们设置P=2 Q=0
对于非季节性模型,咱们须要找到p和q。为此,咱们将绘制ACF和pACF来肯定AR和MA参数的值。
咱们可使用包中的Arima
函数来拟合模型forecast
。
咱们如今可使用该模型来预测将来Nino 3.4地区的气温如何变化。有两种方法能够从预测模型中得到预测。第一种方法依赖于predict
函数,而第二种方法使用包中的forecast
函数。使用该predict
功能,咱们能够经过如下方式预测和可视化结果:
## ## Attaching package: 'ggplot2' ## The following object is masked from 'package:forecast': ## ## autolayer
若是咱们不须要自定义绘图,咱们可使用如下forecast
函数轻松地获取预测和相应的可视化:
# 使用内置绘图功能: forecast <- forecast(A, h = 60) # 预测将来5年 plot(forecast)
为了演示ARIMA模型对非平稳数据的使用,咱们将使用数据集astsa
。该数据集提供全球平均陆地 - 海洋温度误差的年度测量值。
d=1
p=0q=1
咱们如今能够预测将来几年平均陆地 - 海洋温度误差将如何变化:
该模型代表,将来几年平均陆地 - 海洋温度误差将进一步增长。
为了展现ARIMAX模型的使用,咱们将使用臭氧数据集 。
让咱们加载臭氧数据集并将其划分为测试和训练集。请注意,咱们已确保训练和测试数据包含连续的时间测量。
为此,咱们将在臭氧数据集中建立一个新列,该列反映了相对时间点:
如今咱们有了时间维度,咱们能够绘制臭氧水平:
时间序列数据彷佛是平稳的。让咱们考虑ACF和pACF图,看看咱们应该考虑哪些AR和MA
自相关图很是不清楚,这代表数据中实际上没有时间趋势。所以,咱们会选择ARIMA(0,0,0)模型。因为具备参数(0,0,0)的ARIMAX模型没有传统线性回归模型的优点,咱们能够得出结论,臭氧数据的时间趋势不足以改善臭氧水平的预测。让咱们验证一下:
print(Rsquared.linear) ## \[1\] 0.7676977
`````` print(Rsquared.temporal)
`````` ## \[1\] 0.7569718
咱们能够看到具备负二项式几率线性模型优于ARIMAX模型。
要在更合适的数据集上演示ARIMAX模型,让咱们加载数据集:
该Icecream
数据集包含如下变量:
测量结果是从1951-03-18到1953-07-11的四周观测。
咱们将模拟消费,冰淇淋消费做为时间序列,并使用_收入_,_价格_和_平均值_做为外生变量。在开始建模以前,咱们将从数据框中建立一个时间序列对象。
咱们如今调查数据:
所以,数据有两种趋势:
因为季节性趋势,咱们可能拟合ARIMA(1,0,0)(1,0,0)模型。可是,因为咱们知道温度和外生变量的收入,所以它们能够解释数据的趋势:
income
解释了总体趋势。此外,temp
解释了季节性趋势,咱们不须要季节性模型。所以,咱们应该使用ARIMAX(1,0,0)模型进行预测。为了研究这些假设是否成立,咱们将使用如下代码将ARIMAX(1,0,0)模型与ARIMA(1,0,0)(1,0,0)模型进行比较
ARIMAX(1,0,0)模型的预测显示为蓝色,而ARIMA(1,0,0)(1,0,0)模型的预测显示为虚线。实际观察值显示为黑线。结果代表,ARIMAX(1,0,0)明显比ARIMA(1,0,0)(1,0,0)模型更准确。
但请注意,ARIMAX模型在某种程度上不像纯ARIMA模型那样有用于预测。这是由于,ARIMAX模型须要对应该预测的任何新数据点进行外部预测。例如,对于冰淇淋数据集,咱们没有超出1953-07-11的外生数据。所以,咱们没法使用ARIMAX模型预测超出此时间点,而ARIMA模型能够实现:
若是您有任何疑问,请在下面发表评论。
最受欢迎的看法
1.在python中使用lstm和pytorch进行时间序列预测
2.python中利用长短时间记忆模型lstm进行时间序列预测分析