changeset 3060:f07d2a617a6d octave-forge

include stable RLS algorithm
author schloegl
date Tue, 06 Feb 2007 09:33:35 +0000
parents ea1e1d4a99ed
children d46c0991b1f1
files extra/tsa/inst/amarma.m
diffstat 1 files changed, 220 insertions(+), 220 deletions(-) [+]
line wrap: on
line diff
--- a/extra/tsa/inst/amarma.m	Tue Feb 06 07:02:26 2007 +0000
+++ b/extra/tsa/inst/amarma.m	Tue Feb 06 09:33:35 2007 +0000
@@ -1,221 +1,221 @@
-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$
-%       Copyright (c) 1998-2002,2005 by  Alois Schloegl <a.schloegl@ieee.org>
-%
-
-% 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
+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
+%
+%
+% see also: AAR
+%
+% 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$
+%       Copyright (c) 1998-2002,2005,2006,2007 by  Alois Schloegl <a.schloegl@ieee.org>
+%
+
+%#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;
-
+                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
+      			Z = 0.5*(Z+Z');
+       			W = UC*Z;
+                elseif aMode==18
+       			W = 0.5*UC*(Z+Z');
+			%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;
+