4. 误差时间相关性分析:自相关函数、偏自相关函数、白噪声检验
好,咱们接着聊误差分析。前面几章我们把误差的分布、统计特征都摸了一遍,但有个关键问题还没解决——误差之间有没有“勾连”?
说白了,就是今天的预测误差,跟昨天的、前天的误差有没有关系?
我刚开始做负荷预测那会儿,总觉得误差就是随机蹦出来的。直到有一次,我发现连续三天的误差都是正的,而且越来越大。嗯,这就不对劲了。如果误差之间存在相关性,说明我们的模型漏掉了某些规律,必须修正。
这一章,我们就来拆解误差的时间相关性。核心工具就三个:自相关函数(ACF)、偏自相关函数(PACF),以及白噪声检验。
4.1 为什么误差不能“有关系”?
先想一个问题:如果今天的误差和昨天的误差正相关,意味着什么?
意味着模型系统性地低估或高估了负荷。你想想看,如果昨天低估了5%,今天又低估了3%,那模型肯定有没捕捉到的趋势或周期。
我个人的习惯是:拿到一组预测误差后,第一件事不是看均值方差,而是画个时序图。肉眼扫一遍,如果发现误差在某个时间段内“扎堆”为正或为负,那基本可以断定存在时间相关性。
4.2 自相关函数(ACF)
自相关函数,就是衡量误差序列自己跟自己在不同滞后阶数上的相关性。
公式我就不堆了,咱们直接说直觉:
- 滞后1阶的自相关:今天的误差与昨天的误差的相关性
- 滞后2阶的自相关:今天的误差与前天的误差的相关性
- 以此类推……
我在项目中遇到过这样一个案例:某地区夏季负荷预测的误差,在滞后24阶(也就是一天前)出现了明显的自相关峰值。这说明什么?说明模型没处理好日周期规律。后来我们加入了24小时前的负荷特征,误差立马改善了。
ACF的图形怎么看?记住三点:
- 快速衰减:如果ACF在滞后几阶后迅速降到0附近,说明序列可能是平稳的,相关性较弱
- 缓慢衰减:如果ACF拖尾很长,迟迟不归零,说明序列可能存在趋势或非平稳性
- 周期性峰值:比如在滞后24、48、72处出现尖峰,说明存在日周期规律
4.3 偏自相关函数(PACF)
ACF有个问题——它会把间接相关也算进来。比如,今天的误差跟昨天的相关,昨天的又跟前天的相关,那今天跟前天可能也表现出相关,但这其实是“传递”过来的。
偏自相关函数就是用来剔除中间变量的干扰,只保留“纯”的相关性。
说白了,PACF衡量的是:在剔除了中间所有滞后项的影响后,当前误差与特定滞后误差的直接相关性。
举个例子:
- ACF(2) 可能很大,但这是因为滞后1阶在中间“搭桥”
- PACF(2) 如果很小,说明滞后2阶对当前没有直接影响
我曾经犯过一个错:看到ACF在滞后2阶有显著峰值,就急着往模型里加滞后2项。结果模型反而变差了。后来一查PACF,滞后2阶根本不显著。嗯,白费功夫。
4.4 白噪声检验
好,ACF和PACF看完了,怎么判断误差到底是不是白噪声?
光靠肉眼看图不够,得有统计检验。最常用的是Ljung-Box检验(也叫Q检验)。
它的逻辑很简单:
- 原假设H0:误差序列是白噪声(所有自相关系数都为0)
- 备择假设H1:误差序列不是白噪声(至少有一个自相关系数不为0)
如果p值小于0.05,就拒绝原假设,说明误差存在显著的时间相关性。
我个人习惯是:对滞后1阶到滞后24阶(如果是日数据)做Ljung-Box检验。如果p值都大于0.05,那基本可以放心了。
下面给一段Python代码,演示如何计算ACF、PACF并做白噪声检验:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.tsa.stattools import acf, pacf, acf_pacf_plot
from statsmodels.stats.diagnostic import acorr_ljungbox
# 假设 errors 是预测误差序列(一维数组)
errors = np.random.randn(100) # 这里用随机数模拟,实际替换为你的数据
# 计算ACF和PACF
lag_num = 20
acf_values = acf(errors, nlags=lag_num)
pacf_values = pacf(errors, nlags=lag_num)
# 打印前几阶
print("ACF (前5阶):", acf_values[1:6])
print("PACF (前5阶):", pacf_values[1:6])
# Ljung-Box白噪声检验
lb_test = acorr_ljungbox(errors, lags=[5, 10, 15, 20], return_df=True)
print("\nLjung-Box检验结果:")
print(lb_test)
# 可视化
fig, axes = plt.subplots(1, 2, figsize=(12, 4))
acf_pacf_plot(errors, lags=lag_num, ax=axes)
plt.show()
acf_pacf_plot 会自动画出置信区间带。如果柱子超出蓝色区域,说明该阶自相关显著。
4.5 实战中的常见模式
根据我多年的经验,误差时间相关性通常有以下几种模式:
| 模式 | ACF表现 | PACF表现 | 可能原因 |
|---|---|---|---|
| 白噪声 | 所有阶都不显著 | 所有阶都不显著 | 模型已充分捕捉规律 |
| 一阶自相关 | 滞后1阶显著,之后快速衰减 | 滞后1阶显著,之后截尾 | 模型遗漏了短期趋势 |
| 周期相关 | 在滞后24、48等处有峰值 | 对应阶数有峰值 | 日周期规律未建模 |
| 拖尾衰减 | 缓慢下降,多阶显著 | 前几阶显著后截尾 | 存在长期趋势或非平稳性 |
遇到这些情况怎么办?我的建议是:
- 短期自相关:考虑在模型中加入误差的滞后项(AR项)
- 周期相关:加入周期特征,比如小时、星期几、节假日等
- 拖尾衰减:先对原始序列做差分,再检查误差
4.6 知识体系总览
为了让你更直观地理解这一章的逻辑,我画了一张流程图:
这张图把整个分析流程串起来了。你拿到误差数据后,先画时序图看个大概,然后算ACF和PACF找具体规律,最后用Ljung-Box检验给个结论。三步走,清晰明了。
好了,这一章的内容就到这里。记住,下次你看到预测误差,别急着调参数,先看看它们之间有没有“暧昧关系”。
公众号:蓝海资料掘金营,微信deep3321