fix loglinear option with leaded or lagged exogenous variables

time-shift
Michel Juillard 2016-05-02 13:51:51 +02:00
parent e07d97a16e
commit 7e13fe5ef7
4 changed files with 16 additions and 11 deletions

View File

@ -88,7 +88,7 @@ switch task
if isfield(oo.Smoother,'Constant') && isfield(oo.Smoother.Constant,v_name)
y0(i,:)=y0(i,:)-oo.Smoother.Constant.(v_name)(end-maximum_lag+1:end); %subtract mean or steady state
if options.loglinear
y0(i,:)=y0(i,:)+log(oo.dr.ys(strmatch(v_name,deblank(M.endo_names),'exact')));
y0(i,:)=y0(i,:)+log_variable(i,oo.dr.ys,M);
else
y0(i,:)=y0(i,:)+oo.dr.ys(strmatch(v_name,deblank(M.endo_names),'exact'));
end

View File

@ -108,8 +108,9 @@ if info(1)
end
if options.loglinear
% Find variables with non positive steady state.
idx = find(dr.ys<1e-9);
% Find variables with non positive steady state. Skip auxiliary
% variables for lagges/leaded exogenous variables
idx = find(dr.ys(get_all_variables_but_lagged_leaded_exogenous(M)) < 1e-9);
if length(idx)
if options.debug
variables_with_non_positive_steady_state = M.endo_names(idx,:);

View File

@ -84,8 +84,8 @@ else
end
if options_.loglinear && isfield(oo_.dr,'ys') && options_.logged_steady_state==0 %log steady state for correct display of decision rule
oo_.dr.ys=log(oo_.dr.ys);
oo_.steady_state=log(oo_.steady_state);
oo_.dr.ys=log_variable(1:M_.endo_nbr,oo_.dr.ys,M_);
oo_.steady_state=log_variable(1:M_.endo_nbr,oo_.steady_state,M_);
options_old.logged_steady_state = 1; %make sure option is preserved outside of stoch_simul
options_.logged_steady_state=1; %set option for use in stoch_simul
end

View File

@ -334,12 +334,16 @@ end
if options_.loglinear
% this needs to be extended for order=2,3
k = find(dr.kstate(:,2) <= M_.maximum_endo_lag+1);
klag = dr.kstate(k,[1 2]);
k1 = dr.order_var;
dr.ghx = repmat(1./dr.ys(k1),1,size(dr.ghx,2)).*dr.ghx.* ...
repmat(dr.ys(k1(klag(:,1)))',size(dr.ghx,1),1);
dr.ghu = repmat(1./dr.ys(k1),1,size(dr.ghu,2)).*dr.ghu;
k = get_all_variables_but_lagged_leaded_exogenous(M_);
[ik,k1] = rm_lagged_leaded_exogenous_variables(dr.order_var,M_);
[iklag,klag1] = rm_lagged_leaded_exogenous_variables(dr.order_var(M_.nstatic+(1:M_.nspred)),M_);
if ~isempty(ik)
if M_.maximum_endo_lag > 0
dr.ghx(ik,iklag) = repmat(1./dr.ys(k1),1,length(klag1)).*dr.ghx(ik,iklag).* ...
repmat(dr.ys(klag1)',length(ik),1);
end
dr.ghu(ik,:) = repmat(1./dr.ys(k1),1,M_.exo_nbr).*dr.ghu(ik,:);
end
if options_.order>1
error('Loglinear options currently only works at order 1')
end