General Equilibrium Modeling with MPSGE:
Some Examples for Self-Study

Models M2: Closed Economy Models -- Extensions

James Markusen and Thomas F. Rutherford

Department of Economics
University of Colorado

rutherford@colorado.edu

1995

Return to the MARKUSEN index and download page.

Return to the MPSGE home page

$TITLE Model M2-1s: Closed 2x2 Economy -- Calibrating to a Pre-Existing Tax


$ontext

This model introduces taxes.  The important lesson is to keep track
of what prices firms and consumers face.

It is not possible to calibrate a benchmark equilibrium with all
prices equal to one.  For example, if a production input is taxed,
then if its consumer price is one, the producer price is specified as
(1 + t).  On the other hand, if the producer price is unity, the
consumer price is 1/(1+t).

In the benchmark data matrix we enter values received by firms and
consumers, so that residual is government revenue.  (For simplicity,
we assume here that tax revenue is returned to consumers as lump-sum
income.)

The first formulation of the model assumes a 100% tax on labor input
to the production of X.  If the consumer price of L is unity, then X
firms have a price equal to 2.0.

The following accounting matrix adds a row for tax collections
(negative) and with tax revenues appearing as a consumer endowment
(i.e., lump sum rebate):

                Production Sectors          Consumers

   Markets   |    X       Y        W    |       CONS
   ------------------------------------------------------
        PX   |  100             -100    |
        PY   |          100     -100    |
        PW   |                   200    |       -200
        PL   |  -20     -60             |         80
        PK   |  -60     -40             |        100
        TAX  |  -20       0             |         20
   ------------------------------------------------------

$offtext

*       Declare parameters which will be need to specify the
*       benchmark and counterfactual cases.  

SCALAR  TX      Proportional output tax on sector X,
        TY      Proportional output tax on sector Y,
        TLX     Ad-valorem tax on labor inputs to X,
        TKX     Ad-valorem tax on capital inputs to X;

$ONTEXT

$MODEL:M2_1S

$SECTORS:
        X       ! Activity level for sector X
        Y       ! Activity level for sector Y
        W       ! Activity level for sector W (Hicksian welfare index)

$COMMODITIES:
        PX      ! Price index for commodity X
        PY      ! Price index for commodity Y
        PL      ! Price index for primary factor L (net of tax)
        PK      ! Price index for primary factor K
        PW      ! Price index for welfare (expenditure function)

$CONSUMERS:
        CONS    ! Income level for consumer CONS

*       In the benchmark data, tax payments on labor inputs to
*       the X sector equal the value of labor inputs.  Hence, the
*       ad-valorem tax rate, TL, equals 100%.  This means that the user 
*       cost of labor equals PL * (1 + TL) = 2.  

*       When the benchmark price of a production input or output is not
*       equal to unity, it is necessary to add a reference price field.
*       The relative prices of inputs fix the marginal rate of substitution
*       (on inputs, marginal rate of transformation on outputs).  

*       Benchmark reference prices and reference quantities 
*       are needed to provide a first order approximation of the 
*       underlying technology.  (The quantity fields alone provide
*       a zero order approximation.  The quantities, prices and elasticity
*       parameters together provide a second-order approximation.)

*       N.B. The reference price for production inputs equals 1 plus
*       the benchmark ad-valorem tax rate.  This value does not change
*       with the tax rate in a counter-factual.

$PROD:X s:1
        O:PX    Q:100        A:CONS T:TX        ! Output tax initially 0.
        I:PL    Q: 20   P:2  A:CONS T:TLX       ! Labor tax = 1 in benchmark
        I:PK    Q: 60        A:CONS T:TKX       ! Capital tax initially 0.

*       Y sector will be subject to an output tax in the counterfactual:

$PROD:Y s:1
        O:PY    Q:100  T:TY     ! Output tax initially 0.
        I:PL    Q:60
        I:PK    Q:40

*       Note that the demand for X equals 100 -- we measure X in
*       units of benchmark value, gross of tax:

$PROD:W s:1
        O:PW    Q:200
        I:PX    Q:100
        I:PY    Q:100

$DEMAND:CONS
        D:PW    Q:200
        E:PL    Q:80
        E:PK    Q:100

$OFFTEXT
$SYSINCLUDE mpsgeset M2_1S

*       Note that for this example, we do not fix a numeraire.  For 
*       larger models, it is best to let the solver do the normalization.
*       Some care is needed, however, in interpreting the solution.

*       Benchmark replication:

TX  = 0;
TY  = 0;
TLX = 1;
TKX = 0;

M2_1S.ITERLIM = 0;
$INCLUDE M2_1S.GEN
SOLVE M2_1S USING MCP;
M2_1S.ITERLIM = 2000;

*       In the first counterfactual, we replace the tax on labor inputs
*       by a uniform tax on both factors:

TLX = 0.25;  
TKX = 0.25;
TX  = 0;
TY  = 0;
$INCLUDE M2_1S.GEN
SOLVE M2_1S USING MCP;

$ontext

In the next counterfactual, eliminate taxes on X sector inputs and
replace with a single tax on X sector output.  In the uniform input
tax equilibrium, we have:

                 PX* * 100 = (1 + 0.25) * VA(PL*,PK*)

where PX*, PL* and PK* are equilibrium prices for X, L and K.

We then see that:

                    PX* * 100 * 0.8 = VA(PL*, PK*)

In other words, an output tax of 20% (defined on a gross basis) is
equivalent to to an input tax of 25% (defined on a net basis).

The application of a 20% output tax in place of a 25% input tax
therefore has no effect on the equilibrium.  To this this, we can run
the numbers:

$offtext

TLX = 0;
TKX = 0;
TX  = 0.2;
TY  = 0;
$INCLUDE M2_1S.GEN
SOLVE M2_1S USING MCP;

*       One more equivalence can be demonstrated with this small model.
*       The following counterfactual demonstrates that a 20% tax on the 
*       output of X is the same as a 25% subsidy to the production
*       of Y.  Absolute prices may differ in terms of the numeraire,
*       but all quantities and welfare are the same.

TKX = 0;
TLX = 0;
TX = 0;
TY = -0.25;
$INCLUDE M2_1S.GEN
SOLVE M2_1S USING MCP;

$TITLE: Model M2-1s: Closed 2x2 Tax-Ridden Economy -- Vector Syntax


TABLE BMFLOW(*,*)  Benchmark Flows (in value terms)

                 X       Y        W     CONS              
        X      100             -100                               
        Y              100     -100                               
        W                       200     -200              
        L      -20     -60                80              
        K      -60     -40               100              
        TAX    -20       0                20              

SET     I       Goods   /X, Y/
        F       Factors /L, K/;

ALIAS (I,J)

PARAMETER       YBAR(I)         Benchmark output levels
                FDBAR(F,I)      Benchmark factor inputs
                CBAR(I)         Benchmark final demand
                PBAR(F,I)       Benchmark factor price
                ENDOW(F)        Factor endowments
                TXF(F,I)        Ad-valorem tax rate on sector I inputs
                TXO(I)          Proportioanl tax rate on sector I outputs
                UBAR            Benchmark expenditure;

*       Extract values from the table:

YBAR(I)         = BMFLOW(I,I);
FDBAR(F,I)      = -BMFLOW(F,I);
CBAR(I)         = -BMFLOW(I,"W");
UBAR            = SUM(I, CBAR(I));
ENDOW(F)        = BMFLOW(F,"CONS");

TXF("L",I)      =  -BMFLOW("TAX",I) / FDBAR("L",I);
PBAR(F,I)       = 1 + TXF(F,I);
TXO(I)          = 0;

$ONTEXT

$MODEL:M2_1

$SECTORS:
        A(I)            ! ACTIVITY LEVEL
        W               ! WELFARE INDEX

$COMMODITIES:
        PW              ! UTILITY "PRICE"
        P(I)            ! GOODS PRICES
        PF(F)           ! FACTOR PRICES

$CONSUMERS:
        CONS            ! REPRESENTATIVE CONSUMER

$PROD:A(I) s:1
        O:P(I)          Q:YBAR(I)       A:CONS  T:TXO(I)
        I:PF(F)         Q:FDBAR(F,I)    P:PBAR(F,I)  A:CONS  T:TXF(F,I)

$PROD:W  s:1
        O:PW    Q:UBAR
        I:P(I)  Q:CBAR(I)

$DEMAND:CONS
        D:PW    Q:UBAR
        E:PF(F) Q:ENDOW(F)

$OFFTEXT

$SYSINCLUDE mpsgeset M2_1


M2_1.ITERLIM = 0;
$INCLUDE M2_1.GEN
SOLVE M2_1 USING MCP;
M2_1.ITERLIM = 2000;

PARAMETER REPORT        Summary report;

REPORT("WELFARE"," ","BENCH")   = W.L;
REPORT("PRICE",I,"BENCH")       = P.L(I) / PW.L;
REPORT("PRICE",F,"BENCH")       = PF.L(F) / PW.L;
REPORT("OUTPUT",I,"BENCH")      = A.L(I) * YBAR(I);

*       Compute tax revenue as the difference between
*       the value of expenditure and endowment income:

REPORT("TAXREV"," ","BENCH") = W.L*PW.L*UBAR - SUM(F,PF.L(F)*ENDOW(F));

*       Apply a uniform tax on X:

TXF(F,"X") = 0.25;
$INCLUDE M2_1.GEN
SOLVE M2_1 USING MCP;

REPORT("WELFARE"," ","UNIF_X")   = W.L;
REPORT("PRICE",I,"UNIF_X")       = P.L(I) / PW.L;
REPORT("PRICE",F,"UNIF_X")      = PF.L(F) / PW.L;
REPORT("OUTPUT",I,"UNIF_X")     = A.L(I) * YBAR(I);
REPORT("TAXREV"," ","UNIF_X") = W.L*PW.L*UBAR - SUM(F,PF.L(F)*ENDOW(F));

*       Show that the equilibrium a uniform input tax is logically
*       equivalent to a uniform output tax: 

TXF(F,I) = 0;
TXO("X") = 0.20;

$INCLUDE M2_1.GEN
SOLVE M2_1 USING MCP;

REPORT("WELFARE"," ","TAX_X")   = W.L;
REPORT("PRICE",I,"TAX_X")       = P.L(I) / PW.L;
REPORT("PRICE",F,"TAX_X")       = PF.L(F) / PW.L;
REPORT("OUTPUT",I,"TAX_X")      = A.L(I) * YBAR(I);
REPORT("TAXREV"," ","TAX_X") = W.L*PW.L*UBAR - SUM(F,PF.L(F)*ENDOW(F));


*       Finally, demonstrate the equivalence of a tax on X and a 
*       subsidy on Y:

TXF(F,I) = 0;
TXO("X") = 0;
TXO("Y") = -0.25;

$INCLUDE M2_1.GEN
SOLVE M2_1 USING MCP;

REPORT("WELFARE"," ","SBSD_Y")   = W.L;
REPORT("PRICE",I,"SBSD_Y")       = P.L(I) / PW.L;
REPORT("PRICE",F,"SBSD_Y")      = PF.L(F) / PW.L;
REPORT("OUTPUT",I,"SBSD_Y")     = A.L(I) * YBAR(I);
REPORT("TAXREV"," ","SBSD_Y") = W.L*PW.L*UBAR - SUM(F,PF.L(F)*ENDOW(F));


*       Provide a summary report of results at the end:

DISPLAY REPORT;

$TITLE Model M2-2S: Closed 2x2 Economy -- income taxes and labor supply


$ONTEXT

Following model M1-4A, we introduce additional activities which
transform (supply) household owned factors into production inputs.

In this example, the consumer owns 200 units of leisure, supplies 100
(LS) in the benchmark and retains 100 as leisure.  Tax is applied to 
both labor and capital supply to the market.  (The leisure margin
is untaxed.)

Benchmark value flows:

                  Production Sectors                 Consumers
   Markets   |    A       B        W      TK   TK      CONS
   ----------------------------------------------------------
        PX   |  120             -120
        PY   |          120     -120           
        PW   |                   340                  -340
        PLS  |  -48     -72              120           
        PKS  |  -72     -48                      120   100
        PL   |                  -100    -100           200
        PK   |                                  -100
        TAX  |                           -20     -20    40 
   ---------------------------------------------------------

Activity TL transforms leisure into labor supply, and TK transforms
capital into capital supply.

Scaling is a matter of personal taste.  In most applied models,
market prices are scaled to unity in the benchmark.  This makes it
easier to scan for deviations and reduces the amount of data which
must be handled.  On the other hand, there may be situations in which
the most natural approach is to adopt reference prices which differ
from unity.

Here, we will demonstrate how it is possible to rescale prices to
other values in setting up the model.  In the following, we scale the
benchmark prices for X, Y, LS and KS to be 1.2.  In this way,
quantities measure NET OF TAX value.

$OFFTEXT

*       Declare parameters to be used in setting up counter-factual
*       equilibria:

SCALAR  TXL     Labor income tax rate,
        TXK     Capital income tax rate;

$ONTEXT

$MODEL:M2_2S

$SECTORS:
        X       ! Activity level for sector X
        Y       ! Activity level for sector Y
        W       ! Activity level for sector W (Hicksian welfare index)
        TL      ! Supply activity for L
        TK      ! Supply activity for K

$COMMODITIES:
        PX      ! Price index for commodity X
        PY      ! Price index for commodity Y
        PL      ! Price index for primary factor L (net of tax)
        PK      ! Price index for primary factor K (net of tax)
        PLS     ! Price index for primary factor L (gross of tax)
        PKS     ! Price index for primary factor K (gross of tax)
        PW      ! Price index for welfare (expenditure function)

$CONSUMERS:
        CONS    ! Income level for consumer CONS

*       The P: fields shown here present the benchmark prices.
*       Strictly speaking, they could be omitted because the
*       marginal rate of substitution remains equal to unity when
*       the reference price of inputs are the same.

$PROD:X s:1
        O:PX  Q:100  P:1.2
        I:PLS  Q:40  P:1.2
        I:PKS  Q:60  P:1.2

$PROD:Y s:1
        O:PY  Q:100  P:1.2
        I:PLS  Q:60  P:1.2
        I:PKS  Q:40  P:1.2 

*       The income tax applies to labor and capital supplies:

$PROD:TL
        O:PLS  Q:100  P:1.2
        I:PL   Q:100  P:1  A:CONS T:TXL

$PROD:TK
        O:PKS  Q:100  P:1.2
        I:PK   Q:100  P:1  A:CONS T:TXK

$PROD:W s:0.7  a:1
        O:PW   Q:340
        I:PX   Q:100  P:1.2  a:
        I:PY   Q:100  P:1.2  a:
        I:PL   Q:100

$DEMAND:CONS
        D:PW   Q:340
        E:PL   Q:200
        E:PK   Q:100

$OFFTEXT
$SYSINCLUDE mpsgeset M2_2S

*       Benchmark replication:

PX.L =1.2; PY.L =1.2; PLS.L =1.2; PKS.L =1.2;

TXL = 0.2;
TXK = 0.2;

M2_2S.ITERLIM = 0;
$INCLUDE M2_2S.GEN
SOLVE M2_2S USING MCP;
M2_2S.ITERLIM = 2000;

*       Lets do some counter-factual with taxes shifted to the
*       factor which is in fixed supply:

PARAMETER  SUMMARY;

TXL = 0.15;
TXK = 0.25;
$INCLUDE M2_2S.GEN
SOLVE M2_2S USING MCP;
SUMMARY("TL=15%","Hicks EV%") = 100 * (W.L-1);
SUMMARY("TL=15%","Real Wage%") = 100 * (PL.L/PW.L - 1);
SUMMARY("TL=15%","Return %") = 100 * (PK.L/PW.L - 1);
SUMMARY("TL=15%","Revenue %") = 
  100 * ((W.L * PW.L * 340 - PL.L * 200 - PK.L * 100)/(40*(PX.L+PY.L)/2) - 1);

TXL = 0.10;
TXK = 0.30;
$INCLUDE M2_2S.GEN
SOLVE M2_2S USING MCP;
SUMMARY("TL=10%","Hicks EV%") = 100 * (W.L-1);
SUMMARY("TL=10%","Real Wage%") = 100 * (PL.L/PW.L - 1);
SUMMARY("TL=10%","Return %") = 100 * (PK.L/PW.L - 1);
SUMMARY("TL=10%","Revenue %") = 
  100 * ((W.L * PW.L * 340 - PL.L * 200 - PK.L * 100)/(40*(PX.L+PY.L)/2) - 1);

TXL = 0.05;
TXK = 0.35;
$INCLUDE M2_2S.GEN
SOLVE M2_2S USING MCP;
SUMMARY("TL=5%","Hicks EV%") = 100 * (W.L-1);
SUMMARY("TL=5%","Real Wage%") = 100 * (PL.L/PW.L - 1);
SUMMARY("TL=5%","Return %") = 100 * (PK.L/PW.L - 1);
SUMMARY("TL=5%","Revenue %") = 
  100 * ((W.L * PW.L * 340 - PL.L * 200 - PK.L * 100)/(40*(PX.L+PY.L)/2) - 1);

TXL = 0.00;
TXK = 0.40;
$INCLUDE M2_2S.GEN
SOLVE M2_2S USING MCP;
SUMMARY("TL=0%","Hicks EV%") = 100 * (W.L-1);
SUMMARY("TL=0%","Real Wage%") = 100 * (PL.L/PW.L - 1);
SUMMARY("TL=0%","Return %") = 100 * (PK.L/PW.L - 1);
SUMMARY("TL=0%","Revenue %") = 
  100 * ((W.L * PW.L * 340 - PL.L * 200 - PK.L * 100)/(40*(PX.L+PY.L)/2) - 1);

DISPLAY SUMMARY;

$TITLE Model M2-3S: Closed 2x2 Economy -- Equal Yield Tax Reform


$ONTEXT

This model is a follow-up on model M2-2s where we considered some
income tax reform experiments.  Like that model, here we apply
taxes through activities which transform (supply) household owned
factors into production inputs.

The difference here is that we set up a model in which we can
do differential tax policy analysis --- holding the level of 
government revenue constant.  In order to keep things simple, we
continue to rebate tax revenue in lump-sum fashion.

This model introduces a fourth (and final) class of MPSGE unknown
(in addition to activity levels, commodity prices and income levels).
The new entity is called an "auxiliary variable".  In this model,
we use an auxiliary variable to endogenously alter the tax rate
in order to maintain an equal yield.

As in the previous model, the consumer owns 200 units of leisure, 
supplies 100 (LS) in the benchmark and retains 100 as leisure.  
Tax is applied to both labor and capital supply to the market.  
(The leisure margin is untaxed.)

Benchmark value flows:

                  Production Sectors                 Consumers
   Markets   |    A       B        W      TK   TK      CONS
   ----------------------------------------------------------
        PX   |  120             -120
        PY   |          120     -120           
        PW   |                   340                  -340
        PLS  |  -48     -72              120           
        PKS  |  -72     -48                      120   100
        PL   |                  -100    -100           200
        PK   |                                  -100
        TAX  |                           -20     -20    40 
   ---------------------------------------------------------

Activity TL transforms leisure into labor supply, and TK transforms
capital into capital supply.

In this example, we use the more traditional scaling in which 
all market prices are unity in the benchmark.

$OFFTEXT

*       Declare parameters to be used in setting up counter-factual
*       equilibria:

SCALAR  TXL     Labor income tax rate,
        TXK     Capital income tax rate;

$ONTEXT

$MODEL:M2_3S

$SECTORS:
        X       ! Activity level for sector X
        Y       ! Activity level for sector Y
        W       ! Activity level for sector W (Hicksian welfare index)
        TL      ! Supply activity for L
        TK      ! Supply activity for K

$COMMODITIES:
        PX      ! Price index for commodity X
        PY      ! Price index for commodity Y
        PL      ! Price index for primary factor L (net of tax)
        PK      ! Price index for primary factor K (net of tax)
        PLS     ! Price index for primary factor L (gross of tax)
        PKS     ! Price index for primary factor K (gross of tax)
        PW      ! Price index for welfare (expenditure function)

$CONSUMERS:
        CONS    ! Income level for consumer CONS

$AUXILIARY:
        TAU     ! Tax multiplier associated with equal yield constraint.

*       The P: fields shown here present the benchmark prices.
*       Strictly speaking, they could be omitted because the
*       marginal rate of substitution remains equal to unity when
*       the reference price of inputs are the same.

$PROD:X s:1
        O:PX   Q:120
        I:PLS  Q: 48
        I:PKS  Q: 72

$PROD:Y s:1
        O:PY   Q:120
        I:PLS  Q: 72
        I:PKS  Q: 48

*       The income tax applies to labor and capital supplies.

*       Notice that I've omitted the reference price for PL here --
*       the actual value is 1.2, but because there is only one input
*       we don't have to worry about specify the MRS!

*       The new syntax introduced here is the use of an eNdogenous
*       tax field (N:TAU) and Multiplier (M:TXL).  In this sector
*       the user cost of labor is given by:  PL (1 + TAU * TXL).

*       The value of TXL is exogenously specified, but the value of
*       TAU is determined within the model 

$PROD:TL
        O:PLS  Q:120
        I:PL   Q:100  A:CONS N:TAU  M:TXL

$PROD:TK
        O:PKS  Q:120
        I:PK   Q:100  A:CONS N:TAU  M:TXK

$PROD:W s:0.7  a:1
        O:PW   Q:340
        I:PX   Q:120  a:
        I:PY   Q:120  a:
        I:PL   Q:100

$DEMAND:CONS
        D:PW   Q:340
        E:PL   Q:200
        E:PK   Q:100

*       The model-specification is complete, except that we must
*       specify the equal-yield constraint.  This is most easily
*       expressed by recognizing that government revenue equals the
*       difference between expenditure and factor incomes.  We 
*       specify a constraint stating that this value must remain
*       at the benchmark level:

$CONSTRAINT:TAU
        W * PW * 340 - PL * 200 - PK * 100  =E= 40 * (PX + PY)/2;

*       We multiply the benchmark tax revenue (40) by a weighted
*       average of X and Y prices.  This defines the revenue target in 
*       real terms -- assuming that government output requires
*       equal amounts of X and Y inputs.

$OFFTEXT
$SYSINCLUDE mpsgeset M2_3S

*       For historical reasons, the default value of auxiliary variables
*       is not unity but zero.  To replicate the benchmark, we must install
*       an initial value:

TAU.L = 1;

*       Benchmark replication:

TXL = 0.2;
TXK = 0.2;

M2_3S.ITERLIM = 0;
$INCLUDE M2_3S.GEN
SOLVE M2_3S USING MCP;
M2_3S.ITERLIM = 2000;

*       Repeat our calculations subject to an equal yield constraint.
*       Here we fix the relative magnitude of the tax

PARAMETER  SUMMARY  Consequences of tax reform;

TXL = 0.15;
TXK = 0.25;
$INCLUDE M2_3S.GEN
SOLVE M2_3S USING MCP;
SUMMARY("TL/TK=3/5","Hicks EV%") = 100 * (W.L-1);
SUMMARY("TL/TK=3/5","Real Wage%") = 100 * (PL.L/PW.L - 1);
SUMMARY("TL/TK=3/5","TL")        = TAU.L * TXL;
SUMMARY("TL/TK=3/5","TK")        = TAU.L * TXK;
SUMMARY("TL/TK=3/5","Return %") = 100 * (PK.L/PW.L - 1);

TXL = 0.10;
TXK = 0.30;
$INCLUDE M2_3S.GEN
SOLVE M2_3S USING MCP;
SUMMARY("TL/TK=1/3","Hicks EV%") = 100 * (W.L-1);
SUMMARY("TL/TK=1/3","Real Wage%") = 100 * (PL.L/PW.L - 1);
SUMMARY("TL/TK=1/3","Return %") = 100 * (PK.L/PW.L - 1);
SUMMARY("TL/TK=1/3","TL")        = TAU.L * TXL;
SUMMARY("TL/TK=1/3","TK")        = TAU.L * TXK;

TXL = 0.05;
TXK = 0.35;
$INCLUDE M2_3S.GEN
SOLVE M2_3S USING MCP;
SUMMARY("TL/TK=1/7","Hicks EV%") = 100 * (W.L-1);
SUMMARY("TL/TK=1/7","Real Wage%") = 100 * (PL.L/PW.L - 1);
SUMMARY("TL/TK=1/7","Return %") = 100 * (PK.L/PW.L - 1);
SUMMARY("TL/TK=1/7","TL")        = TAU.L * TXL;
SUMMARY("TL/TK=1/7","TK")        = TAU.L * TXK;

TXL = 0.00;
TXK = 0.40;
$INCLUDE M2_3S.GEN
SOLVE M2_3S USING MCP;
SUMMARY("TL=0","Hicks EV%") = 100 * (W.L-1);
SUMMARY("TL=0","Real Wage%") = 100 * (PL.L/PW.L - 1);
SUMMARY("TL=0","Return %") = 100 * (PK.L/PW.L - 1);
SUMMARY("TL=0","TL")        = TAU.L * TXL;
SUMMARY("TL=0","TK")        = TAU.L * TXK;

TXL = -0.05;
TXK = 0.45;
$INCLUDE M2_3S.GEN
SOLVE M2_3S USING MCP;
SUMMARY("TL/TK=-1/7","Hicks EV%") = 100 * (W.L-1);
SUMMARY("TL/TK=-1/7","Real Wage%") = 100 * (PL.L/PW.L - 1);
SUMMARY("TL/TK=-1/7","Return %") = 100 * (PK.L/PW.L - 1);
SUMMARY("TL/TK=-1/7","TL")        = TAU.L * TXL;
SUMMARY("TL/TK=-1/7","TK")        = TAU.L * TXK;

DISPLAY SUMMARY;

$TITLE Model M2-4S: Closed 2x2 Economy -- Monopoly markups


$ONTEXT

Suppose that we believe that our benchmark data was generated by a
monopoly producer in sector X, who sets an optimal markup given by
the inverse Marshallian elasticity of demand.  If SIGMA is elasticity
of substitution between X and Y, and SHAREX is the share of
expenditure on good X, then the Marshallian elasticity (defined as a
positive number) is given by

                e  = SIGMA - (SIGMA -1) SHAREX

The monopoly markup on marginal cost, MK, is the inverse of this, i.e. 

                              MK = 1/e.

In the data shown below, the formula 

                           PX (1 - MK) = MC

where MC is marginal cost, tells us that the markup is 0.20.  
We can observe from the data that SHAREX= 0.5.  

Working backwards, this calibrates to an elasticity of substitution
SIGMA = 9.0.  This is used below.  Similarly, if units are chosen such
that the prices of L and K are one, the price of X must be 1.25, and
the quantity of X produced must be 80.

As an aside, we note that for most data, the monopoly markup formula,
and an arbitrary elasticity of substitution are generally mutually
inconsistent.

                Production Sectors          Consumers

   Markets   |    X       Y        W    |       CONS
   ------------------------------------------------------
        PX   |  100             -100    |
        PY   |          100     -100    |
        PW   |                   200    |       -200
        PL   |  -30     -60             |         90
        PK   |  -50     -40             |         90
      PROFIT |  -20                     |         20
   ------------------------------------------------------

$offtext

SCALAR  SIGMA   Elasticity of substitution (calibrated) /9/;

$ONTEXT

$MODEL:M2_4S

$SECTORS:
        X       ! Activity level for sector X
        Y       ! Activity level for sector Y
        W       ! Activity level for sector W (Hicksian welfare index)

$COMMODITIES:
        PX      ! Price index for commodity X
        PY      ! Price index for commodity Y
        PL      ! Price index for primary factor L (net of tax)
        PK      ! Price index for primary factor K
        PW      ! Price index for welfare (expenditure function)

$CONSUMERS:
        CONS    ! Representative agent.

$AUXILIARY:
        SHAREX  ! Value share of good X
        MARKUP  ! X sector markup on marginal cost
 
$PROD:X  s:1
        O:PX    Q: 80    A:CONS  N:MARKUP
        I:PL    Q: 30
        I:PK    Q: 50

$PROD:Y  s:1
        O:PY    Q:100
        I:PL    Q:60
        I:PK    Q:40

$PROD:W s:9
        O:PW    Q:200
        I:PX    Q: 80  P:1.25
        I:PY    Q:100

$DEMAND:CONS
        D:PW     Q:200
        E:PL     Q: 90
        E:PK     Q: 90

*       Define the value share of X in final demand:

$CONSTRAINT:SHAREX
        SHAREX =E= 80*PX*X / (80*PX*X + 100*PY*Y) ;

$CONSTRAINT:MARKUP
        MARKUP =E= 1 / (SIGMA - (SIGMA-1) * SHAREX);

$OFFTEXT
$SYSINCLUDE mpsgeset M2_4S

*       Benchmark replication:

PX.L     = 1.25;
SHAREX.L =  0.5;  
MARKUP.L =  0.2;

$INCLUDE M2_4S.GEN
SOLVE M2_4S USING MCP;

*       Evaluate the potential gains from first-best (marginal
*       cost) pricing:

SHAREX.L =  0.5;  
MARKUP.FX = 0;

$INCLUDE M2_4S.GEN
SOLVE M2_4S USING MCP;

$TITLE Model M2-5S: Closed 2x2 Economy -- Public Provision


$ontext

The assumption of lump-sum redistribution is convenient trick
which simplifies tax policy analysis.  In practice, governments often
use money to purchase things which private markets do not provide.
People value the public provision, but for some reason it is not easy
to collect money from beneficiaries.

In this model we use a trick give both consumers to full supply of
the public good.  A government "consumer" purchase the public good
(i.e., for its own "consumption") with tax revenue.  A rationing
constraint then gives each consumer an "endowment" of the public good
equal to the amount actually produced.

PG gives the marginal cost of the public good. PG1 and PG2 are the
private valuations of the public good by the two consumers.  Private
valuations are not actually observed in the data, but to do any
welfare analysis, we need to know these values.  

Note that the initial data presented below represent a Pareto
Optimum: it satisfies the Samuelson condition that the sum of the
private values of the public good equal the cost of providing the
good.  More explanation is given below.

The benchmark accounting matrix:

             Production Sectors          Consumers

Markets|    X    Y    G   W1   W2       CONS1   CONS2   GOVT
---------------------------------------------------------------
  PX   |  100            -70  -30
  PY   |       100       -30  -70 
  PG   |             50                                  -50
  PL   |  -50  -30  -20                    50      50
  PK   |  -30  -50  -20                    50      50

  TAX  |  -20  -20  -10                                   50

  PW1  |                  125            -125
  PW2  |                       125               -125
  PG1  |                  -25              25
  PG2  |                       -25                 25
---------------------------------------------------------------

$offtext

SCALAR  TAX     Value-added tax rate;

$ONTEXT

$MODEL:M2_5S

$SECTORS:
        X       ! Activity level for sector X
        Y       ! Activity level for sector Y
        G       ! Activity level for sector G  (public provision)
        W1      ! Activity level for sector W1 (consumer 1 welfare index)
        W2      ! Activity level for sector W2 (consumer 2 welfare index)

$COMMODITIES:
        PX      ! Price index for commodity X
        PY      ! Price index for commodity Y
        PG      ! Price index for commodity G (marginal cost of public output)
        PL      ! Price index for primary factor L (net of tax)
        PK      ! Price index for primary factor K
        PW1     ! Price index for welfare (consumer 1)
        PW2     ! Price index for welfare (consumer 2)
        PG1     ! Private valuation of the public good (consumer 1)
        PG2     ! Private valuation of the public good (consumer 2)

$CONSUMERS:
        CONS1   ! Consumer 1
        CONS2   ! Consumer 2
        GOVT    ! Government

$AUXILIARY:
        LGP     ! Level of government provision

*       Assume tax payments in the benchmark constitute a
*       uniform value-added tax:

$PROD:X  s:1
        O:PX     Q:100
        I:PL     Q: 50   P:1.25  A:GOVT  T:TAX
        I:PK     Q: 30   P:1.25  A:GOVT  T:TAX

$PROD:Y   s:1
        O:PY     Q:100
        I:PL     Q: 30   P:1.25  A:GOVT  T:TAX
        I:PK     Q: 50   P:1.25  A:GOVT  T:TAX

$PROD:G  s:1
        O:PG     Q: 50
        I:PL     Q: 20  P:1.25  A:GOVT  T:TAX
        I:PK     Q: 20  P:1.25  A:GOVT  T:TAX

*       In the data we observe the amount 50 of the public good produced
*       If we want to assume that this is an optimum amount, then the
*       demand prices of each of the consumers for 50 units of the public
*       good must sum to one.  The utility functions below are specified
*       (calibrated) such that each consumer "demands" 50 units of the 
*       public good if the price is 0.5 given the consumption levels of the 
*       other goods  

$PROD:W1   s:1
        O:PW1   Q:125
        I:PX    Q: 70 
        I:PY    Q: 30
        I:PG1   Q: 50   P:0.5

$PROD:W2   s:1
        O:PW2   Q:125
        I:PX    Q: 30
        I:PY    Q: 70
        I:PG2   Q: 50   P:0.5

$DEMAND:GOVT
        D:PG

$DEMAND:CONS1
        D:PW1   Q:125
        E:PL    Q: 50
        E:PK    Q: 50
        E:PG1   Q: 50  R:LGP

$DEMAND:CONS2
        D:PW2   Q:125
        E:PL    Q: 50
        E:PK    Q: 50
        E:PG2   Q: 50  R:LGP

$CONSTRAINT:LGP
        LGP =E= G;

$OFFTEXT
$SYSINCLUDE mpsgeset M2_5S

*       Benchmark replication

TAX = 0.25;
LGP.L = 1;
PG1.L = 0.5;
PG2.L = 0.5;

M2_5S.ITERLIM = 0;
$INCLUDE M2_5S.GEN
SOLVE M2_5S USING MCP;
M2_5S.ITERLIM = 2000;

*       The following counterfactual checks that the original
*       benchmark is indeed an optimum by raising the tax a bit:

TAX = 0.26;
$INCLUDE M2_5S.GEN
SOLVE M2_5S USING MCP;

OPTION DECIMALS = 8;
DISPLAY W1.L, W2.L;

$TITLE Model M2-6S: Closed 2x2 Economy -- Public Output with Samuelson Rule


$ontext

This model is the same as M2-5 except that the tax rate is endogenous,
adjusting to provide the "optimum" level of the public good.  The tax
is adjusted until the sum of the individual prices for the public
good equal to supply price.  

$offtext

SCALAR  VG1  Preference index for public goods for consumer 1 /1/;

$ONTEXT

$MODEL:M2_6S

$SECTORS:
        X       ! Activity level for sector X
        Y       ! Activity level for sector Y
        G       ! Activity level for sector G  (public provision)
        W1      ! Activity level for sector W1 (consumer 1 welfare index)
        W2      ! Activity level for sector W2 (consumer 2 welfare index)

$COMMODITIES:
        PX      ! Price index for commodity X
        PY      ! Price index for commodity Y
        PG      ! Price index for commodity G (marginal cost of public output)
        PL      ! Price index for primary factor L (net of tax)
        PK      ! Price index for primary factor K
        PW1     ! Price index for welfare (consumer 1)
        PW2     ! Price index for welfare (consumer 2)
        PG1     ! Private valuation of the public good (consumer 1)
        PG2     ! Private valuation of the public good (consumer 2)

$CONSUMERS:
        CONS1   ! Consumer 1
        CONS2   ! Consumer 2
        GOVT    ! Government

$AUXILIARY:
        LGP     ! Level of government provision
        TAX     ! Uniform value-added tax rate

*       Assume tax payments in the benchmark constitute a
*       uniform value-added tax:

$PROD:X  s:1
        O:PX     Q:100
        I:PL     Q: 50   P:1.25  A:GOVT  N:TAX
        I:PK     Q: 30   P:1.25  A:GOVT  N:TAX

$PROD:Y   s:1
        O:PY     Q:100
        I:PL     Q: 30   P:1.25  A:GOVT  N:TAX
        I:PK     Q: 50   P:1.25  A:GOVT  N:TAX

$PROD:G  s:1
        O:PG     Q: 50
        I:PL     Q: 20  P:1.25  A:GOVT  N:TAX
        I:PK     Q: 20  P:1.25  A:GOVT  N:TAX

*       In the data we observe the amount 50 of the public good produced
*       If we want to assume that this is an optimum amount, then the
*       demand prices of each of the consumers for 50 units of the public
*       good must sum to one.  The utility functions below are specified
*       (calibrated) such that each consumer "demands" 50 units of the 
*       public good if the price is 0.5 given the consumption levels of the 
*       other goods  

$PROD:W1   s:1
        O:PW1   Q:125
        I:PX    Q: 70 
        I:PY    Q: 30
        I:PG1   Q:(VG1*50)   P:0.5

$PROD:W2   s:1
        O:PW2   Q:125
        I:PX    Q: 30
        I:PY    Q: 70
        I:PG2   Q: 50  P:0.5

$DEMAND:GOVT
        D:PG

$DEMAND:CONS1
        D:PW1   Q:125
        E:PL    Q: 50
        E:PK    Q: 50
        E:PG1   Q: 50  R:LGP

$DEMAND:CONS2
        D:PW2   Q:125
        E:PL    Q: 50
        E:PK    Q: 50
        E:PG2   Q: 50  R:LGP

$CONSTRAINT:LGP
        LGP =E= G;

*       Simple (potentially invalid) rule for determine the level
*       of tax and level of public output: equate marginal cost of
*       provision to the sum of marginal valuations.

$CONSTRAINT:TAX
        PG =E= PG1 + PG2;

$OFFTEXT
$SYSINCLUDE mpsgeset M2_6S

*       Benchmark replication

TAX.L = 0.25;
LGP.L = 1;
PG1.L = 0.5;
PG2.L = 0.5;

M2_6S.ITERLIM = 0;
$INCLUDE M2_6S.GEN
SOLVE M2_6S USING MCP;
M2_6S.ITERLIM = 2000;

*       What happens to consumer 2 welfare if consumer 1 decides
*       she would like more public output:

VG1 = 2;
$INCLUDE M2_6S.GEN
SOLVE M2_6S USING MCP;

$TITLE Model M2-7s: Closed 2x2 Economy -- Steady State Capital Stock


$ontext

The benchmark matrix is:

                Production Sectors          Consumers

   Markets   |    X       Y    I     W    |       CONS
   ------------------------------------------------------
        PX   |   100               -100    |
        PY   |          100        -100    |
        PW   |                      200    |    -200
        PL   |  - 40    -60   -I0          |     100+I0
        PK   |   -60    -40                |     140
	PINV !                 I0          !     -I0 
   ------------------------------------------------------

$offtext

SCALAR		TL	tax rate on labor /0/,
		G	Steady-state growth rate /0.02/
		R	Steady-state interest rate /0.05/,
		DELTA	Capital depreciation rate /0.07/
		I0	Base year steady-state investment;	 

I0 = (100) * (g + delta) / (r + delta);

$ONTEXT

$MODEL:M2_7

$SECTORS:
        X       ! Activity level for sector X
        Y       ! Activity level for sector Y
        W       ! Activity level for sector W (Hicksian welfare index)
        I       ! Investment index

$COMMODITIES:
        PX      ! Price index for commodity X
        PY      ! Price index for commodity Y
        PL      ! Price index for primary factor L (net of tax)
        PK      ! Price index for primary factor K
        PW      ! Price index for welfare (expenditure function)
	PI	! Price of a unit of investment

$CONSUMERS:
        CONS    ! Income level for consumer CONS

$AUXILIARY:
        KSTOCK  ! Capital stock from previous period

$PROD:X  s:1.0
        O:PX   Q:100
        I:PL   Q:40
        I:PK   Q:60

$PROD:Y  s:1    
        O:PY   Q:100
	I:PL   Q: 60	A:CONS T:TL
        I:PK   Q: 40

$PROD:I
        O:PI   Q:i0
        I:PL   Q:i0

$PROD:W  s:1
        O:PW   Q:200
        I:PX   Q:100
        I:PY   Q:100

$DEMAND:CONS
        D:PW
        E:PL   Q:(100+i0)
        E:PK   Q:100    R:KSTOCK
	E:PI   Q:(-i0)	R:KSTOCK

$CONSTRAINT:KSTOCK
	PI =E= PK;

$OFFTEXT
$SYSINCLUDE mpsgeset M2_7

KSTOCK.L = 1;

*       Benchmark replication

$INCLUDE M2_7.GEN
SOLVE M2_7 USING MCP;

TL = 0.5;
$INCLUDE M2_7.GEN
SOLVE M2_7 USING MCP;

PARAMETER	COMPARE		Comparison of static and steady-state results;
compare("X","sstate") = 100 * (X.l-1);
compare("Y","sstate") = 100 * (Y.l-1);
compare("W","sstate") = 100 * (W.l-1);
compare("I","sstate") = 100 * (I.l-1);
compare("PX","sstate") = 100 * (PX.l/PW.l-1);
compare("PY","sstate") = 100 * (PY.l/PW.l-1);
compare("PK","sstate") = 100 * (PK.l/PW.l-1);
compare("PL","sstate") = 100 * (PL.l/PW.l-1);
compare("PI","sstate") = 100 * (PI.l/PW.l-1);

KSTOCK.FX = 1;
$INCLUDE M2_7.GEN
SOLVE M2_7 USING MCP;

compare("X","static") = 100 * (X.l-1);
compare("Y","static") = 100 * (Y.l-1);
compare("W","static") = 100 * (W.l-1);
compare("I","static") = 100 * (I.l-1);
compare("PX","static") = 100 * (PX.l/PW.l-1);
compare("PY","static") = 100 * (PY.l/PW.l-1);
compare("PK","static") = 100 * (PK.l/PW.l-1);
compare("PL","static") = 100 * (PL.l/PW.l-1);
compare("PI","static") = 100 * (PI.l/PW.l-1);

option compare:1;
display compare;

$TITLE Model M2-8s: Closed 2x2 Economy -- Taxes and Classical Unemployment


$ontext

This model is based on M2-1S which introduced pre-existing taxes.
All features are identical except that in this model there is a lower
bound on the real wage and classical unemployment.

The following accounting matrix is identical to M2-1 except that
the labor endowment is now 100*(1-U) = 100*(1-0.2) = 80 in the benchmark.

                Production Sectors          Consumers

   Markets   |    X       Y        W    |       CONS
   ------------------------------------------------------
        PX   |  100             -100    |
        PY   |          100     -100    |
        PW   |                   200    |       -200
        PL   |  -20     -60             |        100*(1-U)
        PK   |  -60     -40             |        100
        TAX  |  -20       0             |         20
   ------------------------------------------------------

$offtext

*       Declare parameters which will be need to specify the
*       benchmark and counterfactual cases.  

SCALAR  TX      Proportional output tax on sector X,
        TY      Proportional output tax on sector Y,
        TLX     Ad-valorem tax on labor inputs to X,
        TKX     Ad-valorem tax on capital inputs to X
	U0	Initial unemployment rate	/ 0.20 /;

$ONTEXT

$MODEL:M2_8S

$SECTORS:
        X       ! Activity level for sector X
        Y       ! Activity level for sector Y
        W       ! Activity level for sector W (Hicksian welfare index)

$COMMODITIES:
        PX      ! Price index for commodity X
        PY      ! Price index for commodity Y
        PL      ! Price index for primary factor L (net of tax)
        PK      ! Price index for primary factor K
        PW      ! Price index for welfare (expenditure function)

$CONSUMERS:
        CONS    ! Income level for consumer CONS

$AUXILIARY:
	U	! Unemployment rate

$PROD:X s:1
        O:PX    Q:100        A:CONS T:TX
        I:PL    Q: 20   P:2  A:CONS T:TLX
        I:PK    Q: 60        A:CONS T:TKX

$PROD:Y s:1
        O:PY    Q:100  T:TY     ! Output tax initially 0.
        I:PL    Q:60
        I:PK    Q:40

$PROD:W s:1
        O:PW    Q:200
        I:PX    Q:100
        I:PY    Q:100

$DEMAND:CONS
        D:PW    Q:200
        E:PL    Q:(80/(1-U0))
	E:PL	Q:(-80/(1-U0))	R:U
        E:PK    Q:100

*	Simple lower bound on the real wage -- using PW as the
*	price index for denominating wages

$CONSTRAINT:U
	PL =G= PW;

$OFFTEXT
$SYSINCLUDE mpsgeset M2_8S

*       Benchmark replication:

TX  = 0;
TY  = 0;
TLX = 1;
TKX = 0;
U.L = U0;

M2_8S.ITERLIM = 0;
$INCLUDE M2_8S.GEN
SOLVE M2_8S USING MCP;
M2_8S.ITERLIM = 2000;

*       As in M2-1S, we replace the tax on labor inputs
*       by a uniform tax on both factors:

TLX = 0.25;  
TKX = 0.25;
TX  = 0;
TY  = 0;
$INCLUDE M2_8S.GEN
SOLVE M2_8S USING MCP;