somtoolbox2/nanstats.m
4dbef185
 function [me, st, md, no] = nanstats(D)
 
 %NANSTATS Statistical operations that ignore NaNs and Infs.
 %
 % [mean, std, median, nans] = nanstats(D)
 %
 %  Input and output arguments: 
 %   D   (struct) data or map struct
 %       (matrix) size dlen x dim
 %
 %   me  (double) columnwise mean
 %   st  (double) columnwise standard deviation
 %   md  (double) columnwise median
 %   no  (vector) columnwise number of samples (finite, not-NaN)
 
 % Contributed to SOM Toolbox vs2, February 2nd, 2000 by Juha Vesanto
 % http://www.cis.hut.fi/projects/somtoolbox/
 
 % Version 2.0beta juuso 300798 200900
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% check arguments
 
 (nargchk(1, 1, nargin));  % check no. of input args is correct
 
 if isstruct(D), 
   if strcmp(D.type,'som_map'), D = D.codebook;
   else D = D.data;
   end
 end
 [dlen dim] = size(D);
 me = zeros(dim,1)+NaN;
 md = me;
 st = me;
 no = me;
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 %% computation
 
 for i = 1:dim,
   ind = find(isfinite(D(:, i))); % indices of non-NaN/Inf elements
   n   = length(ind);             % no of non-NaN/Inf elements
 
   me(i) = sum(D(ind, i)); % compute average
   if n == 0, me(i) = NaN; else me(i) = me(i) / n; end
 
   if nargout>1, 
     md(i) = median(D(ind, i)); % compute median
 
     if nargout>2, 
       st(i) = sum((me(i) - D(ind, i)).^2); % compute standard deviation
       if n == 0,     st(i) = NaN;
       elseif n == 1, st(i) = 0;
       else st(i) = sqrt(st(i) / (n - 1));
       end
 
       if nargout>3, 
 	no(i) = n; % number of samples (finite, not-NaN)
       end
     end
   end
 end
 
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%