0001 function varargout = prt_ui_custom_CV(varargin)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036 gui_Singleton = 1;
0037 gui_State = struct('gui_Name', mfilename, ...
0038 'gui_Singleton', gui_Singleton, ...
0039 'gui_OpeningFcn', @prt_ui_custom_CV_OpeningFcn, ...
0040 'gui_OutputFcn', @prt_ui_custom_CV_OutputFcn, ...
0041 'gui_LayoutFcn', [] , ...
0042 'gui_Callback', []);
0043 if nargin && ischar(varargin{1})
0044 gui_State.gui_Callback = str2func(varargin{1});
0045 end
0046
0047 if nargout
0048 [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
0049 else
0050 gui_mainfcn(gui_State, varargin{:});
0051 end
0052
0053
0054
0055
0056 function prt_ui_custom_CV_OpeningFcn(hObject, eventdata, handles, varargin)
0057
0058
0059
0060
0061
0062
0063 set(handles.figure1,'Name','PRoNTo :: Custom Cross-Validation')
0064
0065 S0= spm('WinSize','0',1);
0066 if ispc
0067 PF='MS Sans Serif';
0068 else
0069 PF= spm_platform('fonts');
0070 PF=PF.helvetica;
0071 end
0072 tmp = [S0(3)/1280 (S0(4))/800];
0073 ratio=min(tmp)*[1 1 1 1];
0074 FS = 1 + 0.85*(min(ratio)-1);
0075 x=get(handles.figure1,'Position');
0076 set(handles.figure1,'DefaultTextFontSize',FS*12,...
0077 'DefaultUicontrolFontSize',FS*12,...
0078 'DefaultTextFontName',PF,...
0079 'DefaultAxesFontName',PF,...
0080 'DefaultUicontrolFontName',PF)
0081 set(handles.figure1,'Position',ratio.*x)
0082 set(handles.figure1,'Resize','on')
0083
0084
0085 color=prt_get_defaults('color');
0086 set(handles.figure1,'Color',color.bg1)
0087 aa=get(handles.figure1,'children');
0088 for i=1:length(aa)
0089 if strcmpi(get(aa(i),'type'),'uipanel')
0090 set(aa(i),'BackgroundColor',color.bg2)
0091 bb=get(aa(i),'children');
0092 if ~isempty(bb)
0093 for j=1:length(bb)
0094 if isfield(get(bb(j)),'Style')
0095 if ~isempty(find(strcmpi(get(bb(j),'Style'),{'text',...
0096 'radiobutton','checkbox'})))
0097 set(bb(j),'BackgroundColor',color.bg2)
0098 elseif ~isempty(find(strcmpi(get(bb(j),'Style'),'pushbutton')))
0099 set(bb(j),'BackgroundColor',color.fr)
0100 end
0101 set(bb(j),'FontUnits','pixel')
0102 xf=get(bb(j),'FontSize');
0103 set(bb(j),'FontSize',ceil(FS*xf),'FontName',PF,...
0104 'FontUnits','normalized','Units','normalized')
0105 end
0106 end
0107 end
0108 elseif strcmpi(get(aa(i),'type'),'uicontrol')
0109 if ~isempty(find(strcmpi(get(aa(i),'Style'),{'text',...
0110 'radiobutton','checkbox','listbox'})))
0111 set(aa(i),'BackgroundColor',color.bg1)
0112 elseif ~isempty(find(strcmpi(get(aa(i),'Style'),'pushbutton')))
0113 set(aa(i),'BackgroundColor',color.fr)
0114 end
0115 end
0116 set(aa(i),'FontUnits','pixel')
0117 xf=get(aa(i),'FontSize');
0118 if ispc
0119 set(aa(i),'FontSize',ceil(FS*xf),'FontName',PF,...
0120 'FontUnits','normalized','Units','normalized')
0121 else
0122 set(aa(i),'FontSize',ceil(FS*xf),'FontName',PF,...
0123 'Units','normalized')
0124 end
0125 end
0126
0127
0128
0129 if ~isempty(varargin)
0130 handles.CV=varargin{1};
0131 dat=num2cell(handles.CV);
0132 handles.ID=varargin{2};
0133 handles.in=varargin{3};
0134 handles.prt=varargin{4};
0135 handles.leg=varargin{5};
0136 end
0137 set(handles.editcv,'Data',dat);
0138 disp_CV(hObject,handles,handles.ID,handles.CV)
0139 set(handles.editcv,'ColumnEditable',true(1,size(handles.CV,2)));
0140 lc=cell(size(handles.CV,2),1);
0141 for i=1:size(handles.CV,2)
0142 lc{i}=['fold ',num2str(i)];
0143 end
0144 set(handles.editcv,'ColumnName',lc)
0145 lr=cell(size(handles.CV,1),1);
0146 ID = handles.ID;
0147 ng = length(unique(ID(:,1)));
0148 if ng>1
0149 for i = 1:length(lr)
0150 lr{i}=[handles.prt.group(ID(i,1)).gr_name,' '];
0151 end
0152 end
0153 ns = length(unique(ID(:,2)));
0154 if ns>1
0155 for i = 1:length(lr)
0156 lr{i}=[lr{i},...
0157 handles.prt.group(ID(i,1)).subject(ID(i,2)).subj_name,' '];
0158 end
0159 end
0160 nm = length(unique(ID(:,3)));
0161 if nm>1
0162 for i = 1:length(lr)
0163 lr{i}=[lr{i},...
0164 handles.prt.group(ID(i,1)).subject(ID(i,2)).modality(ID(i,3)).mod_name,...
0165 ' '];
0166 end
0167 end
0168
0169 nc = length(unique(ID(:,4)));
0170 if nc>1
0171 for i = 1:length(lr)
0172 lr{i}=[lr{i},...
0173 handles.prt.group(ID(i,1)).subject(ID(i,2)).modality(ID(i,3)).design.conds(ID(i,4)).cond_name,...
0174 ' '];
0175 end
0176 end
0177
0178
0179
0180
0181
0182
0183
0184
0185
0186
0187
0188
0189
0190
0191
0192
0193
0194
0195
0196
0197
0198
0199 set(handles.editcv,'RowName',lr)
0200
0201 handles.flagdone=0;
0202 handles.selectedcells=[];
0203
0204 guidata(hObject, handles);
0205
0206
0207 uiwait(handles.figure1);
0208
0209
0210
0211
0212
0213 function varargout = prt_ui_custom_CV_OutputFcn(hObject, eventdata, handles)
0214
0215
0216
0217
0218
0219
0220 if isfield(handles,'output') && ~isempty(handles.output)
0221 varargout{1} = handles.output;
0222 else
0223 varargout{1}=[];
0224 end
0225
0226
0227 if isfield(handles,'figure1') && handles.flagdone
0228 delete(handles.figure1)
0229 end
0230
0231
0232
0233
0234
0235 function editcv_CellEditCallback(hObject, eventdata, handles)
0236
0237
0238
0239
0240
0241
0242
0243
0244 handles.CV=cell2mat(get(handles.editcv,'Data'));
0245
0246
0247 if ~isempty(handles.selectedcells)
0248 vtp=handles.CV(handles.selectedcells(end,1),handles.selectedcells(end,2));
0249 end
0250 if any(any(~ismember(vtp,[0,1,2])))
0251 beep
0252 disp('Values should be either 0, 1 or 2')
0253 return
0254 else
0255 tcol=unique(handles.selectedcells(:,2));
0256 ncol=length(tcol);
0257 for i=1:ncol
0258 icol=find(handles.selectedcells(:,2)==tcol(i));
0259 handles.CV(handles.selectedcells(icol,1),tcol(i))= ...
0260 vtp*ones(length(icol),1);
0261 end
0262 dat=num2cell(handles.CV);
0263 set(handles.editcv,'Data',dat)
0264 disp_CV(hObject,handles,handles.ID,handles.CV)
0265
0266 guidata(hObject, handles);
0267 end
0268
0269
0270
0271
0272 function editcv_CellSelectionCallback(hObject, eventdata, handles)
0273
0274
0275
0276
0277 handles.selectedcells=eventdata.Indices;
0278
0279 guidata(hObject, handles);
0280
0281
0282
0283
0284 function done_button_Callback(hObject, eventdata, handles)
0285
0286
0287
0288 handles.CV=cell2mat(get(handles.editcv,'Data'));
0289 if any(any(~ismember(handles.CV,[0,1,2])))
0290 beep
0291 disp('Values should be either 0, 1 or 2')
0292 return
0293 end
0294
0295 ind=[];
0296 for i=1:size(handles.CV,2)
0297
0298 if ~any(handles.CV(:,i))
0299 beep
0300 disp(['Column ',num2str(i),' has only zero values, it will be removed'])
0301 else
0302 if all(handles.CV(:,i)==1)
0303 beep
0304 disp(['Column ',num2str(i),' contains only train data'])
0305 return
0306 elseif all(handles.CV(:,i)==2)
0307 beep
0308 disp(['Column ',num2str(i),' contains only test data'])
0309 return
0310 else
0311 ind=[ind,i];
0312 end
0313 end
0314 end
0315 handles.CV=handles.CV(:,ind);
0316 [modelid, PRT] = prt_init_model(handles.prt,handles.in);
0317 PRT.model(modelid).input.cv_mat = handles.CV;
0318 PRT.model(modelid).input.cv_type=handles.in.cv.type;
0319
0320
0321
0322 disp('Updating PRT.mat.......>>')
0323 if spm_check_version('MATLAB','7') >= 0
0324 save(handles.in.fname,'-V7','PRT');
0325 else
0326 save(handles.in.fname,'-V6','PRT');
0327 end
0328 handles.flagdone=1;
0329
0330 guidata(hObject, handles);
0331 uiresume(handles.figure1)
0332
0333
0334
0335
0336 function save_button_Callback(hObject, eventdata, handles)
0337
0338
0339
0340
0341 ind=[];
0342 for i=1:size(handles.CV,2)
0343
0344 if ~any(handles.CV(:,i))
0345 beep
0346 disp(['Column ',num2str(i),' has only zero values, it will be removed'])
0347 else
0348 if all(handles.CV(:,i)==1)
0349 beep
0350 disp(['Column ',num2str(i),' contains only train data'])
0351 return
0352 elseif all(handles.CV(:,i)==2)
0353 beep
0354 disp(['Column ',num2str(i),' contains only test data'])
0355 return
0356 else
0357 ind=[ind,i];
0358 end
0359 end
0360 end
0361 handles.CV=handles.CV(:,ind);
0362 disp_CV(hObject,handles,handles.ID,handles.CV)
0363 CV=handles.CV;
0364 if ~ispc
0365 handles.in.fname = strrep(handles.in.fname,'\',filesep);
0366 end
0367 a=fileparts(handles.in.fname);
0368 cvnam=fullfile(a,['CV_model_',handles.in.model_name,'.mat']);
0369 disp('Saving Cross-Validation matrix in a .mat.......>>')
0370 if spm_check_version('MATLAB','7') >= 0
0371 save(cvnam,'-V7','CV');
0372 else
0373 save(cvnam,'-V6','CV');
0374 end
0375
0376 guidata(hObject, handles);
0377
0378
0379
0380
0381 function disp_CV(hObject,handles,dat,CV)
0382
0383 cla(handles.axes1)
0384 cla(handles.axes2)
0385 cla(handles.axes3)
0386
0387
0388 set(handles.figure1,'CurrentAxes',handles.axes1)
0389 for i=1:6
0390 dat(:,i)=dat(:,i)./max(dat(:,i));
0391 end
0392 imagesc(dat);
0393 set(gca,'XTick',1:6)
0394 set(gca,'XTickLabel',{'Group','Subject','Modality','Condition','Block','Scans'},...
0395 'FontWeight','demi','FontSize',7);
0396 set(gca,'YTickLabel',{})
0397 colorbar('Location','WestOutside')
0398 set(get(gca,'Title'),'String','Feature set','FontWeight','bold',...
0399 'FontSize',10)
0400
0401
0402 set(handles.figure1,'CurrentAxes',handles.axes2)
0403 xticksl=cell(1,size(CV,2));
0404 for i=1:size(CV,2)
0405 xticksl{i}=num2str(i);
0406 end
0407 clow1 = 0;
0408 clow2 = 0.5;
0409 chigh1 = 1;
0410 d1 = find(max(CV==0));
0411 d2 = find(min(CV==0));
0412 d3 = find(ismember(d1,d2));
0413 flag = 0;
0414 if ~isempty(d3)
0415 flag = 1;
0416 end
0417
0418
0419 if max(max(CV)-min(CV))>0.5
0420 indu=(CV==0);
0421 indt= (CV==2);
0422 indr = (CV==1);
0423 CV(indt)=clow1;
0424 CV(indu)=chigh1;
0425 CV(indr) = clow2;
0426 else
0427 indr=(CV==1);
0428 indt= (CV==2);
0429 CV(indt)=clow1;
0430 CV(indr)=clow2;
0431 end
0432
0433 set(gca,'FontWeight','bold')
0434 xlabel('CV Folds','fontweight','demi')
0435 imagesc(CV,[clow1 chigh1]);
0436 set(gca,'XTick',1:i)
0437 set(gca,'YTickLabel',{})
0438 set(gca,'XTickLabel',xticksl,'FontWeight','demi','FontSize',8)
0439 colormap(gray)
0440 set(get(gca,'Title'),'String','Cross-Validation','FontWeight','bold',...
0441 'FontSize',10)
0442
0443
0444 set(handles.figure1,'CurrentAxes',handles.axes3)
0445
0446 if max(max(CV)-min(CV))>0.5 || flag
0447 leg=[clow1; clow2; chigh1];
0448 imagesc(leg,[clow1 chigh1]);
0449 set(gca,'YTick',[1,2,3])
0450 set(gca,'YTickLabel',{'Test','Train','Unused'},'FontSize',8);
0451 else
0452 leg=[clow1; clow2];
0453 imagesc(leg,[clow1 chigh1]);
0454 set(gca,'YTick',[1,2])
0455 set(gca,'YTickLabel',{'Test','Train'},'Fontsize',8);
0456 end
0457 set(gca,'YAxisLocation','right')
0458 set(gca,'XTickLabel',{})
0459
0460
0461 guidata(hObject, handles);