Replication of Sims (2010)
This example replicates Sims (2010) from the Handbook of Monetary Economics using the DRIPs package.
to run and modify the following code (no software is needed on the local machine).
See Afrouzi and Yang (2020) for background on the theory.
Contents
Setup
The problem in Sims (2011), as it appears on page 21, with slight change of notation,
where
We have renamed the parameters so that the problem directly maps to a D.R.I.P. Otherwise, the problem is the same.
Initialization
Include the package:
using DRIPs;
nothing #hide
Set parameters:
β = 0.9;
ω = 1.0;
A = [0.95 0.0; 0.0 0.4];
Q = [√0.0975 0.0; 0.0 √0.86];
H = [1.0; 1.0];
nothing #hide
Solution and Performance
Benchmark Parameterization
Solve and display the optimal posterior covariance matrix:
sol_bp = Drip(ω,β,A,Q,H);
sol_bp.ss.Σ_p
2×2 Array{Float64,2}:
0.359213 -0.177025
-0.177025 0.794584
Performance for random values of $\omega\in [0,2]$:
using BenchmarkTools;
@benchmark Drip(ω,β,A,Q,H) setup = (ω = 2*rand())
BenchmarkTools.Trial:
memory estimate: 162.38 KiB
allocs estimate: 1551
--------------
minimum time: 80.321 μs (0.00% GC)
median time: 88.286 μs (0.00% GC)
mean time: 108.515 μs (17.15% GC)
maximum time: 6.428 ms (97.12% GC)
--------------
samples: 10000
evals/sample: 1
Performance for random values of $\beta\in[0,1]$:
@benchmark Drip(ω,β,A,Q,H) setup = (β = rand())
BenchmarkTools.Trial:
memory estimate: 162.38 KiB
allocs estimate: 1551
--------------
minimum time: 80.000 μs (0.00% GC)
median time: 97.624 μs (0.00% GC)
mean time: 118.448 μs (17.32% GC)
maximum time: 6.445 ms (97.04% GC)
--------------
samples: 10000
evals/sample: 1
Lower Cost of Attention: $\omega = 0.1$
Solve and display the optimal posterior covariance matrix:
sol_lω = Drip(0.1,β,A,Q,H);
sol_lω.ss.Σ_p
2×2 Array{Float64,2}:
0.319919 -0.304142
-0.304142 0.386163
Different Discount Factors: $\beta \in \{0,1\}$
Solve the model for $\beta=0$ and $\beta=1$ to compare with the benchmark value of $\beta=0.9$:
$\beta = 0$
sol_lβ = Drip(ω,0,A,Q,H);
sol_lβ.ss.Σ_p
2×2 Array{Float64,2}:
0.495403 -0.152171
-0.152171 0.808939
$\beta = 1$:
sol_hβ = Drip(ω,1,A,Q,H);
sol_hβ.ss.Σ_p
2×2 Array{Float64,2}:
0.337666 -0.178019
-0.178019 0.799701
Impulse Response Functions
Benchmark Parameterization
Get the IRFs:
T = 25;
irfs_bp = irfs(sol_bp,T = T);
nothing #hide
Plot IRFs:
using Plots, LaTeXStrings; pyplot();
p1 = plot(1:T, [irfs_bp.x[1,1,:], irfs_bp.a[1,1,:]],
title = L"IRFs to Slow-Moving Shock ($\rho = 0.95$)",
label = ["Shock" "Price"],
color = [:darkgray :black],
marker = [:circle :square],
markerstrokecolor = :match,
markercolor = false,
markersize = 6)
p2 = plot(1:T, [irfs_bp.x[2,2,:], irfs_bp.a[1,2,:]],
title = L"IRFs to Fast-Moving Shock ($\rho = 0.4$)",
label = ["Shock" "Price"],
color = [:darkgray :black],
marker = [:circle :square],
markerstrokecolor = :match,
markercolor = false,
markersize = 6)
p = plot(p1,p2,
layout = (2,1),
xlabel = "Time",
lw = 2,
xticks = (1:2:T),
xlim = (0,T+1),
fontfamily = "serif",
legend = :topright,
legendfont = font(12),
tickfont = font(12),
size = (900,550),
framestyle = :box)
Lower Cost of Attention: $\omega=0.1$
Get the IRFs:
T = 25; #length of IRFs
irfs_lω = irfs(sol_lω,T = T);
nothing #hide
Plot IRFs:
p1 = plot(1:T, [irfs_lω.x[1,1,:], irfs_lω.a[1,1,:]],
title = L"IRFs to Slow-Moving Shock ($\rho = 0.95$)",
label = ["Shock" "Price"],
color = [:darkgray :black],
marker = [:circle :square],
markerstrokecolor = :match,
markercolor = false,
markersize = 6)
p2 = plot(1:T, [irfs_lω.x[2,2,:], irfs_lω.a[1,2,:]],
title = L"IRFs to Fast-Moving Shock ($\rho = 0.4$)",
label = ["Shock" "Price"],
color = [:darkgray :black],
marker = [:circle :square],
markerstrokecolor = :match,
markercolor = false,
markersize = 6)
p = plot(p1,p2,
layout = (2,1),
xlabel = "Time",
lw = 2,
xticks = (1:2:T),
xlim = (0,T+1),
fontfamily = "serif",
legend = :topright,
legendfont = font(12),
tickfont = font(12),
size = (900,550),
framestyle = :box)
Other Discount Factors: $\beta\in\{0,1\}$
Get the IRFs:
T = 25; #length of IRFs
irfs_lβ = irfs(sol_lβ,T = T);
irfs_hβ = irfs(sol_hβ,T = T);
nothing #hide
Plot IRFs:
p1 = plot(1:T, [irfs_bp.x[1,1,:],irfs_hβ.a[1,1,:], irfs_lβ.a[1,1,:]],
title = L"IRFs to Slow-Moving Shock ($\rho = 0.95$)",
label = ["Shock" L"Price ($\beta=1$)" L"Price ($\beta=0$)"],
color = [:darkgray :black :gray50],
marker = [:circle :square :utriangle],
markerstrokecolor = :match,
markercolor = false,
markersize = 6)
p2 = plot(1:T, [irfs_bp.x[2,2,:],irfs_hβ.a[1,2,:], irfs_lβ.a[1,2,:]],
title = L"IRFs to Fast-Moving Shock ($\rho = 0.4$)",
label = ["Shock" L"Priceblack ($\beta=1$)" L"Price ($\beta=0$)"],
color = [:darkgray :black :gray50],
marker = [:circle :square :utriangle],
markerstrokecolor = :match,
markercolor = false,
markersize = 6)
p = plot(p1,p2,
layout = (2,1),
xlabel = "Time",
lw = 2,
xticks = (1:2:T),
xlim = (0,T+1),
fontfamily = "serif",
legend = :topright,
legendfont = font(12),
tickfont = font(12),
size = (900,550),
framestyle = :box)
Extensions
Transition Dynamics of Attention
In this section, we solve for the transition dynamics of the optimal posterior covariance matrix starting from an initial prior that is different from the steady state prior.
For instance let us consider a case where the firm is at the steady state of the rational inattention problem at time 0, with prior covariance matrix $\bar{\Sigma}_{-1}$, and it receives a one time treatment with a perfectly informative signal about its optimal price:
Solve for the transition dynamics
The function Trip
solves for the transition dynamics automatically given the initial signal. Start by initializing the initial signal:
s0 = DRIPs.Signal(H,0.0);
nothing #hide
Solve for the transition dynamics given $s_0$:
Tss = 15; # guess for time until convergence
bp_trip = Trip(sol_bp, s0; T = Tss);
nothing #hide
Performance for solving the transition dynamics for a random signal:
@benchmark Trip(sol_bp, S; T = 30) setup = (S = DRIPs.Signal(rand(2),0.0))
BenchmarkTools.Trial:
memory estimate: 501.02 KiB
allocs estimate: 6200
--------------
minimum time: 487.478 μs (0.00% GC)
median time: 519.538 μs (0.00% GC)
mean time: 589.391 μs (10.83% GC)
maximum time: 7.933 ms (87.83% GC)
--------------
samples: 8470
evals/sample: 1
Plot Transition Path of Eigenvalues
Plot the marginal values of information. In this problem the state is two dimensional. At any time, for every orthogonalized dimension, the agent weighs the marginal value of acquiring information in that dimension against the marginal cost of attention which is the parameter $\omega$.The number of signals that the agent acquires at any time is the number of marginal values that are larger than $\omega$.
p = plot(0:Tss-1,[bp_trip.Ds[1,1:Tss],bp_trip.Ds[2,1:Tss],bp_trip.p.ω*ones(Tss,1)],
label = ["Low marginal value dim." "High marginal value dim." "Marginal cost of attention"],
size = (900,275),
title = "Marginal Value of Information",
xlabel = "Time",
color = [:darkgray :black :black],
line = [:solid :solid :dash],
marker = [:circle :square :none],
markercolor = false,
markerstrokecolor = :match,
markersize = 6,
xlim = (-1,Tss),
xticks = 0:2:Tss-1,
legend = :outertopright,
fontfamily = "serif",
framestyle = :box)
Impulse Response Functions with Information Treatment
Get the IRFs in the transition path after treatment:
T = 30;
tirfs_bp = irfs(sol_bp,s0,T = T); # irfs with treatment
irfs_bp = irfs(sol_bp,T = T); # irfs in the Ss (without treatment)
nothing #hide
Plot IRFs:
p1 = plot(1:T, [irfs_bp.x[1,1,:], tirfs_bp.a[1,1,:], irfs_bp.a[1,1,:]],
title = L"IRFs to Slow-Moving Shock ($\rho = 0.95$)",
label = ["Shock" "Price (w/ treatment)" "Price (w/o treatment)"],
color = [:darkgray :black :gray80],
marker = [:circle :square :utriangle],
markerstrokecolor = :match,
markercolor = false,
markersize = 6)
p2 = plot(1:T, [tirfs_bp.x[2,2,:], tirfs_bp.a[1,2,:], irfs_bp.a[1,2,:]],
title = L"IRFs to Fast-Moving Shock ($\rho = 0.4$)",
label = ["Shock" "Price (w/ treatment)" "Price (w/o treatment)"],
color = [:darkgray :black :gray80],
marker = [:circle :square :utriangle],
markerstrokecolor = :match,
markercolor = false,
markersize = 6)
p = plot(p1,p2,
layout = (2,1),
xlabel = "Time",
lw = 2,
xticks = (1:2:T),
xlim = (0,T+1),
fontfamily = "serif",
legend = :topright,
legendfont = font(12),
tickfont = font(12),
size = (900,550),
framestyle = :box)
This page was generated using Literate.jl.