📄 backstep.m
字号:
function [B0,BB]=backstep(T,XYZ,FF)
%多元后退回归分析
%xy为待输入的原始数据,按照先x后y按列排列的数组
%如:x1 x2 x3 x4 y等等
%clc;%clear all;
%计算离差阵R(m,m)
%[Y, X, Z]= textread('test7.txt');
%fid = fopen('test7.txt', 'r');
%XYZ = fscanf(fid, '%f %f %f', [3 inf]); % It has two rows now.
%XYZ = XYZ';
%fclose(fid);
%XYZ=[0.5 1.5 3
%0.55 2 3
%0.60 2.5 3
%0.65 2.5 3
%0.70 3 3
%0.75 3.5 3
%0.8 3.8 4
%0.82 4 4
%0.85 4.5 4
%0.88 4.8 4
%0.9 5 4
%0.92 5.5 5
%0.95 6 5
%0.88 4.5 5
%0.9 4.8 5
%0.93 5 5
%0.94 5.5 5
%0.97 6 5];
F1=FF(1,1);
F2=FF(1,2);
[k,h]=size(XYZ);
for i=1:k
X(i)=XYZ(i,2);
XX(i)=XYZ(i,2)^(0.5);
XXX(i)=XYZ(i,2)^(0.25);
Z(i)=XYZ(i,3);
ZZ(i)=XYZ(i,3)^(0.5);
ZZZ(i)=XYZ(i,3)^(0.25);
YY(i)=log(XYZ(i,1)/(T-XYZ(i,1)));
end
[XY]=[X',XX',XXX',Z',ZZ',ZZZ',YY'];
%[XY]= textread('test2.txt');
%xy=[x1 x2 x3 x4 y];
[n,m]=size(XY);
mm=m-1;
BB=zeros(mm,1);
%BBB=zeros(mm,1);
flag =1;
stepnum=0;
IX=0;
%disp('******** Stepback Regression Analysis Start *************')
%是否继续进行后退回归的标志
while(flag)
stepnum=stepnum+1;
% disp(['******** Stepback Regression 第' int2str(stepnum) '步回退*************'])
xy=zeros(n,m);
if IX ==0
xy= XY;
else
for i=1:n
for j=1:m
if j<IX
xy(i,j)= XY(i,j);
end
if j>=IX
xy(i,j) = XY(i,j+1);
end
end
end
end
XY=zeros(n,m);
XY=xy;
%重新定义及初始化各矩阵
LS = zeros(m-1,m-1);
S=zeros(m,m);
SR=zeros(m,1);
R=zeros(m,m);
AS=zeros(m-1,m-1);
BS=zeros(m-1,1);
B=zeros(m-1,1);
%xy_aver=zeros(1,m);
xy_aver=mean(xy);%求均值
for i=1:m
for j=1:i
S(i,j)=0;
for k=1:n
S(i,j)=S(i,j)+(xy(k,i)-xy_aver(i))*(xy(k,j)-xy_aver(j));
end
S(j,i)=S(i,j);
end
SR(i)=sqrt(S(i,i));%计算对角线元素的平方根
end
%disp('************ Deviation Matrix & Value of SR (离差阵S&SR) ***********') %输出离差阵S,及SR
%[S SR']
%计算相关系数R(m,m)
for i=1:m
for j=1:i
R(i,j)=S(i,j)/(SR(i)*SR(j));
R(j,i)=R(i,j);
end
end
%disp('********** Correlation Coefficient Matrix (相关系数阵R) **********')%输出相关系数阵R
%R
for i=1:m-1
for j=1:i
AS(i,j)=S(i,j);
AS(j,i)=AS(i,j);
end
BS(i)=S(i,m);
end
B =AS\BS;
B0=xy_aver(m);
for i=1:m-1
B0=B0-B(i)*xy_aver(i);
end
%输出未回退方程的计算结果
if stepnum==1
BB=B;
end
% disp(['第' num2str(stepnum) '次回退回归系数为:' num2str(B0) ' ' num2str(BB')])
% disp(['第' num2str(stepnum) '次退回归方程为:']);
% disp(['Y=' num2str(B0)]);
for i=1:mm
if BB(i)~=0
if BB(i)>0
disp(['+' num2str(BB(i)) 'X' int2str(i)]);
else
disp([num2str(BB(i)) 'X' int2str(i)]);
end
end
end
%
%end
Q=0;
for i=1:n
yy=0;
for j=1:m-1
yy =yy+B(j)*xy(i,j);
end
Q=Q+(xy(i,m)-yy-B0)*(xy(i,m)-yy-B0);
end
FT= (S(m,m)-Q)*(n-m)/(Q*(m-1));
%LS=AS^(-1);
LS=pinv(AS);
%输出未回退方程的计算结果
%disp(['Sum of SQuares of Residual Error(残差平方和) Q = ' num2str(Q)]);
Sc=sqrt(Q/(n-m));%剩余标准差
%disp(['Standard Deviation(剩余标准差,即模型误差的均方根) Sc = ' num2str(Sc)]);
RR=sqrt(1-Q/S(m,m));%复相关系数
%Rm = 1-n*(1-RR^2)/(n-m+1);
Rm = 1-Q*(n-1)/(S(m,m)*(n-m));
%Rm = (S(m,m)-Q)*(n-1)/(S(m,m)*(m-1));
%disp(['Multiple Correlation Coefficient(复相关系数) R = ' num2str(RR)]);
%disp(['Decision Coefficient(决定系数) R^2= ' num2str(RR^2)]);
%disp(['Modified Decision Coefficient(修正的决定系数) Rm^2= ' num2str(Rm)]);
FF= (S(m,m)-Q)*(n-m)/(Q*(m-1));
%disp(['F Value for Test of Regression(回归方程显著性检验,即回归模型的统计量) F = ' num2str(FF)]);
%F=SH*(m-n-1)/(SX*n);%F-统计量
%PROB = 1 - fcdf(FF,m,n-length(Imin)-1)%与统计量F对应的概率P
j=0;
for i=1:mm
% CC=R(i,i)*R(m,m);
if BB(i)~=0
j=j+1;
T(i)=BB(i)/(sqrt(LS(j,j))*sqrt(Q/(n-m)));%各回归系数的t检验值
R1(i)=R(j,m)/sqrt(R(m,m)*R(j,j));
STR(i)=BB(i)/sqrt(S(m,m)/S(j,j));
else
T(i)=0;%各回归系数的t检验值
R1(i)=0;
STR(i)=0;
end
% R1(i)=R(i,m)/sqrt(CC+R(i,m)^2);%各自变量的偏相关系数
end
% disp(['t Test Value of Argument(各回归系数的t检验值):' num2str(T)]);
% disp(['Partial Corre.Coeffi.Ofargu.(各自变量的偏相关系数):' num2str(R1)]);;
% disp(['Standard Corre.Coeffi.Ofargu.(各自变量的标准系数):' num2str(STR)])
IXX=0;
IX=0;
Fmin=inf;
% F1=input('方程总体检验门坎值:F1=');
% F2=input('方程系数检验门坎值:F2=');
for i=1:m-1
V(i)=B(i).^2/LS(i,i);
F(i)=V(i)*(n-m)/Q;
if F(i)<F2 & F(i)<Fmin
Fmin=F(i);
IX=i;
end
end
if FT>F1
if IX>0
for i=1:mm
if stepnum==1
if i==IX
BB(i)=0;
out = IX;
else
B(i)=B(i)-LS(i,IX)*B(IX)/LS(IX,IX);
BB(i)=B(i);
end
else
if BB(i)~=0
IXX=IXX+1;
BB(i)=B(IXX)-LS(IXX,IX)*B(IX)/LS(IX,IX);;
if IXX==IX
out = i;
BB(i)=0;
end
end
end
end
% disp(['X' int2str(out) ' Be Deleted Out']);
else
% disp(['后退回归分析结束!']);
break;
end
else
% disp(['后退回归分析无显著方程!']);
break;
end
%输出一步后退回归计算结
% if stepnum>1
% disp(['回归系数为:' num2str(B0) ' ' num2str(BB')])
%end
% 'Y=' num2str(B0)]);
% for i=1:m-1
% if BB(i)~=0
% if BB(i)>0
% disp(['+' num2str(BB(i)) 'X' int2str(i)]);
% else
% disp([num2str(BB(i)) 'X' int2str(i)]);
% end
% end
% end
% end
m=m-1;
%flag=input('是否要继续进行后退回归分析(1:是;0:否):');
end
%%x=0:0.1:6;
%%[nn,num]=size(x);
%%y=3:10;
%%m=zeros(8,num);
%%for i=1:8
% m(i,:)=y(i);
% z(i,:)=(1+exp(-(-69.8-17.3225*x.^(0.5)+61.1880*x.^(0.25)+14.5248*y(i).^(0.25)))).^(-1);
% z(i,:)=(1+exp(-(B0+BB(1)*x+BB(2)*x.^(0.5)+BB(3)*x.^(0.25)+BB(4)*y(i)+BB(5)*y(i).^(0.5)+BB(6)*y(i).^(0.25)))).^(-1);
%% z(i,:)=(1+exp(-(B0-30+BB(1)*x+BB(2)*x.^(0.5)+BB(3)*x.^(0.25)+BB(4)*y(i).^(0.25)))).^(-1);
%% for j=1:num
%% m(i,j)=y(i);
%% end
%%end
%%subplot(221);
%%plot(x,z(1,:),'b',x,z(2,:),'b',x,z(3,:),'b',x,z(4,:),'b',x,z(5,:),'b',x,z(6,:),'b',x,z(7,:),'b',x,z(8,:),'b');
%plot(z(1,:),z(2,:));
%plot3(m(1,:),x,z(1,:),x,z(2,:),m(2,:),x,z(3,:),m(3,:),x,z(4,:),m(4,:),x,z(5,:),m(5,:),x,z(6,:),m(6,:),x,z(7,:),m(7,:),x,z(8,:),m(8,:));
%%subplot(222);
%%plot3(x,m(1,:),z(1,:),'b',x,m(2,:),z(2,:),'b',x,m(3,:),z(3,:),'b',x,m(4,:),z(4,:),'b',x,m(5,:),z(5,:),'b',x,m(6,:),z(6,:),'b',x,m(7,:),z(7,:),'b',x,m(8,:),z(8,:),'b');
%plot3(m(1,:),x,z(1,:));
%subplot(212);
%subplot(211);
%plot(y);
%subplot(212);
%plot(x1,y,'red',xy(:,1),xy(:,2),'+b');
%%end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -