当前位置: 首页 > news >正文

【MATLAB第117期】#源码分享 | 基于MATLAB的SSM状态空间模型多元时间序列预测方法(多输入单输出)

【MATLAB第117期】#源码分享 | 基于MATLAB的SSM状态空间模型多元时间序列预测方法(多输入单输出)

引言

本文使用状态空间模型实现失业率递归预测,状态空间模型(State Space Model, SSM)是一种用于描述动态系统行为的数学模型,通过状态变量、输入和输出的关系来刻画系统的时变特性。
在这里插入图片描述在这里插入图片描述

本示例演示如何使用Econometrics Toolbox中的状态空间模型,实现美国年度失业率的滚动窗口预测

% 模型结构:
%   x(t) = A*x(t-1) + B*u(t) + w(t)  (状态方程)
%   y(t) = C*x(t)   + D*u(t) + v(t)  (观测方程)
% 其中:
%   y(t) - 观测失业率
%   x(t) - 潜在状态变量
%   u(t) - 名义GNP增长率(外生变量)
%   w(t) ~ N(0,Q) - 过程噪声
%   v(t) ~ N(0,R) - 观测噪声

一、关键思路

‌1、滚动窗口机制‌
使用31年的窗口进行参数估计,逐年滚动预测下一年失业率
窗口滑动方式:1940-1970年间共生成31个预测窗口
‌2、状态空间模型结构‌

x(t)=[α1;01]∗x(t−1)+[β;0]∗ΔlnGNP(t)+w(t)y(t)=[10]∗x(t)+γ∗ΔlnGNP(t)+v(t)
包含AR(2)动态和GNP的外生影响
参数估计目标:α(自回归系数), β(GNP对状态的系数), γ(GNP对观测的直接系数)
3、‌数据预处理细节‌

对原始GNP数据取对数差分处理:ΔlnGNP = diff(log(GNP))
失业率使用一阶差分:ΔUR = diff(UR)

二、核心代码

%% 1. 导入年度经济数据
load Data_NelsonPlosser; % 加载Nelson-Plosser宏观经济数据集
% 数据集包含美国1909-1970年间的经济指标,包括:
%   GNPN - 名义国民生产总值 
%   UR   - 失业率
%   其他指标:CPI、工资率等%% 2. 数据预处理
isNaN = any(ismissing(DataTable),2); % 标记包含缺失值的行
Z = DataTable.GNPN(~isNaN);  % 提取有效期的名义GNP数据(61×1)
y = DataTable.UR(~isNaN);    % 提取有效期的失业率数据(61×1)%% 3. 创建时间序列数组
WindowSize = 31; % 滚动窗口大小(31年)
ForecastPeriod = numel(y) - WindowSize + 1; % 预测期数(61-31+1=31)% 初始化存储矩阵
ZZ = zeros(ForecastPeriod, WindowSize); % GNP窗口数据(31×31)
yy = zeros(ForecastPeriod, WindowSize); % 失业率窗口数据(31×31)% 创建滚动窗口数据集
m = 1;
for nYear = 1:ForecastPeriodZZ(nYear,:) = Z(m:m+WindowSize-1); % 当前窗口的GNP数据yy(nYear,:) = y(m:m+WindowSize-1); % 当前窗口的失业率数据m = m + 1;
end% 提取时间戳(1940-1970年)
Time = str2double(DataTable.Properties.RowNames(~isNaN));
Time = Time(end-ForecastPeriod+1:end); % 构建带时间戳的数组
ObsUnemployRate = [Time, yy]; % 失业率时间序列(31×32)
nGNP = [Time, ZZ];           % GNP时间序列(31×32)%% 4. MATLAB状态空间模型递归估计
eUR = zeros(numel(Time),1);    % 存储预测失业率
param0 = [0.5; 0.1; -20];      % 初始参数 [A; B; D]% 滚动窗口参数估计循环
for t = 0:numel(Time)-1% 数据准备dlZ = diff(log(ZZ(t+1,:)))';  % GNP对数差分(增长率)dy = diff(yy(t+1,:))';        % 失业率差分% 状态空间模型定义(调用rwAR2ParamMap函数)Mdl = ssm(@(c)rwAR2ParamMap(c,dy,dlZ));% 参数估计(最大似然估计)[Mdl, param0] = estimate(Mdl, dy, param0, 'Display', 'off');% 1步超前预测dyhat = forecast(Mdl, 1, dy,...'Predictors0', dlZ,...'PredictorsF', dlZ(end),...'Beta', param0(end));% 整合预测结果eUR(t+1) = dyhat + yy(t+1,end); % 预测值 = 差分预测 + 当前水平值
end%% 5. 可视化MATLAB预测结果
figure;
axH = axes;
plot(axH, Time, y(end-numel(Time)+1:end),... % 实际失业率'Color', [0.9290 0.6940 0.1250], 'LineWidth', 1.2);
hold on; grid on;
plot(axH, Time, eUR,... % 预测失业率'Color', [0 0.4470 0.7410], 'LineWidth', 1.2);
axH.XLim(1) = Time(1);
axH.Color = [0.5020 0.5020 0.5020];
title('失业率预测对比 (%)');
legend(["实际值", "预测值"]);

在这里插入图片描述

三、代码获取

1.阅读首页置顶文章
2.关注CSDN
3.根据自动回复消息,回复“117期”以及相应指令,即可获取对应下载方式。

相关文章:

  • 【随手记】jupyter notebook绘制交互式图像
  • Shell循环语句---for和while
  • 【上海大学数据库原理实验报告】MySQL数据库的C/S模式部署
  • 发送百度地图的定位
  • 物联网蓬勃发展是助力楼宇自控技术迈向成熟的关键
  • AI 健康小屋:开启智慧健康管理新范式
  • # 06_Elastic Stack 从入门到实践(六)
  • ffmpeg av_buffer_unref的逻辑实现; av_freep 和 av_freep函数的区别
  • 用c语言实现——一个带头节点的链队列,支持用户输入交互界面、初始化、入队、出队、查找、判空判满、显示队列、遍历计算长度等功能
  • 神经网络权重优化秘籍:梯度下降法全解析(五)
  • 记录一次使用面向对象的C语言封装步进电机驱动
  • Shell脚本中的字符串截取和规则变化
  • 深度学习基石:神经网络核心知识全解析(一)
  • 运行neo4j.bat console 报错无法识别为脚本,PowerShell 教程:查看语言模式并通过注册表修改受限模式
  • 【Java面试笔记:基础】5.String、StringBuffer、StringBuilder有什么区别?
  • transformer 子层连接结构
  • 迅为iTOP-RK3576开发板/核心板6TOPS超强算力NPU适用于ARM PC、边缘计算、个人移动互联网设备及其他多媒体产品
  • ElasticSearch深入解析(一):Elastic Stack全景
  • Java实例化对象都有几种方式
  • (undone) 吴恩达版提示词工程 3. 迭代 (建议用到的时候再根据目录针对看)
  • 当代读书人的暗号:不是拆快递,是拆出版社样书!|世界读书日特辑
  • 不朽诗篇的现代重生,意大利音乐剧《神曲》将来华15城巡演
  • 告别国泰海通,黄燕铭下一站将加盟东方证券,负责研究业务
  • 上海农房翻建为何难?基层盼政策适度松动
  • 海外考古大家访谈|马克·波拉德:以考古意识为本位的科技考古学家
  • 国常会:要持续稳定股市,持续推动房地产市场平稳健康发展