dynare/tests/decision_rules/k_order/burnside_k_order.mod

126 lines
3.8 KiB
Modula-2
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*
Check the policy functions obtained by perturbation at a high approximation
order, using the Burnside (1998, JEDC) model (for which the analytical form of
the policy function is known).
As shown by Burnside, the policy function for yₜ is:
yₜ = βⁱ exp[aᵢ+bᵢ(xₜxₛₛ)]
where:
θ² ⎛ 2ρ 1ρ²ⁱ⎞
— aᵢ = iθxₛₛ + σ² ─────── ⎢i ────(1ρⁱ) + ρ² ─────⎥
2(1ρ)² ⎝ 1ρ 1ρ² ⎠
θρ
— bᵢ = ───(1ρⁱ)
1ρ
— xₛₛ is the steady state of x
σ is the standard deviation of e.
With some algebra, it can be shown that the derivative of yₜ at the deterministic
steady state is equal to:
∂ᵐ⁺ⁿ⁺²ᵖ yₜ ∞ (2p)!
──────────────── = ∑ βⁱ bᵢᵐ⁺ⁿ ρᵐ ───── cᵢᵖ exp(iθxₛₛ)
∂ᵐxₜ₋₁ ∂ⁿeₜ ∂²ᵖs ⁱ⁼¹ p!
where:
— s is the stochastic scale factor
θ² ⎛ 2ρ 1ρ²ⁱ⎞
— cᵢ = ─────── ⎢i ────(1ρⁱ) + ρ² ─────⎥
2(1ρ)² ⎝ 1ρ 1ρ² ⎠
Note that derivatives with respect to an odd order for s (i.e. ∂²ᵖ⁺¹s) are always
equal to zero.
The policy function as returned in the oo_.dr.g_* matrices has the following properties:
— its elements are pre-multiplied by the Taylor coefficients;
— derivatives w.r.t. the stochastic scale factor have already been summed up;
— symmetric elements are folded (and they are not pre-multiplied by the number of repetitions).
As a consequence, the element gₘₙ corresponding to the m-th derivative w.r.t.
to xₜ₋₁ and the n-th derivative w.r.t. to eₜ is given by:
1 ∞ cᵢᵖ
gₘₙ = ────── ∑ ∑ βⁱ bᵢᵐ⁺ⁿ ρᵐ ──── exp(iθxₛₛ)
(m+n)! 0≤2p≤k-m-n ⁱ⁼¹ p!
where k is the order of approximation.
*/
@#define k =7
var y x;
varexo e;
parameters beta theta rho xbar;
xbar = 0.0179;
rho = -0.139;
theta = -1.5;
theta = -10;
beta = 0.95;
model;
y = beta*exp(theta*x(+1))*(1+y(+1));
x = (1-rho)*xbar + rho*x(-1)+e;
end;
shocks;
var e; stderr 0.0348;
end;
initval;
x = xbar;
y = beta*exp(theta*xbar)/(1-beta*exp(theta*xbar));
end;
steady;
stoch_simul(order=@{k},k_order_solver,irf=0,drop=0,periods=100);
% Verify that the policy function coefficients are correct
sigma2=M_.Sigma_e;
i = 1:800;
c = theta^2*sigma2/(2*(1-rho)^2)*(i-2*rho*(1-rho.^i)/(1-rho)+rho^2*(1-rho.^(2*i))/(1-rho^2));
b = theta*rho*(1-rho.^i)/(1-rho);
for ord = 0:@{k}
g = oo_.dr.(['g_' num2str(ord)])(2,:); % Retrieve computed policy function for variable y
for m = 0:ord % m is the derivation order with respect to x(-1)
v = 0;
for p = 0:floor((@{k}-ord)/2) % 2p is the derivation order with respect to s
if ord+2*p > 0 % Skip the deterministic steady state constant
v = v + sum(beta.^i.*exp(theta*xbar*i).*b.^ord.*rho^m.*c.^p)/factorial(ord)/factorial(p);
end
end
if abs(v-g(ord+1-m)) > 1e-14
error(['Error in matrix oo_.dr.g_' num2str(ord)])
end
end
end
% Verify that the simulated time series is correct
xss = oo_.steady_state(2);
xlag = xss;
for T = 1:size(oo_.endo_simul,2)
e_ = oo_.exo_simul(T);
y_ = oo_.steady_state(1);
for ord = 0:@{k}
g = oo_.dr.(['g_' num2str(ord)])(2,:); % Retrieve computed policy function for variable y
for m = 0:ord
y_ = y_ + g(ord+1-m)*(xlag-xss)^m*e_^(ord-m)*nchoosek(ord,m);
end
end
if abs(y_-oo_.endo_simul(1,T)) > 1e-14
error(['Error in k_order_simul DLL'])
end
xlag = oo_.endo_simul(2,T);
end