时间序列分析中,自相关系数ACF和偏相关系数PACF是两个比较重要的统计指标,在使用arima模型做序列预测时,我们可以根据这两个统计值来判断模型类型(ar还是ma)以及选择参数。目前网上(百度)关于这两个系数的资料已经相当丰富了,不过大部分的内容都只着重于介绍它们的含义以及使用方式,并没有对计算方法有详细的说明。所以虽然这两个系数的计算比较简单,但是我认为还是有必要做一下总结说明,以便于其他人作为参考。本文的内容将主要集中于如何计算ACF和PACF,关于这两个系数的介绍和说明,大家可以参考网上的博客。
1. 变量说明
首先对基本变量做一下说明,后续的公式和计算都将以这些变量为准。
我们用变量表示一个时间序列,表示序列中的第个点,,表示序列的长度。
序列的均值:
序列的方差:
序列的标准差:
对于长度一样的两条不同序列和,可以使用协方差来刻画它们的相关性。
序列的协方差:
协方差的值越大,说明序列和的相关性越强(大于0时为正相关,小于0时为负相关)。类似地,对于序列,我们根据序列的滞后次数来计算对应的序列自协方差,
序列的自协方差(有偏):
对于,我们有两种估计值,有偏估计(上式)和无偏估计,
序列的自协方差(无偏):
可以注意到,进一步地,我们根据序列的自协方差来定义序列的自相关系数:
序列的自相关系数(有偏):
序列的自相关系数(无偏):
后续关于PACF的计算将以无偏估计值(和)为代表,大家可自行替换为有偏估计(和)。
2. 序列的自相关系数ACF
由前文易得ACF的计算公式:
自相关系数ACF(无偏):
自相关系数ACF(有偏):
代码(python)如下
import numpy as np
# acf method in statsmodels
#import statsmodels.tsa.stattools as stattools
#def default_acf(ts, k):
# return statools.acf(ts, nlags=k, unbiased=False)
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]
3. 序列的偏相关系数PACF
偏相关系数PACF的计算相较于自相关系数ACF要复杂一些。网上大部分资料都只给出了PACF的公式和理论说明,对于PACF的值则没有具体的介绍,所以我们首先需要说明一下PACF指的是什么。这里我们借助AR模型来说明,对于AR(p)模型,一般会有如下假设:
其中,是线性相关系数,是噪声,即我们假设点与前个点是线性相关的。而PACF所要表示的就是点与点的相关性,所以,
序列的偏相关系数PACF:
我们没有办法单独求解。对于一般的线性回归问题,可以使用最小二乘法(MLS)来求解相关系数,而这里可以使用Yule-Walker等式来求解,详情可以参考YW-Eshel。对于滞后次数,我们依照如下过程来构建Yule-Walker等式:
- 首先,我们有假设的原等式:
- 将等式的两边同乘以,可以得到:
- 接着,对等式的两边同时求期望,可以得到:
- 因为噪声项默认是0均值的,所以可以去掉噪声:
- 等式两边同除以(无偏,有偏估计时,除以),同时我们又有,因此可以得到:
- 最后,将等式两边同除以,可以得到:
根据最后的等式,我们将所有相关项列出来后,可以得到:
这里的便是之前提到的序列自相关系数ACF,同时,可以注意到,因此有
简化起见,我们令
则有等式如下,为toeplitz矩阵,
由于矩阵是对称满秩矩阵,所以存在可逆矩阵,使得,则可以求得滞后次数为的偏相关系数(上标表示第个解向量):
代码(python)如下
import numpy as np
from scipy.linalg import toeplitz
# pacf method in 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)
4. 总结
对如何计算自相关系数ACF和偏相关系数PACF的介绍就到这里了,由于本人并非统计学相关专业,上述内容是基于个人对网上资料和开源代码(python:statsmodels)的理解所总结的,存在错误,烦请指出,本文仅作为各位学习相关算法的参考。