Merge pull request #1295 from JohannesPfeifer/stochastic_singularity
Stochastic singularitytime-shift
commit
4532d13fd3
|
@ -6075,6 +6075,15 @@ the option is equal to @code{0}, Dynare will not automatically change
|
|||
the filter, but rather use a penalty value for the likelihood when
|
||||
such a singularity is encountered. Default: @code{1}.
|
||||
|
||||
@item keep_kalman_algo_if_singularity_is_detected
|
||||
@anchor{keep_kalman_algo_if_singularity_is_detected}
|
||||
With the default @ref{use_univariate_filters_if_singularity_is_detected}=1, Dynare will switch
|
||||
to the univariate Kalman filter when it encounters a singular forecast error variance
|
||||
matrix during Kalman filtering. Upon encountering such a singularity for the first time, all subsequent
|
||||
parameter draws and computations will automatically rely on univariate filter, i.e. Dynare will never try
|
||||
the multivariate filter again. Use the @code{keep_kalman_algo_if_singularity_is_detected} option to have the
|
||||
@code{use_univariate_filters_if_singularity_is_detected} only affect the behavior for the current draw/computation.
|
||||
|
||||
@item qz_zero_threshold = @var{DOUBLE}
|
||||
@xref{qz_zero_threshold}.
|
||||
|
||||
|
|
|
@ -894,8 +894,10 @@ if imag(fval)~=0
|
|||
return
|
||||
end
|
||||
|
||||
% Update DynareOptions.kalman_algo.
|
||||
DynareOptions.kalman_algo = kalman_algo;
|
||||
if ~DynareOptions.kalman.keep_kalman_algo_if_singularity_is_detected
|
||||
% Update DynareOptions.kalman_algo.
|
||||
DynareOptions.kalman_algo = kalman_algo;
|
||||
end
|
||||
|
||||
if analytic_derivation==0 && nargout>3,
|
||||
lik=lik(start:end,:);
|
||||
|
|
|
@ -130,7 +130,19 @@ ana_deriv = DynareOptions.analytic_derivation;
|
|||
DynareOptions.analytic_derivation=0;
|
||||
if ~isequal(DynareOptions.mode_compute,11) || ...
|
||||
(isequal(DynareOptions.mode_compute,11) && isequal(DynareOptions.order,1))
|
||||
[fval,info] = feval(objective_function,xparam1,DynareDataset,DatasetInfo,DynareOptions,Model,EstimatedParameters,BayesInfo,BoundsInfo,DynareResults);
|
||||
%shut off potentially automatic switch to diffuse filter for the
|
||||
%purpose of checking stochastic singularity
|
||||
use_univariate_filters_if_singularity_is_detected_old=DynareOptions.use_univariate_filters_if_singularity_is_detected;
|
||||
DynareOptions.use_univariate_filters_if_singularity_is_detected=0;
|
||||
[fval,info] = feval(objective_function,xparam1,DynareDataset,DatasetInfo,DynareOptions,Model,EstimatedParameters,BayesInfo,BoundsInfo,DynareResults);
|
||||
if info(1)==50
|
||||
fprintf('\ninitial_estimation_checks:: The forecast error variance in the multivariate Kalman filter became singular.\n')
|
||||
fprintf('initial_estimation_checks:: This is often a sign of stochastic singularity, but can also sometimes happen by chance\n')
|
||||
fprintf('initial_estimation_checks:: for a particular combination of parameters and data realizations.\n')
|
||||
error('initial_estimation_checks:: The forecast error variance in the multivariate Kalman filter became singular.')
|
||||
end
|
||||
%reset options
|
||||
DynareOptions.use_univariate_filters_if_singularity_is_detected=use_univariate_filters_if_singularity_is_detected_old;
|
||||
else
|
||||
info=0;
|
||||
fval = 0;
|
||||
|
|
|
@ -328,6 +328,7 @@ XFAIL_MODFILES = ramst_xfail.mod \
|
|||
estim_param_in_shock_value_xfail.mod \
|
||||
optimal_policy/Ramsey/ramsey_ex_wrong_ss_file_xfail.mod \
|
||||
estimation/fs2000_mixed_ML_xfail.mod \
|
||||
estimation/fs2000_stochastic_singularity_xfail.mod \
|
||||
identification/ident_unit_root/ident_unit_root_xfail.mod \
|
||||
steady_state/Linear_steady_state_xfail.mod
|
||||
|
||||
|
|
|
@ -0,0 +1,76 @@
|
|||
// See fs2000.mod in the examples/ directory for details on the model
|
||||
|
||||
var m P c e W R k d n l gy_obs gp_obs y dA;
|
||||
varexo e_a e_m e_junk;
|
||||
|
||||
parameters alp bet gam mst rho psi del;
|
||||
|
||||
alp = 0.33;
|
||||
bet = 0.99;
|
||||
gam = 0.003;
|
||||
mst = 1.011;
|
||||
rho = 0.7;
|
||||
psi = 0.787;
|
||||
del = 0.02;
|
||||
|
||||
model;
|
||||
dA = exp(gam+e_a);
|
||||
log(m) = (1-rho)*log(mst) + rho*log(m(-1))+e_m;
|
||||
-P/(c(+1)*P(+1)*m)+bet*P(+1)*(alp*exp(-alp*(gam+log(e(+1))))*k^(alp-1)*n(+1)^(1-alp)+(1-del)*exp(-(gam+log(e(+1)))))/(c(+2)*P(+2)*m(+1))=0;
|
||||
W = l/n;
|
||||
-(psi/(1-psi))*(c*P/(1-n))+l/n = 0;
|
||||
R = P*(1-alp)*exp(-alp*(gam+e_a))*k(-1)^alp*n^(-alp)/W;
|
||||
1/(c*P)-bet*P*(1-alp)*exp(-alp*(gam+e_a))*k(-1)^alp*n^(1-alp)/(m*l*c(+1)*P(+1)) = 0;
|
||||
c+k = exp(-alp*(gam+e_a))*k(-1)^alp*n^(1-alp)+(1-del)*exp(-(gam+e_a))*k(-1);
|
||||
P*c = m;
|
||||
m-1+d = l;
|
||||
e = exp(e_a);
|
||||
y = k(-1)^alp*n^(1-alp)*exp(-alp*(gam+e_a));
|
||||
gy_obs = dA*y/y(-1) + e_junk;
|
||||
gp_obs = (P/P(-1))*m(-1)/dA;
|
||||
end;
|
||||
|
||||
steady_state_model;
|
||||
dA = exp(gam);
|
||||
gst = 1/dA;
|
||||
m = mst;
|
||||
khst = ( (1-gst*bet*(1-del)) / (alp*gst^alp*bet) )^(1/(alp-1));
|
||||
xist = ( ((khst*gst)^alp - (1-gst*(1-del))*khst)/mst )^(-1);
|
||||
nust = psi*mst^2/( (1-alp)*(1-psi)*bet*gst^alp*khst^alp );
|
||||
n = xist/(nust+xist);
|
||||
P = xist + nust;
|
||||
k = khst*n;
|
||||
|
||||
l = psi*mst*n/( (1-psi)*(1-n) );
|
||||
c = mst/P;
|
||||
d = l - mst + 1;
|
||||
y = k^alp*n^(1-alp)*gst^alp;
|
||||
R = mst/bet;
|
||||
W = l/n;
|
||||
ist = y-c;
|
||||
q = 1 - d;
|
||||
|
||||
e = 1;
|
||||
|
||||
gp_obs = m/dA;
|
||||
gy_obs = dA;
|
||||
end;
|
||||
|
||||
|
||||
shocks;
|
||||
var e_a; stderr 0.014;
|
||||
var e_m; stderr 0.005;
|
||||
var e_junk; stderr 0.005;
|
||||
end;
|
||||
|
||||
stoch_simul(order=1,periods=300,irf=0,nomoments) k y c;
|
||||
datatomfile('fsdat_simul_collinear', char('k','y','c'));
|
||||
|
||||
estimated_params;
|
||||
alp, beta_pdf, 0.356, 0.02;
|
||||
end;
|
||||
|
||||
varobs k y c;
|
||||
|
||||
|
||||
estimation(order=1,datafile=fsdat_simul_collinear) y m;
|
Loading…
Reference in New Issue