Coleman (1991): A production economy with an income tax
Coleman (1991) studies a variation of the RBC model with distortionary taxes. The author proves the existence and uniqueness of recursive equilibrium and charaterizes its properties in this economy. In addition, the author provides an algorithm to compute recursive equilibrium using policy function iteration and proves its convergence. This is one of the rare examples in which the convergence of the policy function iteration can be proved analytically.
Students in the advanced macroeconomics class (Econ 608) at Georgetown University in Spring 2020 (Tae-Hun Chang, Chen Jin, Menghan Li, Yingqi Xu) implented this algorithm in the GDSGE gmod file below.
The gmod File
1% Parameters
2parameters beta sigma alpha delta K_min K_max rho Imin tau;
3
4beta = 0.99; % dicount factor
5sigma = 2; % risk aversion
6alpha = 0.36; % capital share
7delta = 0.025; % depreciation rate
8rho = 0.90; %persistent of productivity shocks
9phi = 0.975; %investment irreversibility constraint
10tau = 0.2; %linear tax income
11
12TolEq = 1e-6;
13SaveFreq = 50;
14SimuSaveFreq = 1000;
15SimuPrintFreq = 1000;
16
17NumThreads = feature('NumCores');
18
19var_shock e;
20
21% Shocks
22shock_num = 2;
23shock_trans = [1/2.0,1/2.0;1/2.0,1/2.0];
24
25e = [-0.01,0.01]*sqrt(1-rho^2);
26
27% Steady state
28Kss = (alpha/(1/beta - 1 + delta))^(1/(1-alpha));
29Iss = delta*Kss;
30Imin = phi*Iss;
31
32K_min = 0.5*Kss;
33K_max = 1.5*Kss;
34
35% States
36var_state z K;
37
38z_pts = 21;
39z = linspace(0.9,1.1,z_pts);
40
41K_pts = 101;
42K = exp(linspace(log(K_min),log(K_max),K_pts));
43
44var_interp Euler_interp muc_interp;
45
46% Last period
47var_policy_init c;
48
49inbound_init c 1e-6 100;
50
51var_aux_init Euler mu muc;
52
53model_init;
54
55 Y = z*(K^alpha);
56
57 resid = 1 - c/(Y-Imin);
58
59 mu = 1;
60
61 muc = mu*(c^-sigma);
62
63 Euler = (c^-sigma)*(1-delta+(1-tau)*z*alpha*K^(alpha-1));
64
65 equations;
66 resid;
67 end;
68end;
69
70initial Euler_interp Euler;
71
72Euler_interp = Euler;
73
74initial muc_interp muc;
75
76muc_interp = muc;
77
78% Endogenous variables, bounds, and initial values
79
80var_policy c invst mu;
81
82inbound c 1e-6 100 adaptive(2);
83inbound invst 0 50 adaptive(1.5);
84inbound mu 0 2 adaptive(1.5);
85
86% Other equilbirium variables
87
88var_aux Y Euler K_next muc z_next[2] Inv;
89
90model;
91
92 Inv = invst + Imin;
93
94 K_next = Inv + (1-delta)*K;
95
96 Y = z*(K^alpha);
97
98 resid = 1 - (Inv+c)/Y;
99
100 % transition to z_next
101
102 z_next' = exp(rho*log(z)+e');
103
104 Euler_future' = Euler_interp'(z_next',K_next);
105
106 EEuler_future = GDSGE_EXPECT{Euler_future'};
107
108 muc_future' = muc_interp'(z_next',K_next);
109
110 Emuc_future = GDSGE_EXPECT{muc_future'};
111
112 Euler = (c^-sigma)*(1-delta+(1-tau)*z*alpha*K^(alpha-1));
113
114 % First order conditions for firms
115
116 foc = 1-mu - (beta*EEuler_future-beta*(1-delta)*Emuc_future)/(c^-sigma);
117
118 comp_slack = mu*invst;
119
120 muc = mu*(c^-sigma);
121
122 equations;
123 foc;
124 resid;
125 comp_slack;
126 end;
127
128end;
129
130simulate;
131
132 num_periods = 15000;
133 num_samples = 100;
134
135 initial K Kss;
136 initial z 1;
137
138 initial shock 2;
139
140 var_simu z K Y c Inv;
141
142 K' = K_next;
143 z' = z_next';
144
145end;