【时间序列】怎么理解ACF 和PACF

目录

  • 1 概述
  • 2 截尾与拖尾
  • 3 Auto regressive (AR) process
  • 4 Moving average(MA) Process
  • 5 总结


1 概述

ACF 是一个完整的自相关函数,可为我们提供具有滞后值的任何序列的自相关值。简单来说,它描述了该序列的当前值与其过去的值之间的相关程度。时间序列可以包含趋势,季节性,周期性和残差等成分。ACF在寻找相关性时会考虑所有这些成分。

直观上来说,ACF 描述了一个观测值和另一个观测值之间的自相关,包括直接和间接的相关性信息

PACF部分自相关函数或者偏自相关函数。基本上,它不是找到像ACF这样的滞后与当前的相关性,而是找到残差(在去除了之前的滞后已经解释的影响之后仍然存在)与下一个滞后值的相关性。因此,如果残差中有任何可以由下一个滞后建模的隐藏信息,我们可能会获得良好的相关性,并且在建模时我们会将下一个滞后作为特征。请记住,在建模时,我们不想保留太多相互关联的特征,因为这会产生多重共线性问题。因此,我们只需要保留相关功能。

直观上来说,PACF 只描述观测值 y t y_{t} yt 和其滞后项 y t − k y_{t-k} ytk 之间的直接关系,调整了其他较短滞后项( y t − 1 y_{t-1} yt1 y t − 2 y_{t-2} yt2 …… y t − k − 1 y_{t-k-1} ytk1 )的影响。


2 截尾与拖尾

截尾是指时间序列的自相关函数(ACF)或偏自相关函数(PACF)在某阶后均为0的性质(比如AR的PACF);拖尾是ACF或PACF并不在某阶后均为0的性质(比如AR的ACF)。

  • 截尾:在大于某个常数k后快速趋于0为k阶截尾
  • 拖尾:始终有非零取值,不会在k大于某个常数后就恒等于零(或在0附近随机波动)

3 Auto regressive (AR) process

当一个时间序列中,它当前的观测值可以通过历史观测值获得是,那么就是一个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+ϕ1yt1+ϕ2yt2++ϕp/ytp+εt
其中 ε t \varepsilon_{t} εt 是白噪声, y t − 1 y_{t-1} yt1 y t − 2 y_{t-2} yt2 是滞后项。阶数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 和PACF_第1张图片

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()

【时间序列】怎么理解ACF 和PACF_第2张图片

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()

【时间序列】怎么理解ACF 和PACF_第3张图片


4 Moving average(MA) Process

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εt1+θ2εt2++θq/εtq
其中 ε 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εt1
假设 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

  • 假设今天有飓风,昨天没有飓风,因此, ε t = 5 \varepsilon_{t} = 5 εt=5 y t = 15 y_{t} = 15 yt=15
  • 明天没有飓风,因此, ε t = 0 \varepsilon_{t} = 0 εt=0 ε t − 1 = 5 \varepsilon_{t-1} = 5 εt1=5 y t = 12.5 y_{t} = 12.5 yt=12.5
  • 明天之后仍然没有飓风,那么原油价格就会回到10,也就是回到均价水平。

在这个例子中,飓风的影响只能保持一个滞后项。 这个例子中的飓风是一个独立现象。

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 和PACF_第4张图片
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()

【时间序列】怎么理解ACF 和PACF_第5张图片
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()

【时间序列】怎么理解ACF 和PACF_第6张图片


5 总结

在建立机器学习模型的时候,我们应该避免多重共线性,时间序列模型也一样。

我们可以通过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

你可能感兴趣的:(Python机器学习基础教程,python,机器学习,数据分析)