Dear Tom, I want to use your base model (GTAPinGAMS) for modelling a recursive dynamics. Teoretically, I understand the concept of a dynamic model. Writting into MPSGE model I get difficulties particularly the treatment of invesment. Could you give a hint ! Thank you very much for your hint. Regards,
There are a number of alternative approaches to dynamic modeling. There are fundamental differences between models which employ "consistent expections" and recursive models in which agents are lack a coherent representation of expections. The latter class of models are characterized by "overshoot and collapse" behavior.
There are also different varieties of dynamic models -- those in which capital flows equalize rates of return across countries and those in which constraints on period-by-period borrowing lead to differences in real rates of return.
This page presents three models: (i) A forward-looking model with complete capital markets, (ii) A forward-looking model with incomplete capital markets (constraints on period-by-period capital flows) and (iii) A recursive model in which agents do not form consistent expectations of future prices. All of the models are calibrated to a common baseline equilibrium growth path. There are two regions in the model (OECD and ROW), and the experiment involves carbon emission reductions in the OECD to achieve a given target.
In a single period of the recursive model a key input parameter is ks_n(r), "new vintage capital" for region r. This represents the value of the region's gross investment in the previous period. The allocation of new capital across regions is done so as to equalize the return to new vintage capital inputs. The level of savings is determined by a fixed marginal propensity to save in all regions.
Define from the previous period solution thetak(r) as the share of new vintage capital which is installed in region r.
When a region demands new investment, this is a good which is produced by fixed shares of construction inputs in all regions of the world. The relative fraction of a given region output in the global investment activity is determined by thetak(r) from the previous solution.
Here is where thetar(r) enters the model:
$prod:inv o:pinv q:(sum(r, invest(r))) i:pa(cgd,r) q:(thetak(r)*sum(rr,invest(rr)))The following represent the GAMS/MPSGE programs used to represent the three different models. Thereafter follows a program which generates a graphical comparison of results from the three models.
$title A Dynamic Model of Carbon Emissions and Trade * ----------------------------------------------------------------------- * This version forward-looking w/ or w/o balance of payments constraints. * ----------------------------------------------------------------------- * Read run options and benchmark data from an external file: $include bmkdata scalar esub_t Intertemporal elasticity /0.5/; set bop(r,t) Periods subject to balance of payments constraints; parameter labor(r,t) Labor supply growth path srvshr(t) Survival share ktx Extant capital in terminal period; labor(r,t) = qref(t); srvshr(t) = (1-depr)**(ord(t)-1); ktx(r) = sum(tlast, thetax*capital(r)*srvshr(tlast))*(1-depr); alias (t,tt) parameter u0(r) Baseline PV of expenditure vx Value of benchmark exports vm Value of benchmark imports; u0(r) = sum(t, pref(t)*labor(r,t)*c0(r)); vx(g,r) = sum(rr$(not sameas(r,rr)), m0(g,r,rr)); vm(g,r) = sum(rr$(not sameas(r,rr)), m0(g,rr,r)); $ontext $model:dynamic $sectors: u(r) ! Intertemporal utility c(r,t) ! Consumption y(g,r,t) ! Production index x(g,r,t)$vx(g,r) m(g,r,t)$vm(g,r) ! Import demand a(g,r,t) ! Armington demand ed(r,t) ! Energy demand es(r,t) ! Energy supply inv(r,t) k(r,t) yx(g,r,t)$k0(g,r) ! Extant production $commodities: pu(r) pc(r,t) ! Consumption good price pm(g,r,t)$vm(g,r) ! Import aggregate price pa(g,r,t) ! Armington aggregate price pe(r,t) ! Energy demand price pew(t) ! World energy price pl(r,t) ! Wage rate pk(r,t) ! Capital price rk(r,t) ! Capital price py(g,r,t) ! Non-energy output price px(g,r,t)$vx(g,r) pr(r,t) ! Price of energy resource inputs pkt(r) rkx(g,r,t)$k0(g,r) ! Return to extant capital $consumers: ra(r) ! Representative agent $auxiliary: kt(r) ! Terminal capital stock mu(r,t)$bop(r,t) ! Balance of payments premium tau(r,t)$(card(etax) and annexb(r)) ! Carbon tax rate (ad-valorem) target(t)$(card(etax) and compensate) ! Abatement target $prod:u(r) s:esub_t o:pu(r) q:u0(r) i:pc(r,t) q:(labor(r,t)*c0(r)) p:pref(t) $prod:c(r,t) s:esub c:1 o:pc(r,t) q:c0(r) i:pa(g,r,t) q:cd0(g,r) c: i:pe(r,t) q:ce0(r) a:ra(r) n:tau(r,t)$(card(etax) and annexb(r)) $prod:inv(r,t) o:pk(r,t+1) q:invest(r) o:pkt(r)$tlast(t) q:invest(r) i:pa(cgd,r,t) q:invest(r) $prod:k(r,t) o:pk(r,t+1) q:(capital(r)*(1-depr)) o:pkt(r)$tlast(t) q:(capital(r)*(1-depr)) o:rk(r,t) q:earnings(r) i:pk(r,t) q:capital(r) $prod:x(g,r,t)$vx(g,r) o:px(g,r,t) q:vx(g,r) a:ra(r) n:mu(r,t)$bop(r,t) m:-1$bop(r,t) i:py(g,r,t) q:vx(g,r) $prod:yx(g,r,t)$k0(g,r) s:0 o:py(g,r,t) q:y0(g,r) i:pa(gg,r,t) q:id0(gg,g,r) i:pe(r,t) q:e0(g,r) a:ra(r) n:tau(r,t)$etax(g,r) i:rkx(g,r,t) q:k0(g,r) i:pl(r,t) q:l0(g,r) $prod:y(g,r,t)$merge s:0 e:esub kl(e):1 o:py(g,r,t) q:y0(g,r) i:pa(gg,r,t) q:id0(gg,g,r) i:pe(r,t) q:e0(g,r) a:ra(r) n:tau(r,t)$etax(g,r) e: i:rk(r,t) q:k0(g,r) kl: i:pl(r,t) q:l0(g,r) kl: $prod:y(g,r,t)$green s:0 kle:1 ke(kle):esub o:py(g,r,t) q:y0(g,r) i:pa(gg,r,t) q:id0(gg,g,r) i:pe(r,t) q:e0(g,r) a:ra(r) n:tau(r,t)$etax(g,r) ke: i:rk(r,t) q:k0(g,r) ke: i:pl(r,t) q:l0(g,r) kle: $prod:a(g,r,t) s:sigmadm o:pa(g,r,t) q:s0(g,r) i:pm(g,r,t) q:vm(g,r) a:ra(r) n:mu(r,t)$bop(r,t) i:py(g,r,t) q:m0(g,r,r) $prod:m(g,r,t)$vm(g,r) s:(2*sigmadm) o:pm(g,r,t) q:vm(g,r) i:px(g,rr,t)$(not sameas(r,rr)) q:m0(g,rr,r) $prod:es(r,t) s:sigma(r) o:pew(t) q:es0(r) a:ra(r) n:mu(r,t)$bop(r,t) m:-1$bop(r,t) i:pa(g,r,t) q:ec0(g,r) i:pr(r,t) q:er0(r) $prod:ed(r,t) o:pe(r,t) q:ed0(r) i:pew(t) q:ed0(r) a:ra(r) n:mu(r,t)$bop(r,t) $constraint:tau(r,t)$(card(etax) and annexb(r)) carblim(t,r)*target(t) =e= ed(r,t); $constraint:target(t)$(card(etax) and compensate) sum(r,ed(r,t)*ed0(r)) =e= sum(r, carblim(t,r)*ed0(r)); $demand:ra(r) d:pu(r) q:u0(r) e:rkx(g,r,t) q:(k0(g,r)*thetax*srvshr(t)) e:pc(rr,t) q:(theta(rr)*bopdef(r)*qref(t)) e:pkt(r) q:-1 r:kt(r) e:pkt(r) q:ktx(r) e:pk(r,tfirst) q:(capital(r)*(1-thetax)) e:pl(r,t) q:(labor(r,t)*sum(g,l0(g,r))) e:pr(r,t) q:(labor(r,t)*er0(r)) $constraint:mu(r,t)$bop(r,t) sum(g, x(g,r,t)*vx(g,r)*px(g,r,t)) + es(r,t)*es0(r)*pew(t) + sum(rr,pc(rr,t)*(theta(rr)*bopdef(r)*qref(t))) =e= sum(g, m(g,r,t)*vm(g,r)*pm(g,r,t)) + ed(r,t)*ed0(r)*pew(t); $constraint:kt(r) sum(tlast(t), inv(r,t)/inv(r,t-1) - c(r,t)/c(r,t-1)) =e= 0; $offtext $sysinclude mpsgeset dynamic kt.l(r) = sum(tlast,qref(tlast)*capital(r)*(1+g0)); k.l(r,T) = qref(t)-thetax*srvshr(t); c.l(r,t) = qref(t); y.l(g,r,t) = qref(t)-thetax*srvshr(t)$k0(g,r); yx.l(g,r,t) = thetax*srvshr(t); yx.l(g,r,t)$(not k0(g,r)) = 0; x.l(g,r,t) = qref(t)$vx(g,r); a.l(g,r,t) = qref(t); m.l(g,r,t) = qref(t); m.l(g,r,t)$(not vm(g,r)) = 0; ed.l(r,t) = qref(t); es.l(r,t) = qref(t); inv.l(r,t) = qref(t); pc.l(r,t) = pref(t); pa.l(g,r,t) = pref(t); pm.l(g,r,t) = pref(t); pm.l(g,r,t)$(not vm(g,r)) = 0; pe.l(r,t) = pref(t); pew.l(t) = pref(t); pl.l(r,t) = pref(t); pk.l(r,t) = (1+r0) * pref(t); rkx.l(g,r,t) = pref(t); rk.l(r,t) = pref(t); py.l(g,r,t) = pref(t); px.l(g,r,t) = pref(t)$vx(g,r); pr.l(r,t) = pref(t); pkt.l(r) = sum(tlast, pref(tlast)); target.l(t) = 1; * Benchmark replication check, including a cross-check of * the balance of payments constraint: bop(r,t) = yes; option mcp=path; dynamic.iterlim = 0; $include dynamic.gen solve dynamic using mcp; parameter def Balance of payments deficit; def(t,r) = ( sum(g, x.l(g,r,t)*vx(g,r)*px.l(g,r,t)) + es.l(r,t)*es0(r)*pew.l(t) + sum(rr,pc.l(rr,t)*(theta(rr)*bopdef(r)*qref(t))) - ( sum(g, m.l(g,r,t)*vm(g,r)*pm.l(g,r,t)) + ed.l(r,t)*ed0(r)*pew.l(t) ) ) / (pref(t)*labor(r,t)*c0(r)*pu.l("oecd")); display def; dynamic.iterlim = 8000; * -------------------------------------------------------- * Set the policy parameters for a 20% reduction target: elimit(annexb) = 0.8; carblim(t,r)$(year(t) gt 2000) = 1 - ((1-elimit(r)) * (year(t)-2000)/10);; carblim(t,r)$(year(t) ge 2010) = elimit(r)*labor(r,t)/labor(r,"2010"); carblim(t,r)$(not annexb(r)) = qref(t); display carblim; * -------------------------------------------------------- * Compute the uniform tax scenario with capital flows: exempt(g) = 0; etax(g,r) = yes$annexb(r); bop(r,t) = no; $include dynamic.gen solve dynamic using mcp; def(t,r) = ( sum(g, x.l(g,r,t)*vx(g,r)*px.l(g,r,t)) + es.l(r,t)*es0(r)*pew.l(t) + sum(rr,pc.l(rr,t)*(theta(rr)*bopdef(r)*qref(t))) - ( sum(g, m.l(g,r,t)*vm(g,r)*pm.l(g,r,t)) + ed.l(r,t)*ed0(r)*pew.l(t) ) ) / (pref(t)*labor(r,t)*c0(r)*pu.l("oecd")); display def; def(t,"chk") = sum(r, def(t,r)*labor(r,t)*c0(r)); display def; $setglobal gp_row t $setglobal gp_term gif $libinclude gnuplot def parameter report; report(t,"ed","x",r) = ed.l(r,t)*ed0(r); report(t,"ed","x","total") = sum(r, ed.l(r,t)*ed0(r)); report(t,"c","x",r) = c.l(r,t); report(t,"tau","x",r) = tau.l(r,t)$(card(etax) and annexb(r)); report(t,"inv","x",r) = inv.l(r,t) * invest(r); report(t,"rk", "x",r) = rk.l(r,t)/pc.l(r,t); report(t,"es","x",r) = es.l(r,t); report(t,"y",g,r) = y.l(g,r,t); report(t,"py",g,r) = py.l(g,r,t)/pc.l(r,t); file kcap /capflow.sol/; put kcap; $libinclude gams2txt report * -------------------------------------------------------- * Now, execute the same scenario with balance of payments * constraints: bop("oecd",t)$(not tlast(t)) = yes; mu.lo(r,t)$bop(r,t) = -inf; $include dynamic.gen solve dynamic using mcp; def(t,r) = ( sum(g, x.l(g,r,t)*vx(g,r)*px.l(g,r,t)) + es.l(r,t)*es0(r)*pew.l(t) + sum(rr,pc.l(rr,t)*(theta(rr)*bopdef(r)*qref(t))) - ( sum(g, m.l(g,r,t)*vm(g,r)*pm.l(g,r,t)) + ed.l(r,t)*ed0(r)*pew.l(t) ) ) / (pref(t)*labor(r,t)*c0(r)*pu.l("oecd")); display def; def(t,"chk") = sum(r, def(t,r)*labor(r,t)*c0(r)); display "The following should be identically zero:", def; parameter report; report(t,"ed","x",r) = ed.l(r,t)*ed0(r); report(t,"ed","x","total") = sum(r, ed.l(r,t)*ed0(r)); report(t,"c","x",r) = c.l(r,t); report(t,"tau","x",r) = tau.l(r,t)$(card(etax) and annexb(r)); report(t,"inv","x",r) = inv.l(r,t) * invest(r); report(t,"rk", "x",r) = rk.l(r,t)/pc.l(r,t); report(t,"es","x",r) = es.l(r,t); report(t,"y",g,r) = y.l(g,r,t); report(t,"py",g,r) = py.l(g,r,t)/pc.l(r,t); file ksol /bopcon.sol/; put ksol; $libinclude gams2txt report
$title Recursive-dynamic model of carbon emissions and trade * ------------------------------------------------------------------ * This version recursive dynamic. * ------------------------------------------------------------------ * Read run options and benchmark data from an external file: $include bmkdata scalar bmkchk Switch for benchmark check /0/; parameter labor(r) Labor supply, ks_n(r) New vintage capital ks_s(r,r) Sunk capital (flexible coefficient) ks_x(g,r) Extant capital thetai(r) Regional shares of investment in solution thetak(r) Regional share of new capital in solution; ks_n(r) = sum(g, k0(g,r)) * (depr + g0) / (1 + g0); ks_s(r,r) = sum(g, k0(g,r)) * (1-thetax) - ks_n(r); ks_x(g,r) = k0(g,r) * thetax; thetai(r) = invest(r)/sum(rr,invest(rr)); thetak(r) = ks_n(r)/sum(rr, ks_n(rr)); labor(r) = sum(g, l0(g,r)); $ontext $model:global $sectors: c(r) ! Consumption y(g,r) ! Production index yx(g,r)$k0(g,r) a(g,r) ! Armington demand ed(r) ! Energy demand es(r) ! Energy supply inv ! Global investment kn(r) ! New-vintage capital allocation $commodities: pc(r) ! Consumption good price pa(g,r) ! Armington aggregate price pe(r) ! Energy demand price pew ! World energy price pl(r) ! Wage rate py(g,r) ! Non-energy output price pr(r) ! Price of energy resource inputs pinv ! Investment cost rk(r) ! Return to regional capital rkx(g,r)$k0(g,r) ! Return to extant capital rkn ! Return to new vintage capital $consumers: ra(r) ! Representative agent $auxiliary: tau(r)$(card(etax) and annexb(r)) ! Carbon tax rate (ad-valorem) target$compensate ! Scale factor for leakage-compensation $prod:c(r) s:esub c:1 o:pc(r) q:c0(r) i:pa(g,r) q:cd0(g,r) c: i:pe(r) q:ce0(r) a:ra(r) n:tau(r)$(card(etax) and annexb(r)) $prod:yx(g,r)$k0(g,r) s:0 o:py(g,r) q:y0(g,r) i:pa(gg,r) q:id0(gg,g,r) i:pe(r) q:e0(g,r) a:ra(r) n:tau(r)$etax(g,r) i:rkx(g,r) q:k0(g,r) i:pl(r) q:l0(g,r) $prod:y(g,r)$merge s:0 e:esub kl(e):1 o:py(g,r) q:y0(g,r) i:pa(gg,r) q:id0(gg,g,r) i:pe(r) q:e0(g,r) a:ra(r) n:tau(r)$etax(g,r) e: i:rk(r) q:k0(g,r) kl: i:pl(r) q:l0(g,r) kl: $prod:y(g,r)$green s:0 kle:1 ke(kle):esub o:py(g,r) q:y0(g,r) i:pa(gg,r) q:id0(gg,g,r) i:pe(r) q:e0(g,r) a:ra(r) n:tau(r)$etax(g,r) ke: i:rk(r) q:k0(g,r) ke: i:pl(r) q:l0(g,r) kle: $prod:a(g,r) s:sigmadm m:(2*sigmadm) o:pa(g,r) q:s0(g,r) i:py(g,rr) q:m0(g,rr,r) m:$(not sameas(r,rr)) $prod:es(r) s:sigma(r) o:pew q:es0(r) i:pa(g,r) q:ec0(g,r) i:pr(r) q:er0(r) $prod:ed(r) o:pe(r) q:ed0(r) i:pew q:ed0(r) $constraint:tau(r)$(card(etax) and annexb(r)) elimit(r)*target =e= ed(r); $constraint:target$compensate sum(r, ed(r)*ed0(r)) =e= sum(r, ed0(r)*elimit(r)); $prod:inv o:pinv q:(sum(r, invest(r))) i:pa(cgd,r) q:(thetak(r)*sum(rr,invest(rr))) $prod:kn(r) o:rk(r) q:1 i:rkn q:1 $demand:ra(r) s:1 d:pc(r) q:c0(r) d:pinv q:invest(r) e:pc(rr) q:(theta(rr)*bopdef(r)) e:rkn q:ks_n(r) e:rkx(g,r) q:ks_x(g,r) e:rk(rr) q:ks_s(r,rr) e:pl(r) q:labor(r) e:pr(r) q:er0(r) $report: v:i(r) d:pinv demand:ra(r) $offtext $sysinclude mpsgeset global * Benchmark replication check: kn.l(r) = ks_n(r); yx.l(g,r) = thetax$k0(g,r); y.l(g,r)$k0(g,r) = 1-thetax; target.l = 1; target.fx$(not compensate) = 1; * Verify benchmark consistnency: global.iterlim = 0; if (not bmkchk, * Always consider a 20% reduction target after 2010: elimit(annexb) = 0.8; elimit(r)$(not annexb(r)) = 1; carblim(t,r)$(year(t) gt 2000) = 1 - ((1-elimit(r)) * (year(t)-2000)/10); carblim(t,r)$(year(t) ge 2010) = elimit(r)*qref(t)/qref("2010"); carblim(t,r)$(not annexb(r)) = qref(t); display carblim; * Compute the uniform tax scenario: exempt(g) = 0; etax(g,r) = yes$(annexb(r) and (not exempt(g))); global.iterlim = 8000; else tau.fx(r) = 0; ); parameter report solution report; loop(t$(ord(t) le 21), * Apply the emission limit: elimit(r) = carblim(t,r); display thetai, thetak, elimit; $include global.gen solve global using mcp; report(t,"ed","x",r) = ed.l(r)*ed0(r); report(t,"ed","x","total") = sum(r, ed.l(r)*ed0(r)); report(t,"c","x",r) = c.l(r); report(t,"tau","x",r) = tau.l(r)$(card(etax) and annexb(r)); report(t,"inv","x",r) = inv.l * thetak(r) * sum(rr, invest(rr)); report(t,"rk", "x",r) = rk.l(r)/pc.l(r); report(t,"es","x",r) = es.l(r); report(t,"y",g,r) = y.l(g,r); report(t,"py",g,r) = py.l(g,r)/pc.l(r); * The following equation distributes new capital holdings * uniformly across investors. The current value of thetai(r) * represents region r's share of investment in the previous * period, and these shares then allocation new investment across * share holdings. * The complete mixing assumption may not reflect * actual investment behavior, but it is probably the closest * approximation of the forwarding-looking model. ks_s(r,rr) = (1-depr) * (ks_s(r,rr) + thetai(r) * kn.l(rr)); * Update region r's share of global investment: thetai(r) = i.l(r) / sum(rr, i.l(rr)); * Update share of capital flowing into region r: thetak(r) = kn.l(r) / sum(rr, kn.l(rr)); * Depreciate extant capital holdings: ks_x(g,r) = (1-depr) * ks_x(g,r); * New vintage capital holdings: ks_n(r) = (r0 + depr) * i.l(r); * Update other endowments: labor(r) = (1 + g0) * labor(r); er0(r) = (1 + g0) * er0(r); bopdef(r) = (1 + g0) * bopdef(r); c.l(r) = c.l(r) * (1 + g0); yx.l(g,r) = yx.l(g,r) * (1 - depr); y.l(g,r)$k0(g,r) = c.l(r) - yx.l(g,r); y.l(g,r)$(not k0(g,r)) = c.l(r); a.l(g,r) = a.l(g,r) * (1 + g0); ed.l(r) = ed.l(r) * (1 + g0); es.l(r) = es.l(r) * (1 + g0); inv.l = inv.l * (1 + g0); kn.l(r) = kn.l(r) * (1 + g0); ); file ksol /recursive.sol/; put ksol; $libinclude gams2txt report $exit $include global.gen solve global using mcp; parameter leakage Leakage rate (%) welfare Welfare cost carbtax Carbon tax (ad-valorem %); leakage("uniform","energy") = 100 * sum(r$(not annexb(r)), ed0(r) * (ed.l(r) - 1)) / sum(r$annexb(r), ed0(r) * (1 - ed.l(r))); leakage("uniform","carbon") = 100 * sum(r$(not annexb(r)), carbon(r,"total") * (ed.l(r) - 1)) / sum(r$annexb(r), carbon(r,"total") * (1 - ed.l(r))); welfare(r,"uniform") = round( 100 * (c.l(r)-1), 1); carbtax(r,"uniform") = 100 * tau.l(r);
$title Plot comparisons of results from three models set t Time (years) /2000*2020/, tl(t) /2000,2005,2010,2015,2020/; set r /oecd,row/; $setglobal gp_xl tl $setglobal gp_row t parameter recursive / $include recursive.sol /; parameter capflow / $include capflow.sol /; parameter bopcon / $include bopcon.sol /; * Generate gif images: $setglobal gp_term gif parameter invest Investment rk Return to capital (pct change) es Energy supply tau Carbon tax rates C Consumption (pct change) emit Emissions; parameter qref; scalar g0 Benchmark growth rate / 0.02 /; qref(t) = (1 + g0)**(ord(t)-1); set rplot(*); rplot(r) = yes; rplot("oecd_d") = yes; rplot("row_d") = yes; rplot("oecd_b") = yes; rplot("row_b") = yes; c(t,r) = recursive(t,"c","x",r); c(t,"oecd_d") = capflow(t,"c","x","oecd"); c(t,"row_d") = capflow(t,"c","x","row"); c(t,"oecd_b") = bopcon(t,"c","x","oecd"); c(t,"row_b") = bopcon(t,"c","x","row"); c(t,rplot) = 100 * (c(t,rplot)/qref(t) - 1); $libinclude gnuplot c rk(t,r) = 100 * (recursive(t,"rk","x",r) - 1); rk(t,"oecd_d") = 100 * (capflow(t,"rk","x","oecd") - 1); rk(t,"row_d") = 100 * (capflow(t,"rk","x","row") - 1); rk(t,"oecd_b") = 100 * (bopcon(t,"rk","x","oecd") - 1); rk(t,"row_b") = 100 * (bopcon(t,"rk","x","row") - 1); $libinclude gnuplot rk invest(t,r) = recursive(t,"inv","x",r); invest(t,"oecd_d") = capflow(t,"inv","x","oecd"); invest(t,"row_d") = capflow(t,"inv","x","row"); invest(t,"oecd_b") = bopcon(t,"inv","x","oecd"); invest(t,"row_b") = bopcon(t,"inv","x","row"); $libinclude gnuplot invest emit(t,r) = recursive(t,"ed","x",r); emit(t,"total") = recursive(t,"ed","x","total"); emit(t,"oecd_d") = capflow(t,"ed","x","oecd"); emit(t,"row_d") = capflow(t,"ed","x","row"); emit(t,"total_d") = capflow(t,"ed","x","total"); emit(t,"oecd_b") = bopcon(t,"ed","x","oecd"); emit(t,"row_b") = bopcon(t,"ed","x","row"); emit(t,"total_b") = bopcon(t,"ed","x","total"); $libinclude gnuplot emit tau(t,r) = recursive(t,"tau","x",r); tau(t,"oecd_d") = capflow(t,"tau","x","oecd"); tau(t,"row_d") = capflow(t,"tau","x","row"); tau(t,"oecd_b") = bopcon(t,"tau","x","oecd"); tau(t,"row_b") = bopcon(t,"tau","x","row"); $libinclude gnuplot tau es(t,r) = recursive(t,"es","x",r); es(t,"oecd_d") = capflow(t,"es","x","oecd"); es(t,"row_d") = capflow(t,"es","x","row"); es(t,"oecd_b") = bopcon(t,"es","x","oecd"); es(t,"row_b") = bopcon(t,"es","x","row"); $libinclude gnuplot es
*==>bmkdata.gms Read the benchmark dataset scalar eta Elasticity of energy supply /1/ sigmadm Armington elasticity /2/ esub Energy demand elasticity /0.5/ merge Use Merge demand structure /0/ green Use Green demand structure /1/, compensate Evaluate leakage-compensated equilibria /1/, r0 Benchmark interest rate / 0.05 / g0 Benchmark growth rate / 0.02 / depr Depreciation rate / 0.07 / thetax Extant production share / 0.75 /; set t Time (maximum model horizon -- years) /2000*2040/, tlast(t) Last period, tfirst(t) First period; * Read the raw data: $INCLUDE aggr.dat alias (r,rr), (g,gg); parameter chk Check of global energy markets ed0(r) Regional energy demand; ed0(r) = ce0(r) + sum(g, e0(g,r)); chk("value") = sum(r, es0(r) - ed0(r)); chk("percent") = 100 * sum(r, es0(r) - ed0(r)) / sum(r,es0(r)); display chk; * Scale energy supply to equal energy demand globally: es0(r) = es0(r) * sum(rr, ed0(rr)) / sum(rr, es0(rr)); * Computed parameters -- the benchmark data will typically not * provide an exact benchmark equilibrium. For this reason, it is * necessary to compute a benchmark dataset which is as close as * possible to the input data: parameter s0(g,r) Supply of Armington aggregate y0(g,r) Sectoral output; * Retrieve the calibration results: y0(g,r) = sum(gg, id0(gg,g,r)) + e0(g,r) + k0(g,r) + l0(g,r); s0(g,r) = sum(gg, id0(g,gg,r)) + cd0(g,r) + ec0(g,r); * Assign other calibrated parameters: parameter achk(g,r) Check of regional consumption markets (%) er0(r) Energy resoure c0(r) Regional consumption value bopdef(r) Balance of payments deficit theta(r) Regional shares of aggregate demand sigma(r) Elasticity of substitution in energy supply thetar(r) Value share of resources in energy supply; er0(r) = es0(r) - sum(g, ec0(g,r)); thetar(r) = er0(r)/es0(r); display thetar; sigma(r) = eta * thetar(r)/(1-thetar(r)); c0(r) = sum(g, cd0(g,r)) + ce0(r); achk(g,r) = 100 * (s0(g,r) - cd0(g,r) - sum(gg, id0(g,gg,r)) - ec0(g,r))/s0(g,r); chk("value") = sum(r, es0(r) - ed0(r)); chk("percent") = 100 * sum(r, es0(r) - ed0(r)) / sum(r,es0(r)); display chk, achk; * Balance of payments deficits: bopdef(r) = sum((g,rr), m0(g,rr,r)-m0(g,r,rr)) + ed0(r) - es0(r); theta(r) = c0(r) / sum(rr, c0(rr)); * Policy instruments: set etax(*,r) Energy tax exempt(g) Goods exempt from tax; parameter elimit(r) Emission limit; elimit(r) = 1; exempt(g) = no; etax(g,r) = no; etax("c",r) = no; set cgd(g) Identify the investment god /cgd/; parameter year(t); year(t) = 1999 + ord(t); tfirst(t) = yes$(ord(t) eq 1); tlast(t) = yes$(ord(t) eq card(t)); parameter capital Regional capital stocks invest Regional investment earnings Calibrated capital earnings capchk Ratio of calibrated earnings to benchmark pref(t) Reference price path qref(t) Reference quantity path carblim(t,r) Carbon emissions limit; carblim(t,r) = 1; invest(r) = cd0("cgd",r); capital(r) = invest(r) / (g0+depr); earnings(r) = capital(r) * (r0 + depr); capchk(r) = earnings(r) /sum(g, k0(g,r)); display capchk; * Adjust labor and capital value shares accordingly: l0(g,r) = l0(g,r) + k0(g,r); k0(g,r) = k0(g,r) * earnings(r) / sum(gg, k0(gg,r)); l0(g,r) = l0(g,r) - k0(g,r); display k0,l0; * Define the reference price and quantity indices: pref(t) = 1/(1 + r0)**(ord(t)-1); qref(t) = (1 + g0)**(ord(t)-1); * Remove investment demand from the final consumption vector: cd0("cgd",r) = 0; c0(r) = ce0(r) + sum(g, cd0(g,r));
set g Goods / EIS Energy-intensive goods CGD Investment goods y Other goods and services /; set r Regions / ROW ROW countries oecd OECD countries /; set annexb(r) /oecd/; parameter cd0 Consumer demand/ *=>gams2prm cd0x cd0 * Called from D:\WORKSHOP\MUENSTER\LEAKAGE\AGGR.GMS, line 1200 * 07/16/99 14:17:47 EIS.ROW 1.91814994213555E+01 EIS.oecd 4.74590942264071E+01 CGD.ROW 1.48674307621276E+02 CGD.oecd 4.43324370800807E+02 y.ROW 4.04776943271069E+02 y.oecd 1.53935837961554E+03 /; parameter ce0 Energy final demand/ *=>gams2prm ce0x ce0 * Called from D:\WORKSHOP\MUENSTER\LEAKAGE\AGGR.GMS, line 1473 * 07/16/99 14:17:47 ROW 1.18398760000000E+01 oecd 3.04577240000000E+01 /; parameter id0 Intermediate demand/ *=>gams2prm id0x id0 * Called from D:\WORKSHOP\MUENSTER\LEAKAGE\AGGR.GMS, line 1709 * 07/16/99 14:17:47 EIS.EIS.ROW 3.43054962550903E+01 EIS.EIS.oecd 9.75734486898846E+01 EIS.CGD.ROW 6.88782817891295E-01 EIS.CGD.oecd 1.27850869775425E+00 EIS.y.ROW 6.59857233004141E+01 EIS.y.oecd 1.76781102363022E+02 y.EIS.ROW 3.37476782363236E+01 y.EIS.oecd 9.13546756920966E+01 y.CGD.ROW 1.49713503490839E+02 y.CGD.oecd 4.44533373010817E+02 y.y.ROW 4.62204069955892E+02 y.y.oecd 1.48892503637097E+03 /; parameter e0 Energy use/ *=>gams2prm e0x e0 * Called from D:\WORKSHOP\MUENSTER\LEAKAGE\AGGR.GMS, line 1945 * 07/16/99 14:17:47 EIS.ROW 8.51325811275889E+00 EIS.oecd 1.32712079878864E+01 CGD.ROW 1.14283298791226E-01 CGD.oecd 9.60013217381704E-02 y.ROW 2.90618034520120E+01 y.oecd 3.62988167067247E+01 /; parameter k0 Capital demand/ *=>gams2prm k0x k0 * Called from D:\WORKSHOP\MUENSTER\LEAKAGE\AGGR.GMS, line 2181 * 07/16/99 14:17:47 EIS.ROW 2.49176757610161E+01 EIS.oecd 5.67113476276185E+01 y.ROW 2.69741622890410E+02 y.oecd 7.00289763787685E+02 /; parameter l0 Labor demand/ *=>gams2prm l0x l0 * Called from D:\WORKSHOP\MUENSTER\LEAKAGE\AGGR.GMS, line 2417 * 07/16/99 14:17:47 EIS.ROW 1.45349213638299E+01 EIS.oecd 7.82230317148800E+01 y.ROW 2.40741558413746E+02 y.oecd 1.19508578795731E+03 /; parameter m0 Trade flows/ *=>gams2prm m0x m0 * Called from D:\WORKSHOP\MUENSTER\LEAKAGE\AGGR.GMS, line 2653 * 07/16/99 14:17:47 EIS.ROW.ROW 1.08519655718741E+02 EIS.ROW.oecd 7.49937401027759E+00 EIS.oecd.ROW 1.61452783642903E+01 EIS.oecd.oecd 3.20988433348076E+02 CGD.ROW.ROW 1.50516569607522E+02 CGD.oecd.oecd 4.45907883030309E+02 y.ROW.ROW 9.79624899634489E+02 y.ROW.oecd 8.81098783779849E+01 y.oecd.ROW 9.52691466514548E+01 y.oecd.oecd 3.50211136053426E+03 /; parameter es0 Energy supply/ *=>gams2prm es0x es0 * Called from D:\WORKSHOP\MUENSTER\LEAKAGE\AGGR.GMS, line 2889 * 07/16/99 14:17:47 ROW 6.15950912126926E+01 oecd 6.80578796672188E+01 /; parameter ec0 Energy costs/ *=>gams2prm ec0x ec0 * Called from D:\WORKSHOP\MUENSTER\LEAKAGE\AGGR.GMS, line 3125 * 07/16/99 14:17:47 EIS.ROW 4.50343228828040E+00 EIS.oecd 5.39565338128560E+00 CGD.ROW 1.84226198624608E+00 CGD.oecd 2.58351222950270E+00 y.ROW 2.44518513318198E+01 y.oecd 2.60497742228211E+01 /;