MATLAB自回归预测模型实现方案

完整AR建模与预测工作流程

matlab 复制代码
%% 1. 数据准备:生成/加载并可视化数据
% 假设您有自己的时间序列数据 `myData`
% 这里以模拟的平稳时间序列为例
rng(0); % 设置随机种子确保可重复性
T = 200; % 数据长度
y = 0.7*randn(T,1); % 生成白噪声
for t = 3:T
    y(t) = 0.5*y(t-1) - 0.3*y(t-2) + y(t); % 生成AR(2)过程
end

figure;
plot(y, 'LineWidth', 1.5);
title('原始时间序列数据');
xlabel('时间点'); ylabel('数值');
grid on;

%% 2. 平稳性检验与处理
% 进行ADF单位根检验(需要Econometric Toolbox的adftest函数)
% 如果检验结果为0(非平稳),则需要进行差分
try
    [h, pValue] = adftest(y, 'Model', 'ARD');
    if ~h
        disp('数据非平稳,进行一阶差分...');
        y_diff = diff(y);
        y = y_diff; % 用差分后的数据继续分析
    else
        disp('数据通过平稳性检验。');
    end
catch
    disp('未找到adftest函数,请确保已安装Econometric Toolbox。');
    % 作为备选,可以可视化观察或手动差分
    % y = diff(y); 
end

% 去中心化:减去均值(对平稳序列很重要)
y = y - mean(y);

%% 3. 模型识别:确定AR阶数(p)
% 方法一:绘制自相关(ACF)和偏自相关(PACF)图
figure;
subplot(2,1,1);
autocorr(y); title('样本自相关函数 (ACF)');
subplot(2,1,2);
parcorr(y); title('样本偏自相关函数 (PACF)'); 
% PACF在滞后p阶后"截尾",即为建议的阶数

% 方法二:使用AIC/BIC信息准则自动定阶(更客观)
maxP = 10; % 设定最大搜索阶数
[aic, bic] = aicbic_custom(y, maxP); % 需自定义aicbic_custom函数,下方提供
[~, bestP_aic] = min(aic);
[~, bestP_bic] = min(bic);
fprintf('AIC建议最佳阶数 p = %d\n', bestP_aic-1); % 阶数从0开始
fprintf('BIC建议最佳阶数 p = %d\n', bestP_bic-1);

%% 4. 模型估计与拟合
p = bestP_bic - 1; % 选择BIC建议的阶数(通常更简洁)
% 使用aryule函数(Yule-Walker方法)估计AR参数
[ar_coeff, noise_var] = aryule(y, p);
ar_coeff = -ar_coeff(2:end); % 提取真正的自回归系数(去掉首项1)

% 构建AR模型对象(如果使用System Identification Toolbox)
if exist('ar', 'file') == 2
    sys = ar(y, p, 'yw');
    compare(sys, y, 10); % 对比模型拟合效果
end

%% 5. 模型诊断:检验残差是否为白噪声
% 计算残差
y_pred = filter([0; ar_coeff], 1, y); % 单步预测
residuals = y(p+1:end) - y_pred(p+1:end); % 预测残差

% 残差的自相关检验
figure;
subplot(2,1,1);
autocorr(residuals);
title('残差序列的自相关图'); 
% 如果大部分自相关系数在置信区间内,则通过

subplot(2,1,2);
histogram(residuals, 20);
title('残差直方图'); 
xlabel('残差'); ylabel('频数');

% Ljung-Box Q检验(更严格的统计检验)
[h_lbq, p_lbq] = lbqtest(residuals, 'Lags', [10, 15]);
if h_lbq
    fprintf('警告:残差可能不是白噪声 (p-value = %.4f)。考虑增加模型阶数或检查模型类型。\n', p_lbq);
else
    fprintf('残差通过白噪声检验 (p-value = %.4f)。\n', p_lbq);
end

%% 6. 预测与可视化
nForecast = 20; % 预测未来20个点
[y_forecast, y_forecast_mse] = forecast_ar(y, ar_coeff, nForecast); % 需自定义forecast_ar函数

% 计算95%置信区间
ci_bound = 1.96 * sqrt(y_forecast_mse);
lower_bound = y_forecast - ci_bound;
upper_bound = y_forecast + ci_bound;

% 绘制结果
figure;
hold on;
plot(1:length(y), y, 'b-', 'LineWidth', 1.2, 'DisplayName', '历史数据');
forecast_start = length(y) + 1;
forecast_x = forecast_start:forecast_start+nForecast-1;
plot(forecast_x, y_forecast, 'r--', 'LineWidth', 1.5, 'DisplayName', '预测值');
fill([forecast_x, fliplr(forecast_x)], ...
     [lower_bound', fliplr(upper_bound')], ...
     'r', 'FaceAlpha', 0.2, 'EdgeColor', 'none', 'DisplayName', '95%置信区间');
xline(length(y), 'k--', 'HandleVisibility', 'off');
legend('show', 'Location', 'best');
title('AR模型样本外预测');
xlabel('时间点'); ylabel('数值');
grid on;
hold off;

%% 自定义函数1:计算AIC和BIC值
function [aic, bic] = aicbic_custom(y, maxP)
    T = length(y);
    aic = zeros(maxP+1, 1);
    bic = zeros(maxP+1, 1);
    for p = 0:maxP
        [coeff, noise_var] = aryule(y, p);
        % 计算对数似然值(假设高斯分布)
        logL = -T/2 * log(2*pi*noise_var) - (T-p)/(2);
        % 计算AIC和BIC
        aic(p+1) = -2*logL + 2*(p+1); % 参数个数为 p+1 (包括方差)
        bic(p+1) = -2*logL + (p+1)*log(T-p);
    end
end

%% 自定义函数2:AR模型预测
function [y_forecast, forecast_mse] = forecast_ar(y, ar_coeff, nForecast)
    p = length(ar_coeff);
    y_extended = [y; zeros(nForecast, 1)]; % 扩展向量以存放预测值
    forecast_mse = zeros(nForecast, 1);
    noise_var = var(y - filter([0; ar_coeff], 1, y)); % 估计噪声方差
    
    for t = length(y)+1 : length(y)+nForecast
        % 使用过去p个值进行预测
        past_values = y_extended(t-p:t-1);
        y_forecast_local = sum(ar_coeff .* past_values(end:-1:1)); % 注意系数顺序
        y_extended(t) = y_forecast_local;
        
        % 计算预测误差的均方误差(逐步增大)
        if t == length(y)+1
            forecast_mse(t-length(y)) = noise_var;
        else
            % 对于多步预测,误差会累积
            forecast_mse(t-length(y)) = forecast_mse(t-length(y)-1) + noise_var * sum(ar_coeff(1:t-length(y)-1).^2);
        end
    end
    y_forecast = y_extended(end-nForecast+1:end);
    forecast_mse = forecast_mse(end-nForecast+1:end);
end

模型选择与优化关键点

  • 平稳性处理AR模型的核心假设是数据平稳 。如果您的数据有趋势或季节性:
    • 趋势 :使用 detrend 函数或进行差分(diff)。
    • 季节性 :进行季节性差分(如 diff(y, 季节周期))。
  • 定阶方法
    • 观察PACF图 :在滞后 p 阶后,如果PACF系数突然落入置信区间内("截尾"),p 即为建议阶数。
    • 使用信息准则:AIC/BIC准则能平衡模型复杂度与拟合度。BIC通常给出更简洁的模型。
  • 模型诊断残差是否为白噪声是判断模型是否充分的黄金标准 。如果残差仍存在自相关,考虑:
    1. 增加AR阶数。
    2. 改用ARMA模型(armax 函数)来同时建模自回归和移动平均部分。
  • 高级扩展
    • 多变量 :使用向量自回归(VAR) 模型(varm, estimate 函数)。
    • 外生变量 :使用带外生输入的ARX 模型(arx 函数)。
    • 非线性 :考虑非线性自回归(NAR) 神经网络模型(narnet 函数)。

参考代码 时间序列的自回归预测模型 www.youwenfan.com/contentcsp/96377.html

常见问题与解决方案

问题现象 可能原因 解决方案
预测值迅速收敛到均值 模型为纯AR过程且未包含外部驱动 检查模型形式,考虑引入外生变量(ARX)或使用SARIMA建模季节性
残差非白噪声,存在自相关 模型阶数不足或模型类型不当 增加 p,或改用ARMA模型(使用 armax
预测置信区间过宽 序列噪声大或预测步长过长 检查数据质量,缩短预测步长,或集成多个模型降低不确定性
新数据上的预测性能骤降 数据发生结构突变(如市场事件、系统故障) 使用滚动窗口重新估计模型,或采用状态空间模型(如您之前提到的UKF)进行自适应滤波
相关推荐
海奥华25 分钟前
Golang Channel 原理深度解析
服务器·开发语言·网络·数据结构·算法·golang
代码游侠7 分钟前
学习笔记——MQTT协议
开发语言·笔记·php
渡我白衣12 分钟前
计算机组成原理(13):多路选择器与三态门
开发语言·javascript·ecmascript·数字电路·计算机组成原理·三态门·多路选择器
HUST14 分钟前
C语言 第十讲:操作符详解
c语言·开发语言
田里的水稻19 分钟前
matlab_绘图线条颜色显示和点的形状显示
开发语言·matlab
CCPC不拿奖不改名22 分钟前
python基础:python语言的数据结构+面试习题
开发语言·数据结构·python·面试
Tan385122 分钟前
陪读蛙 Read Frog 配置 API 教程|低成本实现高质量翻译
开发语言·机器翻译·自动翻译·api key·tensdaq·陪读蛙·read frog
凑凑的小手办24 分钟前
C语言基础(一)
c语言·开发语言
lly20240627 分钟前
Lua 循环
开发语言
※※冰馨※※27 分钟前
【QT】初始化显示时正常,操作刷新后布局显示问题。
开发语言·c++·windows·qt