diff m-toolbox/classes/+utils/@math/stopfit.m @ 0:f0afece42f48

Import.
author Daniele Nicolodi <nicolodi@science.unitn.it>
date Wed, 23 Nov 2011 19:22:13 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/m-toolbox/classes/+utils/@math/stopfit.m	Wed Nov 23 19:22:13 2011 +0100
@@ -0,0 +1,212 @@
+% STOPFIT verify fit accuracy checking for specified condition.
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% DESCRIPTION:
+% 
+%     Verify fit accuracy checking for a specified condition. Available
+%     conditions are:
+% 
+%     Log Residuals difference
+%     Check if the minimum of the logarithmic difference between data and
+%     residuals is larger than a specified value. ie. if the conditioning
+%     value is 2, the function ensures that the difference between data and
+%     residuals is at lest 2 order of magnitude lower than data itsleves.
+%     Checking algorithm is:
+%     lsr = log10(abs(y))-log10(abs(rdl));
+%     min(lsr) > lrscond;
+% 
+%     Log Residuals difference and Root Mean Squared Error
+%     Check if the log difference between data and residuals is in
+%     larger than the value indicated in lsrcond and that the variation of
+%     the root mean squared error is lower than 10^(-1*msevar).
+%     Checking algorithm is:
+%     lsr = log10(abs(y))-log10(abs(rdl));
+%     (lsr > lrscond) && (mse < 10^(-1*lrsvarcond));
+% 
+% CALL:
+% 
+%      [ext,msg] = stopfit(y,rdl,mse,ctp,lrscond,msevar)
+% 
+% INPUTS:
+% 
+%     - y are the fitting data (in case of 'lrs' and 'lrsmse') or the
+%     fitted model (in case of 'rft' and 'rftmse')
+%     - rdl are the fit residuals
+%     - mse is a vector storing the values of root mean squared errors
+%     difference for the present and previuos iterations
+%     - order is the model order
+%     - ctp defines the conditioning type. Admitted values are:
+%       1) 'chival' check if the value of the Mean Squared Error is lower
+%       than 10^(-1*lsrcond).
+%       2) 'chivar' check if the value of the Mean Squared Error is lower
+%       than 10^(-1*lsrcond) and if the relative variation of mean squared error is
+%       lower than 10^(-1*msevar).
+%       3) 'lrs' check if the log difference between data and residuals is
+%       point by point larger than the value indicated in lsrcond. This
+%       mean that residuals are lsrcond order of magnitudes lower than
+%       data.
+%       4) 'lrsmse' check if the log difference between data and
+%       residuals is larger than the value indicated in lsrcond and if the
+%       relative variation of root mean squared error is lower than
+%       10^(-1*msevar).
+%       5) 'rft' check if the spectral flatness coefficient for the
+%       rersiduals is larger than the value passed in lrscond. In this case
+%       only values 0 < lrscond < 1 are allowed.
+%       6) 'rftmse' check if the spectral flatness coefficient for the
+%       rersiduals is larger than the value passed in lrscond and if the
+%       relative variation of root mean squared error is lower than 10^(-1*msevar).
+%       In this case only values 0 < lrscond < 1 are allowed.
+% 
+% OUTPUT:
+% 
+%     - ext is 1 if the specified condition is satisfied or 0 if not
+%     - msg is a string containing a messagge
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% VERSION: $Id: stopfit.m,v 1.8 2009/04/20 14:25:50 luigi Exp $
+%
+% HISTORY:     09-10-2008 L Ferraioli
+%                 Creation
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function [ext,msg] = stopfit(y,rdl,mse,ctp,lrscond,msevar)
+
+  % switching between conditions
+  switch ctp
+    case 'chival'
+      if isempty(lrscond)
+        lrscond = 2; % Default value
+      end
+
+      hh = length(mse);
+      lsr = -1*log10(mse(hh));
+      if lsr > lrscond
+        msg = 'Reached tolerance for Mean Squared Error Value';
+        ext = true;
+      else
+        ext = false;
+        msg = '';
+      end
+
+    case 'chivar'
+
+      if isempty(lrscond)
+        a = 2; % Default value
+      else
+        a = lrscond;
+      end
+      if isempty(msevar)
+        b = 2; % Default value
+      else
+        b = msevar;
+      end
+
+      hh = length(mse);
+      tlsr = -1*log10(mse(hh));
+      if hh == 1
+        stc = 1;
+      else
+        stc = diff(mse(hh-1:hh))/mse(hh-1);
+      end
+      if all(tlsr > a) && (abs(stc) < 10^(-1*b))
+        msg = 'Reached tolerance for Mean Squared Error Value and Variation';
+        ext = true;
+      else
+        ext = false;
+        msg = '';
+      end
+    
+    case 'lrs'
+      if isempty(lrscond)
+        lrscond = 2; % Default value
+      end
+
+      lsr = log10(abs(y))-log10(abs(rdl));
+      if min(lsr) > lrscond
+        msg = 'Reached tolerance for Log residuals';
+        ext = true;
+      else
+        ext = false;
+        msg = '';
+      end
+
+    case 'lrsmse'
+
+      if isempty(lrscond)
+        a = 2; % Default value
+      else
+        a = lrscond;
+      end
+      if isempty(msevar)
+        b = 2; % Default value
+      else
+        b = msevar;
+      end
+
+      tlsr = log10(abs(y))-log10(abs(rdl));
+      hh = length(mse);
+      if hh == 1
+        stc = 1;
+      else
+        stc = diff(mse(hh-1:hh))/mse(hh-1);
+      end
+      if all(tlsr > a) && (abs(stc) < 10^(-1*b))
+        msg = 'Reached tolerance for Log Residuals and Mean Squared Error variation';
+        ext = true;
+      else
+        ext = false;
+        msg = '';
+      end
+      
+    case 'rft' % Check that residuals flatness is larger than a certain value
+      % Calculate residual flatness
+      rf = utils.math.spflat(abs(rdl));
+      
+      % Checking that lrscond has the correct value
+      a = lrscond;
+      if (a >= 1) || (a < 0)
+        a = 0.5;
+      end
+      if rf > a
+        msg = 'Reached tolerance for residuals spectral flatness';
+        ext = true;
+      else
+        ext = false;
+        msg = '';
+      end
+      
+    case 'rftmse'
+      
+      % Calculate residual flatness
+      rf = utils.math.spflat(abs(rdl));
+      
+      % Checking that lrscond has the correct value
+      a = lrscond;
+      if (a >= 1) || (a < 0)
+        a = 0.5;
+      end
+      
+      if isempty(msevar)
+        b = 2; % Default value
+      else
+        b = msevar;
+      end
+
+      hh = length(mse);
+      if hh == 1
+        stc = 1;
+      else
+        stc = diff(mse(hh-1:hh))/mse(hh-1);
+      end
+      if (rf > a) && (abs(stc) < 10^(-1*b))
+        msg = 'Reached tolerance for residuals spectral flatness and Mean Squared Error variation';
+        ext = true;
+      else
+        ext = false;
+        msg = '';
+      end
+      
+        
+
+  end
+