ARMA称为自回归移动平均模型(Autoregressive moving average model),由自回归模型(AR)和移动平均模型(MA)混合构成。
注意这里的移动平均模型和移动平均值平滑曲线不是一个概念。
AR模型是用自身的历史数据来预测未来数据,构成如下:
MA模型则利用历史噪声来预测未来数据,构成如下:
ARMA模型综合利用两种方法,构成如下:
其中beta为AR模型的系数,alpha为MA模型的系数,Y为系统测量值,epsilon为噪声。
如果有一些数据,想要利用AR、MA或者ARMA模型来做预测,就需要估计上述alpha,beta系数和epsilon噪声。
AR模型可以用线性最小二乘求解。
MA模型因为噪声数据也是未知量,列出的方程比未知量要少,矩阵奇异,则可以用非线性最小二乘方法迭代求解。
下面给一个ARMA模型求解系数的例子
matlab代码如下:
clear;close all;clc;
n=50;
u = 3;
e = randn(n,1);
x = zeros(n,1);
%ARMA模型
for i=3:n
x(i) = 0.2*x(i-1) + 0.1*x(i-2) + u + e(i) - 0.3*e(i-1) + 0.4*e(i-2);
end
newu = mean(x);
options.Algorithm = 'levenberg-marquardt';
lb = [];ub = [];
par = [newu;rand(4,1);rand(n,1)];
f = @(par) func(par,x);
par= lsqnonlin(f,par,lb,ub,options); %执行优化
%生成拟合量
newe = par(6:end);
newx = zeros(n,1);
for i=3:n
newx(i) = par(2)*newx(i-1) + par(3)*newx(i-2)+ par(1) + newe(i) + par(4)*newe(i-1) + par(5)*newe(i-2);
end
for i=n+1:n+2 %预测两步
newe(i) = randn(1);
newx(i) = par(2)*newx(i-1) + par(3)*newx(i-2)+ par(1) + newe(i) + par(4)*newe(i-1) + par(5)*newe(i-2);
end
subplot(3,1,1);
plot(x,'r-o');
hold on;
plot(newx,'g-*');
title('原始序列与估计序列')
subplot(3,1,2);
plot(e,'r-o');
hold on;
plot(newe,'g-*');
title('原始随机序列与估计随机序列')
subplot(3,1,3);
plot(autocorr(x,length(x)-1),'r-o');
hold on;
plot(parcorr(x,'Method','yule-walker','NumLags',length(x)-1),'g-*');
title('自相关与偏相关')
function re = func(par,x)
e = par(6:end);
re = zeros(length(e),1);
for i=3:length(e)
re(i) = x(i) - (par(2)*x(i-1) + par(3)*x(i-2) + par(1) + e(i) + par(4)*e(i-1) + par(5)*e(i-2)); %损失量
end
end
结果如下:
参考:https://stats.stackexchange.com/questions/505873/how-to-manually-fit-ma1-model-with-ols