逐步回归matlab程序

逐步回归matlab程序
逐步回归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;

else

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)),')']; }

end;

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

相关主题
相关文档
最新文档