www.gusucode.com > mbctools 工具箱 matlab 源码程序 > mbctools/@mdev_local/sweep_plot.m

    function [RfStr,sigmaStr] = sweep_plot(mdev,Xs,Ys,ModelNos,SNo,AxHand,PlotOpts,PlotModes)
%SWEEP_PLOT Plot twostage sweep predictions

%  Copyright 2000-2014 The MathWorks, Inc. and Ford Global Technologies, Inc.


RfStr='';
sigmaStr='';

[PredType,MultiModel,MLEMode]= deal(PlotModes{:});
% PredType = normal/PRESS
% MultiModel = MultiSelected or not
% MLEMode = Verify MLE or not

[bdflag,Trans,~,AbsX,~]= deal(PlotOpts{:});

% all TS models of this mdev_local
Models= mdev.TwoStage;
if MLEMode==2 && length(Models)>1
    % make sure evaluation picks up the right model
    ModelNos=2;
end
if MLEMode
    selrf  = mdev.ResponseFeatures([1 1],:);
    sm= mdev.MLE.Pooled_MSE;    % pooled mean squared error
    sigma2 = [sm sm];
else
    selrf  = mdev.ResponseFeatures;
    sigma2 = repmat(mdev.MLE.Pooled_MSE,length(Models),1);
end
LogL= mdev.TSstatistics.LogL;
TSModels= Models(ModelNos);
selrf= selrf(ModelNos,:);
sigma2= sigma2(ModelNos);

% ----------------------------------------------------------------------


% the local model
L= model(mdev);
XG= Xs{2};


% all values of response features of this local model
Yf= mdev.RFData.double;
% and just get data for this sweep
Yf= Yf(SNo,RFstart(L)+1:end);

Sigma= squeeze(mdev.MLE.Sigma(:,:,SNo));

% validate two stage models
State= get(AxHand(1),'NextPlot');
set(AxHand(1),'NextPlot','add')
switch PredType
    case 1
        [~,Lpred,Lfpred]= plot(TSModels{:},Xs,Ys,[PlotOpts{:},0],AxHand(1));
        t2= mdev.TSstatistics.RespFeat(SNo,ModelNos);
    case 2
        [~,Lpred,Lfpred]= plot(TSModels{:},Xs,Ys,[PlotOpts{:},SNo],AxHand(1));
        t2= NaN*ones(1,length(ModelNos));
end



[L,LfitOK]= LocalModel(mdev,SNo);

mbh=MBrowser;
ATLOCALNODE = strcmp(mbh.CurrentNode.guid,'local');
if LfitOK && (~MultiModel || ATLOCALNODE)
    % Generate local fit curve (to compare with TS)
    L= SelFeat(L,selrf);

    [XL,YL,DataOK]= FitData(mdev,SNo);
    plot(L,XL,YL,DataOK,[PlotOpts{:}],AxHand(1),'k');

else
    % do not draw local fit
    X=Xs;
    Y= Ys;
    for i=1:length(TSModels)
        Xs= X;
        Ys= Y;
        TS= TSModels{i};
        % local model not fitted so use estimated datum
        xlab= InputLabels(L);
        if ~AbsX && get(TS,'datumtype')
            dmodel= get(TS,'datum');
            XL= Xs{1} - dmodel(XG); 
            xlab= sprintf('%s-Datum',xlab{1});
        else
            XL= Xs{1};
            xlab = xlab{1};
        end

        if Trans && HasTransform(L)
            out = getOutput(L);
            Ys{1}= ytrans(L,Ys{1});
            set(Ys,'Units',TransUnits(out))
        end
        L= get(TS,'local');
        if sum(InputFactorTypes(L)==1)==1
            % plot against data
            Xplt= XL;
            ColorOrderIndex = AxHand(1).ColorOrderIndex;
            if bdflag
                [~,hLeg] = plot(Xplt(:,1),Ys,'.', ...
                    'bd','grid', 'on','Parent',AxHand(1),'Color','k');
            else
                [~,hLeg] = plot(Xplt(:,1),Ys,'.', ...
                    'grid', 'on','Parent',AxHand(1),'Color','k');
            end
            AxHand(1).ColorOrderIndex = ColorOrderIndex;
            delete(hLeg);
            xlabel(xlab,'Parent',AxHand(1))
        end;
    end
end
set(AxHand(1),'NextPlot',State)

% output RFStr?
if nargout
    if ~MultiModel && LfitOK
        % display response feature info
        r=  (Lfpred{1}-Yf(:,selrf));
        S= Sigma *sigma2;
        S=S(selrf,selrf);
        rn= Inf(1,size(S,1));
        if all(diag(S)>0)
            sd= diag(1./sqrt(diag(S)));
            S= sd*S*sd;
            r= r*sd;
            if all(isfinite(S(:))) && rank(S)==size(S,1)
                rn= r/chol(S);
            end
        end

        chnames= char(children(mdev,'name'));
        chnames= chnames(RFstart(L)+1:end,:);
        % don't let displayed RF names be longer than 25
        maxNameLength = min(size(chnames,2),25);
        % concatenate strings
        rfname = char([{'RF Name'},chnames(selrf,1:maxNameLength)]);
        rfhat = char([{' RFhat'},num2str(Lfpred{1}(:),'%10.2g')]);
        rf = char([{' RF'},num2str(Yf(:,selrf)','%10.2g')]);
        rfT = char([{' RF t'},num2str(rn(:),'%6.2f')]);

        RfStr = [ rfname,...
            blanks(length(selrf)+1)',rfhat,...
            blanks(length(selrf)+1)',rf,...
            blanks(length(selrf)+1)',rfT];
    end
end

% output sigmaStr?
if nargout>1
    % display info
    sigmaStr= cell(1,length(ModelNos));
    for ModNo=1:length(ModelNos)
        rf= selrf(ModNo,:);
        S= Sigma(rf,rf)*sigma2(ModNo);
        rp=(double(Ys)-Lpred{ModNo});
        rp= rp(isfinite(rp));
        dfp= length(rp)-size(S,1);
        if dfp>0
            sp = sqrt( sum(rp.^2)/dfp );
        else
            sp = NaN;
        end

        sigmaStr{ModNo}= sprintf('%10.3g %10.3g %10.3g',t2(ModNo),LogL(SNo,ModNo),sp);
    end
    sigmaStr = char(sigmaStr);
end