123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- function [confC,phistd,Cerr]=coherr(C,J1,J2,err,trialave,numsp1,numsp2)
- % Function to compute lower and upper confidence intervals on the coherency
- % given the tapered fourier transforms, errchk, trialave.
- %
- % Usage: [confC,phistd,Cerr]=coherr(C,J1,J2,err,trialave,numsp1,numsp2)
- % Inputs:
- % C - coherence
- % J1,J2 - tapered fourier transforms
- % err - [errtype p] (errtype=1 - asymptotic estimates; errchk=2 - Jackknife estimates;
- % p - p value for error estimates)
- % trialave - 0: no averaging over trials/channels
- % 1 : perform trial averaging
- % numsp1 - number of spikes for data1. supply only if finite size corrections are required
- % numsp2 - number of spikes for data2. supply only if finite size corrections are required
- %
- % Outputs:
- % confC - confidence level for C - only for err(1)>=1
- % phistd - theoretical or jackknife standard deviation for phi for err(1)=1 and err(1)=2
- % respectively. returns zero if coherence is 1
- % Cerr - Jacknife error bars for C - only for err(1)=2
- % Jackknife uses the following transform of the coherence
- % z=sqrt(2*dim-2)atanh(C). Asymptotically (and for Gaussian data) var(z)=1.
- if nargin < 5; error('Need at least 5 input arguments'); end;
- if err(1)==0; error('Need err=[1 p] or [2 p] for error bar calculation'); end;
- if nargout==4 && err(1)==1; error('Cerr contains Jackknife errors: only computed when err(1) is 2'); end;
- [nf,K,Ch]=size(J1);
- errchk=err(1);
- p=err(2);
- pp=1-p/2;
- %
- % Find the number of degrees of freedom
- %
- if trialave;
- dim=K*Ch;
- dof=2*dim;
- dof1=dof;
- dof2=dof;
- Ch=1;
- if nargin>=6 && ~isempty(numsp1)
- totspikes1=sum(numsp1);
- dof1=fix(2*totspikes1*dof/(2*totspikes1+dof));
- end
- if nargin==7 && ~isempty(numsp2);
- totspikes2=sum(numsp2);
- dof2=fix(2*totspikes2*dof/(2*totspikes2+dof));
- end;
- dof=min(dof1,dof2);
- J1=reshape(J1,nf,dim);
- J2=reshape(J2,nf,dim);
- else
- dim=K;
- dof=2*dim;
- dof1=dof;
- dof2=dof;
- for ch=1:Ch;
- if nargin>=6 && ~isempty(numsp1);
- totspikes1=numsp1(ch);
- dof1=fix(2*totspikes1*dof/(2*totspikes1+dof));
- end;
- if nargin==7 && ~isempty(numsp2);
- totspikes2=numsp2(ch);
- dof2=fix(2*totspikes2*dof/(2*totspikes2+dof));
- end;
- dof(ch)=min(dof1,dof2);
- end;
- end;
- %
- % variance of the phase
- %
- %
- % Old code is the next few lines - new code is in the if statement below
- % beginning line 87
- %
- % if isempty(find((C-1).^2 < 10^-16));
- % phierr = sqrt((2./dof(ones(nf,1),:)).*(1./(C.^2) - 1));
- % else
- % phierr = zeros(nf,Ch);
- % end
- %
- % theoretical, asymptotic confidence level
- %
- if dof <= 2
- confC = 1;
- else
- df = 1./((dof/2)-1);
- confC = sqrt(1 - p.^df);
- end;
- %
- % Phase standard deviation (theoretical and jackknife) and jackknife
- % confidence intervals for C
- %
- if errchk==1;
- totnum=nf*Ch;
- phistd=zeros(totnum,1);
- CC=reshape(C,[totnum,1]);
- indx=find(abs(CC-1)>=1.e-16);
- dof=repmat(dof,[nf,1]);
- dof=reshape(dof,[totnum 1]);
- phistd(indx)= sqrt((2./dof(indx).*(1./(C(indx).^2) - 1)));
- phistd=reshape(phistd,[nf Ch]);
- elseif errchk==2;
- tcrit=tinv(pp,dof-1);
- for k=1:dim; % dim is the number of 'independent' estimates
- indxk=setdiff(1:dim,k);
- J1k=J1(:,indxk,:);
- J2k=J2(:,indxk,:);
- eJ1k=squeeze(sum(J1k.*conj(J1k),2));
- eJ2k=squeeze(sum(J2k.*conj(J2k),2));
- eJ12k=squeeze(sum(conj(J1k).*J2k,2));
- Cxyk=eJ12k./sqrt(eJ1k.*eJ2k);
- absCxyk=abs(Cxyk);
- atanhCxyk(k,:,:)=sqrt(2*dim-2)*atanh(absCxyk); % 1-drop estimate of z
- phasefactorxyk(k,:,:)=Cxyk./absCxyk;
- % indxk=setdiff(1:dim,k);
- % J1jk=J1(:,indxk,:);
- % J2jk=J2(:,indxk,:);
- % eJ1jk=squeeze(sum(J1jk.*conj(J1jk),2));
- % eJ2jk=squeeze(sum(J2jk.*conj(J2jk),2));
- % eJ12jk=squeeze(sum(conj(J1jk).*J2jk,2));
- % atanhCxyjk(k,:,:)=sqrt(2*dim-2)*atanh(abs(eJ12jk)./sqrt(eJ1jk.*eJ2jk));
- end;
- atanhC=sqrt(2*dim-2)*atanh(C); % z
- sigma12=sqrt(dim-1)*squeeze(std(atanhCxyk,1,1)); % Jackknife estimate std(z)=sqrt(dim-1)*std of 1-drop estimates
- % sigma12=sqrt(dim-1)*squeeze(std(atanhCxyjk,1,1));
- if Ch==1; sigma12=sigma12'; end;
- Cu=atanhC+tcrit(ones(nf,1),:).*sigma12;
- Cl=atanhC-tcrit(ones(nf,1),:).*sigma12;
- %Cerr(1,:,:) = tanh(Cl/sqrt(2*dim-2));
- Cerr(1,:,:) = max(tanh(Cl/sqrt(2*dim-2)),0); % This ensures that the lower confidence band remains positive
- Cerr(2,:,:) = tanh(Cu/sqrt(2*dim-2));
- %phistd=(2*dim-2)*(1-abs(squeeze(mean(phasefactorxyk))));
- phistd = sqrt( (2*dim-2)*(1-abs(squeeze(mean(phasefactorxyk)))) );
- if trialave; phistd=phistd'; end;
- end
- % ncrit=norminv(pp);
- % phierr=zeros([2 size(phistd)]);
- % phierr(1,:,:)=phi-ncrit*phistd; phierr(2,:,:)=phi+ncrit*phistd;
|