$title Illustrative MPSGE model based on a social accounting matrix
* See sam.xls for the dataset (here is the Excel file)
set i SAM row and column indices /1*14/,
s Sectors / agr Agriculture,
ind Industry,
ser Services /,
f Primary factors / L Labor, N Land, K Capital/,
h Households / rural, urban/
* Goods and sectors are identical:
alias (s,g,gg), (i,j);
set mapa(i,s) Mapping from SAM to activities /1.agr, 2.ind, 3.ser/,
mapc(i,g) Mapping from SAM to commodities /4.agr, 5.ind, 6.ser/,
mapf(i,f) Mapping from SAM to factors /7.L, 8.N, 9.K /,
maph(i,h) Mapping from SAM to households / 10.rural, 11.urban/,
mapg(i) Identifies government in the SAM /12/,
mapi(i) Identifies the investment row /13/,
mapx(i) Identifies the rest of world /14/;
parameter sam(i,j) Base year social accounts;
$libinclude xlimport sam sam.xls sam
* Scale the social accounting matrix so that the average entry
* is roughly 1:
sam(i,j) = sam(i,j) / 1000;
display sam;
parameter chksam(i) Consistency check of social accounts;
chksam(i) = sum(j, sam(i,j)-sam(j,i));
display "Consistency check before balancing:", chksam;
variable obj Objective -- least squares deviation;
positive
variable es(i,j) Estimate of SAM entries;
equations objdef Defines the deviation
balance(i) SAM balance condition;
scalar penalty /1e6/;
objdef.. obj =e= sum((i,j), sqr(es(i,j)-sam(i,j)))
+ sum((i,j)$(not sam(i,j)), penalty * es(i,j));
balance(i).. sum(j, es(i,j)) =e= sum(j, es(j,i));
es.l(i,j) = sam(i,j);
model sambal /all/;
solve sambal using nlp minimizing obj;
parameter nz(i,j) New nonzeros in the SAM;
nz(i,j) = es.l(i,j)$(not sam(i,j));
display nz;
sam(i,j) = es.l(i,j);
chksam(i) = sum(j, sam(i,j)-sam(j,i));
display "Consistency check after balancing:", chksam;
* Extract submatrices from the social accounts:
parameter id0(g,s) Intermediate demand
fd0(f,s) Factor demand
tm0(g) Import tariff collection
m0(g) Imports (cif),
c0(g,h) Private consumption
g0(g) Government demand
i0(g) Investment demand
x0(g) Exports
tx0 Export taxes (total)
ti0 Investment taxes (total)
fe0(f,h) Factor endowments
it0(h) Income taxes,
s0(h) Private saving,
gs0 Government saving
fs0 Foreign savings
tf0(f) Factor taxes
tr0(h) Government transfers to households,
it0(h) Income tax payments
tx(g) Export tax rate (assumed uniform)
px0(g) Reference price for exports
d0(s) Domestic supply
a0(s) Aggregate supply
pm0(s) Reference price of imports
tm(s) Import tariff rate
ti Investment tax rate
inv0 Total investment
depr0(f) Deprecation
xk0(f) Foreign factor return;
loop((mapc(i,g), mapa(j,s)), id0(g,s) = sam(i,j) );
loop((mapf(i,f), mapa(j,s)), fd0(f,s) = sam(i,j) );
loop((mapc(j,g), mapg(i)), tm0(g) = sam(i,j) );
loop((mapc(j,g), mapx(i)), m0(g) = sam(i,j) );
loop((mapc(i,g), maph(j,h)), c0(g,h) = sam(i,j) );
loop((mapc(i,g), mapg(j)), g0(g) = sam(i,j));
loop((mapc(i,g), mapi(j)), i0(g) = sam(i,j));
loop((mapc(i,g), mapx(j)), x0(g) = sam(i,j));
loop((mapg(i), mapx(j)), tx0 = sam(i,j));
loop((mapg(i), mapi(j)), ti0 = sam(i,j));
loop((maph(i,h),mapf(j,f)), fe0(f,h) = sam(i,j));
loop((mapg(i), maph(j,h)), it0(h) = sam(i,j));
loop((mapi(i), maph(j,h)), s0(h) = sam(i,j));
loop((mapi(i), mapg(j)), gs0 = sam(i,j));
loop((mapi(i), mapx(j)), fs0 = sam(i,j));
loop((maph(i,h), mapg(j)), tr0(h) = sam(i,j));
loop((mapg(i), mapf(j,f)), tf0(f) = sam(i,j));
loop((mapx(i), mapf(j,f)), xk0(f) = sam(i,j));
loop((mapi(i), mapf(j,f)), depr0(f) = sam(i,j));
* Assume a uniform export tax:
tx(g) = tx0 / (tx0 + sum(gg, x0(gg)));
px0(g) = 1 - tx(g);
* Express x0(g) as a gross of tax value:
x0(g) = x0(g) / (1 - tx(g));
d0(s) = sum(g, id0(g,s)) + sum(f, fd0(f,s)) - x0(s)*px0(s);
tm(g) = tm0(g) / m0(g);
pm0(g) = 1 + tm(g);
a0(g) = d0(g) + m0(g) * pm0(g);
inv0 = ti0 + sum(g, i0(g));
ti = ti0/inv0;
$ontext
$model:soe
$sectors:
y(s) ! Sectoral output (domestic production)
a(s) ! Aggregate supply (Armington aggregate)
c(h) ! Household consumption
invest ! Aggregate investment
$commodities:
pd(s) ! Domestic output
pa(s) ! Composite demand price
pc(h) ! Household consumption price
pf(f) ! Factor prices
pinv ! Investment
pfx ! Price of foreign exchange
$consumers:
ra(h) ! Private households
govt ! Government
$auxiliary:
tau ! Consumption tax rate (for trade tax experiment)
* Production for domestic market and for export:
$prod:y(s) s:0 t:4 va:1
o:pfx q:x0(s) p:px0(s) a:govt t:tx(s)
o:pd(s) q:d0(s)
i:pa(g) q:id0(g,s)
i:pf(f) q:fd0(f,s) va:
$report:
v:x(s) o:pfx prod:y(s)
* Armington aggregation of domestic and imported goods:
$prod:a(s) s:2
o:pa(s) q:a0(s)
i:pd(s) q:d0(s)
i:pfx q:m0(s) p:pm0(s) a:govt t:tm(s)
$report:
v:m(s) i:pfx prod:a(s)
* Investment:
$prod:invest
o:pinv q:inv0 a:govt t:ti
i:pa(g) q:i0(g)
* Household consumption:
$prod:c(h) s:1
o:pc(h) q:(sum(g, c0(g,h)))
i:pa(g) q:c0(g,h) a:govt n:tau
* Household demand (with exogenously fixed investment,
* taxes and transfers):
$demand:ra(h)
d:pc(h)
e:pinv q:(-s0(h))
e:pc(h) q:(tr0(h)-it0(h))
e:pf(f) q:fe0(f,h)
* Government demand:
$demand:govt s:0
* Government demand for goods appears here:
d:pa(g) q:g0(g)
* Income tax revenue less transfers, fixed in real terms:
e:pc(h) q:(it0(h)-tr0(h))
* Inestment demand -- this includes government savings, foreign
* savings and depreciation:
e:pinv q:(-gs0-fs0-sum(f,depr0(f)))
* Factor ownership includes lump-sum taxes on factor income,
* depreciation and returns to foreign factor owners:
e:pf(f) q:(tf0(f)+depr0(f)+xk0(f))
* Foreign savings appear as a credit, returns paid to foriegn
* factor owners is a debit:
e:pfx q:(fs0-sum(f,xk0(f)))
$constraint:tau
govt =e= sum(g, pa(g) * g0(g));
$offtext
$sysinclude mpsgeset soe
* Check the benchmark:
soe.iterlim = 0;
$include soe.gen
solve soe using mcp;
* Replace export and import taxes by a consumption tax,
* holding public expenditure constant:
soe.iterlim = 5000;
tm(s) = 0;
tx(s) = 0;
$include soe.gen
solve soe using mcp;
* Generate a report:
parameter EV Hicksian equivalent variation in income (% change)
trade Trade levels (% change)
ct0(h) Total consumption;
ct0(h) = sum(g, c0(g,h));
ev(H,"%C") = 100 * (c.l(h)-1);
ev(H,"%GDP") = 100 * (c.l(h)-1) * (ct0(h) / (ct0(h)+s0(h)));
ev("total","%C") = 100 * (sum(h,c.l(h)*ct0(h))/sum(h,ct0(h))-1);
ev("total","%GDP") = 100 * (sum(h,c.l(h)*ct0(h))/sum(h,ct0(h))-1) *
sum(h, ct0(h)) / sum(f, sum(h,fe0(f,h))+tf0(f)+depr0(f));
trade(s,"export") = 100 * (x.l(s)/x0(s) - 1);
trade(s,"import") = 100 * (m.l(s)/m0(s) - 1);
display trade, EV, tau.l;
Display output:
---- 1081 PARAMETER TRADE Trade levels (% change)
EXPORT IMPORT
AGR 36.218 42.128
IND 68.401 33.859
SER 26.678 33.733
---- 1081 PARAMETER EV Hicksian equivalent variation in income (% change)
%C %GDP
RURAL 4.759 4.756
URBAN 1.229 1.218
TOTAL 3.121 2.974
---- 1081 VARIABLE TAU.L = 0.156 Consumption tax rate (for trade tax experiment)