TEAP (Toolbox for Emotion Analysis using Physiological Signals) doc
hist2res.m
Go to the documentation of this file.
1 function [R]=hist2res(H,fun)
2 % Evaluates Histogram data
3 % [R]=hist2res(H)
4 %
5 % [y]=hist2res(H,fun)
6 % estimates fun-statistic
7 %
8 % fun 'mean' mean
9 % 'std' standard deviation
10 % 'var' variance
11 % 'sem' standard error of the mean
12 % 'rms' root mean square
13 % 'meansq' mean of squares
14 % 'sum' sum
15 % 'sumsq' sum of squares
16 % 'CM#' central moment of order #
17 % 'skewness' skewness
18 % 'kurtosis' excess coefficient (Fisher kurtosis)
19 %
20 % see also: NaN/statistic
21 %
22 % REFERENCES:
23 % [1] C.L. Nikias and A.P. Petropulu "Higher-Order Spectra Analysis" Prentice Hall, 1993.
24 % [2] C.E. Shannon and W. Weaver "The mathematical theory of communication" University of Illinois Press, Urbana 1949 (reprint 1963).
25 % [3] http://www.itl.nist.gov/
26 % [4] http://mathworld.wolfram.com/
27 
28 % This program is free software; you can redistribute it and/or
29 % modify it under the terms of the GNU General Public License
30 % as published by the Free Software Foundation; either version 2
31 % of the License, or (at your option) any later version.
32 %
33 % This program is distributed in the hope that it will be useful,
34 % but WITHOUT ANY WARRANTY; without even the implied warranty of
35 % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
36 % GNU General Public License for more details.
37 %
38 % You should have received a copy of the GNU General Public License
39 % along with this program; if not, write to the Free Software
40 % Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
41 
42 % $Id: hist2res.m 2202 2009-10-27 12:06:45Z schloegl $
43 % Copyright (c) 1996-2002,2006 by Alois Schloegl <a.schloegl@ieee.org>
44 % This is part of the BIOSIG-toolbox http://biosig.sf.net/
45 
46 
47 if strcmp(H.datatype,'HISTOGRAM')
48 
49 elseif strcmp(H.datatype,'qc:histo')
50  HDR = H;
51  if isfield(H,'THRESHOLD'),
52  TH = H.THRESHOLD;
53  else
54  TH = repmat([-inf,inf],HDR.NS,1);
55  end;
56  HIS = H.HIS;
57 
58  % remove overflowing samples
59  HIS.N = sumskipnan(HIS.H);
60  for k = 1:size(HIS.H,2);
61  t = HIS.X(:,min(k,size(HIS.X,2)));
62  HIS.H(xor(t<=min(TH(k,:)), t>=max(TH(k,:))),k) = 0;
63  end;
64  Nnew = sumskipnan(HIS.H);
65  R.ratio_lost = 1-Nnew./HIS.N;
66  HIS.N = Nnew;
67 
68  % scale into physical values
69  if H.FLAG.UCAL,
70  %t = HIS.X;
71  %for k=1:length(HDR.InChanSelect),
72  % HIS.X(:,k) = t(:,min(size(t,2),k))*HDR.Calib(k+1,k)+HDR.Calib(1,k);
73  %end;
74  HIS.X = [ones(size(HIS.X,1),1),repmat(HIS.X,1,size(HIS.H,2)./size(HIS.X,2))]*H.Calib;
75  end;
76  H = HIS;
77 else
78  fprintf(2,'ERROR: arg1 is not a histogram\n');
79  return;
80 end;
81 if nargin<2, fun=[]; end;
82 
83 global FLAG_implicit_unbiased_estimation;
84 %%% check whether FLAG was already defined
85 if exist('FLAG_implicit_unbiased_estimation')~=1,
86  FLAG_implicit_unbiased_estimation=[];
87 end;
88 %%% set DEFAULT value of FLAG
89 if isempty(FLAG_implicit_unbiased_estimation),
90  FLAG_implicit_unbiased_estimation=logical(1);
91 end;
92 
93 sz = size(H.H)./size(H.X);
94 R.N = sumskipnan(H.H,1);
95 R.SUM = sumskipnan(H.H.*repmat(H.X,sz),1);
96 R.SSQ = sumskipnan(H.H.*repmat(H.X.*H.X,sz),1);
97 %R.S3P = sumskipnan(H.H.*repmat(H.X.^3,sz),1); % sum of 3rd power
98 R.S4P = sumskipnan(H.H.*repmat(H.X.^4,sz),1); % sum of 4th power
99 %R.S5P = sumskipnan(H.H.*repmat(H.X.^5,sz),1); % sum of 5th power
100 
101 R.MEAN = R.SUM./R.N;
102 R.MSQ = R.SSQ./R.N;
103 R.RMS = sqrt(R.MSQ);
104 R.SSQ0 = R.SSQ-R.SUM.*R.MEAN; % sum square of mean removed
105 
106 if FLAG_implicit_unbiased_estimation,
107  n1 = max(R.N-1,0); % in case of n=0 and n=1, the (biased) variance, STD and STE are INF
108 else
109  n1 = R.N;
110 end;
111 
112 R.VAR = R.SSQ0./n1; % variance (unbiased)
113 R.STD = sqrt(R.VAR); % standard deviation
114 R.SEM = sqrt(R.SSQ0./(R.N.*n1)); % standard error of the mean
115 R.SEV = sqrt(n1.*(n1.*R.S4P./R.N+(R.N.^2-2*R.N+3).*(R.SSQ./R.N).^2)./(R.N.^3)); % standard error of the variance
116 R.Coefficient_of_variation = R.STD./R.MEAN;
117 
118 R.CM2 = R.SSQ0./n1;
119 x = repmat(H.X,sz) - repmat(R.MEAN,size(H.X,1),1);
120 R.CM3 = sumskipnan(H.H.*(x.^3),1)./n1;
121 R.CM4 = sumskipnan(H.H.*(x.^4),1)./n1;
122 %R.CM5 = sumskipnan(H.H.*(x.^5),1)./n1;
123 
124 R.SKEWNESS = R.CM3./(R.STD.^3);
125 R.KURTOSIS = R.CM4./(R.VAR.^2)-3;
126 R.MAD = sumskipnan(H.H.*abs(x),1)./R.N; % mean absolute deviation
127 
128 H.PDF = H.H./H.N(ones(size(H.H,1),1),:);
129 status=warning('off');
130 R.ENTROPY = -sumskipnan(H.PDF.*log2(H.PDF),1);
131 warning(status);
132 R.QUANT = repmat(min(diff(H.X,[],1)),1,size(H.H,2)/size(H.X,2));
133 R.MAX = max(H.X);
134 R.MIN = min(H.X);
135 R.RANGE = R.MAX-R.MIN;
136 
137 if ~isempty(fun),
138  fun=upper(fun);
139  if strncmp(fun,'CM',2)
140  oo = str2double(fun(3:length(fun)));
141  R = sumskipnan(H.PDF.*(x.^oo),1);
142  else
143  R = getfield(R,fun);
144  end;
145 end;
146 
hist2res
function hist2res(in H, in fun)
str2double
function str2double(in s, in cdelim, in rdelim, in ddelim)