MATLAB自回归预测模型实现方案
完整AR建模与预测工作流程
%% 1. 数据准备:生成/加载并可视化数据
% 假设您有自己的时间序列数据 `myData`
% 这里以模拟的平稳时间序列为例
rng(0); % 设置随机种子确保可重复性
T = 200; % 数据长度
y = 0.7*randn(T,1); % 生成白噪声
for t = 3:Ty(t) = 0.5*y(t-1) - 0.3*y(t-2) + y(t); % 生成AR(2)过程
endfigure;
plot(y, 'LineWidth', 1.5);
title('原始时间序列数据');
xlabel('时间点'); ylabel('数值');
grid on;%% 2. 平稳性检验与处理
% 进行ADF单位根检验(需要Econometric Toolbox的adftest函数)
% 如果检验结果为0(非平稳),则需要进行差分
try[h, pValue] = adftest(y, 'Model', 'ARD');if ~hdisp('数据非平稳,进行一阶差分...');y_diff = diff(y);y = y_diff; % 用差分后的数据继续分析elsedisp('数据通过平稳性检验。');end
catchdisp('未找到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') == 2sys = 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_lbqfprintf('警告:残差可能不是白噪声 (p-value = %.4f)。考虑增加模型阶数或检查模型类型。\n', p_lbq);
elsefprintf('残差通过白噪声检验 (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和BICaic(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)+1forecast_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);endendy_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通常给出更简洁的模型。
- 观察PACF图:在滞后
- 模型诊断:残差是否为白噪声是判断模型是否充分的黄金标准。如果残差仍存在自相关,考虑:
- 增加AR阶数。
- 改用ARMA模型(
armax函数)来同时建模自回归和移动平均部分。
- 高级扩展:
- 多变量:使用向量自回归(VAR) 模型(
varm,estimate函数)。 - 外生变量:使用带外生输入的ARX模型(
arx函数)。 - 非线性:考虑非线性自回归(NAR) 神经网络模型(
narnet函数)。
- 多变量:使用向量自回归(VAR) 模型(
参考代码 时间序列的自回归预测模型 www.youwenfan.com/contentcno/96377.html
常见问题与解决方案
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 预测值迅速收敛到均值 | 模型为纯AR过程且未包含外部驱动 | 检查模型形式,考虑引入外生变量(ARX)或使用SARIMA建模季节性 |
| 残差非白噪声,存在自相关 | 模型阶数不足或模型类型不当 | 增加 p,或改用ARMA模型(使用 armax) |
| 预测置信区间过宽 | 序列噪声大或预测步长过长 | 检查数据质量,缩短预测步长,或集成多个模型降低不确定性 |
| 新数据上的预测性能骤降 | 数据发生结构突变(如市场事件、系统故障) | 使用滚动窗口重新估计模型,或采用状态空间模型(如您之前提到的UKF)进行自适应滤波 |