diff m-toolbox/classes/@ao/confint.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/@ao/confint.m	Wed Nov 23 19:22:13 2011 +0100
@@ -0,0 +1,427 @@
+% CONFINT Calculates confidence levels and variance for psd, lpsd, cohere, lcohere and curvefit parameters
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%
+% DESCRIPTION: CONFINT Input psd, mscohere (magnitude square coherence) 
+% and return confidence levels and variance for them.
+% Spectra are assumed to be calculated with the WOSA method (Welch's
+% Overlapped Segment Averaging Method)
+%
+% CALL:         out = confint(a,pl)
+%               
+%
+% INPUTS:
+%               a  -  input analysis objects containing power spectral
+%                     densities or magintude squared coherence.
+%               pl  - input parameter list
+%
+% OUTPUTS:         
+%               out - a collection object containing:
+%                 lcl - lower confidence level
+%                 ucl - upper confidence level
+%                 var - expected spectrum variance
+%
+%
+%              If the last input argument is a parameter list (plist).
+%              The following parameters are recognised.
+%
+% <a href="matlab:utils.helper.displayMethodInfo('ao', 'confint')">Parameters Description</a>
+% 
+% 
+% 
+%
+%
+% VERSION:    $Id: confint.m,v 1.20 2011/04/29 13:54:36 luigi Exp $
+%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+function varargout = confint(varargin)
+  
+  %%% Check if this is a call for parameters
+  if utils.helper.isinfocall(varargin{:})
+    varargout{1} = getInfo(varargin{3});
+    return
+  end
+  
+  import utils.const.*
+  utils.helper.msg(msg.PROC3, 'running %s/%s', mfilename('class'), mfilename);
+  
+  %%% Collect input variable names
+  in_names = cell(size(varargin));
+  for ii = 1:nargin,in_names{ii} = inputname(ii);end
+  
+  %%% Collect all AOs
+  [as, ao_invars] = utils.helper.collect_objects(varargin(:), 'ao', in_names);
+  pl              = utils.helper.collect_objects(varargin(:), 'plist', in_names);
+  
+  %%% avoid multiple AO at input
+  if numel(as)>1
+    error('!!! Too many input AOs, CONFINT can process only one AO per time !!!')
+  end
+  
+  %%% avoid input modification
+  if nargout == 0
+    error('!!! CONFINT cannot be used as a modifier. Please give an output variable !!!');
+  end
+  
+  %%% Parse plists
+  pl = parse(pl, getDefaultPlist());
+  
+  %%% Find parameters
+  mtd  = lower(find(pl, 'method'));
+  conf = find(pl, 'conf');
+  dof  = find(pl, 'dof');
+  conf = conf/100; % go from percentage to fractional
+  Ntot = find(pl,'DataLength');
+  
+  %%% check that fsdata is input
+  if ~isa(as.data, 'fsdata')
+    error('!!! Non-fsdata input, CONFINT can process only fsdata !!!')
+  end
+
+  
+  % looking to dof
+  if isempty(dof)
+    calcdof = true;
+  else
+    if isa(dof, 'ao')
+      dof = dof.data.y;
+      calcdof = false;
+    else
+      calcdof = false;
+    end
+  end
+    
+  
+  %%% switching over methods
+  switch mtd
+    case 'psd'
+      %%% confidence levels for spectra calculated with psd
+      
+      % calculating dof
+      if calcdof
+        dofs = getdof(as,plist('method',mtd,'DataLength',Ntot));
+        dof = dofs.y;
+      end % if calcdof
+      dof = round(dof);
+      if length(dof)~=1
+        error('!!! CONFINT for ao/psd method, dof must be a single number')
+      end
+      
+      % Calculating Confidence Levels factors
+      alfa = 1 - conf;
+      c = utils.math.Chi2inv([1-alfa/2 alfa/2],dof);
+      c = dof./c;
+      
+      % calculating variance
+      expvar = ((as.data.y).^2).*2./dof;
+      
+      % calculating confidence levels
+      lwb = as.data.y.*c(1);
+      upb = as.data.y.*c(2);
+      
+    case 'lpsd'
+      %%% confidence levels for spectra calculated with lpsd
+      
+      % calculating dof
+      if calcdof
+        dofs = getdof(as,plist('method',mtd,'DataLength',Ntot));
+        dofs = dofs.y;
+
+        % extract number of frequencies bins
+        nf = length(as.x);
+        
+        cl = ones(nf,2);
+        for jj=1:nf
+
+          % Calculating Confidence Levels factors
+          alfa = 1 - conf;
+          c = utils.math.Chi2inv([1-alfa/2 alfa/2],dofs(jj));
+          c = dofs(jj)./c;
+
+          % storing c
+          cl(jj,1) = c(1);
+          cl(jj,2) = c(2);
+        end % for jj=1:nf
+      else % if calcdof
+        if length(dof)~=length(as.x)
+          error('!!! CONFINT for ao/lpsd method, dof must be a vector of the same length of the frequencies vector')
+        end
+        dofs = round(dof);
+        cl = ones(length(as.x),2);
+        for jj = 1:length(as.x)
+          % Calculating Confidence Levels factors
+          alfa = 1 - conf;
+          c = utils.math.Chi2inv([1-alfa/2 alfa/2],dofs(jj));
+          c = dofs(jj)./c;
+
+          % storing c
+          cl(jj,1) = c(1);
+          cl(jj,2) = c(2);
+        end
+      end % if calcdof
+      % willing to work with columns
+      dy = as.data.y;
+      [ii,kk] = size(dy);
+      if ii<kk
+        dy = dy.';
+        rsp = true;
+      else
+        rsp = false;
+      end
+      % calculating variance
+      expvar = ((dy).^2).*2./dofs;
+      
+      % calculating confidence levels
+      lwb = dy.*cl(:,1);
+      upb = dy.*cl(:,2);
+      
+      % reshaping if necessary
+      if rsp
+        expvar = expvar.';
+        lwb = lwb.';
+        upb = upb.';
+      end
+      
+    case 'mscohere'
+      %%% confidence levels for mscohere calculated with ao/cohere
+      
+      % calculating dof
+      if calcdof
+        dofs = getdof(as,plist('method',mtd,'DataLength',Ntot));
+        dof = dofs.y;
+      end % if calcdof
+      dof = round(dof);
+      if length(dof)~=1
+        error('!!! CONFINT for ao/cohere method, dof must be a single number')
+      end
+      
+      % Defining Y variable
+      Y = atanh(sqrt(as.data.y));
+      
+      % Calculating Confidence Levels factor
+      alfa = 1 - conf;
+      c = -sqrt(2).*erfcinv(2*(1-alfa/2))./sqrt(dof);
+      Ylwb = Y - c;
+      Yupb = Y + c;
+      
+      % calculating confidence levels
+      lwb = tanh(Ylwb).^2;
+      upb = tanh(Yupb).^2;
+      
+      % calculating variance
+      expvar = ((1-(as.data.y).^2).^2).*((as.data.y).^2).*4./dof;
+      
+    case 'mslcohere'
+      %%% confidence levels for spectra calculated with lpsd
+      
+      % calculating dof
+      if calcdof
+        dofs = getdof(as,plist('method',mtd,'DataLength',Ntot));
+        dofs = dofs.y;
+
+        % extract number of frequencies bins
+        nf = length(as.x);
+       
+        % willing to work with columns
+        dy = as.data.y;
+        [ii,kk] = size(dy);
+        if ii<kk
+          dy = dy.';
+          rsp = true;
+        else
+          rsp = false;
+        end
+  
+        % Defining Y variable
+        Y = atanh(sqrt(dy));
+
+        cl = ones(nf,2);
+        for jj=1:nf
+
+          % Calculating Confidence Levels factors
+          alfa = 1 - conf;
+          c = -sqrt(2).*erfcinv(2*(1-alfa/2))./sqrt(dofs(jj));
+
+          % storing c and dof
+          cl(jj,1) = Y(jj) - c;
+          cl(jj,2) = Y(jj) + c;
+        end % for jj=1:nf
+        
+      else % if calcdof
+        if length(dof)~=length(as.x)
+          error('!!! CONFINT for ao/lcohere method, dof must be a vector of the same length of the frequencies vector')
+        end
+        dofs = round(dof);
+        
+        % willing to work with columns
+        dy = as.data.y;
+        [ii,kk] = size(dy);
+        if ii<kk
+          dy = dy.';
+          rsp = true;
+        else
+          rsp = false;
+        end
+        
+        % Defining Y variable
+        Y = atanh(sqrt(dy));
+        
+        cl = ones(length(as.x),2);
+        for jj = 1:length(as.x)
+          % Calculating Confidence Levels factors
+          alfa = 1 - conf;
+          c = -sqrt(2).*erfcinv(2*(1-alfa/2))./sqrt(dofs(jj));
+
+          % storing c
+          cl(jj,1) = Y(jj) - c;
+          cl(jj,2) = Y(jj) + c;
+        end
+      end % if calcdof
+      
+      % calculating variance
+      expvar = ((1-(dy).^2).^2).*((dy).^2).*4./dofs;
+      
+      % get not well defined coherence estimations
+      idd = dofs<=2;
+      
+      % calculating confidence levels
+      lwb = tanh(cl(:,1));
+      % remove negative elements
+      idx = lwb < 0;
+      lwb(idx) = 0;
+      % set lower bound to zero in points where coharence is not well defined 
+      lwb(idd) = 0;
+      upb = tanh(cl(:,2));
+      % set upper bound to one in points where coharence is not well
+      % defined
+      upb(idd) = 1;
+      lwb = lwb.^2;
+      upb = upb.^2;
+      
+      % reshaping if necessary
+      if rsp
+        expvar = expvar.';
+        lwb = lwb.';
+        upb = upb.';
+      end
+      
+      
+      
+  end %switch mtd
+  
+  % Output data
+ 
+    
+  % defining units
+  inputunit = get(as.data,'yunits');
+  varunit = unit(inputunit.^2);
+  varunit.simplify;
+  levunit = inputunit;
+  levunit.simplify;
+  
+  
+  % variance
+  plvar = plist('xvals', as.data.x, 'yvals', expvar, 'type', 'fsdata');
+  ovar = ao(plvar);
+  
+  ovar.setFs(as.data.fs);
+  ovar.setT0(as.data.t0);
+  ovar.data.setEnbw(as.data.enbw);
+  ovar.data.setNavs(as.data.navs);
+  ovar.setXunits(as.data.xunits);
+  ovar.setYunits(varunit);
+  % Set output AO name
+  ovar.name = sprintf('var(%s)', ao_invars{:});
+  
+  % lower confidence level
+  pllwb = plist('xvals', as.data.x, 'yvals', lwb, 'type', 'fsdata');
+  olwb = ao(pllwb);
+
+  olwb.setFs(as.data.fs);
+  olwb.setT0(as.data.t0);
+  olwb.data.setEnbw(as.data.enbw);
+  olwb.data.setNavs(as.data.navs);
+  olwb.setXunits(copy(as.data.xunits,1));
+  olwb.setYunits(levunit);
+  % Set output AO name
+  clev = [num2str(conf*100) '%'];
+  olwb.name = sprintf('%s_low_conf_level(%s)', clev, ao_invars{:});
+  
+  % upper confidence level
+  plupb = plist('xvals', as.data.x, 'yvals', upb, 'type', 'fsdata');
+  oupb = ao(plupb);
+
+  oupb.setFs(as.data.fs);
+  oupb.setT0(as.data.t0);
+  oupb.data.setEnbw(as.data.enbw);
+  oupb.data.setNavs(as.data.navs);
+  oupb.setXunits(copy(as.data.xunits,1));
+  oupb.setYunits(levunit);
+  % Set output AO name
+  oupb.name = sprintf('%s_up_conf_level(%s)', clev, ao_invars{:});
+  
+  
+  outobj = collection(olwb,oupb,ovar);
+  outobj.setName(sprintf('%s conf levels for %s', clev, ao_invars{:}));
+  outobj.addHistory(getInfo('None'), pl, [ao_invars(:)], [as.hist]);
+  
+  varargout{1} = outobj;
+    
+  
+end
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%                               Local Functions                               %
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
+%----- LTPDA FUNCTIONS ----------------------------------------------------
+%--------------------------------------------------------------------------
+% Get Info Object
+%--------------------------------------------------------------------------
+function ii = getInfo(varargin)
+  if nargin == 1 && strcmpi(varargin{1}, 'None')
+    sets = {};
+    pl   = [];
+  else
+    sets = {'Default'};
+    pl   = getDefaultPlist;
+  end
+  % Build info object
+  ii = minfo(mfilename, 'ao', 'ltpda', utils.const.categories.sigproc, '$Id: confint.m,v 1.20 2011/04/29 13:54:36 luigi Exp $', sets, pl);
+  ii.setModifier(false);
+  ii.setOutmin(2);
+  ii.setOutmax(3);
+end
+
+%--------------------------------------------------------------------------
+% Get Default Plist
+%--------------------------------------------------------------------------
+
+function plout = getDefaultPlist()
+  persistent pl;  
+  if exist('pl', 'var')==0 || isempty(pl)
+    pl = buildplist();
+  end
+  plout = pl;  
+end
+
+
+function pl = buildplist()
+
+ 
+  pl = ao.getInfo('getdof', 'Default').plists;
+  
+  % Conf
+  p = param({'Conf', ['Required percentage confidence level.<br>' ...
+    'It is a number between 0 and 100.']}, ...
+    {1, {95}, paramValue.OPTIONAL});
+  pl.pset(p);
+  
+  % DOF
+  p = param({'dof', ['Degrees of freedom of the estimator. If it is<br>'...
+    'left empty they are calculated.']}, paramValue.EMPTY_DOUBLE);
+  pl.pset(p);
+end
+% END
+