function [inmodel,gcv,history,RSS,DOF,inmodelHistory] = backwardsStepwisePrune(X,inpe,y,lambda,varargin) [N,T]=size(y); nargin okargs = {'mvweights'}; defaults = {ones(1,T) }; [eid,emsg,mvweights] = mygetargs(okargs,defaults,varargin{:}); eid emsg Mmax = length(inpe)+1; inmodel = ones(1,Mmax); Kstar = inmodel; xin = X(:,find(inmodel)); B= (xin'*xin)\(xin')*y; %S = xin*((xin'*xin)\(xin')); yhat = xin*B; res = y-yhat; temprss=0; rss0=0; for j=1:T temprss =temprss+mvweights(j)*res(:,j)'*res(:,j); rss0=rss0+sum((y(:,j)-mean(y(:,j))).^2)*mvweights(j); end rss = temprss; [N,ninmodel]=size(xin); [D,nbetas]=calculateEffectiveParameters(xin,inpe(find(inmodel(2:length(inmodel)))),N,T,lambda); gcv(1)=calculateLOF(rss,N,D,T,rss0,nbetas); lofstar = gcv(1); Mrange = Mmax-[0:1:(Mmax-2)]; counter = 1; history = cell(1,Mmax); inmodelHistory = cell(1,Mmax); RSS = zeros(1,Mmax); DOF = zeros(1,Mmax); for M = Mrange counter = counter+1; b = Inf; % keeps track of min{GCV) for all models with M dof. L = Kstar; % keeps track of the variables left in the model at this stage. Linmodel = find(L); for m = Linmodel % TRY DELETING EACH VARIABLE IN MODEL ONE BY ONE. % fprintf('M=%d,m=%d\n',M,m); if m ~= 1 % never delete the intercept term. K = L; K(m) = 0; xin=X(:,find(K)); % CALCULATE THE LOF B= (xin'*xin)\(xin')*y; %S = xin*((xin'*xin)\(xin')); yhat = xin*B; res = y-yhat; temprss=0; for j=1:T temprss =temprss+mvweights(j)*res(:,j)'*res(:,j); end rss = temprss; [N,ninmodel]=size(xin); [D,nbetas]=calculateEffectiveParameters(xin,inpe(find(K(2:length(K)))),N,T,lambda); lof=calculateLOF(rss,N,D,T,rss0,nbetas); if lof < b b = lof; Kstar = K; inmodelHistory{counter}= Kstar; history{counter} = inpe{m-1}; RSS(counter-1) = rss; DOF(counter-1) = D; end if lof < lofstar lofstar = lof; inmodel = K; end end end gcv(counter) = b; fprintf('At step %d, %s would be deleted.\n', counter-1, char(history{counter})); end RSS=RSS(1:counter-1); DOF=DOF(1:counter-1);