mr5mcp.gms : Multi-Region Growth Model Based on Global 2100

Description

This multi-region growth model used data from the Global 2100
model used to analyze the economic cost of carbon dioxide emissions.


Reference

  • Manne, A S, and Richels, R G, Buying Greenhouse Insurance: The Economic Cost of Dioxide Emission Limits. MIT Press Cambridge, 1992.

Large Model of Type : MCP


Category : GAMS Model library


Main file : mr5mcp.gms

$title Multi-Region Growth Model Based on Global 2100 (MR5MCP,SEQ=134)

$onText
This multi-region growth model used data from the Global 2100
model used to analyze the economic cost of carbon dioxide emissions.


Manne, A S, and Richels, R, Buying Greenhouse Insurance - the Economic
Cost of Dioxide Emission Limits. MIT Press Cambridge, 1992.

Keywords: mixed complementarity problem, general equilibrium model, CO2 emissions,
          greenhouse gase, global warming
$offText

Set
   tp                / t0*t11   /
   iter 'iterations' / it1*it10 /;

Scalar
   dev    'current deviation      (%)'
   contol 'convergence tolerance  (%)' / 0.001 /
   ny     'number of years per period'
   nyb2   'ny over 2';

ny   = 110/(card(tp) - 1);
nyb2 = ny/2;

Set
   rg           'regions' / usa, ooecd, ussr, china, row /
   tlast(tp)    'last projection year'
   tbase(tp)    'base year'
   tfirst(tp)   'first projection year'
   tnext(tp,tp) 'subsequent period indicator'
   pp(tp)       'projection period';

Alias (t,tp), (r,rg);

Parameter nper(tp);
nper(t) = ord(t);

tnext(t,t+1) = yes;
tbase(t)     = yes$(ord(t) = 1);
tfirst(t)    = yes$(ord(t) = 2);
tlast(t)     = yes$(ord(t) = card(t));
pp(t)        = yes$(not tbase(t));

* read the global 2100 data:
Table macro(*, rg) 'macroeconomic and other parameters'
           usa  ooecd  ussr  china   row
   gdp    5.6   10.2   2.68   1.1   3.34
   kgdp   2.4    2.8   3.0    3.0   3.0
   depr   5.00   5.00  5.00   5.00  5.00
   kpvs   0.24   0.28  0.30   0.30  0.30;

$onText
gdp   initial gdp ($ trillions)
kgdp  initial capital-gdp ratio
depr  annual percent depreciation
kpvs  capital value share parameter
$offText

Set decade / 1990, 2000, 2010, 2020, 2030, 2040, 2050, 2060, 2070, 2080, 2090, 2100 /;

Parameter weight(decade,tp);

Table grow(*, *) 'potential gdp growth rates - annual percent'
           usa  ooecd   ussr  china    row
   1990   2.50   2.70   2.50   4.50   3.75
   2000   2.00   2.00   2.00   4.00   3.30
   2010   2.00   2.00   2.00   4.00   3.30
   2020   1.75   1.75   1.75   3.75   3.05
   2030   1.50   1.50   1.50   3.50   2.80
   2040   1.50   1.50   1.50   3.50   2.80
   2050   1.25   1.25   1.25   3.25   2.55
   2060   1.25   1.25   1.25   3.25   2.55
   2070   1.125  1.125  1.125  3.125  2.425
   2080   1.00   1.00   1.00   3.00   2.30
   2090   1.00   1.00   1.00   3.00   2.30
   2100   1.00   1.00   1.00   3.00   2.30 ;

* convert growth rates from dates to time periods:
grow(tp,"year")   = 1990 + 110*(ord(tp) - 1)/(card(tp) - 1);
weight(decade,tp) = abs(grow(tp,"year") - (1990 + 10*(ord(decade) - 1)));
weight(decade,tp) = ((10 - weight(decade,tp))/10)$(weight(decade,tp) <= 10);
grow(tp,rg)       = sum(decade, weight(decade,tp)*grow(decade,rg));
grow(decade,rg)   = 0;

display grow;

Parameter
   udr(rg,tp) 'utility discount rate'
   kpvs(rg)   'capital value share'
   kgdp(rg)   'capital-gdp ratio'
   depr(rg)   'depreciation rate'
   k0(rg)     'initial capital'
   rk0(rg)    'benchmark capital rental price'
   l0(rg)     'initial labor'
   y0(rg)     'initial gdp'
   i0(rg)     'initial investment'
   c0(rg)     'initial consumption'
   wb(rg)     'baseline welfare index'
   ksrv(rg)   'n-year capital survival factor'
   udf(rg,t)  'utility discount factor - period t'
   l(rg,t)    'labor supply quantity'
   qref(t,rg) 'reference (balanced growth) quantity path'
   pref(t,rg) 'reference (steady state) price path'
   pkbar(rg)  'steady-state rate of return';

depr(rg) = macro("depr",rg)/100;
kpvs(rg) = macro("kpvs",rg);
y0(rg)   = macro("gdp",rg);
kgdp(rg) = macro("kgdp",rg);
k0(rg)   = kgdp(rg)*y0(rg);

* convert growth rates from percentages to fractions:
grow(t,rg) = grow(t,rg)/100;
ksrv(rg)   = 1/(1 + depr(rg))**ny;
l0(rg)     = y0(rg) - kpvs(rg)*y0(rg);
qref(tbase,rg) = 1;

loop(t, qref(t+1,rg) = qref(t,rg)*(1 + grow(t,rg))**ny;);

rk0(rg)   = kpvs(rg)/kgdp(rg);
udr(rg,t) = rk0(rg) - depr(rg) - grow(t,rg);
pref(tbase,rg)  = 1;
pref(tfirst,rg) = 1;

loop(t$(ord(t) > 1), pref(t+1,rg) = pref(t,rg)/((1 + udr(rg,t))*(1 + grow(t,rg)))**ny);

display pref, qref;

l(rg,pp) = l0(rg)*qref(pp,rg);

loop(tbase, i0(rg) = k0(rg)*(grow(tbase,rg) + depr(rg)););

c0(rg) = y0(rg) - i0(rg);
wb(rg) = c0(rg)*sum(pp, pref(pp,"usa")*qref(pp,rg));

* compute the utility discount factor:
udf(rg,tbase) = 1;

loop(t, udf(rg,t+1) = udf(rg,t)/(1+udr(rg,t))**ny;);

udf(rg,tlast) = udf(rg,tlast)/(1 - 1/(1 + udr(rg,tlast))**ny);
udf(rg,t)     = udf(rg,t)/sum(pp, udf(rg,pp));

display udr, udf;

Parameter
   wage
   rent
   income;

wage(pp,rg) = pref(pp,rg);
rent(pp,rg) = rk0(rg)*pref(pp,rg);
income(rg)  = sum(pp, wage(pp,rg)*l(rg,pp))
            + sum(tfirst, rent(tfirst,rg)*(k0(rg) + nyb2*i0(rg))*ksrv(rg));

Positive Variable
   y(rg,t)      'new vintage production'
   inv(rg,t)    'investment'
   k(rg,t)      'capital stock'
   p(t)         'future price'
   ptc(rg,t)    'terminal capital price'
   w(rg,t)      'wage rate'
   pk(rg,t)     'capital return'
   rk(rg,t)     'rental price on capital'
   i(rg)        'income';

Equation
   mkt_c(t)     'output balance'
   capstk(rg,t) 'capital stock'
   mkt_k(rg,t)  'capital use'
   mkt_l(rg,t)  'labor supply'
   tc(rg,t)     'terminal investment'
   prf_y(rg,t)  'producer profit'
   prf_i(rg,t)  'investment profit'
   prf_k(rg,t)  'capital stock profit'
   incdef(rg)   'income definition';

mkt_c(t)$pp(t).. sum(rg, y(rg,t)) =g= sum(rg, udf(rg,t)*i(rg)/p(t) + inv(rg,t));

capstk(rg,t)$pp(t).. nyb2*inv(rg,t) + nyb2*ksrv(rg)*inv(rg,t-1) =g= k(rg,t) - k(rg,t-1)*ksrv(rg);

mkt_k(rg,t)$pp(t).. k(rg,t) =g= (y(rg,t)/y0(rg))*k0(rg)*(w(rg,t)/pref(t,rg))**(1 - kpvs(rg))
                             *  (rk(rg,t)/(rk0(rg)*pref(t,rg)))**kpvs(rg)/(rk(rg,t)/(rk0(rg)*pref(t,rg)));

mkt_l(rg,t)$pp(t).. l(rg,t) =g= (y(rg,t)/y0(rg))*l0(rg)*(w(rg,t)/pref(t,rg))**(1 - kpvs(rg))
                             *  (rk(rg,t)/(rk0(rg)*pref(t,rg)))**kpvs(rg)/(w(rg,t)/pref(t,rg));

tc(rg,t)$tlast(t).. inv(rg,t) =g= k(rg,t)*(grow(t,rg) + depr(rg));

prf_y(rg,t)$pp(t)..   (1 - kpvs(rg))*log(w(rg,t)/pref(t,rg))
                    +  kpvs(rg)*log(rk(rg,t)/(rk0(rg)*pref(t,rg)))
                   =g= log(p(t)/pref(t,rg));

prf_i(rg,t)$pp(t).. p(t) =g= nyb2*pk(rg,t) + nyb2*ksrv(rg)*pk(rg,t+1) + ptc(rg,t)$tlast(t);

prf_k(rg,t)$pp(t).. pk(rg,t) + (ptc(rg,t)*(grow(t,rg)+depr(rg)))$tlast(t) =g= rk(rg,t) + ksrv(rg)*pk(rg,t+1);

incdef(rg).. i(rg) =g= sum(pp, w(rg,pp)*l(rg,pp))
                    +  sum(tfirst, (nyb2*i0(rg) + k0(rg))*ksrv(rg)*pk(rg,tfirst));

Model mrg / mkt_c.p, capstk.pk, mkt_k.rk, mkt_l.w, tc.ptc, prf_y.y, prf_i.inv, prf_k.k, incdef.i /;

* work on the full horizon model:
tlast(t) = yes$(ord(t) = card(t));
pp(t)    = yes$(not tbase(t));

* install bounds to avoid bad function calls:
p.lo(t)     = 0.0001*pref(t,"usa");
rk.lo(rg,t) = 0.0001*rk0(rg)*pref(t,rg);
w.lo(rg,t)  = 0.0001*pref(t,rg);

* install some scale factors:
y.scale(rg,pp)   = y0(rg)*qref(pp,rg);
inv.scale(rg,pp) = i0(rg)*qref(pp,rg);
k.scale(rg,pp)   = k0(rg)*qref(pp,rg);
p.scale(t)       = pref(t,"usa");
ptc.scale(rg,tlast) = pref(tlast,rg);
w.scale(rg,t)  = pref(t,rg);
pk.scale(rg,t) = pref(t,rg);
rk.scale(rg,t) = rk0(rg)*pref(t,rg);
i.scale(rg)    = income(rg);
mrg.scaleopt   = 1;

* install default starting point:
y.l(rg,pp)   = qref(pp,rg)*y0(rg);
inv.l(rg,pp) = qref(pp,rg)*i0(rg);
k.l(rg,pp)   = qref(pp,rg)*k0(rg);
p.l(pp)      = pref(pp,"usa");
ptc.l(rg,tlast) = pref(tlast,rg);
w.l(rg,pp)   = pref(pp,rg);
pk.l(rg,pp)  = pref(pp,rg);
rk.l(rg,pp)  = rk0(rg)*pref(pp,rg);
i.l(rg)      = income(rg);
inv.fx(rg,tbase) = i0(rg);
k.fx(rg,tbase)   = k0(rg);

* fix one income level to normalize the price system:
i.fx(rg)$(ord(rg) = 1) = income(rg);

solve mrg using mcp;