Matlab实现ADF检验,adftest函数使用详细说明(看完就会用)

目录

  • ADF检验简介
  • adftest的使用及参数介绍
    • ——简单调用:h = adftest(y)
    • ——多参数调用:[h,pValue,stat,cValue] = adftest(y,'alpha',0.05)
  • adftest如何判断是否平稳?
    • ——原假设与备择假设
    • ——通过h判断是否平稳
    • ——通过pValue判单是否平稳
    • ——通过stat和cValue判断是否平稳
  • 应用举例(以1978年到2020年的中国GDP为例):
    • 原始序列的ADF检验
    • 一阶差分序列的ADF检验
    • 二阶差分序列
  • 完整代码及数据
  • 作者水平有限,第一次发文,有错误及需要改正的地方请指正

ADF检验简介

ADF检验全称为Augmented Dickey-Fuller test。通常在使用时间序列模型(如ARMA,ARIMA)的时候用于检验时间序列数据的平稳性。他主要通过检验数据是否有单位根判断序列是否平稳。

adftest的使用及参数介绍

——简单调用:h = adftest(y)

输入参数:
y:进行检验的时间序列
输出参数:
h:检验结果
h = 0,说明序列不平稳;
h = 1,说明序列平稳。

——多参数调用:[h,pValue,stat,cValue] = adftest(y,‘alpha’,0.05)

输入参数:
y:进行检验的时间序列
‘alpha’,0.05:组合起来使用可以改变假设检验的显著性水平,如果不设置则默认为0.05

输出参数:
h:检验结果
pValue:假设检验的P值,依据他的大小可以判断是否拒绝原假设
stat:检验统计量,与cValue一起可以决定是否拒绝原假设
cValue:假设检验的临界值,与stat一起可以决定是否拒绝原假设
(下文会介绍三种利用输出参数判断是否平稳的方法,他们的结果是统一的,会一种就行)

adftest如何判断是否平稳?

——原假设与备择假设

原假设:存在单位根(时间序列不平稳)
备择假设:不存在单位根(时间序列平稳)

——通过h判断是否平稳

h = 0时,我们无法拒绝原假设,也就是接受原假设→序列存在单位根→时间序列不平稳
h = 1时,我们拒绝原假设→序列不存在单位根→时间序列平稳

——通过pValue判单是否平稳

pValue>0.05(显著性水平,这里用0.05举例):我们无法拒绝原假设,也就是接受原假设→序列存在单位根→时间序列不平稳
pValue<0.05:我们拒绝原假设→序列不存在单位根→时间序列平稳

——通过stat和cValue判断是否平稳

stat>cValue:落在接受域,我们无法拒绝原假设,也就是接受原假设→序列存在单位根→时间序列不平稳
stat<cValue:落在拒绝域,我们拒绝原假设→序列不存在单位根→时间序列平稳

应用举例(以1978年到2020年的中国GDP为例):

原始序列的ADF检验

clc;
clear;
data = readtable("data.xlsx");
data = table2array(data);
data = data(:,2)
plot(data,'LineWidth',1.5)
[h,pValue,stat,cValue] = adftest(data,'alpha',0.05)

输出结果为:
h = 0; (h等于0→接受原假设→有单位根→不平稳)
pValue = 0.9990 (p大于0.05→接受原假设→有单位根→不平稳)
stat = 13.4332 (stat>cValue→接受原假设→有单位根→不平稳)
cValue = -1.9474
原始时间序列折线图
从折线图和函数返回结果看,该序列都是不平稳的。

一阶差分序列的ADF检验

%%  接上述代码
datad1 = diff(data,1)
figure
plot(datad1,'LineWidth',1.5)
[h,pValue,stat,cValue] = adftest(datad1,'alpha',0.05)

输出结果为:
h = 0;
pValue = 0.2810
stat = -0.9989
cValue = -1.9475
一阶差分序列折线图
从折线图可见一阶差分仍然具有显著上升趋势,序列不平稳,与函数返回结果契合。

二阶差分序列

datad2 = diff(data,2)
figure
plot(datad2,'LineWidth',1.5)
[h,pValue,stat,cValue] = adftest(datad2,'alpha',0.05)

输出结果为:
h = 1;
pValue = 1.0000e-03
stat = -4.3792
cValue = -1.9476
二阶差分序列的折线图
由折线图,数据在0附近随机波动,表现为平稳序列,与函数返回值契合。文章来源地址https://uudwc.com/A/NNn

完整代码及数据

clc;
clear;
data = readtable("data.xlsx");
data = table2array(data);
data = data(:,2)
%可注释上面三行,将下一行取消注释
%data = [3678.70250000000	4100.45370000000	4587.58110000000	4935.83280000000	5373.35010000000	6020.92410000000	7278.50230000000	9098.94800000000	10376.1545000000	12174.5947000000	15180.3865000000	17179.7417000000	18872.8688000000	22005.6285000000	27194.5309000000	35673.2304000000	48637.4503000000	61339.8913000000	71813.6296000000	79715.0445000000	85195.5071000000	90564.3758000000	100280.139300000	110863.123000000	121717.424700000	137422.034900000	161840.160900000	187318.903100000	219438.474800000	270092.323700000	319244.612800000	348517.743700000	412119.255800000	487940.180500000	538579.953500000	592963.229500000	643563.104500000	688858.218000000	746395.059500000	832035.948600000	919281.129100000	990865.111300000	1015986.20000000]'
plot(data,'LineWidth',1.5)
[h,pValue,stat,cValue] = adftest(data,'alpha',0.05)
%%  一阶差分
datad1 = diff(data,1)
figure
plot(datad1,'LineWidth',1.5)
[h,pValue,stat,cValue] = adftest(datad1,'alpha',0.05)
%%  二阶差分
datad2 = diff(data,2)
figure
plot(datad2,'LineWidth',1.5)
[h,pValue,stat,cValue] = adftest(datad2,'alpha',0.05)
%adftest:原假设:存在单位根(说明这是一个非平稳的时间序列)  备择假设:不存在单位根(说明这是一个平稳时间序列)
%h = 0则不能拒绝原假设,那么接受原假设,说明时间序列不平稳

作者水平有限,第一次发文,有错误及需要改正的地方请指正

原文地址:https://blog.csdn.net/qq_62888264/article/details/129403702

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请联系站长进行投诉反馈,一经查实,立即删除!

h
上一篇 2023年06月12日 01:05
数据结构:堆的实现与建堆时间复杂度分析
下一篇 2023年06月12日 01:07