逐步回归matlab程序
function stepregress(x,y,F)
x=zscore(x,1); %数列标准化
y=zscore(y,1); %数列标准化
r=corrcoef([x,y]);
l=0; %消去的次数
L=0; %引入变量的个数
[n,m]=size(x); %m为变量的个数,n为观测的次数
k=ones(m);
q=1; %判断逐步回归是否继续
while(q==1)
q=0;
for i=1:m
v(i)=r(i,m+1)^2/r(i,i); %计算各因子的方差贡献
end
max=1;
min=1;
for i=1:m
if((max==1)&&(k(i)==1)&&(k(1)==0))||((v(i)>v(max))&&(k(i)==1)) max=i;
end
if((min==1)&&(k(i)==0)&&(k(1)==1))||((v(i) end end if(l<3)&&(L+1<=m) F1=v(max)/((r(m+1,m+1)-v(max))/(n-l-2)); if(F1>F) disp( [ '引入第', num2str(max), '个变量']); k(max)=0; L=L+1; l=l+1; r=matdel(max,m+1,r); %matdel为消去变换程序 q=1; end else F2=v(min)/(r(m+1,m+1)/(n-l-1)); if((F2 disp( [ '剔除第', num2str(min), '个变量']); k(min)=1; L=L-1; l=l+1; r=matdel(min,m+1,r); q=1; F1=v(max)/((r(m+1,m+1)-v(max))/(n-l-2)); if(F1>F) disp( [ '引入第', num2str(max), '个变量']); k(max)=0; %如果变量i引入,则对应的k变为0 L=L+1; l=l+1; r=matdel(max,m+1,r); q=1; end end end end disp('没有可剔除或引入的变量,逐步回归结束'); a=zeros(L); j=1; for i=1:m if (k(i)==0) a(j)=i; j=j+1; end; end; xx=x(:,a(1)); for i=2:L xx=[xx x(:,a(i))]; end; b=regress(y,xx); %回归系数 R=sqrt(1-r(m+1,m+1)); %复相关系数 yyy=xx*b; %y的估计值 ymean=mean(y); %y平均值 Q=(y-yyy)'*(y-yyy); %剩余平方和 U=(yyy-ymean)'*(yyy-ymean); %回归平方和 rs=Q/(n-L-1); %剩余方差 f=U/L/(Q/(n-L-1)); %F统计量 fid=fopen('result','w'); ss=['引入第',num2str(a(1))]; for i=2:L ss=[ss,',',num2str(a(i))]; end ss=[ss,'个变量']; ss1=['y=(',num2str(b(1)),'x',num2str(a(1)),')']; for i=2:L ss1=[ss1,'+(',num2str(b(i)),'x',num2str(a(i)),')']; ss2=['复相关系数=',num2str(R)]; ss3=['剩余方差=',num2str(rs)]; ss4=['F统计量=',num2str(f)]; ss5=['剩余平方和=',num2str(Q)]; fprintf(fid,'%s\n',ss); fprintf(fid,'%s\n',ss1); fprintf(fid,'%s\n',ss2); fprintf(fid,'%s\n',ss3); fprintf(fid,'%s\n',ss4); fprintf(fid,'%s',ss5); fclose(fid); end