前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >时间序列 ACF 和 PACF 理解、代码、可视化

时间序列 ACF 和 PACF 理解、代码、可视化

作者头像
Python数据科学
发布2024-02-05 14:33:50
3810
发布2024-02-05 14:33:50
举报
文章被收录于专栏:Python数据科学Python数据科学

我们说时间序列可以被预测,主要基于以下事实:我们可以部分掌握影响该时间序列的因素的变化情况。换句话说,对时间序列进行预测,其实就是利用各种理论和工具,对观察到的时间序列进行“抽丝剥茧”,以试图掌握其变化的本质,从而对未来的表现进行预测。

而自相关性是时序预测的基础,对于时序的平稳性、白噪声检测、确定

ARMA

模型中的阶数(p/q)有着重要的作用。本篇将着重介绍自相关的概念

ACF

PACF

ACF 自相关函数

概念理解

ACF(Autocorrelation Function)就是用来计算时间序列自身的相关性的函数。

对于同一时间

x_t

的计算,

Cov(x_t,x_t)=1

,这个很好理解。

如果是不同的时间,比如

Cov(x_{t-k},x_t)

,该如何计算呢?

实际上,在应用自相关函数时,其输入分别为原始的时间序列

x_t

及其

k

阶滞后序列

x_{t-k}

,于是

Cov(x_{t-k},x_t)

就变成了:

Cov(\{x_1,...,x_{t-k}\},\{x_{k+1},...,x_t\})

,这里两个序列的长度是一致的,如下图所示:

计算和代码

ACF的公式定义为:

acf(k) = \frac{N}{N-k} \times \frac{\sum_{t=k+1}^N (x_t-\bar{x})(x_{t-k}-\bar{x})}{\sum_{t=1}^N (x_t-\bar{x})^2}(无偏)
acf(k) = \frac{\sum_{t=k+1}^N (x_t-\bar{x})(x_{t-k}-\bar{x})}{\sum_{t=1}^N (x_t-\bar{x})^2}(有偏)

Python代码实现可以直接使用statsmodels包进行计算,当然也可以自己通过Numpy复现一遍公式,结果是一样的。

代码语言:javascript
复制
import numpy as np

# statsmodels包计算acf
import statsmodels.tsa.stattools as stattools
def default_acf(ts, k):
    return statools.acf(ts, nlags=k, unbiased=False)

# 手撸公式计算acf,有偏
def acf(ts, k):
    """ Compute autocorrelation coefficient, biased
    """
    x = np.array(ts) - np.mean(ts)
    coeff = np.zeros(k+1, np.float64) # to store acf
    coeff[0] = x.dot(x) # N*c(0)

    for i in range(1, k+1):
        coeff[i] = x[:-i].dot(x[i:]) # (N-k)*c(i)
        
    return coeff / coeff[0]

可视化

通过可视化可以更清楚的看出不同lag的系数值和趋势变化,通过statsmodels函数的直接绘制,以下是示例。

代码语言:javascript
复制
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
df = pd.read_excel('data.xlsx',engine='openpyxl')

df['price'].plot()
plot_acf(df['price'], lags=40, adjusted=False)
plt.show()

第一个图是一组时间序列的数据。第二个图是计算的ACF相关系数图。

ACF图的横坐标表示滞后的阶数,纵坐标表示对应的滞后序列与原始序列的相关系数。可以看出,随着滞后阶数的增加,滞后序列与原始序列的相关性也在不断地降低。图中的蓝色区域表示置信区间,用来标识相关系数是否具有统计显著性。简单来说,如果相关系数落在置信区间内,表明对应的两个序列的相关系数并不能代表其真实相关性。

即使是两个完全不相干的白噪声序列,由于随机性的影响,其相关系数也不可能全都为0,因此,需要使用置信区间来过滤掉那些由于随机性造成的“伪相关”。

PACF 偏自相关函数

概念理解

我们知道求导是对所有项都求导,求偏导只对某一个求导忽略其他项。

ACF

PACF

也可以理解为这样的关系。

前面我们计算

ACF

自相关函数时,得到的并不是

X_t

X_{t-k}

之间单纯的相关关系。因为

X_t

同时还会受到中间

k-1

个随机变量

X_{t-1}

X_{t-2}

...

X_{t-k+1}

的影响,而这

k-1

个随机变量又都和

X_{t-k}

具有相关关系,所以自相关系数里面实际掺杂了其他变量对

X_{t}

X_{t-k}

的影响。

为了得到

X_{t-k}

X_{t}

直接影响,引入了偏自相关系数

PACF

的概念。滞后

k

偏自相关系数是指,对于平稳时间序列

\{X_{t}\}

,在剔除了中间

k-1

个随机变量

X_{t-1}

X_{t-2}

...

X_{t-k+1}

的干扰之后,

X_{t-k}

X_{t}

影响的纯相关程度

计算和代码

PACF

的计算比

ACF

要复杂很多。这里我们借助AR模型来说明,对于AR(p)模型,一般会有如下假设:

x_{i+1} = \phi_1x_i+\phi_2x_{i-1}+...+\phi_px_{i-p+1}+\varepsilon_{i+1}

其中,

\phi_j,j=1,2,...,p

是线性相关系数,

\varepsilon_{i+1}

是噪声,即我们假设点

x_{i+1}

与前

p

个点

x_{i-p+1},x_{i-p+2},...,x_{i}

是线性相关的。而

PACF

所要表示的就是点

x_i

与点

x_{i-p}

的相关性,所以,

序列的偏相关系数PACF

pacf(p)=\phi_p

有几种方法可以求解相关系数,方法包括最小二乘法(MLS)、尤尔-沃克方程(Yule-Walker equation)、伯格算法(Burg"s method。由于公式推导内容较多,本篇对求解方法不做详细介绍。

Python计算代码如下:

代码语言:javascript
复制
import numpy as np
from scipy.linalg import toeplitz

# 使用statsmodels
import statsmodels.tsa.stattools as stattools
def default_pacf(ts, k):
    return statools.pacf(ts, nlags=k, unbiased=True)

# 尤尔-沃克方程公式复现
def yule_walker(ts, order):
    ''' Solve yule walker equation
    '''
    x = np.array(ts) - np.mean(ts)
    n = x.shape[0]

    r = np.zeros(order+1, np.float64) # to store acf
    r[0] = x.dot(x) / n # r(0)
    for k in range(1, order+1):
        r[k] = x[:-k].dot(x[k:]) / (n - k) # r(k)

    R = toeplitz(r[:-1])

    return np.linalg.solve(R, r[1:]) # solve `Rb = r` to get `b`

def pacf(ts, k):
    ''' Compute partial autocorrelation coefficients for given time series,unbiased
    '''
    res = [1.]
    for i in range(1, k+1):
        res.append(yule_walker(ts, i)[-1])
    return np.array(res)

可视化

使用statsmodels函数直接绘制,methond可以选择合适的方法求解,下面使用最小二乘法ols进行求解。

代码语言:javascript
复制
# 使用最小二乘法ols求解
plot_pacf(df['price'], lags=40,  method='ols')
plt.show()

以上就是对

ACF

PACF

的介绍,理解自相关的概念对于学习时间序列非常重要,下一篇将介绍它们的应用场景。

参考链接 [1].https://blog.csdn.net/SunJW_2017/article/details/126993853,芳樽里的歌 [2].https://www.jianshu.com/p/811f9ea0b52d,洪于祥 [3].https://zhuanlan.zhihu.com/p/59089924,gwave [4].https://www.statsmodels.org/ [5].https://mp.weixin.qq.com/s/llMZaMkhoXLRDlFxoFlXiw,seriesc

--end--

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2024-02-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python数据科学 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • ACF 自相关函数
    • 概念理解
      • 计算和代码
        • 可视化
        • PACF 偏自相关函数
          • 概念理解
            • 计算和代码
              • 可视化
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档