function plscalval = plscalval(xcal,ycal,xval,yval,xnum,calnum,valnum,ncomp,kfold)
%UNTITLED3 此处显示有关此函数的摘要
% 此处显示详细说明
xycal=horzcat(xcal,ycal);
mu=mean(xycal);sig=std(xycal); %求均值和标准差
% rr=corrcoef(xycal); %求相关系数矩阵
xycalnorm=zscore(xycal); %数据标准化
xcalnorm=xycalnorm(:,[1:xnum]);ycalnorm=xycalnorm(:,[xnum+1:end]); %提出标准化后的自变量和因变量数据
[Xl,Yl,Xs1,Ys1,beta1,pctVar1,msec1] = plsregress(xcalnorm,ycalnorm,ncomp,'CV',kfold);%A pcs K-fold
[minmsec,optindex] = min(msec1(2,:))% determine optimal pcs select minimal msec 0:ncomp
[X2,Y2,Xs2,Ys2,beta2,pctVar2,msec2] = plsregress(xcalnorm,ycalnorm,optindex-1,'CV',kfold);%optimal model
beta3(1,:)=mu(xnum+1:end)-mu(1:xnum)./sig(1:xnum)*beta2([2:end],:).*sig(xnum+1:end); %原始数据回归方程的常数项
beta3([2:xnum+1],:)=(1./sig(1:xnum))'*sig(xnum+1:end).*beta2([2:end],:) %计算原始变量x1,...,xn的系数,每一列是一个回归方程
% bar(beta2','k') %画直方图
%求校正集预测值,验证集预测值
ycalpred=repmat(beta3(1,:),[calnum,1])+xcal(:,[1:xnum])*beta3([2:end],:) %求y1,..,ym的预测值,新矩阵由m×n个原A平铺而成
% ccc=[ycalpred;ycal]
% ymax1=max([ycalpred;ycal]);
RMSEC=sqrt(sumsqr(ycal-ycalpred)/calnum);
R2C=1-sumsqr(ycal-ycalpred)/sumsqr(ycal-mean(ycal,1));
yvalpred=repmat(beta3(1,:),[valnum,1])+xval(:,[1:xnum])*beta3([2:end],:) %验证集的预测值
%
% ymax2=max([yvalpred;yval]);
RMSEV=sqrt(sumsqr(yval-yvalpred)/valnum);
R2V=1-sumsqr(yval-yvalpred)/sumsqr(yval-mean(yval,1));
figure
plot(0:ncomp,msec1(2,:),'b-o');
xlabel('Number of components');
ylabel('Estimated Mean Squared Prediction Error');
legend({'PLSR' 'PCR'},'location','NE');
figure
% plot(octane,ycalpred,'b.');%图1,校正集,测试集
plot(ycal,ycalpred,'b.',yval,yvalpred,'r.',(1:35),(1:35),'k-');%图1,校正集,测试集
% xlabel('测定值');
% ylabel('预测值');
% legend({'校正集' '验证集'},'location','NorthWest');
xlabel('Measured value');
ylabel('Predicted value');
legend({'Calibration set' 'Validation set'},'location','SouthEast');
text(1,31,['RMSEC=',num2str(RMSEC)])
text(1,29,['R^2_C=',num2str(R2C)])
text(1,27,['RMSEV=',num2str(RMSEV)])
text(1,25,['R^2_V=',num2str(R2V)])
plscalval.RMSEC=RMSEC;
plscalval.RMSEV=RMSEV;
plscalval.R2C=R2C;
plscalval.R2V=R2V;
plscalval.optindex=optindex-1;
plscalval.ycalpred=ycalpred;
plscalval.yvalpred=yvalpred;
end