$title Three Approaches to Differential Tax Policy Analysis (THREEMGE,SEQ=154) $onText Three Approaches to Differential Tax Policy Analysis Rutherford, T F, Applied General Equilibrium Modeling with MPSGE as a GAMS Subsystem: An Overview of the Modeling Framework and Syntax. Computational Economics 14 (1999), 1-46. ------------------------------------------------------------------ SECTION (i) DATA SPECIFICATION AND BENCHMARKING Keywords: mixed complementarity problem, general equilibrium model, tax policy $offText Set G 'goods and sectors' / X, Y / F 'primary factors' / K, L / H 'households' / OWNER, WORKER/; Alias (S,G); Table A(G,S) 'make matrix (goods outputs by sector)' X Y X 100 Y 80; Table B(G,S) 'use matrix (goods inputs by sector)' X Y X 20 Y 10 ; Table C(G,H) 'household demand' OWNER WORKER X 30 50 Y 40 30; Table FD(F,S) 'factor demand by sector' X Y K 20 40 L 50 10; Table E(F,H) 'factor endowments' OWNER WORKER K 60 L 100; Table D(F,H) 'factor demand by households' WORKER L 40; Table T(F,S) 'tax payment by factor by sector' X Y K 20 10; Parameter TRN(H) 'transfer revenue' / OWNER 10, WORKER 20 / ELAS(S) 'elasticity of substitution in production' ESUB(H) 'elasticity of substitution in demand' TF(F,S) 'factor tax rate' PF(F,S) 'benchmark factor prices gross of tax'; ELAS(S) = 1; ESUB(H) = 0.5; TF(F,S) = T(F,S)/FD(F,S); PF(F,S) = 1 + TF(F,S); Scalar GREV 'benchmark government revenue'; GREV = sum(H, TRN(H)); Parameter THETA(G) 'weights in numeraire price index' WBAR(H) 'benchmark welfare index'; THETA(G) = sum(H, C(G,H)); THETA(G) = THETA(G)/sum(S, THETA(S)); WBAR(H) = sum(G, C(G,H)) + sum(F, D(F,H)); * MODEL #1 TAX POLICY WITH EXOGENOUSLY SPECIFIED TAX RATES * SECTION (ii) MPS/GE MODEL DECLARATION $onText $MODEL:HARBERGER $SECTORS: AL(S) $COMMODITIES: P(G) W(F) PT $CONSUMERS: RA(H) GOVT $REPORT: V:CD(G,H) D:P(G) DEMAND:RA(H) V:DF(F,H) D:W(F) DEMAND:RA(H) V:EMPLOY(S) I:W("L") PROD:AL(S) V:WLF(H) W:RA(H) $PROD:AL(S) s:0 a:ELAS(S) O:P(G) Q:A(G,S) I:P(G) Q:B(G,S) I:W(F) Q:FD(F,S) P:PF(F,S) A:GOVT T:TF(F,S) a: $DEMAND:RA(H) s:1 a:ESUB(H) D:P(G) Q:C(G,H) a: D:W(F) Q:D(F,H) E:W(F) Q:E(F,H) E:PT Q:TRN(H) $DEMAND:GOVT D:PT Q:GREV $offText * READ THE HEADER FILE: $sysInclude mpsgeset HARBERGER * SECTION (iii) BENCHMARK REPLICATION HARBERGER.iterLim = 0; $include HARBERGER.GEN solve HARBERGER using mcp; abort$(abs(HARBERGER.objVal) > 1.E-4) "*** HARBERGER benchmark does not calibrate."; HARBERGER.iterLim = 1000; * ------------------------------------------------------------------ * SECTION (iv) COUNTER-FACTUAL SPECIFICATION AND SOLUTION: Set SC 'counterfactual scenarios to be computed' / L 'UNIFORM TAX ON LABOR' K 'UNIFORM TAX ON CAPITAL' VA 'UNIFORM VALUE-ADDED TAX' /; Parameter TAXRATE(F,S,SC) 'counterfactual tax rates' REPORT(*,*,*,SC) 'solution report - % changes' PINDEX 'price deflator'; * SPECIFY COUNTER-FACTUAL TAX RATES TO ACHIEVE CETERIS * PARIBUS BALANCED BUDGET: TAXRATE("L",S,"L") = GREV/sum(G, FD("L",G)); TAXRATE("K",S,"K") = GREV/sum(G, FD("K",G)); TAXRATE("L",S,"VA") = GREV/sum((F,G), FD(F,G)); TAXRATE("K",S,"VA") = GREV/sum((F,G), FD(F,G)); loop(SC, * INSTALL TAX RATES FOR THIS COUNTERFACTUAL: TF(F,S) = TAXRATE(F,S,SC); $ include HARBERGER.GEN solve HARBERGER using mcp; * ------------------------------------------------------------------ * SECTION (v) REPORT WRITING: * REPORT SOME RESULTS: PINDEX = sum(G, P.l(G)*THETA(G)); REPORT("HARBERGER","REVENUE","_",SC) = 100*(PT.l/PINDEX - 1); REPORT("HARBERGER","TAXRATE","_",SC) = 100*smax((F,S), TAXRATE(F,S,SC)); REPORT("HARBERGER","WELFARE","TOTAL",SC) = 100*(sum(H, WBAR(H)*(WLF.l(H) - 1))/sum(H, WBAR(H))); REPORT("HARBERGER","WELFARE",H,SC) = 100*(WLF.l(H) - 1); REPORT("HARBERGER","EMPLOY",S,SC) = 100*(EMPLOY.l(S)/FD("L",S) - 1); REPORT("HARBERGER","PRICE",G,SC) = 100*(P.l(G)/PINDEX - 1); REPORT("HARBERGER","PRICE",F,SC) = 100*(W.l(F)/PINDEX - 1); REPORT("HARBERGER","OUTPUT",S,SC) = 100*(AL.l(S) - 1); ); * ------------------------------------------------------------------ * MODEL #2 DIFFERENTIAL TAX POLICY WITH ENDOGENOUS * ADJUSTMENT OF RATES TO ACHIEVE EQUAL YIELD * SECTION (ii) MPS/GE MODEL DECLARATION $onText $MODEL:SHOVEN $SECTORS: AL(S) $COMMODITIES: P(G) W(F) PT $CONSUMERS: RA(H) GOVT $AUXILIARY: TAU $REPORT: V:CD(G,H) D:P(G) DEMAND:RA(H) V:DF(F,H) D:W(F) DEMAND:RA(H) V:EMPLOY(S) I:W("L") PROD:AL(S) V:WLF(H) W:RA(H) $PROD:AL(S) s:0 a:ELAS(S) O:P(G) Q:A(G,S) I:P(G) Q:B(G,S) I:W(F) Q:FD(F,S) P:PF(F,S) A:GOVT N:TAU M:TF(F,S) a: $DEMAND:RA(H) s:1 a:ESUB(H) D:P(G) Q:C(G,H) a: D:W(F) Q:D(F,H) E:W(F) Q:E(F,H) E:PT Q:TRN(H) $DEMAND:GOVT D:PT Q:GREV $CONSTRAINT:TAU PT =g= sum(G, THETA(G)*P(G)); $offText $sysInclude mpsgeset SHOVEN * ------------------------------------------------------------------ * SECTION (iii) BENCHMARK REPLICATION * THE DEFAULT INITIAL VALUE FOR AUXILIARY VARIABLES IS ZERO, * SO TO REPLICATE THE BENCHMARK WE NEED TO ASSIGN THE LEVEL * VALUE TO UNITY: TAU.l = 1; * REINSTALL THE BENCHMARK TAX RATE: TF(F,S) = PF(F,S) - 1; * VERIFY THAT THE BENCHMARK EQUILIBRIUM IS REPLICATED: SHOVEN.iterLim = 0; $include SHOVEN.GEN solve SHOVEN using mcp; abort$(abs(SHOVEN.objVal) > 1.E-4) "*** SHOVEN benchmark does not calibrate."; SHOVEN.iterLim = 1000; * ------------------------------------------------------------------ * SECTION (iv) COUNTER-FACTUAL SPECIFICATION AND SOLUTION: loop(SC, * INSTALL TAX RATES FOR THIS COUNTERFACTUAL: TF(F,S) = TAXRATE(F,S,SC); $ include SHOVEN.GEN solve SHOVEN using mcp; * ------------------------------------------------------------------ * SECTION (v) REPORT WRITING: PINDEX = sum(G, P.l(G)*THETA(G)); REPORT("SHOVEN","REVENUE","_",SC) = 100*(PT.l/PINDEX - 1); REPORT("SHOVEN","TAXRATE","_",SC) = 100*TAU.l*smax((F,S), TAXRATE(F,S,SC)); REPORT("SHOVEN","WELFARE","TOTAL",SC) = 100*(sum(H, WBAR(H)*(WLF.l(H) - 1))/sum(H, WBAR(H))); REPORT("SHOVEN","WELFARE",H,SC) = 100*(WLF.l(H) - 1); REPORT("SHOVEN","EMPLOY",S,SC) = 100*(EMPLOY.l(S)/FD("L",S) - 1); REPORT("SHOVEN","PRICE",G,SC) = 100*(P.l(G)/PINDEX - 1); REPORT("SHOVEN","PRICE",F,SC) = 100*(W.l(F)/PINDEX - 1); REPORT("SHOVEN","OUTPUT",S,SC) = 100*(AL.l(S) - 1); ); Parameter V(H) 'benchmark valuation of public good' VSHR(H) 'public goods demand as a fraction of private demand' GD(G) 'inputs to government demand'; V(H) = TRN(H); VSHR(H) = V(H)/sum(G, C(G,H)); GD(G) = sum(H, VSHR(H)*C(G,H)); * READJUST PRIVATE DEMAND, MOVING PART OF PRIVATE DEMAND * INTO THE PUBLIC GOODS SECTOR INPUTS: C(G,H) = (1 - VSHR(H))*C(G,H); * ------------------------------------------------------------------ * MODEL #3 DIFFERENTIAL TAX POLICY WITH ENDOGENOUS * ADJUSTMENT OF RATES TO MAINTAIN OPTIMAL * PROVISION OF A PURE PUBLIC GOOD. * SECTION (ii) MPS/GE MODEL DECLARATION $onText $MODEL:SAMUELSON $SECTORS: AL(S) GP $COMMODITIES: P(G) W(F) PG VG(H) $CONSUMERS: RA(H) GOVT $AUXILIARY: TAU LGP $REPORT: V:CD(G,H) D:P(G) DEMAND:RA(H) V:DF(F,H) D:W(F) DEMAND:RA(H) V:EMPLOY(S) I:W("L") PROD:AL(S) V:WLF(H) W:RA(H) $PROD:AL(S) s:0 a:ELAS(S) O:P(G) Q:A(G,S) I:P(G) Q:B(G,S) I:W(F) Q:FD(F,S) P:PF(F,S) A:GOVT N:TAU$TF(F,S) M:TF(F,S)$TF(F,S) a: $PROD:GP s:0 O:PG Q:GREV I:P(G) Q:GD(G) $DEMAND:RA(H) s:1 a:ESUB(H) D:P(G) Q:C(G,H) a: D:W(F) Q:D(F,H) D:VG(H) Q:V(H) E:VG(H) Q:V(H) R:LGP E:W(F) Q:E(F,H) $DEMAND:GOVT D:PG Q:GREV $CONSTRAINT:TAU GREV*PG =g= sum(H, V(H)*VG(H)); $CONSTRAINT:LGP LGP =g= GP; $offText $sysInclude mpsgeset SAMUELSON * THE DEFAULT INITIAL VALUE FOR AUXILIARY VARIABLES IS ZERO, * SO TO REPLICATE THE BENCHMARK WE NEED TO ASSIGN THE LEVEL * VALUE TO UNITY: TAU.l = 1; LGP.l = 1; * REINSTALL THE BENCHMARK TAX RATE: TF(F,S) = PF(F,S) - 1; * VERIFY THAT THE BENCHMARK EQUILIBRIUM IS REPLICATED: SAMUELSON.iterLim = 0; $include SAMUELSON.GEN solve SAMUELSON using mcp; abort$(abs(SAMUELSON.objVal) > 1.E-4) "*** SAMUELSON benchmark does not calibrate."; SAMUELSON.iterLim = 1000; loop(SC, * INSTALL TAX RATES FOR THIS COUNTERFACTUAL: TF(F,S) = TAXRATE(F,S,SC); $ include SAMUELSON.GEN solve SAMUELSON using mcp; PINDEX = sum(G, P.l(G)*THETA(G)); * REPORT PERCENTAGE CHANGES: REPORT("SAMUELSON","REVENUE","_",SC) = 100*(GP.l*PG.L/PINDEX - 1); REPORT("SAMUELSON","TAXRATE","_",SC) = 100*TAU.l*smax((F,S), TF(F,S)); REPORT("SAMUELSON","WELFARE","TOTAL",SC) = 100*(sum(H, WBAR(H)*(WLF.l(H) - 1))/sum(H, WBAR(H))); REPORT("SAMUELSON","WELFARE",H,SC) = 100*(WLF.l(H) - 1); REPORT("SAMUELSON","PROVISION","_",SC) = 100*(GP.l - 1); REPORT("SAMUELSON","EMPLOY",S,SC) = 100*(EMPLOY.l(S)/FD("L",S) - 1); REPORT("SAMUELSON","PRICE",G,SC) = 100*(P.l(G)/PINDEX - 1); REPORT("SAMUELSON","PRICE",F,SC) = 100*(W.l(F)/PINDEX - 1); REPORT("SAMUELSON","OUTPUT",S,SC) = 100*(AL.l(S) - 1); ); * GENERATE A FINAL REPORT: option REPORT:1:2:1; display REPORT;