0


逐步回归 Matlab

What is 逐步回归(stepwise regression)?

逐步回归是回归分析中一种筛选变量的过程,我们可以使用逐步回归从一组候选变量中构建回归模型,让系统自动识别出有影响的变量。

理论说明:逐步回归,是通过逐步将自变量输入模型,如果模型具统计学意义,并将其纳入在回归模型中。同时移出不具有统计学意义的变量。最终得到一个自动拟合的回归模型。其本质上还是线性回归。

逐步回归的三种实现策略:

  1. 正向(Forward)选择,从模型中没有预测因素开始,反复添加最有帮助的预测因素,直到没有显著的预测变量选入回归方程 。
  2. 向后(Backward)选择(也称向后消除)从完整模型(即包含所有可能预测变量的模型)中的所有预测变量开始,以迭代方式删除贡献最小的预测变量,直到没有不显著的预测变量从回归方程删除。
  3. 逐步(stepwise)选择(也称顺序替换),这是向前和向后选择的组合。您从没有预测变量开始,然后顺序添加最有贡献的预测变量(例如正向选择)。添加每个新变量后,删除所有不再改善模型拟合的变量(例如向后选择),直到既没有显著的预测变量选入回归方程,也没有不显著的预测变量从回归方程中剔除为止。

逐步回归代码(Matlab)如下:

  1. function dyzbhg(xy)
  2. %多元逐步回归分析
  3. %xy为待输入的原始数据,按照先xy按列排列的数组
  4. %如:x1 x2 x3 x4 y等等
  5. %clc;%clear all;
  6. %计算离差阵R(m,m)
  7. [n,m]=size(xy);
  8. %F1=0;F2=0;
  9. %disp('均值为:')
  10. xy_aver=mean(xy)%求均值
  11. for i=1:m
  12. for j=1:i
  13. R(i,j)=0;
  14. for k=1:n
  15. R(i,j)=R(i,j)+(xy(k,i)-xy_aver(i))*(xy(k,j)-xy_aver(j));
  16. end
  17. R(j,i)=R(i,j);
  18. end
  19. SR(i)=sqrt(R(i,i));%计算对角线元素的平方根
  20. end
  21. %disp('************ Deviation Matrix & Value of SR (离差阵R&SR) ***********') %输出离差阵R,及SR
  22. %[R SR']
  23. %计算相关系数R(m,m)
  24. for i=1:m
  25. for j=1:i
  26. R(i,j)=R(i,j)/(SR(i)*SR(j));
  27. R(j,i)=R(i,j);
  28. end
  29. end
  30. %disp('********** Correlation Coefficient Matrix (相关系数阵R) **********')%输出相关系数阵R
  31. %R
  32. flag=1;%是否重复进行逐步回归的标志
  33. while(flag)
  34. disp('******** Stepwise Regression Analysis Start *************')
  35. F1=input('剔除门坎值:F1=');
  36. F2=input('引入门坎值:F2=');
  37. S=0;%计算步数
  38. L=0;%引入方程的自变量个数
  39. FQ=n-1;%残差平方和的自由度
  40. disp('************** Discriminant Value of Contribution V **************')
  41. Imin(1)=0;Imax=1:m-1;%定义已引入(最小)和未引入(最大)变量的序号
  42. inn=0;outt=0;%引入和剔除的变量的顺序号
  43. while(1)
  44. % pause
  45. VN=1E+08;%已引入方程的自变量贡献的最小值
  46. VX=0;%未引入方程的自变量贡献的最大值
  47. IN=0;%贡献最小的已引入的自变量序号
  48. IX=0;%贡献最大的未引入的自变量序号
  49. S=S+1;
  50. disp(['--------- step = ' int2str(S) '------------'])%输出步骤数
  51. for i=1:m-1
  52. if R(i,i)<1E-08
  53. continue
  54. end
  55. % disp(['VMAX=' int2str(VX) '; IMAX=' int2str(IX)]) %输出Vmax=VX;Imax=IX;
  56. V(i)=R(m,i)^2/R(i,i);%计算已引入的变量的方差贡献
  57. if V(i)>=0
  58. if V(i)>VX %寻找未引入变量方差贡献的最大值
  59. for in=1:length(Imax)
  60. if i==Imax(in)
  61. VX=V(i);IX=i;
  62. end
  63. end
  64. end
  65. end
  66. if abs(V(i))<VN %寻找已引入变量方差贡献的最小值
  67. for out=1:length(Imin)
  68. if i==Imin(out)
  69. VN=abs(V(i));IN=i;
  70. end
  71. end
  72. end
  73. %disp(['方差贡献:V=' num2str(V(i)) 'VX=' num2str(VX) 'IX=' int2str(IX) 'VN=' num2str(VN) 'IN=' int2str(IN)])
  74. end
  75. % Imax(inn+1)=IX;inn=inn+1;
  76. t=find(Imax==IX);
  77. Imax(t)=[];
  78. disp(['******** 方差贡献V **********' num2str(V)])
  79. disp(['VMAX=' num2str(VX) '; IMAX=' int2str(IX)]) %输出Vmax=VX;Imax=IX;
  80. % disp(['VMIN=' num2str(VN) '; IMIN=' int2str(IN)]) %输出Vmin=VN;Imin=IN;
  81. if S==1
  82. disp(['S=' int2str(S)]) %输出S=1
  83. else
  84. disp(['VMIN=' num2str(VN) '; IMIN=' int2str(IN)]) %输出Vmin=VN;Imin=IN;
  85. end
  86. if S==1%||S==2||S==3
  87. FE=VX*(n-L-2)/(R(m,m)-VX);
  88. disp(['FE=' num2str(FE)]) %输出 FE
  89. if FE<F1
  90. if L~=0
  91. disp('Neither Delete Out Nor Select In!')
  92. else
  93. disp('May Be Smaller F1 And F2')
  94. disp('The Stepwise Regression Analysis End!')
  95. break;%程序结束
  96. end
  97. else
  98. L=L+1;FQ=FQ-1;K=IX;
  99. disp(['X' int2str(K) ' Be Selected In'])
  100. Imin(outt+1)=IX;outt=outt+1;
  101. disp(['L = ' int2str(L) ])
  102. R=xiaoqu(R,K) %调用子函数,执行消去变换
  103. if L~=m-1
  104. continue;
  105. end
  106. disp('Already Selecting End')
  107. break;
  108. end
  109. else
  110. %计算剔除变量的F检验值
  111. FT=VN*(n-L-1)/R(m,m);
  112. disp(['剔除变量的F检验值' num2str(FT)])
  113. if FT>=F2
  114. FE=VX*(n-L-2)/(R(m,m)-VX);
  115. disp(['***FE=' num2str(FE)]) %输出 FE
  116. if FE<F1
  117. if L~=0
  118. disp('Neither Delete Out Nor Select In!')
  119. disp('The Stepwise Regression Analysis End!')
  120. break;%程序结束
  121. else
  122. disp('May Be Smaller F1 And F2')
  123. disp('The Stepwise Regression Analysis End!')
  124. break;%程序结束
  125. end
  126. else
  127. L=L+1;FQ=FQ-1;K=IX;
  128. disp(['X' int2str(K) ' Be Selected In'])
  129. disp(['L = ' int2str(L) ])
  130. Imin(outt+1)=IX;outt=outt+1;
  131. R=xiaoqu(R,K) %调用子函数,执行消去变换
  132. if L~=m-1
  133. continue;
  134. end
  135. disp('Already Selecting End')
  136. break;
  137. end
  138. else
  139. L=L-1;FQ=FQ+1;K=IN;
  140. disp(['X' int2str(K) ' Be Deleted Out'])
  141. disp(['L = ' int2str(L) ' (No. of Variable Selected)'])
  142. R=xiaoqu(R,K) %调用子函数
  143. continue
  144. end
  145. end
  146. end
  147. %输出相应的计算结果
  148. for i=1:m-1
  149. kk=R(i,m)*R(m,i);
  150. if kk<0
  151. B(i)=R(i,m)*SR(m)/SR(i);
  152. else
  153. B(i)=0;
  154. end
  155. end
  156. B0=xy_aver(m);
  157. for i=1:m-1
  158. B0=B0-B(i)*xy_aver(i);
  159. end
  160. disp(['回归系数为:' num2str(B0) ' ' num2str(B)])
  161. disp('回归方程为:')
  162. disp(['Y=' num2str(B0)])
  163. for i=1:m-1
  164. if B(i)~=0
  165. if B(i)>0
  166. disp(['+' num2str(B(i)) 'X' int2str(i)]);
  167. else
  168. disp([num2str(B(i)) 'X' int2str(i)]);
  169. end
  170. end
  171. end
  172. Q=SR(m)^2*R(m,m);%残差平方和
  173. disp(['Sum of SQuares of Residual Error(残差平方和) Q = ' num2str(Q)])
  174. S=SR(m)*sqrt(R(m,m)/FQ);%剩余标准差
  175. disp(['Standard Deviation(剩余标准差,即模型误差的均方根) S = ' num2str(S)])
  176. RR=sqrt(1-R(m,m));%复相关系数
  177. disp(['Multiple Correlation Coefficient(复相关系数) R = ' num2str(RR)])
  178. FF=FQ*(1-R(m,m))/(L*R(m,m));%回归方程显著性检验的F值
  179. disp(['F Value for Test of Regression(回归方程显著性检验,即回归模型的统计量) F = ' num2str(FF)])
  180. %F=SH*(m-n-1)/(SX*n);%F-统计量
  181. %PROB = 1 - fcdf(FF,m,n-length(Imin)-1)%与统计量F对应的概率P
  182. for i=1:m-1
  183. CC=R(i,i)*R(m,m);
  184. T(i)=R(i,m)/sqrt(CC/FQ);%各回归系数的t检验值
  185. R1(i)=R(i,m)/sqrt(CC+R(i,m)^2);%各自变量的偏相关系数
  186. end
  187. disp(['t Test Value of Argument(各回归系数的t检验值):' num2str(T)])
  188. disp(['Partial Corre.Coeffi.Ofargu.(各自变量的偏相关系数):' num2str(R1)])
  189. flag=input('是否重新进行逐步回归分析(1:是;0:否):');
  190. end

本文转载自: https://blog.csdn.net/Allen1862105/article/details/127941261
版权归原作者 Allen_freem 所有, 如有侵权,请联系我们删除。

“逐步回归 Matlab”的评论:

还没有评论