Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
function xout=erqa(varargin)
%ERQA Computes and plots the ERQA measures.
% Y=ERQA(X [,Y] [,param1,param2,...])
% Extended recurrence quantification analysis of
% cross-recurrence plots with the first vector
% X and the second Y.
%
% Y=ERQA(X,M,T,E,W,WS) computes the extended
% recurrence quantification analysis of the recurrence
% plot of X by using the dimension M, delay T, the
% size of neighbourhood E, the window size W and
% a window shifting value of WS.
%
% Parameters: dimension M, delay T, the size of
% neighbourhood E, the window size W and the shift
% value WS are the first five numbers after the data
% series; if W is empty, the whole plot will be calculated.
% Further parameters can be used to switch between various
% methods of finding the neighbours of the phasespace
% trajectory, to suppress the normalization of the data
% and to suppress the GUI (useful in order to use this
% programme by other programmes).
%
% Methods of finding the neighbours.
% maxnorm - Maximum norm.
% euclidean - Euclidean norm.
% nrmnorm - Euclidean norm between normalized vectors
% (all vectors have the length one).
% fan - Fixed amount of nearest neighbours.
% inter - Interdependent neighbours.
% distance - Distance coded matrix (global CRP).
%
% Normalization of the data series.
% normalize - Normalization of the data.
% nonormalize - No normalization of the data.
%
% Suppressing the GUI.
% gui - Creates (the GUI and) the output plot.
% nogui - Suppresses the GUI and the output plot.
% silent - Suppresses all output.
%
% Parameters not needed to specify.
%
% Output:
% Y(:,1) = K1
% Y(:,2) = K2
% Y(:,3) = D2
% Y(:,4) = I2
% Examples: a = randn(300,1);
% erqa(a,1,1,.2,40,2,'max')
% N = 300; w = 40; ws = 2;
% a = 3.4:.6/(N-1):4;
% b = .5; for i = 2:N, b(i) = a(i)*b(i-1)*(1-b(i-1)); end
% y = erqa(b,3,2,.1,w,ws,'nogui');
% subplot(2,1,1), plot(a,b,'.','markersize',.1)
% title('logistic map'), axis([3.4 4 0 1])
% ylabel('recurrence rate'), axis([3.4 4 0 1])
%
%
% See also CRP, CRP2, CRP_BIG, DL, TT.
%
% References:
% Thiel, M., Romano, M. C., Kurths, J.:
% Analytical description of Recurrence Plots of stochastic
% and chaotic processes, to be publ. 2002
%
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% % Please note, that this routine is not yet finished! %
% % Don't use the results of this script! %
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Copyright (c) 2008-2009
% Norbert Marwan, Potsdam Institute for Climate Impact Research, Germany
% http://www.pik-potsdam.de
%
% Copyright (c) 1998-2008
% Norbert Marwan, Potsdam University, Germany
% http://www.agnld.uni-potsdam.de
%
% $Date$
% $Revision$
%
% $Log$
% Revision 1.11 2007/12/20 16:26:05 marwan
% changed gpl splash behaviour
%
% Revision 1.10 2005/04/01 12:19:27 marwan
% *** empty log message ***
%
% Revision 1.9 2004/11/10 07:06:03 marwan
% initial import
%
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
%
% 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 2
% of the License, or any later version.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% check and read the input
error(nargchk(1,10,nargin));
if nargout>1, error('Too many output arguments'), end
varargin{11}=[];
i_double=find(cellfun('isclass',varargin,'double'));
i_char=find(cellfun('isclass',varargin,'char'));
% check the text input parameters for gui
check_gui={'gui','nog','sil'}; % gui, nogui, silent
temp_gui=0;
if ~isempty(i_char)
for i=1:length(i_char),
varargin{i_char(i)}(4)='0';
temp_gui=temp_gui+strcmpi(varargin{i_char(i)}(1:3),check_gui');
end
nogui=min(find(temp_gui))-1;
for i=1:length(i_char); temp2(i,:)=varargin{i_char(i)}(1:3); end
i_char(strmatch(check_gui(find(temp_gui)),temp2))=[];
if isempty(nogui), nogui=1; end
if nogui>2, nogui=1; end
else
nogui=1;
end
if nogui==0, warning('Sorry. GUI not yet available.'),end
% get the parameters for creating RP
if max(size(varargin{1}))<=3
error('To less values in data X.')
end
x=double(varargin{1});
if isempty(varargin{2}) | ~isnumeric(varargin{2}), y=x; else
y=double(varargin{2}); end
if (isnumeric(varargin{2}) & max(size(varargin{2}))==1) | ~isnumeric(varargin{2})
y=x;
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)}), w=varargin{i_double(5)}(1); else w=varargin{i_double(5)}; end
if ~isempty(varargin{i_double(6)}), wstep=varargin{i_double(6)}(1); else wstep=1; end
else
if ~isempty(varargin{i_double(3)}), m=varargin{i_double(3)}(1); else m=1; end
if ~isempty(varargin{i_double(4)}), t=varargin{i_double(4)}(1); else t=1; end
if ~isempty(varargin{i_double(5)}), e=varargin{i_double(5)}(1); else e=.1; end
if ~isempty(varargin{i_double(6)}), w=varargin{i_double(6)}(1); else w=varargin{i_double(6)}; end
if ~isempty(varargin{i_double(7)}), wstep=varargin{i_double(7)}(1); else wstep=1; end
end
Nx=length(x); Ny=length(y);
if size(x,1)<size(x,2), x=x'; end
if size(y,1)<size(y,2), y=y'; end
if size(x,2)>=2
xscale=x(:,1);
if ~isempty(find(diff(xscale)<0)), error('First column of the first vector must be monotonically non-decreasing.'),end
x=x(:,2);
else
xscale=(1:length(x))';
end
if size(y,2)>=2
yscale=y(:,1);
if ~isempty(find(diff(yscale)<0)), error('First column of the second vector must be monotonically non-decreasing.'),end
y=y(:,2);
else
yscale=(1:length(y))';
end
if max(size(x))~=max(size(y)),error('Data must have the same length.'),end
if e<0, e=1; disp('The threshold size E can not be negative and is now set to 1.'), end
if t<1, t=1; disp('The delay T can not be smaller than one and is now set to 1.'), end
if isempty(w), w=Nx-1; end
if w<2, w=2; disp('The window size W exceeds the valid range.'), end
if w>Nx, w=Nx-1; disp('The window size W exceeds the valid range.'), end
if wstep<2 & wstep>Nx/3, wstep=2; disp('The window shifting value WS exceeds the valid range.'), end
t=round(t); m=round(m); w=round(w); wstep=round(wstep);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% splash the GPL
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
which_res=which([filename,'.m']);
gplrc_path=[strrep(which_res,[filename,'.m'],''), 'private'];
gplrc_file=[gplrc_path, filesep, '.gpl.',filename];
if ~exist(gplrc_path)
mkdir(strrep(which_res,[filename,'.m'],''),'private')
end
if ~exist(gplrc_file)
fid=fopen(gplrc_file,'w');
fprintf(fid,'%s\n','If you delete this file, the GNU Public License will');
fprintf(fid,'%s','splash up at the next time the programme starts.');
fclose(fid);
if exist('gpl')
txt=gpl;
else
txt={'The GNU General Public License was not found.'};
end
h=figure('NumberTitle','off',...,
'ButtonDownFcn','close',...
'Name','GNU General Public License');
ha=get(h,'Position');
h=uicontrol('Style','Listbox',...
'ButtonDownFcn','close',...
'CallBack','close',...
'Position',[0 0 ha(3) ha(4)],...
'FontName','Courier',...
'BackgroundColor',[.8 .8 .8],...
'String',txt);
waitfor(h)
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% compute
de=.1;
if nogui~=2, h=waitbar(0,'1');h1=get(h,'chil');h1=get(h1,'title'); end
for i=1:wstep:Nx-w;
if nogui~=2, waitbar(i/(Nx-w));
txt=['CRP1 - ',num2str(i),'/',num2str(Nx-w)];
set(h1,'str',txt); drawnow, end
try
X1=crp(x(i:i+w-1,:),y(i:i+w-1,:),m,t,e,varargin{i_char},'silent');
if nogui~=2, txt=['CRP1a - ',num2str(i),'/',num2str(Nx-w)]; set(h1,'str',txt); drawnow, end
X1a=crp(x(i:i+w-1,:),y(i:i+w-1,:),m,t,e,varargin{i_char},'silent');
X2 = X1 .* X1a; X1 = X2;
if nogui~=2, txt=['CRP2 - ',num2str(i),'/',num2str(Nx-w)]; set(h1,'str',txt); drawnow, end
X2=crp(x(i:i+w-1,:),y(i:i+w-1,:),m,t,e+de,varargin{i_char},'silent');
X1a=crp(x(i:i+w-1,:),y(i:i+w-1,:),m,t,e+de,varargin{i_char},'silent');
X2a = X2 .* X1a; X2 = X2a;
if nogui~=2, txt=['CRP3 - ',num2str(i),'/',num2str(Nx-w)]; set(h1,'str',txt); drawnow, end
X3=crp(x(i:i+w-1,:),y(i:i+w-1,:),m+2,t,e,varargin{i_char},'silent');
X1a=crp(x(i:i+w-1,:),y(i:i+w-1,:),m+2,t,e,varargin{i_char},'silent');
X2a = X3 .* X1a; X3 = X2a;
catch
if nogui~=2, close(h), end
error(lasterr)
end
txt=['ERQA - ',num2str(i),'/',num2str(Nx-w)];
if nogui~=2, set(h1,'str',txt); drawnow, end
warning off
N=length(X1);
[ml NL]=dl(X1);
pl=hist(NL,[0:N]);
for j=1:N;
plc(j)=sum(pl([1:N-j]+j).*([1:N-j]+1));
end
Np=min(find(plc==0));
% 1st measure
i1=[round(.04*Np):round(.12*Np)]+1;
i2=[round(.3*Np):round(.85*Np)]+1;
%i1=2:round(.12*Np);
if length(i1)==1, i1=[]; end
if length(i2)==1, i2=[]; end
if ~isempty(i1),K1=-regress(log(plc(i1))',[i1',ones(length(i1),1)]);else K1=NaN; end
if ~isempty(i2),K2=-regress(log(plc(i2))',[i2',ones(length(i2),1)]);else K2=NaN; end
%K2=regress(log(plc(i2))',[i2',ones(length(i1),1)]);
%K2=log(plc(i2));
% 2nd measure
txt=['2RQA - ',num2str(i),'/',num2str(Nx-w)];
if nogui~=2, set(h1,'str',txt); drawnow, end
[ml NL]=dl(X2); N2=length(X2);
pl=hist(NL,[0:N2]);
for j=1:N2; plc2(j)=sum(pl([1:N2-j]+j).*([1:N2-j]+1)); end
l=round(ml);
D2=log(plc(l)/plc2(l))/log(e/(e+de));
% 3rd measure
H2=-log(sum(X1(:))/(N^2));
X1=double(X1);
for t=1:3;
j=1:N-t;k=1:N-t;
H2t(t)=-log(sum(sum(X1(k,j).*X1(k+t,j+t)))/(N^2));
end
I2=2*H2-H2t;
% ApEn
B=(sum(X1,1)-1)/(length(X1)+1); A=(sum(X3,1)-1)/(length(X3)+1);
ApEn = sum(log(B(find(B))))/(length(X1)+1) - sum(log(A(find(A))))/(length(X3)+1);
%SampEn
B=(sum(X1,1)-1)/(length(X1)-1); A=(sum(X3,1)-1)/(length(X1)-1);
SampEn = -log(mean(A)/mean(B));
warning on
Y(i,1)=K1(1);
Y(i,2)=K2(1);
Y(i,3)=D2;
Y(i,4)=I2(1);
Y(i,5)=I2(2);
Y(i,6)=I2(3);
end
if nogui~=2
close(h)
tx={'K1';'K2';'D2';'I2';'I2';'I2'};
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% plot
for i=1:4,subplot(2,2,i),plot(Y(1:wstep:end,i)),ylabel(tx(i));end
hold on
plot(Y(1:wstep:end,i+1),'r')
plot(Y(1:wstep:end,i+2),'g')
end
if nargout, xout=Y; end