ECG-Kit 1.0
(3,898 bytes)
function result=rrmse(x,y,h,kmax,attrib,plots,k,weight,res)
%RRMSE calculates the robust RMSECV and/or the robust RMSEP-value
% for RPCR and RSIMPLS.
%
% The robust RMSECV is described in:
%
% Engelen, S., Hubert, M. (2005),
% "Fast model selection for robust calibration methods",
% Analytica Chimica Acta, 544, 219-228.
%
% Required input arguments:
% x : the regressors
% y : the response variables
% h : the quantile used in RPCR and RSIMPLS.
% kmax : the maximal number of components to be used.
% attrib : the name of the analysis 'RSIMPLS', or 'RPCR'
%
% Optional input arguments:
% plots : 0/1 = no plot / plot (default) of the RMSECV values
% k : the optimal number of components chosen by cross validation.
% if k is different from zero, the RMSEP will be calculated
% (default k=0)
% weight : only needed when calculating RMSEP value
% res : the residuals of each left-out observation for every k.
%
% I/O: result=rrmse(x,y,h,kmax,attrib,plots,k,weight,res);
%
% Example: h=0.75*size(x,1);
% result=rrmse(x,y,h,10,'RPCR');
%
% This function is part of LIBRA: the Matlab Library for Robust Analysis,
% available at:
% http://wis.kuleuven.be/stat/robust.html
%
% Created by Karlien Vanden Branden on 05-07-2002
% Revisions by Sabine Verboven, Sanne Engelen
% Last update on 28-04-2004
%%%%%%%%% Initialisation %%%%%%%%%%%%%%
if nargin>=7
in.pred=1;
else
in=struct('');
end
if nargin<7
k=0;
end
if nargin<6
k=0;
plots=1;
end
if nargin<5
error('Missing one or more input variables.')
end
if k<0 %preventing negative input of chosen number of PC's
k=0;
end
[n,p]=size(x);
[n,q]=size(y);
%%%%%Defining the maximum number of principal components to calculate
count=1;
if q>1
while (count*q+q+(q*(q+1)/2))<=h
count=count+1;
end
else
while (count+2)<=h
count=count+1;
end
end
ktot=max(1,min(count-1,kmax));
%%%%%%%%%%%%%%%% MAIN PART %%%%%%%%%%%%%%%%%%%%%%%%
if (k~=0) & nargin>7
disp(['The RMSEP value is based on ', num2str(k),' scores.'])
weight=weight(:,k);
res=res(:,(k-1)*q + 1:k*q).^2;
res=repmat(weight,1,q).*res;
vRMSECV2=sum(res,1)/sum(weight); %1xn -> 1x1
out.rmsep=sqrt(sum(vRMSECV2)/q);
else
% Cross-validation
if k==0
disp(['Cross-validation is now performed.'])
else
disp(['The RMSEP value is based on ', num2str(k),' components.'])
end
resCV = crossvalid(attrib,x,y,ktot,h,k);
out.R2 = resCV.R2;
out.rss = resCV.rss;
if plots & (k==0)
disp(['The robust RMSECV-values: ', num2str(resCV.rmsecv)])
figure
set(gcf,'Name', 'Robust Component Selection plot', 'NumberTitle', 'off');
plot(1:ktot,resCV.rmsecv,'o-');
hold on
plot(1:ktot,sqrt(0.5*resCV.rmsecv.^2 + 0.5*resCV.rss),'r*--')
plot(1:ktot,sqrt(resCV.rss),'g>-')
xlabel('Number of components');
set(gca,'XTick',1:1:ktot)
ylabel('RCS value');
title(attrib)
legend('\gamma = 1 (CV)','\gamma = 0.5','\gamma = 0 (RSS)')
hold off
kout=input(['How many components would you like to retain? ']);
out.k=kout;
else
out.k=k;
end
if k==0 %output needed for the calculation of rmsep
out.weight=resCV.outWeights.weightsk;
out.res=resCV.residu;
out.rmsecv=resCV.rmsecv;
else
out.rmsep=resCV.rmsep;
out.k=k;
end
end
result = out;
%%%%%%%%%%%%%%%%%%%%%%%%%subfunction%%%%%%%%%%%%%%%%%%%%%%
function out=crossvalid(attrib,x,y,kmax,h,k)
switch attrib
case 'RPCR'
out = cvRpcr(x,y,kmax,1,h,k);
case 'RSIMPLS'
out = cvRsimpls(x,y,kmax,1,h,k);
end