pop_icathresh.m
来自「含有多种ICA算法的eeglab工具箱」· M 代码 · 共 306 行
M
306 行
% pop_icathresh() - main menu for choosing threshold for component% rejection in EEGLAB. %% Usage:% >> [OUTEEG rej] = pop_icathresh(INEEG, threshval, rejmethod, % rejvalue, interact);%% Inputs:% INEEG - input dataset% threshval - values of thresholds for each of the 3 statistical% measures. Default is [] and the program uses the value% in the dataset.% rejmethod - either 'percent', 'dataset' or 'current'. 'percent'% will reject a given percentage of components with% the highest value in one or several statistical % measure. 'dataset' will use an other dataset for% calibration. 'current' will use the current dataset% for calibration. Default is 'current'. % rejvalue - percentage if rejmethod is 'percent', dataset number% if rejmethod is 'dataset' (no input if 'current'). If it% is a percentage, '25' for instance means that the 25% % independent components with the highest values of one % statistical measure are rejected. Note that, one can % also enter one percentage per statistical value (such as % 25 20 30).% interact - interactive windows or just rejection%% Inputs:% OUTEEG - output dataset with updated thresholds % rej - new rejection array %% Graphic interface:% The graphic interface is divided into 3 parts. On the top, the % experimenter chooses the basis for the component rejection (see % rejmethod input). On the middle panel, the user can tune thresholds% manually and plot the distribution of statistical values. Each time % that setting of one of these two top panels is modified, the curve% on the third panel are redrawn. % The third panel is composed of 3 graphs, one for each statistical % measure. The blue curve on each graph indicates the accuracy of the% measure to detect artifactual components and non-artifactual % components of a dataset. Note that 'artifactual components are % defined with the rejection methods fields on the top (if you use % the percentage methods, these artifactual components may not actually% be artifactual). For accurate rejection, one should first reject% artifactual component manually and then set up the threshold to% approximate this manual rejection. The green curve indicate the% rejection when all measure are considered. Points on the blue and % on the green curves indicate the position of the current threshold on% the parametric curve. Not that for the green cumulative curve, this% point is at the same location for all graphs.% How to tune the threshold? To tune the threshold, one should try to % maximize the detection of non-artifactual components (because it is% preferable to miss some artifactual components than to classify as% artifactual non-artifact components). %% Author: Arnaud Delorme, CNL / Salk Institute, 2001%% See also: eeglab()%123456789012345678901234567890123456789012345678901234567890123456789012% Copyright (C) 2001 Arnaud Delorme, Salk Institute, arno@salk.edu%% 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% (at your option) any later version.%% This program is distributed in the hope that it will be useful,% but WITHOUT ANY WARRANTY; without even the implied warranty of% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the% GNU General Public License for more details.%% You should have received a copy of the GNU General Public License% along with this program; if not, write to the Free Software% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA% $Log: pop_icathresh.m,v $% Revision 1.5 2002/08/14 18:22:46 arno% new supergui arg%% Revision 1.4 2002/08/13 17:32:11 arno% new supergui call%% Revision 1.3 2002/08/12 18:32:15 arno% questdlg2%% Revision 1.2 2002/04/18 18:24:09 arno% typo can not%% Revision 1.1 2002/04/05 17:32:13 jorn% Initial revision%%PROBLEM: when the % is set and we change manually yhe threshold,% the software comes back to the percentage rejection% 01-25-02 reformated help & license -ad function [EEG, rej, com] = pop_icathresh( EEG, threshval, rejmethod, rejvalue, interact); com = [];rej = EEG.reject.gcompreject;if nargin < 1 help pop_icathresh; return; end;if nargin < 2 threshval = [];end;if nargin < 3 rejmethod = 'current';end;if nargin < 4 rejvalue = 25;end;if nargin < 5 interact = 1;end;if ~isempty(threshval) EEG.reject.threshentropy = threshval(1); EEG.reject.threshkurtact = threshval(2); EEG.reject.threshkurtdist = threshval(3);end;tagmenu = 'pop_icathresh';if ~isempty( findobj('tag', tagmenu)) error('cannot open two identical windows, close the first one first');end;% the current rejection will be stored in userdata of the figure% --------------------------------------------------------------gcf = figure('visible', 'off', 'numbertitle', 'off', 'name', 'Choose thresholds', 'tag', tagmenu, 'userdata', rej);pos = get(gca, 'position');q = [pos(1) pos(2) 0 0];s = [pos(3) pos(4) pos(3) pos(4)]./100;axis off;% definition of callbacks% -----------------------cb_cancel = [ 'userdat = get(gcbo, ''userdata'');' ... % restore thresholds 'EEG.reject.threshentropy = userdat{1};' ... 'EEG.reject.threshkurtact = userdat{2};' ... 'EEG.reject.threshkurtdist = userdat{3};' ... 'clear userdat; close(gcbf);' ];drawgraphs = [ 'if isempty( gcbf ), fig = gcf; else fig = gcbf; end;' ... % determine the figure handler 'if get( findobj(''parent'', fig, ''tag'', ''Ipercent''), ''value'') == 1, ' ... % test if percentage ' perc = str2num(get( findobj(''parent'', fig, ''tag'', ''Ipercenttext''), ''String''));' ... ' if length(perc < 2), perc = [perc perc perc]; end;' ... ' perc = round((100-perc) * length( EEG.stats.compenta) / 100);' ... % convert the percentage ' method = zeros( size( EEG.stats.compenta ) );' ... ' [tmprej tmpindex] = sort(EEG.stats.compenta(:));' ... ' method( tmpindex(perc(1)+1:end) ) = 1;' ... ' set( findobj(''parent'', fig, ''tag'', ''entstring''), ''string'', num2str(tmprej(perc(1)+1)));' ... % update threshold ' [tmprej tmpindex] = sort(EEG.stats.compkurta(:));' ... ' method( tmpindex(perc(2)+1:end) ) = 1;' ... ' set( findobj(''parent'', fig, ''tag'', ''kurtstring''), ''string'', num2str(tmprej(perc(1)+1)));' ... % update threshold ' [tmprej tmpindex] = sort(EEG.stats.compkurtdist(:));' ... ' method( tmpindex(perc(3)+1:end) ) = 1;' ... ' set( findobj(''parent'', fig, ''tag'', ''kurtdiststring''), ''string'', num2str(tmprej(perc(1)+1)));' ... % update threshold ' allvalues = [EEG.stats.compenta(:) EEG.stats.compkurta(:) EEG.stats.compkurtdist(:) ];' ... ' clear perc tmprej tmpindex;' ... 'end;' ... 'if get( findobj(''parent'', fig, ''tag'', ''Iother''), ''value'') == 1, ' ... % test if other dataset ' di = str2num(get( findobj(''parent'', fig, ''tag'', ''Iothertext''), ''String''));' ... ' if isempty( di ), clear fig; return; end;' ... ' method = ALLEEG(di).reject.gcompreject'';' ... ' allvalues = [ALLEEG(di).stats.compenta(:) ALLEEG(di).stats.compkurta(:) ALLEEG(di).stats.compkurtdist(:) ];' ... ' clear di;' ... 'end;' ... 'if get( findobj(''parent'', fig, ''tag'', ''Icurrent''), ''value'') == 1, ' ... % test if current dataset ' method = EEG.reject.gcompreject'';' ... ' allvalues = [EEG.stats.compenta(:) EEG.stats.compkurta(:) EEG.stats.compkurtdist(:) ];' ... 'end;' ... 'axes( findobj( ''parent'', fig, ''tag'', ''graphent'')); cla;' ... '[tmp1 tmp2 tmp3] = drawproba( method, allvalues, [0 EEG.reject.threshkurtact EEG.reject.threshkurtdist ], ' ... ' { ''&'' ''|'' }, EEG.reject.threshentropy, ''Entropy of activity'',''Artifact detection (%)'', ''Non-artifact detection (%)'');' ... 'set(gca, ''tag'', ''graphent'');' ... 'axes( findobj( ''parent'', fig, ''tag'', ''graphkurt'')); cla;' ... '[tmp1 tmp2 tmp3] = drawproba( method, allvalues, [EEG.reject.threshentropy 0 EEG.reject.threshkurtdist ], ' ... ' { ''&'' ''|'' }, EEG.reject.threshkurtact, ''Kurtosis of activity'', ''Artifact detection (%)'', '''');' ... 'set(gca, ''tag'', ''graphkurt'');' ... 'axes( findobj( ''parent'', fig, ''tag'', ''graphkurtdist'')); cla;' ... '[tmp1 tmp2 tmp3] = drawproba( method, allvalues, [EEG.reject.threshentropy EEG.reject.threshkurtact 0 ], ' ... ' { ''&'' ''|'' }, EEG.reject.threshkurtdist, ''Kurtosis of topography'', ''Artifact detection (%)'', '''');' ... 'set(gca, ''tag'', ''graphkurtdist'');' ... 'clear method allvalues fig;' ... ]; cb_percent = [ 'if isempty( gcbf ), fig = gcf; else fig = gcbf; end;' ... % determine the figure handler 'set( findobj(''parent'', fig, ''tag'', ''Ipercent''), ''value'', 1);'... 'set( findobj(''parent'', fig, ''tag'', ''Iother''), ''value'', 0);' ... 'set( findobj(''parent'', fig, ''tag'', ''Icurrent''), ''value'', 0);' ... 'set( findobj(''parent'', fig, ''tag'', ''Ipercenttext''), ''enable'', ''on'');' ... 'set( findobj(''parent'', fig, ''tag'', ''Iothertext''), ''enable'', ''off''); clear fig;' drawgraphs ]; cb_other = [ 'if isempty( gcbf ), fig = gcf; else fig = gcbf; end;' ... % determine the figure handler 'set( findobj(''parent'', fig, ''tag'', ''Iother''), ''value'', 1);'... 'set( findobj(''parent'', fig, ''tag'', ''Ipercent''), ''value'', 0);' ... 'set( findobj(''parent'', fig, ''tag'', ''Icurrent''), ''value'', 0);' ... 'set( findobj(''parent'', fig, ''tag'', ''Ipercenttext''), ''enable'', ''off'');' ... 'set( findobj(''parent'', fig, ''tag'', ''Iothertext''), ''enable'', ''on''); clear fig;' drawgraphs ]; cb_current = [ 'if isempty( gcbf ), fig = gcf; else fig = gcbf; end;' ... % determine the figure handler 'set( findobj(''parent'', fig, ''tag'', ''Icurrent''), ''value'', 1);'... 'set( findobj(''parent'', fig, ''tag'', ''Iother''), ''value'', 0);' ... 'set( findobj(''parent'', fig, ''tag'', ''Ipercent''), ''value'', 0);' ... 'set( findobj(''parent'', fig, ''tag'', ''Ipercenttext''), ''enable'', ''off'');' ... 'set( findobj(''parent'', fig, ''tag'', ''Iothertext''), ''enable'', ''off''); clear fig;' drawgraphs ];cb_entropy = [ 'EEG.reject.threshentropy = str2num(get(gcbo, ''string''));' ... drawgraphs ];cb_kurtact = [ 'EEG.reject.threshkurtact = str2num(get(gcbo, ''string''));' ... drawgraphs ];cb_kurtdist = [ 'EEG.reject.threshkurtdist = str2num(get(gcbo, ''string''));' ... drawgraphs ];if interact cb_calrej = [ 'ButtonName=questdlg2( ''This will erase previous projections'', ''Confirmation'', ''CANCEL'', ''OK'', ''OK'');' ]else cb_calrej = [ 'ButtonName= ''OK''' ]; end;cb_calrej = [ cb_calrej ... 'switch ButtonName,' ... ' case ''OK'',' ... ' rej1 = find(EEG.stats.compenta > EEG.reject.threshentropy);' ... ' rej2 = find(EEG.stats.compkurta > EEG.reject.threshkurtact);' ... ' rej3 = find(EEG.stats.compkurtdist > EEG.reject.threshkurtdist);' ... ' EEG.reject.gcompreject = (rej1 & rej2) | rej3;' ... ' clear rej1 rej2 rej3;' ... 'end; clear ButtonName;' ]; % default value for rejection methods% -----------------------------------rejvalother = ''; rejvalpercent = '25'; switch rejmethod case 'percent', rejvalpercent = num2str( rejvalue); case 'dataset', rejvalother = num2str( rejvalue); end; % -----------------------------------------------------allh = supergui(gcf, { [1] ... [2 1] [2 1] [2 1] ... [1] ... [1] ... [1.5 0.5 1] [1.5 0.5 1] [1.5 0.5 1] ... [1] [1] [1] [1] [1] [1] [1] [1] [1] [1] ... [1 1 1 1 1] ... }, [], ... { 'Style', 'text', 'string', 'Calibration method', 'FontSize', 13, 'fontweight', 'bold' }, ... ... { 'style', 'checkbox', 'String', '% of artifactual components (can also put one % per rejection)', 'tag', 'Ipercent', 'value', 1, 'callback', cb_percent}, ... { 'style', 'edit', 'String', rejvalpercent, 'tag', 'Ipercenttext', 'callback', drawgraphs }, ... ... { 'style', 'checkbox', 'String', 'Specific dataset (enter dataset number)', 'tag', 'Iother', 'value', 0, 'callback', cb_other}, ... { 'style', 'edit', 'String', rejvalother, 'tag', 'Iothertext', 'enable', 'off', 'callback', drawgraphs }, ... ... { 'style', 'checkbox', 'String', 'Current dataset', 'tag', 'Icurrent', 'value', 0, 'callback', cb_current}, ... { }, ... ... { }, ... ... { 'Style', 'text', 'string', 'Threshold values', 'FontSize', 13, 'fontweight', 'bold' }, ... ... { 'style', 'text', 'String', 'Entropy of activity threshold' }, ... { 'style', 'edit', 'String', num2str(EEG.reject.threshentropy), 'tag', 'entstring', 'callback', cb_entropy }, ... { 'style', 'pushbutton', 'String', 'Histogram', 'callback', 'figure; hist(EEG.stats.compenta,20); title(''Entropy of activity'');' }, ... ... { 'style', 'text', 'String', 'Kurtosis of activity threshold' }, ... { 'style', 'edit', 'String', num2str(EEG.reject.threshkurtact), 'tag', 'kurtstring', 'callback', cb_kurtact }, ... { 'style', 'pushbutton', 'String', 'Histogram', 'callback', 'figure; hist(EEG.stats.compkurta,200); title(''Kurtosis of activity'');' }, ... ... { 'style', 'text', 'String', 'Kurtosis of topography threshold' }, ... { 'style', 'edit', 'String', num2str(EEG.reject.threshkurtdist), 'tag', 'kurtdiststring', 'callback', cb_kurtdist }, ... { 'style', 'pushbutton', 'String', 'Histogram', 'callback', 'figure; hist(EEG.stats.compkurtdist,20); title(''Kurtosis of topography'');' }, ... ... { }, { }, { }, { }, { }, { }, { }, { }, { }, { }, ... ... { 'style', 'pushbutton', 'String', 'Cancel', 'callback', cb_cancel, 'userdata', { EEG.reject.threshentropy EEG.reject.threshkurtact EEG.reject.threshkurtdist }}, ... { 'style', 'pushbutton', 'String', 'Auto thresh' , 'callback', '', 'enable', 'off' }, ... { 'style', 'pushbutton', 'String', 'Help' , 'callback', 'pophelp(''pop_icathresh'');' }, ... { 'style', 'pushbutton', 'String', 'Accept thresh.' , 'callback', 'close(gcbf);' }, ... { 'style', 'pushbutton', 'String', 'Calc. rejection' , 'callback', 'close(gcbf);' } ... ... );h = axes('position', [0 15 30 30].*s+q, 'tag', 'graphent');h = axes('position', [35 15 30 30].*s+q, 'tag', 'graphkurt');h = axes('position', [70 15 30 30].*s+q, 'tag', 'graphkurtdist');rejmethodswitch rejmethod case 'dataset', eval([ 'gcbf = [];' cb_other]); case 'current', eval([ 'gcbf = [];' cb_current]); otherwise, eval([ 'gcbf = [];' cb_percent]);end; return;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?