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

Coleman1991.gmod

  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;