在时间序列分析与建模过程中,白噪声检验的作用有:
- 判断输入的数据是否为纯随机的白噪声,如果是白噪声,那么就说明数据中没有任何有用的信息,也就没有分析与建模的必要。
- 在模型检验中,判断检验预测结果与实际结果的残差是否为白噪声,如果是白噪声,则认为拟合效果很好,已经没有更多的信息可以提取了。
可以看到白噪声检验很重要,所以本文将介绍白噪声检验的相关概念与方法。
二、检验方法观察自相关图
通常情况下,我们将一个具有零均值、同方差的独立同分布序列称为白噪声序列,所以白噪声序列是没有自相关性的,因此可以通过直观地考察ACF与PACF来判断序列是否为白噪声:
import numpy as np
import matplotlib.pyplotas plt
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
white_noise= np.random.standard_normal(size=100)
fig= plt.figure(figsize=(20, 10))
ax1= fig.add_subplot(211)
ax2= fig.add_subplot(223)
ax3= fig.add_subplot(224)
ax1.plot(white_noise)
ax1.set_title('white noise')
plot_acf(white_noise, ax=ax2)
plot_pacf(white_noise, ax=ax3)
plt.show()
可以看到,白噪声的非0阶ACF与PACF均在置信区间内。
计算统计量
如果觉得通过观察自相关图的方法过于主观,可以通过计算统计量的方式进行量化的分析检验。
- 预备知识
- Barlett定理:如果一个时间序列是白噪声,选择其中的n个数据作为观察序列,那么这个观察序列的非0阶自相关系数近似服从均值为0,方差为1/n的正态分布。
- 卡方分布:m个服从正态分布的独立随机变量,它们的平方和构成一个新的随机变量,所服从的分布称为卡方分布,m称为自由度。
- 自由度:当以样本的统计量来估计总体的参数时,样本中独立或能自由变化的数据的个数。比如:若存在两个变量a,b满足a b=1,只要知道其中一个数a,另一个数b=1 - a 会依赖 a 的值变化而变化,所以这组数的自由度为1。
- Box-Pierce检验
- Q统计量定义:
式中n为序列观察期数,m为指定延迟期数,Q统计量近似服从自由度为m的卡方分布。
- 判断准则:(1)Q统计量小于右侧分位点置信阈值;(2)p值大于显著性水平(如0.05)。
import numpy as np
from scipy import stats
from statsmodels.stats.diagnostic import acorr_ljungbox
def box_pierce_check(data, conf_coef=0.05, lags=20):
res = acorr_ljungbox(data, lags=lags, boxpierce=True, return_df=True)
Qbp = res['bp_stat']
p_val = res['bp_pvalue']
is_white_noise = res[(Qbp > stats.chi2.isf(conf_coef, lags)) | (p_val < conf_coef)].empty
print('Box-Pierce check result: {}'.format('white noise' if is_white_noise else 'NOT white noise'))
return is_white_noise
np.random.seed(123)
data = np.random.standard_normal(size=100)
box_pierce_check(data,0.05,24)
- Ljung-Box检验
Q统计量针对大样本的检验效果很好,但是在小样本场合不太精确,所以Box和Ljung提出了LB统计量。
- LB统计量定义:
式中n为序列观察期数,m为指定延迟期数,LB统计量近似服从自由度为m的卡方分布。
- 判断准则:(1)LB统计量小于右侧分位点置信阈值;(2)p值大于显著性水平(如0.05)。
import numpy as np
fromscipyimportstats
from statsmodels.stats.diagnostic import acorr_ljungbox
def ljung_box_check(data, conf_coef=0.05, lags=20):
res = acorr_ljungbox(data, lags=lags, boxpierce=False, return_df=True)
Qlb = res['lb_stat']
p_val = res['lb_pvalue']
is_white_noise = res[(Qlb > stats.chi2.isf(conf_coef, lags)) | (p_val < conf_coef)].empty
print('Ljung-Box check result: {}'.format('white noise' if is_white_noise else 'NOT white noise'))
return is_white_noise
np.random.seed(123)
data = np.random.standard_normal(size=100)
ljung_box_check(data, 0.05, 24)
三、 总结
本文介绍了三种白噪声检验方法,其中最为常用的是Ljung-Box检验。
【参考资料】
https://www.zybuluo.com/evilking/note/795616
https://zhuanlan.zhihu.com/p/430365631