三变量的SVAR模型#step1:ADF平稳检验、差分、时序图

        无论是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实例时序图

  • 47
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值