当两组变量的个数很多,且都存在多重相关性,而观测数据的数量(样本量)又较少时,用偏最小二乘回归建立模型
11.1 分析概述
- 在自变量集中提出第一成分u(尽可能多的提取原自变量中的变异信息),同时在因变量集中也提取第一成分v,并要求u与v相关程度达到最大
- 建立因变量与u的回归,如果回归方程已达到满意的精度,则算法终止。否则继续对第二成分的提取,直到能达到满意的精度为止。
- 若最终对自变量集提取r个成分,偏最小二乘法回归将通过建立因变量和r个u的回归式,然后再表示为因变量与原自变量的回归方程式,即偏最小二乘回归方程式
11.2 Matlab命令plsregress
使用格式[ XL, YL, XS, YS, BETA, PCTVAR, MSE, stats ] = plsregress( X, Y, ncomp )
11.3 案例分析
例1:
clc,clear
ab0=load('pz.txt');
mu=mean(ab0), sig=std(ab0)
rr=corrcoef(ab0) %求相关系数矩阵
ab=zscore(ab0); %数据标准化
a=ab(:,[1:3]);b=ab(:,[4:end]); %提出标准化后的自变量和因变量数据
[XL,YL,XS,YS,BETA,PCTVAR,MSE,stats] =plsregress(a,b)
contr=cumsum(PCTVAR,2) %求累计贡献率
xw=a\XS %求自变量提出成分系数,每列对应一个成分,这里xw等于stats.W
yw=b\YS
ncomp=input('请根据PCTVAR的值确定提出成分对的个数ncomp=');
[XL2,YL2,XS2,YS2,BETA2,PCTVAR2,MSE2,stats2] =plsregress(a,b,ncomp)
n=size(a,2); m=size(b,2);%n是自变量的个数,m是因变量的个数
beta3(1,:)=mu(n+1:end)-mu(1:n)./sig(1:n)*BETA2([2:end],:).*sig(n+1:end); %原始数据回归方程的常数项
beta3([2:n+1],:)=(1./sig(1:n))'*sig(n+1:end).*BETA2([2:end],:) %计算原始变量的系数,每一列是一个回归方程
bar(BETA2','k') %画直方图
yhat=repmat(beta3(1,:),[size(a,1),1])+ab0(:,[1:n])*beta3([2:end],:) %求因变量的预测值
ymax=max([yhat;ab0(:,[n+1:end])]); %求预测值和预测值的最大值
%下面画y1,y2,y3的预测图,并画直线y=x
figure, subplot(2,2,1)
plot(yhat(:,1),ab0(:,n+1),'*',[0:ymax(1)],[0:ymax(1)],'Color','k')
legend('弯曲成绩预测图',2), xlabel('预测数据'), ylabel('观测数据')
subplot(2,2,2)
plot(yhat(:,2),ab0(:,n+2),'O',[0:ymax(2)],[0:ymax(2)],'Color','k')
legend('弯曲成绩预测图',2), xlabel('预测数据'), ylabel('观测数据')
subplot(2,2,3)
plot(yhat(:,3),ab0(:,end),'H',[0:ymax(3)],[0:ymax(3)],'Color','k')
legend('跳高成绩预测图',2), xlabel('预测数据'), ylabel('观测数据')
例2:
clc, clear,format long g %长小数的显示方式
ab0=load('you.txt');
mu=mean(ab0);sig=std(ab0); %求均值和标准差
ab=zscore(ab0); %数据标准化
a=ab(:,[1:7]);b=ab(:,[8:end]);
ncomp=2; %试着选择成分的对数
[XL,YL,XS,YS,BETA,PCTVAR,MSE,stats]=plsregress(a,b,ncomp)
contr=cumsum(PCTVAR,2) %求累积贡献率
n=size(a,2); m=size(b,2);
BETA2(1,:)=mu(n+1:end)-mu(1:n)./sig(1:n)*BETA([2:end],:).*sig(n+1:end);
BETA2([2:n+1],:)=(1./sig(1:n))'*sig(n+1:end).*BETA([2:end],:)
format %恢复到短小数的显示方式