www.pudn.com > tsa.rar > amarma.m
function [z,e,REV,ESU,V,Z,SPUR] = amarma(y, Mode, MOP, UC, z0, Z0, V0, W);
% Adaptive Mean-AutoRegressive-Moving-Average model estimation
% [z,E,ESU,REV,V,Z,SPUR] = amarma(y, mode, MOP, UC, z0, Z0, V0, W);
% Estimates AAR parameters with Kalman filter algorithm
% y(t) = sum_i(a(i,t)*y(t-i)) + mu(t) + E(t)
%
% State space model:
% z(t)=G*z(t-1) + w(t) w(t)=N(0,W)
% y(t)=H*z(t) + v(t) v(t)=N(0,V)
%
% G = I,
% z = [µ(t)/(1-sum_i(a(i,t))),a_1(t-1),..,a_p(t-p),b_1(t-1),...,b_q(t-q)];
% H = [M0/(1-sum_i(a(i,t))),y(t-1),..,y(t-p),e(t-1),...,e(t-q)];
% W = E{(z(t)-G*z(t-1))*(z(t)-G*z(t-1))'}
% V = E{(y(t)-H*z(t-1))*(y(t)-H*z(t-1))'}
%
% Input:
% y Signal (AR-Process)
% Mode
% [0,0] uses V0 and W
%
% MOP Model order [m,p,q], default [0,10,0]
% UC Update Coefficient, default 0
% z0 Initial state vector
% Z0 Initial Covariance matrix
%
% Output:
% z AR-Parameter
% E error process (Adaptively filtered process)
% REV relative error variance MSE/MSY
%
% REFERENCE(S):
% [1] A. Schloegl (2000), The electroencephalogram and the adaptive autoregressive model: theory and applications.
% ISBN 3-8265-7640-3 Shaker Verlag, Aachen, Germany.
%
% More references can be found at
% http://www.dpmi.tu-graz.ac.at/~schloegl/publications/
% $Id: amarma.m,v 1.1 2005/11/07 14:42:26 schloegl Exp $
% Copyright (c) 1998-2002,2005 by Alois Schloegl
%
% 12.04.1999 ESU included
% 19.10.2000 aMode 13,14 included
% NaN handling
% 06.07.2002 Docu improved, included into TSA
% 11.07.2002 nanmean replaced by mean
%#realonly
%#inbounds
[nc,nr]=size(y);
if nargin<2 Mode=0;
elseif ischar(Mode) Mode=bin2dec(Mode);
elseif isnan(Mode) return; end;
if nargin<3, MOP=[0,10,0]; end;
if nargin<8, W = nan ; end;
if length(MOP)==0, m=0;p=10; q=0; MOP=p;
elseif length(MOP)==1, m=0;p=MOP(1); q=0; MOP=p;
elseif length(MOP)==2, fprintf(1,'Error AMARMA: MOP is ambiguos\n');
elseif length(MOP)>2, m=MOP(1); p=MOP(2); q=MOP(3);MOP=m+p+q;
end;
if prod(size(Mode))>1
aMode=Mode(1);
eMode=Mode(2);
end;
%fprintf(1,['a' int2str(aMode) 'e' int2str(eMode) ' ']);
e = zeros(nc,1);
V = zeros(nc,1);V(1)=V0;
T = zeros(nc,1);
ESU = zeros(nc,1)+nan;
SPUR = zeros(nc,1)+nan;
z = z0(ones(nc,1),:);
arc = poly((1-UC*2)*[1;1]); b0=sum(arc); % Whale forgetting factor for Mode=258,(Bianci et al. 1997)
dW = UC/MOP*eye(MOP); % Schloegl
%------------------------------------------------
% First Iteration
%------------------------------------------------
H = zeros(MOP,1);
if m,
%M0 = z0(1)/(1-sum(z0(2:p+1))); %transformierter Mittelwert
H(1) = 1;%M0;
%z0(1)= 1;
end;
Z = Z0;
zt= z0;
A1 = zeros(MOP); A2 = A1;
%------------------------------------------------
% Update Equations
%------------------------------------------------
for t=1:nc,
%H=[y(t-1); H(1:p-1); E ; H(p+1:MOP-1)]
if t<=p, H(m+(1:t-1)) = y(t-1:-1:1); %H(p)=mu0; % Autoregressive
else H(m+(1:p)) = y(t-1:-1:t-p); %mu0];
end;
if t<=q, H(m+p+(1:t-1)) = e(t-1:-1:1); % Moving Average
else H(m+p+(1:q)) = e(t-1:-1:t-q);
end;
% Prediction Error
E = y(t) - zt*H;
e(t) = E;
if ~isnan(E),
E2 = E*E;
AY = Z*H;
% [zt, t, y(t), E,ESU(t),V(t),H,Z],pause,
ESU(t) = H'*AY;
if eMode==0
V(t) = V0;
elseif eMode==1
V0 = V(t-1);
V(t) = V0*(1-UC)+UC*E2;
elseif eMode==2
V0 = 1;
V(t) = V0; %V(t-1)*(1-UC)+UC*E2;
elseif eMode==3
V0 = 1-UC;
V(t) = V0; %(t-1)*(1-UC)+UC*E2;
elseif eMode==4
V0 = V0*(1-UC)+UC*E2;
V(t) = V0;
elseif eMode==5
V(t)=V0;
%V0 = V0;
elseif eMode==6
if E2>ESU(t)
V0=(1-UC)*V0+UC*(E2-ESU(t));
end;
V(t)=V0;
elseif eMode==7
V0=V(t);
if E2>ESU(t)
V(t) = (1-UC)*V0+UC*(E2-ESU(t));
else
V(t) = V0;
end;
elseif eMode==8
V0=0;
V(t) = V0; % (t-1)*(1-UC)+UC*E2;
end;
%[t,size(H),size(Z)]
k = AY / (ESU(t) + V0); % Kalman Gain
zt = zt + k'*E;
%z(t,:) = zt;
if aMode==0
%W = W; %nop % Schloegl et al. 2003
elseif aMode==2
T(t)=(1-UC)*T(t-1)+UC*(E2-Q(t))/(H'*H); % Roberts I 1998
Z=Z*V(t-1)/Q(t);
if T(t)>0 W=T(t)*eye(MOP); else W=zeros(MOP);end;
elseif aMode==5
Q_wo = (H'*C*H + V(t-1)); % Roberts II 1998
T(t)=(1-UC)*T(t-1)+UC*(E2-Q_wo)/(H'*H);
if T(t)>0 W=T(t)*eye(MOP); else W=zeros(MOP); end;
elseif aMode==6
T(t)=(1-UC)*T(t-1)+UC*(E2-Q(t))/(H'*H);
Z=Z*V(t)/Q(t);
if T(t)>0 W=T(t)*eye(MOP); else W=zeros(MOP); end;
elseif aMode==11
%Z = Z - k*AY';
W = sum(diag(Z))*dW;
elseif aMode==12
W = UC*UC*eye(MOP);
elseif aMode==13
W = UC*diag(diag(Z));
elseif aMode==14
W = (UC*UC)*diag(diag(Z));
elseif aMode==15
W = sum(diag(Z))*dW;
elseif aMode==16
W = UC*eye(MOP); % Schloegl 1998
%elseif aMode==17
%W=W;
end;
Z = Z - k*AY'; % Schloegl 1998
else
V(t) = V0;
end;
if any(any(isnan(W))), W=UC*Z; end;
z(t,:) = zt;
Z = Z + W; % Schloegl 1998
SPUR(t)=trace(Z);
end;
if 0,m,
z(:,1)=M0*z(:,1)./(1-sum(z(:,2:p),2));
end;
REV = mean(e.*e)/mean(y.*y);
if any(~isfinite(Z(:))), REV=inf; end;