function [GS,pickn,ok,uis,uiu,vs]=gstate(G1,impact,pick) %function [GS,pickn,ok,uis,vs]=gstate(G1,impact,pick) % G1: the coefficient on lagged y from the output of gensys.m. % impact:the coefficient on exogenous shocks from the output of gensys.m % pick: an optional guess at a matrix of coefficients that extracts % the state vector from y % ok: 0 if pick matrix is just no good. % 1 if pick matrix is usable forward, but loses initial date information % 2 if pick matrix is not usable forward, is part of a correct state vector, but is not complete % 3 if pick matrix is usable forward, is part of a correct state vector, but is not complete % 4 if pick matrix is not usable forward, summarizes past, but is redundant % 5 if pick matrix is usable forward, summarizes past, but is redundant % 6 if pick matrix summarizes past and is not redundant, but is not usable forward % 7 if pick matrix is perfect, both forward and as history summary % pickn: a matrix of coefficients that extracts the state vector from y. Equal % to pick if pick is supplied and ok=1; otherwise, an ok-maximizing pick matrix that % is somewhat similar to pick. % GS: the matrix of coefficients on the lagged state variable % uis,vs: If uis'*vs is square and full rank, ok=7 is possible, otherwise not. If ok<2, an ok>2 can be found by trying % a pick in the row space of vs'. Any pick with pick*uis full column rank will provide a foward state % (i.e. ok an odd number). % uiu: uiu'y(t)=0, and this is interpretable as the decision rule setting controls as functions of the states. % The solution was in the form y(t)=G1*y(t-1)+impact*z(t). Now it's in the form y(t)=GS*pickn*y(t-1)+impact*z(t). % In general, pickn is mxn with mREALSMALL); nd=top(end); us=u(:,top); uu=u(:,top+1:end); d=d(top,top); vs=v(:,top); if nargin<=2 pick=vs'; vp=v; vps=vs; dp=eye(nd); ups=eye(nr,nd); ndp=nd; else [up dp vp]=svd(pick); topp=find(diag(dp)>REALSMALL); ndp=topp(end); vps=vp(:,topp); dp=dp(topp,topp); ups=up(:,topp); end % If we were worried about efficiency, we'd skip some of this when pick=vs. %Does pick summarize history? (pick in v' row space, v in vp' row space). pinv=all(all((pick'-vs*vs'*pick').^2REALSMALL); ndi=length(topi); uis=ui(:,topi); uiu=ui(:,ndi+1:size(ui,2)); if ndiREALSMALL); if length(toppu)REALSMALL); p2=ur(:,topr); pickn=[pick;p2']; GS=G1/pickn; elseif oknow GS=G1/[pick;uiu']; GS=GS(:,1:size(pick,1)); pickn=pick; else pickn=vs'; GS=us*d; end ok=oknow+2*pinv+4*vinp;