Skip to content
Snippets Groups Projects
Commit 428ce439 authored by marwan's avatar marwan
Browse files

initial import

parent 76915243
No related branches found
No related tags found
No related merge requests found
function y = twinsurr(varargin)
% TWINSURR Creates twin surrogates for statistical tests.
% Y=TWINSURR(X) creates twin surrogates Y based on the vector X
% using recurrences. The matrix Y contains 100 columns of
% 100 twin surrogates. If X is a PxQ matrix, the resulting
% surrogate matrix is Px100xQ.
%
% Y=TWINSURR(X,M,T,E,...) creates twin surrogates using
% embedding dimension M, delay T, recurrence threshold E. The
% input arguments are similar to those of the command CRP.
%
% Y=TWINSURR(X,M,T,E,...,N) creates N surrogates (default is 100).
%
% Example: x = rand(3,1);
% a = [.8 .3 -.25 .9]';
% for i = 4:1000,
% x(i) = sum(a(1:3) .* x(i-1:-1:i-3)) + a(end) * randn;
% end
% xs = twinsurr(x,1,1,.1,'euc',10);
%
% See also CRP, RECONS.
%
% References:
% Thiel, M., Romano, M. C., Kurths, J., Rolfs, M., Kliegl, R.:
% Twin Surrogates to Test for Complex Synchronisation,
% Europhys. Lett., 75, 2006.
% Copyright (c) 2008 by AMRON
% Norbert Marwan, Potsdam University, Germany
% http://www.agnld.uni-potsdam.de
%
% $Date$
% $Revision$
%
% $Log$
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% programme properties
global errcode props
init_properties
nsur_init = 100;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% check the input
error(nargchk(1,7,nargin));
if nargout>1, error('Too many output arguments'), end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% read the input
% transform any int to double
intclasses = {'uint8';'uint16';'uint32';'uint64';'int8';'int16';'int32';'int64'};
flagClass = [];
for i = 1:length(intclasses)
i_int=find(cellfun('isclass',varargin,intclasses{i}));
if ~isempty(i_int)
for j = 1:length(i_int)
varargin{i_int(j)} = double(varargin{i_int(j)});
end
flagClass = [flagClass; i_int(:)];
end
end
if ~isempty(flagClass)
disp(['Warning: Input arguments at position [',num2str(flagClass'),'] contain integer values']);
disp(['(now converted to double).'])
end
varargin{8}=[];
i_double=find(cellfun('isclass',varargin,'double'));
i_char=find(cellfun('isclass',varargin,'char'));
check_meth={'ma','eu','mi','nr','rr','fa','in','om','op','di'}; % maxnorm, euclidean, nrmnorm, fan, distance
check_norm={'non','nor'}; % nonormalize, normalize
if isnumeric(varargin{1}) % read commandline input
% check the text input parameters for method, gui
temp_meth=0;
temp_norm=0;
if ~isempty(i_char)
for i=1:length(i_char),
varargin{i_char(i)}(4)='0';
temp_norm=temp_norm+strcmpi(varargin{i_char(i)}(1:3),check_norm');
temp_meth=temp_meth+strcmpi(varargin{i_char(i)}(1:2),check_meth');
end
method_n=min(find(temp_meth));
nonorm=min(find(temp_norm))-1;
for i=1:length(i_char); temp2(i,:)=varargin{i_char(i)}(1:3); end
if isempty(nonorm), nonorm=1; end
if nonorm>1, nonorm=1; end
if isempty(method_n), method_n=1; end
if method_n>length(check_meth), method0=length(check_meth); end
method=check_meth{method_n};
norm_str = check_norm{nonorm+1};
else
method = 'max'; norm_str = 'non';
end
% get the parameters for creating RP
if max(size(varargin{1}))<=3
disp('Error using ==> twinsurr')
disp('To less values in data X.')
return
end
x=double(varargin{1});
if ~isempty(varargin{i_double(2)}), m=varargin{i_double(2)}(1); else m=1; end
if ~isempty(varargin{i_double(3)}), t=varargin{i_double(3)}(1); else t=1; end
if ~isempty(varargin{i_double(4)}), e=varargin{i_double(4)}(1); else e=.1; end
if ~isempty(varargin{i_double(5)}), nsur=varargin{i_double(5)}(1); else nsur=nsur_init; end
else
disp('Error using ==> twinsurr')
disp('No valid arguments.')
return
end
N = length(x);
if size(x,1) < size(x,2), x = x'; end
m = size(x,2);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% make surrogates
X = crp(x,m,t,e,method,norm_str,'sil');
NX = length(X);
%% find twins
h = waitbar(0,'Searching Twins');
for i = 1:NX, waitbar(i/NX)
A = repmat(X(:,i),1,NX);
S{i} = find(all(X == A));
end
delete(h)
for k = 1:nsur
%% chose randomly first point
i = ceil(NX * rand);
xs = x(i,:);
%% jump randomly between twins until length of surrogate is reached
while length(xs) < N
j = S{i};
j_i = ceil(length(j) * rand);
i = j(j_i);
i = i + 1;
if i > NX
i = ceil(NX * rand);
continue
end
xs = [xs; x(i,:)];
end
y(:,k,1:m) = reshape(xs(:),N,1,m);
end
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment