无论是VAR,SVAR,ARMA还是ARIMA,大多数时间序列模型的第一步都是数据的平稳性检验,通常我们使用ADF检验
1.1ADF检验原假设
1.2ADF检验假设
- 原假设(H0):时间序列存在单位根(非平稳)。
- 备择假设(H1):时间序列不存在单位根(平稳)。
1.3ADF标准检验代码
% 生成一个示例时间序列数据
data = randn(100, 1); % 假设这是一个平稳的时间序列
% 进行 ADF 检验
[h, pValue, stat, cValue, reg] = adftest(data);
%h: 结果的二进制指示符。0 表示无法拒绝原假设,1 表示拒绝原假设。
%pValue: p 值,用于判断结果的显著性。
%stat: ADF 检验统计量。%cValue: 临界值。%reg: 回归结果的结构体。
% 显示结果
if h == 0
disp('无法拒绝原假设:时间序列存在单位根(非平稳)。');
else
disp('拒绝原假设:时间序列不存在单位根(平稳)。');
end
disp(['p 值: ', num2str(pValue)]);
disp(['检验统计量: ', num2str(stat)]);
disp(['临界值: ', num2str(cValue)]);
一般论文里只需要体现h, pValue, stat, cValue
1.4ADF平稳性检验、差分、时序图实例
ADF判断各个时间序列的平稳性
%step1 先判断原序列和对数序列
PHE=data1(:,3); PGDP=data1(:,2); EDR=data1(:,1); YEAR=data(:,4);
%给变量取对数
logPHE = log(PHE);
logPGDP = log(PGDP);
logEDR = log(EDR);
DataSet = [ logEDR logPGDP logPHE];
%检验
% 获取变量数量
num_variables = size(DataSet, 2);
% 循环对每个变量进行ADF检验
for i = 1:num_variables
variable = DataSet(:, i);
[h, pValue, stat] = adftest(variable);
% 输出检验结果
fprintf('变量 %d 的单位根检验结果:\n', i);
fprintf('平稳性检验的p值为:%f\n', pValue);
fprintf('检验统计量的值为:%f\n', stat);
if h == 0
fprintf('结论:变量是非平稳的\n');
else
fprintf('结论:变量是平稳的\n');
end
fprintf('\n');
end
% %如果连对数都不是平稳的,则一阶差分
% dlogPHE = logPHE(2: end) - logPHE(1: end-1);
% dlogPGDP =logPGDP(2: end) - logPGDP(1: end-1);
% dlogEDR = logEDR(2: end) - logEDR(1: end-1);
% DataSet1 = [dlogPHE dlogPGDP dlogEDR ];
DataSet1 = diff(DataSet);
num_variables1 = size(DataSet1, 2);
% 循环对每个变量进行ADF检验
for i = 1:num_variables1
variable1 = DataSet1(:, i);
[h, pValue, stat] = adftest(variable1);
% 输出检验结果
fprintf('变量 %d 的单位根检验结果:\n', i);
fprintf('平稳性检验的p值为:%f\n', pValue);
fprintf('检验统计量的值为:%f\n', stat);
if h == 0
fprintf('结论:变量是非平稳的\n');
else
fprintf('结论:变量是平稳的\n');
end
fprintf('\n');
end
%画一阶差分的时序图图2
datatu2 = DataSet1;
dataArray = DataSet1;
% 提取各列数据
years =1981:2022;
old_age_dependency_ratio = dataArray(:,1);
gdp_per_capita =dataArray(:,2);
healthcare_expenditure_per_capita =dataArray(:,3);
% 创建一个新的图形
figure;
% 绘制老年抚养比时序图
subplot(3, 1, 1);
plot(years, old_age_dependency_ratio, '-', 'Color', [0.8500, 0.3250, 0.0980], 'DisplayName', '老年抚养比(%)');
xlabel('年份');
ylabel('老年抚养比(%)');
title('老龄化');
% 绘制人均GDP时序图
subplot(3, 1, 2);
plot(years, gdp_per_capita, '-', 'Color', [0.9290, 0.6940, 0.1250], 'DisplayName', '人均GDP(元)');
xlabel('年份');
ylabel('人均GDP(元)');
title('经济增长');
% 绘制人均医疗保健支出时序图
subplot(3, 1, 3);
plot(years, healthcare_expenditure_per_capita, '-', 'Color', [0.4940, 0.1840, 0.5560],'DisplayName', '人均医疗保健支出(元)');
xlabel('年份');
ylabel('人均医疗保健支出(元)');
title('居民医疗保健消费');
% %如果一阶差分不平稳那就2阶再重复
%MATLAB中计算差分的函数是diff,
% 我们可以使用diff(A,n)命令计算向量A的n阶差分,当n等于1时,可以直接写成diff(A).
DataSet2=diff(DataSet1);
num_variables1 = size(DataSet2, 2);
% 循环对每个变量进行ADF检验
for i = 1:num_variables1
variable1 = DataSet2(:, i);
[h, pValue, stat] = adftest(variable1);
% 输出检验结果
fprintf('变量 %d 的单位根检验结果:\n', i);
fprintf('平稳性检验的p值为:%f\n', pValue);
fprintf('检验统计量的值为:%f\n', stat);
if h == 0
fprintf('结论:变量是非平稳的\n');
else
fprintf('结论:变量是平稳的\n');
end
fprintf('\n');
end
一般经济变量的时间序列数据都是不平稳的,取对数可以有效消除异方差性,再对对数化后的数据进行一阶差分看平稳性
1.5实例时序图