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
$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;
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;
$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;
$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;
$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;
$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;
$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;
$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;
$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;