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) 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 y0(i,:)=y0(i,:)-oo.Smoother.Constant.(v_name)(end-maximum_lag+1:end); %subtract mean or steady state
if options.loglinear 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 else
y0(i,:)=y0(i,:)+oo.dr.ys(strmatch(v_name,deblank(M.endo_names),'exact')); y0(i,:)=y0(i,:)+oo.dr.ys(strmatch(v_name,deblank(M.endo_names),'exact'));
end end

View File

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

View File

@ -84,8 +84,8 @@ else
end end
if options_.loglinear && isfield(oo_.dr,'ys') && options_.logged_steady_state==0 %log steady state for correct display of decision rule 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_.dr.ys=log_variable(1:M_.endo_nbr,oo_.dr.ys,M_);
oo_.steady_state=log(oo_.steady_state); 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_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 options_.logged_steady_state=1; %set option for use in stoch_simul
end end

View File

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