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