⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 backstep.m

📁 实现多元线性回归方程自变量的选择及系数的求解
💻 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 + -