赞
踩
ACF 是一个完整的自相关函数,可为我们提供具有滞后值的任何序列的自相关值。简单来说,它描述了该序列的当前值与其过去的值之间的相关程度。时间序列可以包含趋势,季节性,周期性和残差等成分。ACF在寻找相关性时会考虑所有这些成分。
直观上来说,ACF 描述了一个观测值和另一个观测值之间的自相关,包括直接和间接的相关性信息。
PACF 是部分自相关函数或者偏自相关函数。基本上,它不是找到像ACF这样的滞后与当前的相关性,而是找到残差(在去除了之前的滞后已经解释的影响之后仍然存在)与下一个滞后值的相关性。因此,如果残差中有任何可以由下一个滞后建模的隐藏信息,我们可能会获得良好的相关性,并且在建模时我们会将下一个滞后作为特征。请记住,在建模时,我们不想保留太多相互关联的特征,因为这会产生多重共线性问题。因此,我们只需要保留相关功能。
直观上来说,PACF 只描述观测值 y t y_{t} yt 和其滞后项 y t − k y_{t-k} yt−k 之间的直接关系,调整了其他较短滞后项( y t − 1 y_{t-1} yt−1 , y t − 2 y_{t-2} yt−2 …… y t − k − 1 y_{t-k-1} yt−k−1 )的影响。
截尾是指时间序列的自相关函数(ACF)或偏自相关函数(PACF)在某阶后均为0的性质(比如AR的PACF);拖尾是ACF或PACF并不在某阶后均为0的性质(比如AR的ACF)。
当一个时间序列中,它当前的观测值可以通过历史观测值获得是,那么就是一个AR。
P 阶AR 过程可以写成下面的式子:
y
t
=
c
+
ϕ
1
y
t
−
1
+
ϕ
2
y
t
−
2
+
…
…
+
ϕ
p
/
y
t
−
p
+
ε
t
y_{t} = c + \phi_{1} y_{t-1} + \phi_{2} y_{t-2} + …… + \phi_{p}/ y_{t-p} + \varepsilon_{t}
yt=c+ϕ1yt−1+ϕ2yt−2+……+ϕp/yt−p+εt
其中
ε
t
\varepsilon_{t}
εt 是白噪声,
y
t
−
1
y_{t-1}
yt−1,
y
t
−
2
y_{t-2}
yt−2 是滞后项。阶数P 是滞后值,PACF 曲线在该滞后值首次穿过上限置信区间。这些P 延迟将作为我们预测AR 时间序列的特征。
我们不能在这里使用ACF图,因为即使对于过去很久远的滞后项,它也会显示出良好的相关性。如果我们考虑了这么多特征,我们将遇到多重共线性问题。这对于PACF图来说不是问题,因为它删除了之前滞后已经解释的成分,因此我们只得到了与残差相关的滞后,比如未被较早的滞后项所解释的成分。
在下面的代码中,我定义了一个简单的AR 流程,并使用PACF 图找到了它的阶数。我们应该期望我们的AR过程在ACF图中显示出逐渐减少的趋势,因为作为一个AR过程,其当前与过去的滞后项具有良好的相关性。我们期望PACF在滞后项阶数后会急剧下降,因为这些接近当前项的滞后项可以很好地捕获变化,因此我们不需要很多过去的滞后项来预测当前项。
构建数据:
import pandas as pd import numpy as np import matplotlib.pyplot as plt %matplotlib inline import matplotlib matplotlib.rc('xtick', labelsize=40) matplotlib.rc('ytick', labelsize=40) import seaborn as sns sns.set(style="whitegrid", color_codes=True) from statsmodels.tsa.stattools import acf, pacf t = np.linspace(0, 10, 500) #normal distributed values ys = np.random.normal(0,5,500) #exponential series to get the trend ye = np.exp(t**0.5) #adding normally distributed series in exponential series y = ys+ye #plot plt.figure(figsize=(16,7)) plt.plot(t,y)
ACF:
from statsmodels.tsa.stattools import acf
#calling auto correlation function
lag_acf = acf(y, nlags=300)
#Plot PACF:
plt.figure(figsize=(16, 7))
plt.plot(lag_acf,marker='+')
plt.axhline(y=0,linestyle='--',color='gray')
plt.axhline(y=-1.96/np.sqrt(len(y)),linestyle='--',color='gray')
plt.axhline(y=1.96/np.sqrt(len(y)),linestyle='--',color='gray')
plt.title('Autocorrelation Function')
plt.xlabel('number of lags')
plt.ylabel('correlation')
plt.tight_layout()
PACF:
from statsmodels.tsa.stattools import pacf
#calling partial correlation function
lag_pacf = pacf(y, nlags=30, method='ols')
#Plot PACF:
plt.figure(figsize=(16, 7))
plt.plot(lag_pacf,marker='+')
plt.axhline(y=0,linestyle='--',color='gray')
plt.axhline(y=-1.96/np.sqrt(len(y)),linestyle='--',color='gray')
plt.axhline(y=1.96/np.sqrt(len(y)),linestyle='--',color='gray')
plt.title('Partial Autocorrelation Function')
plt.xlabel('Number of lags')
plt.ylabel('correlation')
plt.tight_layout()
Moving average(MA) Process 是一个序列,其中当前值是由过去误差的线性组合组成的。我们认为误差是服从正态分布并且相互独立的。
q 阶MA 过程可以定义为下面的式子:
y
t
=
c
+
ε
t
+
θ
1
ε
t
−
1
+
θ
2
ε
t
−
2
+
…
…
+
θ
q
/
ε
t
−
q
y_{t} = c + \varepsilon_{t} + \theta_{1} \varepsilon_{t-1} + \theta_{2} \varepsilon_{t-2} + …… + \theta_{q}/ \varepsilon_{t-q}
yt=c+εt+θ1εt−1+θ2εt−2+……+θq/εt−q
其中
ε
t
\varepsilon_{t}
εt 是白噪声。为了更直观的体会MA 过程,我们可以先考虑一阶MA。
y
t
=
c
+
ε
t
+
θ
1
ε
t
−
1
y_{t} = c + \varepsilon_{t} + \theta_{1} \varepsilon_{t-1}
yt=c+εt+θ1εt−1
假设
y
t
y_{t}
yt 是原油价格,
ε
t
\varepsilon_{t}
εt 是原油价格由于飓风影响产生的波动。假设
c
=
10
c = 10
c=10(没有飓风时候原油的均价)并且
θ
1
=
0.5
\theta_{1} = 0.5
θ1=0.5 。
在这个例子中,飓风的影响只能保持一个滞后项。 这个例子中的飓风是一个独立现象。
MA 的阶数q 在里通过ACF 图获得,在阶数之后,ACF 会第一次穿过上限置信区间。根据上文我们知道,PACF 能够捕捉残差和时间序列滞后项的关系,我们可能能够从附近的滞后项和过去的滞后项得到很好的相关关系。为什么我们不用PACF呢?因为我们的序列是残差项的线性组合,并且时间序列本身的滞后项不能直接解释当前项(因为它并不是一个AR 过程)。PACF 图最核心的是,他能够提取已经被之前的滞后项所解释的变化,因此,在MA 过程中,PACF 失去了它的魔力。
另一方面,一个MA 过程,它并没有季节性或者趋势成分,因此ACF 能够捕捉只由于残差项带来的相关性。
在下面的代码中,我定义了一个简单的MA 流程,并使用ACF 图找到了它的阶数。我们应该期望ACF 图能够画出相邻的滞后项之间的良好的相关关系,并且在阶数q 之后迅速下降(因为这不是一个AR 过程,因此和过去的滞后项没有相关关系)。同样,我们也可以看到PACF 逐渐下降,临近的滞后项并不能预测当前项(不同于AR 过程);而更远的滞后项有可能有良好的相关关系。
构建数据:
import pandas as pd import numpy as np import matplotlib.pyplot as plt %matplotlib inline import matplotlib matplotlib.rc('xtick', labelsize=40) matplotlib.rc('ytick', labelsize=40) import seaborn as sns sns.set(style="whitegrid", color_codes=True) #ACF and PACF plots: from statsmodels.tsa.stattools import acf, pacf import pandas as pd import numpy as np import matplotlib.pyplot as plt %matplotlib inline import matplotlib matplotlib.rc('xtick', labelsize=40) matplotlib.rc('ytick', labelsize=40) import seaborn as sns sns.set(style="whitegrid", color_codes=True) #ACF and PACF plots: from statsmodels.tsa.stattools import acf, pacf #xma = np.random.randint(1,50000,100) xma = np.random.normal(0,25,1000) #lets create a MA series having mean 2 and of order 2 y5 = 2 + xma + 0.8*np.roll(xma,-1) + 0.6*np.roll(xma,-2) #+ 0.6 *np.roll(xma,-3) plt.figure(figsize=(16, 7)) #Plot ACF: plt.subplot(121) plt.plot(xma) plt.subplot(122) plt.plot(y5)
ACF:
#calling acf function from stattools
lag_acf = acf(y5, nlags=50)
plt.figure(figsize=(16, 7))
#Plot ACF:
plt.plot(lag_acf, marker="o")
plt.axhline(y=0,linestyle='--',color='gray')
plt.axhline(y=-1.96/np.sqrt(len(y5)),linestyle='--',color='gray')
plt.axhline(y=1.96/np.sqrt(len(y5)),linestyle='--',color='gray')
plt.title('Autocorrelation Function')
plt.xlabel('number of lags')
plt.ylabel('correlation')
plt.tight_layout()
PACF:
#calling pacf function from stattool
lag_pacf = pacf(y5, nlags=50, method='ols')
#PLOT PACF
plt.figure(figsize=(16, 7))
plt.plot(lag_pacf, marker="o")
plt.axhline(y=0,linestyle='--',color='gray')
plt.axhline(y=-1.96/np.sqrt(len(y5)),linestyle='--',color='gray')
plt.axhline(y=1.96/np.sqrt(len(y5)),linestyle='--',color='gray')
plt.title('Partial Autocorrelation Function')
plt.xlabel('number of lags')
plt.ylabel('correlation')
plt.tight_layout()
在建立机器学习模型的时候,我们应该避免多重共线性,时间序列模型也一样。
我们可以通过PACF 图来优化AR 过程中的特征,因为PACF 能够移除已经被先前的滞后项所解释的变化,因此我们只会得到相关的特征。
我们可以通过ACF 图,来优化MA 过程的特征,因为MA 过程没有季节性和趋势成分,我们只会在ACF 图中得到当前项和滞后项中残差的关系。
参考资料:
https://towardsdatascience.com/significance-of-acf-and-pacf-plots-in-time-series-analysis-2fa11a5d10a8
https://www.biaodianfu.com/acf-pacf.html
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。