prolog.gms : Market Equilibrium and Activity Analysis

Description

A nonlinear programming model is used to find the market
equilibrium for a model with activity analysis containing
multiple production technologies. The calibration or reconciliation
calculations are not shown in this version. In practice it may
be necessary to solve another nlp in order to find a consistent
initial point. Also, the shadow prices on commodity balances
and resource constraints are not always as reported in the reference.
only if some variables (and equations) are substituted out and
all constraints are set to =e= will the reported relationship hold.


Small Model of Type : NLP


Category : GAMS Model library


Main file : prolog.gms

$title Market Equilibrium and Activity Analysis (PROLOG,SEQ=41)

$onText
A nonlinear programming model is used to find the market
equilibrium for a model with activity analysis containing
multiple production technologies. The calibration or reconciliation
calculations are not shown in this version. In practice it may
be necessary to solve another nlp in order to find a consistent
initial point. Also, the shadow prices on commodity balances
and resource constraints are not always as reported in the reference.
only if some variables (and equations) are substituted out and
all constraints are set to =e= will the reported relationship hold.


Norton, R D, and Scandizzo, P L, Market Equilibrium Computations in
Activity Analysis Models. Operations Research 29, 2 (1981).

Keywords: nonlinear programming, market equilibrium, activity analysis,
          economic development
$offText

Set
   i    'commodities'    / food, h-industry, l-industry /
   g(i) 'goods demanded' / food, l-industry /
   k    'resources'      / labor, capital   /
   h    'households'     / workers, enterpr /
   t    'technologies'   / tech-1*tech-3    /;

Alias (i,j), (g,gp);

Table a(i,j) 'input-output matrix'
              food  h-industry  l-industry
   food       .060                    .244
   h-industry .064        .420        .172
   l-industry .048        .247        .084;

Table d(i,k,t) 'resource technology matrix'
                labor.tech-1  capital.tech-1  labor.tech-2  capital.tech-2  labor.tech-3  capital.tech-3
   food                  1.0             2.0           1.2             1.8            .8             2.2
   h-industry            2.0             3.0           1.8             3.5           2.4             2.3
   l-industry            3.0             3.0           2.7             3.2           3.2             2.7;

Table bb(h,k) 'resource endowment and ownership'
               labor  capital
   workers      .900     .100
   enterpr      .100     .900;

Table x0(i,h) 'initial consumption'
               workers  enterpr
   food          352.0    430.0
   l-industry    222.0    292.0;

Parameter
   b(k)  'total resource endowment' / labor  3712, capital  5000 /
   p0(i) 'initial prices'           / food  .5942, h-industry  1.6167, l-industry  1.31077 /
   y0(h) 'initial income'
   q0(i) 'initial production'
   r0    'initial marginal product';

y0(h) = sum(g, x0(g,h)*p0(g));
r0    = sum(h, y0(h))/sum(k, b(k));

display y0, r0;

$sTitle Calibration of Demand System and aggregation Tests
Parameter
   gamma(g,h)  'les parameter'
   beta(g,h)   'les parameter'
   alpha(g,h)  'budget shares'
   al(g,h)     'linear demand intercept'
   cl(g,h)     'income demand slope'
   s(g,gp,h)   'cross price demand slope'
   an(g,h)     'nonlinear demand constant'
   eta(g,gp,h) 'price elasticities';

Table epsi(i,h) 'income elasticities'
                 workers  enterpr
   food              .8       .6
   l-industry       1.14     1.26;

Scalar omega 'money flexibility - frish' / -2 /;

alpha(g,h)  =  p0(g)*x0(g,h)/y0(h);
epsi(g,h)   =  epsi(g,h)/sum(gp, epsi(gp,h)*alpha(gp,h));
beta(g,h)   =  epsi(g,h)*alpha(g,h);
gamma(g,h)  =  x0(g,h) + beta(g,h)*y0(h)/p0(g)/omega;
eta(g,gp,h) = -gamma(gp,h)*p0(gp)*beta(g,h)/p0(g)/x0(g,h);
eta(g,g ,h) =  gamma(g ,h)*(1 - beta(g,h))/x0(g,h) - 1;

display alpha, epsi, beta, gamma, eta;

an(g,h)   = x0(g,h)/prod(gp, p0(gp)**eta(g,gp,h))/y0(h)**epsi(g,h);
cl(g,h)   = epsi(g,h)*x0(g,h)/y0(h);
s(g,gp,h) = eta(g,gp,h)*x0(g,h)/p0(gp);
al(g,h)   = x0(g,h) - sum(gp, s(g,gp,h)*p0(gp)) - cl(g,h)*y0(h);

display an, cl, s, al;

Parameter
   etest(h)   'Engel aggregation test'
   htest(g,h) 'homogeneity test'
   ctest(g,h) 'Cournot aggregation test';

etest(h)   = sum(g, epsi(g,h)*alpha(g,h)) -1;
htest(g,h) = sum(gp, eta(g,gp,h)) + epsi(g,h);
ctest(g,h) = sum(gp, alpha(gp,h)*eta(gp,g,h)) + alpha(g,h);

display etest, htest, ctest;

$sTitle Model Definitions
Variable
   z      'expenditure minus factor income'
   p(i)   'prices of goods'
   x(i,h) 'quantities consumed'
   r(k)   'marginal product'
   q(i,t) 'quantities produced'
   y(h)   'income';

Positive Variable x, q, p, r, y;

Equation
   cb(i)   'commodity balances'
   rc(k)   'resource constraint'
   de(g,h) 'demand - linear expenditure system'
   dl(g,h) 'demand - linear demand function'
   dn(g,h) 'demand - nonlinear demand function'
   bc(h)   'budget constraint'
   id(h)   'income definition'
   mp(i,t) 'marginal pricing condition'
   zdef    'objective definition';

cb(i)..   sum(h$g(i), x(i,h)) =l= sum(t, q(i,t) - sum(j, a(i,j)*q(j,t)));

rc(k)..   sum((i,t), d(i,k,t)*q(i,t)) =l= b(k);

de(g,h).. x(g,h) =l= gamma(g,h) + beta(g,h)*( y(h) - sum(gp, gamma(gp,h)*p(gp)))/p(g);

dl(g,h).. x(g,h) =l= al(g,h) + sum(gp, s(g,gp,h)*p(gp)) + cl(g,h)*y(h);

dn(g,h).. x(g,h) =l= an(g,h)*prod(gp, p(gp)**eta(g,gp,h))*y(h)**epsi(g,h);

bc(h)..   sum(g, x(g,h)*p(g)) =l= y(h);

id(h)..   y(h) =l= sum(k, bb(h,k)*b(k)*r(k));

mp(i,t).. p(i) =l= sum(j, a(j,i)*p(j)) + sum(k, d(i,k,t)*r(k));

zdef..    z    =e= sum((g,h), x(g,h)*p(g)) - sum(k, b(k)*r(k));

Model
   nortone 'eles version'      / cb, rc, de,         bc, id, mp, zdef /
   nortonl 'linear version'    / cb, rc,     dl,     bc, id, mp, zdef /
   nortonn 'nonlinear version' / cb, rc,         dn, bc, id, mp, zdef /;

x.l(i,h) = x0(i,h);
p.l(i)   = p0(i);
y.l(h)   = y0(h);
r.l(k)   = r0;

* lower bounds are placed on price to avoid the trivial solution p=0.
p.lo(i) = .2;

Parameter
   wp(g) 'weights for price index'
   pi    'price index'
   yp    'real income';

wp(g) = sum(h, x0(g,h)*p0(g))/sum(h, y0(h));
display wp;

solve nortonl maximizing z using nlp;

pi("linear") = sum(g, wp(g)*p.l(g))/sum(g, wp(g)*p0(g));
yp("linear") = sum(h, y.l(h))/pi("linear");

display pi, yp;

solve nortone maximizing z using nlp;

pi("les") = sum(g, wp(g)*p.l(g))/sum(g, wp(g)*p0(g));
yp("les") = sum(h, y.l(h))/pi("les");

display pi, yp;

solve nortonn maximizing z using nlp;

pi("nonlin") = sum(g, wp(g)*p.l(g))/sum(g, wp(g)*p0(g));
yp("nonlin") = sum(h, y.l(h))/pi("nonlin");

display pi, yp;