Global Index (all files) (short | long) | Local Index (files in subdir) (short | long)
[ccoef,sig,acr] = lagcorr(data,refer,lags,level,degf);
function [ccoef,sig] = lagcorr(data,refer,[lags],[level],[degf]); calculate lagged correlations and their significance input : data - data array refer - reference series [lags] [0] - vector of lags (reference leads for positive) [level] [95] - significance level in % to be checked [degf] - degrees of freedom of reference series output : ccoef - correlation coefficient sig - significant (1,-1) or not (0) Correlation is calculated between refer and the dim of data which agrees in length. If there is more than one, the first is taken. Default is simple correlation without lag. If lags are given, the results for the different lags are listed in the lagged dimension. The degrees of freedom of the series can be prescribed as an integer>0 or as a fraction of the length, otherwise the length of the lagged series is taken. uses : anorm.m version 0.1.2 last change 17.03.2004
This function calls | |
---|---|
function [ccoef,sig,acr] = lagcorr(data,refer,lags,level,degf); % G.Krahmann, LODYC Paris, May 1998 % references : Bendat, Piersol: Random Data: Analysis and measurement % procedures % Wiley-Interscience, 1971, p.125-128 % history: % % removed bug G.Krahmann, LODYC Paris 1998 0.1.0 --> 0.1.1 % changed shiftdim in 5.2 ? % catch correl of 1 G.K. LDEO 2004 0.1.1 --> 0.1.2 % % check arguments % if nargin<2 error('Not enough input arguments.') end refer = squeeze(refer); lr = length(refer); if ~(size(refer,1)==1 | size(refer,2)==1) error('Reference series must be a vector.') end if sum( lr==size(data) )==0 error('Data must contain a dimension with the length of the reference.') end if nargin<5 degf = []; end if nargin<4 level = 95; end if nargin<3 lags = 0; end if sum(isnan(refer))>1 error('Reference series must not contain NaN''s') end if degf<0 | ( degf>1 & degf<4 ) warning('Skipping degrees of freedom.') degf = []; end % % check for simple case % simple = 0; if length(lags)==1 if lags==0 simple = 1; end end % % prepare output arrays % ds = size(data); di = find(ds==lr); di = di(1); ns = ds; ns(di) = length(lags); ccoef = repmat(0,ns); sig = repmat(0,ns); acr = repmat(0,ns); % % subtract mean and enlarge reference % dr = ones(1,length(ns)); dr(di) = size(data,di); nr = ds; nr(di) = 1; data = data - repmat(nmean(data,di),dr); refer = refer - nmean(refer); ref = repmat(0,size(data)); ref = shiftdim(ref,di-1); % I was not able to get repamt for n=1:length(refer) % to work properly here ref(n,:) = ref(n,:) + refer(n); end ref = shiftdim(ref,length(ds)-di+1); % % correlation level % al = anorm(100-level); % % do correlations % if simple==1 ref2 = refer.^2; mref2 = mean(ref2); ccoef = nmean(data.*ref,di)./sqrt( mref2 * nmean(data.^2,di) ); if nargout>1 if isempty(degf) ng = sum( isfinite(data), di ); elseif degf>3 ng = floor(degf(1)); else ng = sum( isfinite(data), di )*degf; end [ccoef,ind1] = nans(ccoef,nan,1,'=='); [ccoef,ind2] = nans(ccoef,nan,-1,'=='); acr = 0.5*sqrt(ng-3).*log( (1+ccoef)./(1-ccoef) ); sig = (abs(acr)>al).*sign(real(acr)); if ~isempty(ind1) sig(ind1) = 1; ccoef(ind1) = 1; end if ~isempty(ind2) sig(ind2) = -1; ccoef(ind2) = -1; end end else % shift dimensions to get the series into the first ref = shiftdim(ref,di-1); data = shiftdim(data,di-1); ccoef = shiftdim(ccoef,di-1); sig = shiftdim(sig,di-1); acr = shiftdim(acr,di-1); % reshape to get only two dimensions sr = size(ref); ref = reshape(ref,[sr(1),prod(sr(2:length(sr)))]); data = reshape(data,[sr(1),prod(sr(2:length(sr)))]); sc = size(ccoef); ccoef = reshape(ccoef,[sc(1),prod(sc(2:length(sc)))]); sig = reshape(sig,[sc(1),prod(sc(2:length(sc)))]); acr = reshape(acr,[sc(1),prod(sc(2:length(sc)))]); data2 = data.^2; for n=1:length(lags) if lags(n)<0 ref2 = refer(1-lags(n):length(refer)).^2; mref2 = mean(ref2); d = data(1:size(data,1)+lags(n),:); r = ref(1-lags(n):size(ref,1),:); ccoef(n,:) = nmean(d.*r,1)./sqrt( mref2 * nmean(d.^2,1) ); if isempty(degf) ng = sum( isfinite(d), 1 ); elseif degf>3 ng = floor(degf(1)); else ng = sum( isfinite(d), 1 )*degf; end [ccoef,ind1] = nans(ccoef,nan,1,'=='); [ccoef,ind2] = nans(ccoef,nan,-1,'=='); acr(n,:) = 0.5*sqrt(ng-3).*log( (1+ccoef(n,:))./(1-ccoef(n,:)) ); sig(n,:) = (abs(acr(n,:))>al).*sign(real(acr(n,:))); if ~isempty(ind1) sig(ind1) = 1; ccoef(ind1) = 1; end if ~isempty(ind2) sig(ind2) = -1; ccoef(ind2) = -1; end elseif lags(n)>0 ref2 = refer(1:length(refer)-lags(n)).^2; mref2 = mean(ref2); d = data(1+lags(n):size(data,1),:); r = ref(1:size(ref,1)-lags(n),:); ccoef(n,:) = nmean(d.*r,1)./sqrt( mref2 * nmean(d.^2,1) ); if isempty(degf) ng = sum( isfinite(d), 1 ); elseif degf>3 ng = floor(degf(1)); else ng = sum( isfinite(d), 1 )*degf; end [ccoef,ind1] = nans(ccoef,nan,1,'=='); [ccoef,ind2] = nans(ccoef,nan,-1,'=='); acr(n,:) = 0.5*sqrt(ng-3).*log( (1+ccoef(n,:))./(1-ccoef(n,:)) ); sig(n,:) = (abs(acr(n,:))>al).*sign(real(acr(n,:))); if ~isempty(ind1) sig(ind1) = 1; ccoef(ind1) = 1; end if ~isempty(ind2) sig(ind2) = -1; ccoef(ind2) = -1; end elseif lags(n)==0 ref2 = refer.^2; mref2 = mean(ref2); d = data; r = ref; ccoef(n,:) = nmean(d.*r,1)./sqrt( mref2 * nmean(d.^2,1) ); if isempty(degf) ng = sum( isfinite(d), 1 ); elseif degf>3 ng = floor(degf(1)); else ng = sum( isfinite(d), 1 )*degf; end [ccoef,ind1] = nans(ccoef,nan,1,'=='); [ccoef,ind2] = nans(ccoef,nan,-1,'=='); acr(n,:) = 0.5*sqrt(ng-3).*log( (1+ccoef(n,:))./(1-ccoef(n,:)) ); sig(n,:) = (abs(acr(n,:))>al).*sign(real(acr(n,:))); if ~isempty(ind1) sig(ind1) = 1; ccoef(ind1) = 1; end if ~isempty(ind2) sig(ind2) = -1; ccoef(ind2) = -1; end end end % reshape back ref = reshape(ref,sr); data = reshape(data,sr); ccoef = reshape(ccoef,sc); sig = reshape(sig,sc); acr = reshape(acr,sc); % shift dimensions back ref = shiftdim(ref,length(ds)-di+1); data = shiftdim(data,length(ds)-di+1); ccoef = shiftdim(ccoef,length(ds)-di+1); sig = shiftdim(sig,length(ds)-di+1); acr = shiftdim(acr,length(ds)-di+1); end