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

您所在的位置:网站首页 eviewsar根图 【时间序列】怎么理解ACF 和PACF

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

2023-09-29 12:51| 来源: 网络整理| 查看: 265

目录 1 概述2 截尾与拖尾3 Auto regressive (AR) process4 Moving average(MA) Process5 总结

1 概述

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​ )的影响。

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+ϕ1​yt−1​+ϕ2​yt−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()

在这里插入图片描述

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​ε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 。

假设今天有飓风,昨天没有飓风,因此, ε 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 εt−1​=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:

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

在这里插入图片描述

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3