You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('') and can be up to 35 characters long.
80 lines
2.5 KiB
80 lines
2.5 KiB
2 years ago

function [SE] = funcSampleEntropy(DataIn, m, r)






%% Description



% Calculate the sample entropy as described in



% Richman JS, Moorman JR (2000)



% "Physiological timeseries analysis using approximate entropy and sample entropy"



% American Journal of Physiology. Heart and Circulatory Physiology [2000, 278(6):H203949]



%



% The sample entropy is calculated as the natural logarithm of the



% probability that two samples of length m that are within a distance of r,



% remain within a distance of r when adding one additional sample. Note



% that distance is considered as the maximum of the distances for the



% individual dimensions 1 to m, and that the input data is normalised.



%



% Input:



% DataIn: a onedimensional time series



% m: the dimension of the vectors to be used. The vectors consist of m



% consecutive samples



% r: the maximum distance between two samples to qualify as a



% mathch, relative to the std of DataIn



%



% Output:



% SE: the calculated sample entropy



%






%% Copyright



% COPYRIGHT (c) 2012 Sietse Rispens, VU University Amsterdam



%



% This program is free software: you can redistribute it and/or modify



% it under the terms of the GNU General Public License as published by



% the Free Software Foundation, either version 3 of the License, or



% (at your option) any later version.



%



% This program is distributed in the hope that it will be useful,



% but WITHOUT ANY WARRANTY; without even the implied warranty of



% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the



% GNU General Public License for more details.



%



% You should have received a copy of the GNU General Public License



% along with this program. If not, see <http://www.gnu.org/licenses/>.






%% Author



% Sietse Rispens






%% History



% 7 May 2012, version 1.0






%% Check input



if size(DataIn,1) ~= 1 && size(DataIn,2) ~= 1



error('DataIn must be a vector');



end



DataIn = DataIn(:)/std(DataIn(:));



N = size(DataIn,1);



if Nm <= 0



error('m must be smaller than the length of the time series DataIn');



end






%% Create the vectors Xm to be compared



Xm = zeros(Nm,m);



for i = 1:m,



Xm(:,i) = DataIn(i:end1m+i,1);



end






%% Count the numbers of matches for Xm and Xmplusone



CountXm = 0;



CountXmplusone = 0;



XmDist = nan(size(Xm));



for i = 1:Nm,



for j=1:m,



XmDist(:,j)=abs(Xm(:,j)Xm(i,j));



end



IdXmi = find(max(XmDist,[],2)<=r);



CountXm = CountXm + length(IdXmi)  1;



CountXmplusone = CountXmplusone + sum(abs(DataIn(IdXmi+m)DataIn(i+m))<=r)  1;



end






%% Return sample entropy



SE = log(CountXmplusone/CountXm);



