threemge.gms : Three Approaches to Differential Tax Policy Analysis

Description

Three Approaches to Differential Tax Policy Analysis


Reference

  • 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.

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;