www.gusucode.com > mbctools 工具箱 matlab 源码程序 > mbctools/@modeldev/OutlierDialog.m
function [mdev,ok] = OutlierDialog(mdev) %OUTLIERDIALOG Display the Outlier Selection Criteria dialog % % [MDEV, OK] = OUTLIERDIALOG(MDEV) displays the Outlier Selection Criteria % dialog which allows users to select the criteria to use when % highlighting outliers. % Copyright 2000-2015 The MathWorks, Inc. and Ford Global Technologies, Inc. dlg = mbcgui.container.Dialog('Name','Outlier Selection Criteria',... 'Size',[580 140],... 'Tag','ResponseModSetup',... 'Buttons','OK_CANCEL_HELP',... 'HelpCode','xreg_outlierCriteria',... 'Resize','off'); figh = dlg.Figure; p_md = address(mdev); [lyt,ud] = i_createlyt(figh,p_md); dlg.Content = lyt; % Blocking call closeAction = dlg.showDialog(); switch lower(closeAction) case 'ok' if get(ud.UserDefCheck,'Value') str = get(ud.UserDef,'String'); ok= exist(str)==2; %#ok<EXIST> crit= str; else % note that the "abs val" popup is 1 for yes (want 1) and 2 for no (want 0) % hence use mod 2 below crit=[get(ud.criteria,'Value'),... % the statistic mod(get(ud.absVal,'Value'),2),... % use abs val of data? get(ud.operator,'Value'),... % < or whatever get(ud.value,'Value'),... % numerical value get(ud.distribution,'Value')]; % distribution to use ok= isnumeric(crit); end if ~ok crit=[]; ok=1; end if ok OldMdev= mdev; try m= model(mdev); m = set(m,'outliers',crit); mdev= model(mdev,m); ok=1; catch mdev= OldMdev; pointer(OldMdev); ok= 0; end end otherwise ok=0; end mdev= info(mdev); delete(dlg); %------------------------- % SUBFUNCTION i_createlyt %------------------------- function [lyt,ud]=i_createlyt(figh,p) mdev= info(p); [data,factors]= diagnosticStats(mdev); m= model(mdev); SC = xregGui.SystemColorsDbl; % reate all the controls ud.seltxt=uicontrol('Style','text',... 'Parent',figh,... 'HorizontalAlignment','left',... 'String','Select using:',... 'Position',[0 0 80 15]); ud.criteria=uicontrol('Style','popup',... 'Parent',figh,... 'HorizontalAlignment','left',... 'BackgroundColor',SC.WINDOW_BG,... 'UserData',data,... 'Tag', 'selectUsing',... 'String',factors); ud.abstxt=uicontrol('Style','text',... 'Parent',figh,... 'HorizontalAlignment','left',... 'String','Use absolute value?',... 'Position',[0 0 80 15]); ud.absVal=uicontrol('Style','popup',... 'Parent',figh,... 'HorizontalAlignment','left',... 'BackgroundColor',SC.WINDOW_BG,... 'Tag', 'absValue',... 'String',{'Yes','No'}); ud.optxt=uicontrol('Style','text',... 'Parent',figh,... 'HorizontalAlignment','left',... 'String','Operator:',... 'Position',[0 0 80 15]); ud.operator=uicontrol('Style','popup',... 'Parent',figh,... 'HorizontalAlignment','left',... 'BackgroundColor',SC.WINDOW_BG,... 'Tag', 'operator',... 'String',{'<','>','<=','>=','==','~='}); ud.distxt=uicontrol('Style','text',... 'Parent',figh,... 'HorizontalAlignment','left',... 'String','Distribution:',... 'Position',[0 0 80 15]); ud.distribution=uicontrol('Style','popup',... 'Parent',figh,... 'HorizontalAlignment','left',... 'BackgroundColor',SC.WINDOW_BG,... 'Tag', 'distribution',... 'String',{'None','Student''s t','Normal'}); ud.valtxt=uicontrol('Style','text',... 'Parent',figh,... 'HorizontalAlignment','left',... 'String','Value:',... 'Position',[0 0 80 15]); ud.value= mbcgui.widget.Spinner('Parent', figh); ud.UserDefCheck=uicontrol('Style','check',... 'Parent',figh,... 'HorizontalAlignment','left',... 'String','Select using custom MATLAB file:',... 'Tag','UserDefCheck',... 'Position',[0 0 80 15]); ud.UserDef=uicontrol('Style','edit',... 'Parent',figh,... 'Enable','off',... 'HorizontalAlignment','left',... 'BackgroundColor',SC.CTRL_BG,... 'Tag','UserDefFile',... 'Position',[0 0 80 15]); ud.chooseFile = uicontrol('Parent', figh,... 'Style','pushbutton',... 'Enable','off',... 'String','...'); lyt= xreggridbaglayout(figh,... 'dimension',[4 7],... 'mergeblock',{[1 1],[4 5]},... % dist text 'mergeblock',{[2 2],[4 5]},... % dist popup 'mergeblock',{[4 4],[2 4]},... % name of file edit box 'mergeblock',{[1 1],[6 7]},... % value text 'gapx',10,... 'colsizes',[-1 100 50 50 20 80 20] ,... 'rowsizes',[17,20,20,20], ... 'elements',{... ud.seltxt,ud.criteria,[],ud.UserDefCheck,... ud.abstxt,ud.absVal,[],ud.UserDef,... ud.optxt,ud.operator,[],[],... ud.distxt,ud.distribution,[],[],... [],[],[],ud.chooseFile, ... ud.valtxt,ud.value,[],[]}); % define callbacks set(ud.criteria,'Callback',{@i_criteria,ud}); set(ud.absVal,'Callback',{@i_absval,ud}); set(ud.UserDefCheck,'Callback',{@i_userdef,ud}); set(ud.chooseFile,'Callback',{@i_chooseFile,ud}); set(ud.distribution,'Callback',{@i_criteria,ud}); % if we already have some criteria defined, display this in the controls crit= get(m,'outliers'); if isempty(crit); crit= DefaultOutliers(m); end if isnumeric(crit) if size(crit,2)<5 crit(:,5)=1; end if crit(1)<=length(get(ud.criteria,'String')) set(ud.criteria,'Value',crit(1)); end set(ud.distribution,'Value',crit(5)); % note that the "abs val" is 1 for yes (want 1) and 0 for no (want 2) % hence use 2-value below to set the popup set(ud.absVal,'Value',2-crit(2)); set(ud.operator,'Value',crit(3)); set(ud.value,'Value',crit(4)); i_criteria(ud.criteria,[],ud); elseif ischar(crit) set(ud.UserDefCheck,'Value',1); % do the enable/disable thing i_userdef(ud.UserDefCheck,[],ud); set(ud.UserDef,'String',crit); end %------------------------- % SUBFUNCTION i_criteria %------------------------- function i_criteria(~,~,ud) SC = xregGui.SystemColorsDbl; data= get(ud.criteria,'UserData'); % data is numpoints rows x num factors columns critVal = get(ud.criteria,'Value'); thisData = data(:,critVal); % set the clickincrement to be appropriate for this factor switch get(ud.distribution,'Value') case 1 % not using distribution if ~isempty(thisData) set(ud.value,'ClickIncrement',10^(floor(log10(range(thisData)))-1)); else set(ud.value,'ClickIncrement',1); end if get(ud.absVal, 'Value')==1 % absVal = Yes minval = 0; else minval = -inf; end set(ud.value, 'Min', minval, 'Max', inf); set(ud.valtxt,'String',sprintf('Value: [%0.4g, %0.4g]',min(thisData),max(thisData))); set(ud.absVal,'Enable','on','BackgroundColor', SC.WINDOW_BG); set(ud.abstxt,'Enable','on'); case {2,3} % using a distribution rather than data values set(ud.value,'ClickIncrement',0.5,'Min',0.5,'Max',10); set(ud.valtxt,'String','Value: [alpha %]'); set(ud.absVal,'Enable','off','Value',1,'BackgroundColor',SC.CTRL_BG); set(ud.abstxt,'Enable','off'); end %------------------------- % SUBFUNCTION i_absval %------------------------- function i_absval(src,~,ud) absval= get(src,'Value'); if absval==1 % abs val? = Yes ud.value.Min = 0; else ud.value.Min = -Inf; end %------------------------- % SUBFUNCTION i_userdef %------------------------- function i_userdef(src,event,ud) check = get(src,'Value'); SC = xregGui.SystemColorsDbl; if check % = Yes set(ud.UserDef,'Enable','on','BackgroundColor', SC.WINDOW_BG); set(ud.chooseFile,'Enable','on'); set([ud.seltxt,ud.abstxt,ud.optxt,ud.valtxt,ud.distxt],... 'Enable','off'); set([ud.criteria,ud.absVal,ud.operator,ud.distribution],... 'Enable','off','BackgroundColor',SC.CTRL_BG); set(ud.value,'Enable','off'); else set(ud.UserDef,'Enable','off','BackgroundColor',SC.CTRL_BG); set(ud.chooseFile,'Enable','off'); set([ud.seltxt,ud.abstxt,ud.optxt,ud.valtxt,ud.distxt],... 'Enable','on'); set([ud.criteria,ud.absVal,ud.operator,ud.distribution],... 'Enable','on','BackgroundColor',SC.WINDOW_BG); set(ud.value,'Enable','on'); % Force absVal items to correct enable state i_criteria(src,event,ud); end %------------------------------------------------------ % SUBFUNCTION i_chooseFile %------------------------------------------------------ function i_chooseFile(~,~,ud) [filename,pathname]=uigetfile('*.m', 'Custom Selection Criteria MATLAB File'); if filename==0 % user hit "Cancel" return else [~,filename] = fileparts([pathname, filename]); set(ud.UserDef,'String', filename); end