Matlab逐步拟合不会通过循环

时间:2015-12-23 01:17:28

标签: matlab

我是一个相对较新的Matlab用户,并且可能比我能用这段代码咀嚼更多。基本上,它在所有1505列中都有循环的逐步回归时间(重要的是保留没有数据的列)

在代码开始时,由于滞后(在另一个代码中预先确定),某些列的长度会发生变化。我认为这导致了问题,因为我在代码中进一步降低了尺寸不匹配(下面通过注释表示)。我很困难,不知道如何解决问题。我真的很感激任何明显被指出的东西。

提前感谢您的帮助!

for j = 1:1505

   m = lag (1,j) %this is a number between 1 and 6 indicating the best lag 

  Nc=NDVI(m+1:end,j);
  A1c=Approx1 (1:end-m,j);
  A2c=Approx2 (1:end-m,j);  
  A3c=Approx3 (1:end-m,j);
  A4c=Approx4 (1:end-m,j);
  D1c=Det1 (1:end-m,j);
  D2c=Det2 (1:end-m,j);
  D3c=Det3 (1:end-m,j);
  D4c=Det4 (1:end-m,j);

  xx=[A1c, A2c, A3c, A4c, D1c, D2c, D3c, D4c];
  yy = Nc;

  %Begin Stepwise Regression

  if isnan(Nc)
      continue
  else

          [B,SE,PVAL,INMODEL,STATS,NEXTSTEP,HISTORY]= ...
                                   stepwisefit(xx,yy,'penter',.05);

    inApprox1(j)=INMODEL(1);
    inApprox2(j)=INMODEL(2);
    inApprox3(j)=INMODEL(3);
    inApprox4(j)=INMODEL(4);
    inDpprox7(j)=INMODEL(5);
    inDpprox8(j)=INMODEL(6);
    inDpprox9(j)=INMODEL(7);
    inDpprox10(j)=INMODEL(8);

    sstotApprox1(j)=STATS.SStotal;        %calculate R^2
    ssresidApprox1(j)=STATS.SSresid;
    rsq = 1- ssresidApprox1./sstotApprox1
    rsq(rsq==Inf) = NaN                     %Set Inf to NaN

    rmse(j)=STATS.rmse;              %Extract rmse
    rmse(rmse==Inf) = NaN;           %Set Inf to NaN


    % repeat regresson only on the sigificant variables
    if sum(INMODEL,2)>0
    xip=0; 
    for k=1:8   %8 refers to previous 8 variables including intecept
        if INMODEL(1,k)==1
            xip=xip+1;
            xxn(:,xip)=xx(:,k); %ERROR HERE, xip AND k DIMENSION MISMATCH. UNSURE HOW TO SOLVE
        end
    end


      [Bn,SEn,PVALn,INMODELn,STATSn,NEXTSTEPn,HISTORYn]= ...
                                   stepwisefit(xxn,yy,'penter',.05);      
            rmsen(j)=STATSn.rmse;              %Extract rmse
            rmsen(rmse==Inf) = NaN;           %Set Inf to NaN
    end
  end
end

1 个答案:

答案 0 :(得分:0)

您的代码遭到爆炸,因为您没有为每个新的延迟清除xxn变量。相反,因为你的xxn是持久的,我相信下次你通过最外层的循环时,它最终会有错误的大小(错误的行数)。

在我看来,您应该将xxn变量初始化为正确大小的零。您可以在代码的这一部分中执行此操作...

% repeat regresson only on the sigificant variables
if sum(INMODEL,2)>0
xxn = zeros(size(xx,1),8);  %ADD THIS LINE!  Initializes to zero.
xip=0; 
for k=1:8   %8 refers to previous 8 variables including intecept
    if INMODEL(1,k)==1
        xip=xip+1;
        xxn(:,xip)=xx(:,k); %these should now be the correct dimension
    end
end