PhysioNet Cardiovascular Signal Toolbox 1.0.0
(4,131 bytes)
function [entropy, conf95] = sampenMaxim(data, m, r)
% SAMPEN Calculate SampEn value
%
% Description:
% The function takes a column vector of data and calculates Sample
% Entropy value of order m and similarity r.
%
% Arguments:
% data - column vector with data
% m - pattern length
% r - similarity criteria (absolute value)
%
% Results:
% entropy - Sample Entropy value
% conf95 - 95% confidence interval
%
% Copyright (C) 2011-2013, Maxim Osipov
%
% All rights reserved.
%
% Redistribution and use in source and binary forms, with or without modification,
% are permitted provided that the following conditions are met:
%
% - Redistributions of source code must retain the above copyright notice, this
% list of conditions and the following disclaimer.
% - Redistributions in binary form must reproduce the above copyright notice,
% this list of conditions and the following disclaimer in the documentation
% and/or other materials provided with the distribution.
% - Neither the name of the University of Oxford nor the names of its
% contributors may be used to endorse or promote products derived from this
% software without specific prior written permission.
%
% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
% ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
% WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
% IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
% INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
% BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
% DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
% LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
% OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
% OF THE POSSIBILITY OF SUCH DAMAGE.
%
len = length(data);
% create an array of all m-templates
tpl_len = len-m+1;
tpl_data = zeros(tpl_len, m);
i_tpl = 1; % index of first template
n_tpl = 0; % length of first template series
for i_data = 1:m
n_data = floor((len-i_data+1)/m)*m;
i_tpl = i_tpl + n_tpl;
n_tpl = floor(n_data/m);
tpl_data(i_tpl:(i_tpl+n_tpl-1), :) =...
reshape(data(i_data:(i_data+n_data-1)), m, n_tpl)';
end
% count template matches, excluding self-matches
BB = zeros(1, tpl_len);
tpl_data = repmat(tpl_data, 2, 1);
% shifting the vector until floor((tpl_len/2)+1 to avoid
% double count of the same match
for i_tpl = 2:floor((tpl_len/2)+1)
tpl_diff = abs(tpl_data(1:tpl_len, :) -...
tpl_data(i_tpl:i_tpl+tpl_len-1, :));
BB(i_tpl-1) = sum(sum((tpl_diff < r), 2) == m);
end
B = sum(BB)/(len-m);
% create an array of all m+1 templates
mp = m+1;
tpl_len = len-mp+1;
tpl_data = zeros(tpl_len, mp);
i_tpl = 1; % index of first template
n_tpl = 0; % length of first template series
for i_data = 1:mp,
n_data = floor((len-i_data+1)/mp)*mp;
i_tpl = i_tpl + n_tpl;
n_tpl = floor(n_data/mp);
tpl_data(i_tpl:(i_tpl+n_tpl-1), :) =...
reshape(data(i_data:(i_data+n_data-1)), mp, n_tpl)';
end
% count template matches, excluding self-matches
AA = zeros(1, tpl_len);
tpl_data = repmat(tpl_data, 2, 1);
% shifting the vector until floor((tpl_len/2)+1) to avoid
% double count of the same match
for i_tpl = 2:floor((tpl_len/2)+1),
tpl_diff = abs(tpl_data(1:tpl_len, :) -...
tpl_data(i_tpl:i_tpl+tpl_len-1, :));
AA(i_tpl-1) = sum(sum((tpl_diff < r), 2) == mp);
end
A = sum(AA)/(len-mp);
% calculate value of sample entropy
if (A<=0) || (B<=0),
entropy = -log(1/(m*mp));
else
entropy = -log((A/(len-mp))/(B/(len-m)));
end
% calculate 95% confidence interval
EE = AA(1:len-mp)./BB(1:len-mp);
conf95 = std(EE)*tinv(0.95,length(EE))/sqrt(length(EE));
end