Description
Three Approaches to Differential Tax Policy Analysis
Small Model of Types : MPSGE mcp
Category : GAMS Model library
Main file : threemge.gms
$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;