别再只盯着h=1了!Matlab adftest函数实战:用GDP数据手把手教你三种平稳性判断方法
别再只盯着h=1了!Matlab adftest函数实战:用GDP数据手把手教你三种平稳性判断方法
在时间序列分析中,ADF检验是判断数据平稳性的黄金标准。但很多Matlab用户在使用adftest函数时,往往只关注h值这一单一指标,忽略了pValue、stat和cValue等同样重要的统计量。本文将带你深入理解ADF检验的完整输出,通过实际GDP数据分析,掌握三种交叉验证的平稳性判断方法。
1. ADF检验的核心逻辑与输出参数解析
ADF检验(Augmented Dickey-Fuller test)的核心在于检验时间序列是否存在单位根。原假设(H₀)认为序列存在单位根(非平稳),而备择假设(H₁)则认为序列不存在单位根(平稳)。
adftest函数的完整调用格式为:
[h, pValue, stat, cValue] = adftest(y, 'alpha', 0.05);关键输出参数解读:
| 参数 | 数学含义 | 判断标准 | 实际意义 |
|---|---|---|---|
| h | 假设检验结果 | h=0接受H₀(非平稳) h=1拒绝H₀(平稳) | 最直观的判断指标 |
| pValue | 观察到的显著性水平 | p>α接受H₀ p<α拒绝H₀ | 反映拒绝H₀的证据强度 |
| stat | 检验统计量 | stat>cValue接受H₀ stat<cValue拒绝H₀ | 直接比较统计量与临界值 |
| cValue | 临界值 | 由显著性水平α决定 | 提供统计量的比较基准 |
注意:这三种判断方法在理论上应该得出相同结论,但在实际数据分析中可能出现不一致,这正是需要交叉验证的原因。
2. 实战案例:中国GDP数据的平稳性检验
让我们以1978-2020年中国GDP数据为例,演示如何全面解读ADF检验结果。
2.1 原始序列检验
首先加载并可视化原始GDP数据:
data = [3678.70, 4100.45, 4587.58, ..., 1015986.20]; % 完整数据见文末 plot(data, 'LineWidth', 1.5); title('中国GDP原始序列(1978-2020)');执行ADF检验:
[h, pValue, stat, cValue] = adftest(data, 'alpha', 0.05);检验结果对比:
- h值判断:h=0 → 接受原假设(非平稳)
- pValue判断:p=0.999 > 0.05 → 接受原假设
- 统计量判断:stat=13.433 > cValue=-1.947 → 接受原假设
三种方法一致表明原始GDP序列是非平稳的,这与直观趋势图显示的持续增长特征相符。
2.2 一阶差分序列检验
对数据进行一阶差分:
datad1 = diff(data, 1); plot(datad1, 'LineWidth', 1.5); title('GDP一阶差分序列');检验结果:
h = 0 pValue = 0.2810 stat = -0.9989 cValue = -1.9475关键发现:
- 虽然差分后序列的stat值已低于原始序列,但仍大于cValue
- pValue虽有下降(从0.999→0.281),但仍大于0.05
- 图形仍显示明显趋势,验证了非平稳结论
2.3 二阶差分序列检验
继续对数据进行二阶差分:
datad2 = diff(data, 2); plot(datad2, 'LineWidth', 1.5); title('GDP二阶差分序列');检验结果:
h = 1 pValue = 1.0000e-03 stat = -4.3792 cValue = -1.9476综合分析:
- h=1、p<0.05、stat<cValue → 三种方法一致判断为平稳
- 图形显示序列在零值附近随机波动,无明显趋势
- 这表明GDP序列经过二阶差分后达到了平稳状态
3. 三种判断方法的深入比较与应用场景
虽然h、pValue和stat/cValue理论上应该一致,但实际分析中可能出现以下情况:
案例1:临界情况下的判断分歧当stat接近cValue时,可能出现:
- h=0(不拒绝H₀)
- 但pValue略小于0.05(如0.04)
此时建议:结合图形分析,考虑进行更长时间的观察或收集更多数据。
案例2:小样本数据的特殊表现样本量较小时:
- pValue可能不够稳定
- stat与cValue的比较更为可靠
实用建议:
- 常规分析:优先查看h值,快速判断
- 深入研究:必须检查pValue和stat/cValue
- 结果存疑时:绘制序列图形,进行多方法交叉验证
4. 高级技巧与常见问题排查
4.1 显著性水平α的选择
α值不仅影响cValue,也决定了h和pValue的判断标准:
| α值 | 影响 | 适用场景 |
|---|---|---|
| 0.01 | 更严格 | 金融等高精度领域 |
| 0.05 | 默认值 | 大多数经济数据分析 |
| 0.10 | 更宽松 | 探索性分析或小样本研究 |
修改α值的调用方式:
[h, pValue, stat, cValue] = adftest(data, 'alpha', 0.01);4.2 模型设定选项
adftest支持多种模型设定,通过'model'参数指定:
% 三种可选模型 [h1] = adftest(data, 'model', 'ARD'); % 含截距项和趋势项(默认) [h2] = adftest(data, 'model', 'TS'); % 含趋势项 [h3] = adftest(data, 'model', 'NC'); % 不含常数项和趋势项选择建议:
- 观察数据图形,判断是否明显存在趋势
- 不确定时,使用默认'ARD'模型
- 比较不同模型的结果,选择最一致的结论
4.3 滞后阶数的确定
adftest会自动选择滞后阶数,也可手动指定:
[h] = adftest(data, 'lags', 2); % 指定滞后2阶经验法则:
- 年度数据:滞后1-2阶
- 季度数据:滞后4-5阶
- 月度数据:滞后12阶左右
5. 完整代码实现与数据准备
为方便读者复现,这里提供完整代码:
% 数据准备 gdp = [3678.70, 4100.45, 4587.58, 4935.83, 5373.35, 6020.92, 7278.50, ... 9098.95, 10376.15, 12174.59, 15180.39, 17179.74, 18872.87, ... 22005.63, 27194.53, 35673.23, 48637.45, 61339.89, 71813.63, ... 79715.04, 85195.51, 90564.38, 100280.14, 110863.12, 121717.42, ... 137422.03, 161840.16, 187318.90, 219438.47, 270092.32, 319244.61, ... 348517.74, 412119.26, 487940.18, 538579.95, 592963.23, 643563.10, ... 688858.22, 746395.06, 832035.95, 919281.13, 990865.11, 1015986.20]; % 原始序列检验 figure(1) plot(gdp, 'LineWidth', 1.5) title('中国GDP原始序列(1978-2020)') [h, p, stat, cval] = adftest(gdp, 'alpha', 0.05); % 一阶差分 figure(2) d1 = diff(gdp, 1); plot(d1, 'LineWidth', 1.5) title('GDP一阶差分序列') [h1, p1, stat1, cval1] = adftest(d1, 'alpha', 0.05); % 二阶差分 figure(3) d2 = diff(gdp, 2); plot(d2, 'LineWidth', 1.5) title('GDP二阶差分序列') [h2, p2, stat2, cval2] = adftest(d2, 'alpha', 0.05);在实际分析中,我发现当三种判断方法出现分歧时,往往意味着数据处于平稳与非平稳的边界状态。这时最好的做法是结合业务背景知识,或者尝试不同的差分阶数和模型设定,而不是机械地依赖单一指标。例如,某些具有弱趋势的序列可能在某些检验方法下显示为平稳,但从业务角度看仍需要进一步处理。
