0001 function [D,E,R]=nt_cca_aad(xA,xB,y,ssize)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 if nargin<3; error('!'); end
0013 if nargin<4; ssize=[]; end
0014
0015 if ssize ~= round(ssize); error('!'); end
0016
0017
0018 n=size(xA{1},1);
0019 for iTrial=1:numel(xA)
0020 if size(xA{iTrial}) ~= size(xB{iTrial}); error('!'); end
0021 if size(xA{iTrial}) ~= size(y{iTrial}); error('!'); end
0022 n=min(n,size(xA{iTrial},1));
0023 end
0024 if isempty(ssize); ssize=n; end
0025 n=ssize*floor(n/ssize);
0026 if n<1; error('!'); end
0027 for iTrial=1:numel(xA)
0028 xA{iTrial}=nt_demean(xA{iTrial}(1:n,:));
0029 xB{iTrial}=nt_demean(xB{iTrial}(1:n,:));
0030 y{iTrial}=nt_demean(y{iTrial}(1:n,:));
0031 end
0032 nsegments=n/ssize;
0033 ntrials=numel(xA);
0034
0035
0036 x={};
0037 for iTrial=1:numel(xA)
0038 x{iTrial}=[xA{iTrial},xB{iTrial}];
0039 end
0040
0041
0042 shifts=[0];
0043 [AA,BB,RR]=nt_cca_crossvalidate(xA,y,shifts);
0044 R=mean(RR,3);
0045
0046 for iTrial=1:ntrials
0047
0048
0049 others=setdiff(1:ntrials,iTrial);
0050
0051
0052 xA_CC=nt_mmat(xA(others),AA{iTrial});
0053 xB_CC=nt_mmat(xB(others),AA{iTrial});
0054 yCC=nt_mmat(y(others),BB{iTrial});
0055 ncomp=size(xA_CC{1},2);
0056
0057
0058 XA=zeros(ssize,ncomp,numel(others),nsegments);
0059 XB=zeros(ssize,ncomp,numel(others),nsegments);
0060 Y=zeros(ssize,ncomp,numel(others),nsegments);
0061 for iTrial2=1:numel(others)
0062 for iWindow=1:nsegments
0063 start=(iWindow-1)*ssize;
0064 XA(:,:,iTrial2,iWindow)=nt_normcol(nt_demean(xA_CC{iTrial2}(start+(1:ssize),:)));
0065 XB(:,:,iTrial2,iWindow)=nt_normcol(nt_demean(xB_CC{iTrial2}(start+(1:ssize),:)));
0066 Y(:,:,iTrial2,iWindow)=nt_normcol(nt_demean(yCC{iTrial2}(start+(1:ssize),:)));
0067 end
0068 end
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079 D_match=sqrt(mean((XA-Y).^2));
0080 sz=size(D_match); D_match=reshape(D_match,sz(2:end));
0081 D_match=D_match(:,:)';
0082
0083
0084 D_mismatch=sqrt(mean((XB-Y).^2));
0085 sz=size(D_mismatch); D_mismatch=reshape(D_mismatch,sz(2:end));
0086 D_mismatch=D_mismatch(:,:)';
0087
0088
0089
0090
0091 c0=nt_cov(D_mismatch)/size(D_mismatch,1);
0092 c1=nt_cov(D_match)/size(D_match,1);
0093 [todss,pwr0,pwr1]=nt_dss0(c1,c0);
0094 if mean(D_match*todss(:,1))<0; todss=-todss; end
0095
0096
0097 if 1
0098 DD_match=D_match*todss(:,1);
0099 DD_mismatch=D_mismatch*todss(:,1);
0100 else
0101 DD_match=D_match(:,1);
0102 DD_mismatch=D_mismatch(:,1);
0103 end
0104
0105
0106
0107
0108
0109 dprime(iTrial)=abs(mean(DD_match)-mean(DD_mismatch)) / std([DD_match-mean(DD_match); DD_mismatch-mean(DD_mismatch)]);
0110
0111
0112
0113
0114
0115
0116
0117 We now have a CCA solution and a JD transform calculated
0118 on other trials.
0119
0120 We apply them to segments of this trial.
0121
0122
0123
0124 xA_x=nt_mmat(xA{iTrial},AA{iTrial});
0125 xB_x=nt_mmat(xB{iTrial},AA{iTrial});
0126 y_x=nt_mmat(y{iTrial},BB{iTrial});
0127
0128
0129 XA_x=zeros(ssize,ncomp,nsegments);
0130 XB_x=zeros(ssize,ncomp,nsegments);
0131 Y_x=zeros(ssize,ncomp,nsegments);
0132 for iWindow=1:nsegments
0133 start=(iWindow-1)*ssize;
0134 XA_x(:,:,iWindow)=nt_normcol(nt_demean(xA_x(start+(1:ssize),:)));
0135 XB_x(:,:,iWindow)=nt_normcol(nt_demean(xB_x(start+(1:ssize),:)));
0136 Y_x(:,:,iWindow)=nt_normcol(nt_demean(y_x(start+(1:ssize),:)));
0137 end
0138
0139
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151 D_match_x=zeros(nsegments,ncomp);
0152 D_mismatch_x=zeros(nsegments,ncomp);
0153 for iWindow=1:nsegments
0154 D_match_x(iWindow,:)=sqrt( mean((XA_x(:,:,iWindow)-Y_x(:,:,iWindow)).^2) );
0155 D_mismatch_x(iWindow,:)=sqrt( mean((XB_x(:,:,iWindow)-Y_x(:,:,iWindow)).^2) );
0156 end
0157
0158 if 1
0159 D_match_x=D_match_x*todss(:,1);
0160 D_mismatch_x=D_mismatch_x*todss(:,1);
0161 else
0162 D_match_x=D_match_x(:,1);
0163 D_mismatch_x=D_mismatch_x(:,1);
0164 end
0165
0166
0167
0168
0169 err(iTrial)=numel(find(D_mismatch_x<D_match_x))/nsegments;
0170
0171 end
0172
0173 D=mean(dprime);
0174 E=mean(err);
0175
0176