Step 18: Basic NTA Indicators (Lee & Mason 2017)
Overview
At this step we add a module for the calculation of basic NTA indicators - the Support Ratio and the Impact Index as suggested by Lee & Mason (2017). Indices are calculated and updated in yearly steps on the State level. To do so, we add an actor “State” performing these updates, and a module StateCore.mpp.
The new NtaIndicators.mpp Module
This module calculates a set of yearly NTA indicators following the approach presented by Lee & Mason (2017) “Some Economic Impacts of Changing Population Age Distributions—Capital, Labor and Transfers”. We model a simple economy with a Cobb Douglas production function without productivity growth in two scenarios: a closed economy where interest rate and wages are endogenous, and a open economy where wages and interest rates stay constant. The two indicators calculated are the “Support Ratio” and the “Impact Index”. Both measures have the “Effective consumers” - i.e. the age re-weighted consumption based on the reference year - in the denominator. The nominator of the Support Ratio is the projected total labor. In contrast, the “Impact Index” puts the total consumption assuming constant saving rates by age and accounting for the changes in wages and interest rates into the nominator.:
Variables:
- yl(x) Average labor income age x
- yk(x) Average capital income age x
- P(x) Population age x
- i(x) Average savings age x
- s(x) Saving rate age x - constant
- c(x) Average Consumption age x (reference values for calculation of N) - reference
- L Labor
- K Capital
- I Saving
- S Saving rate
- C Consumption
- r Interest rate
- w Wage
- Yl Labor Income
- YK Capital Income
- Y Total Income Yl+Yk
- α Alpha – constant
- N Effective Consumers (population-weighted base-year consumption)
- l(x) Average labor age x – constant
- k(x) Average capital age x – constant
Cobb Douglas:
Y = L^α K^(1- α)
Y = wL + rK
w = αY / L
r = (1- α) Y / K
Yl = wL = αY
Yk = rK = (1- α)Y
Known:
yl(x) NTA data of reference year
yk(x) NTA data of reference year
i(x) NTA data of reference year
c(x) NTA data of reference year
P(x) NTA data of reference year
r parameter for reference year (used also to estimate stock from capital income flow)
Calculated for initial year:
Yl = ∑ yl(x) * P(x)
Yk = ∑ yk(x) * P(x)
Y = Yl + Yk
α = Yl / Y
K = Yk / r
L = ( Y / K^(1- α))^(1/α)
w = Yl / L
s(x) = i(x) / (yl(x) + ykx))
l(x) = yl (x) / w
k(x) = yk (x) / r
N = ∑ cl(x) * P(x)
Simulation: calculate for an updated population by age P(x)
Closed Economy
L = ∑ l(x)* P(x)
K = ∑ k(x)* P(x)
Y = L^α K^(1- α)
Yl = αY
YK = (1- α)Y
w = αY / L
r = (1- α) Y / K
N = ∑ c(x) * P(x)
yl(x) = w * l(x)
yk(x) = r * k(x)
C = ∑ (1-s(x)) * (yl(x) + yk(x) ) * P(x)
Open Economy (difference to closed)
Y = w * L + r * K
Yl = w * L
YK = r * K
Indices
SR = L / N Support Ratio (same for open and closed economy)
IMP = C / N Impact Index (different for closed and open economy)
This module is optional. It feeds on the NTA variables (by age, sex, education, family) calculated and maintained in the NtaBase.mpp module. The only model parameters are the reference year of the NTA data and the initial interest rate. All calculations are performed in a yearly update event of the actor State.
////////////////////////////////////////////////////////////////////////////////////////////////////
// Parameters
////////////////////////////////////////////////////////////////////////////////////////////////////
parameter_group PG_NTA_CONST //EN NTA Indicators
{
NtaInitialInterestRate, NtaBaseYear
};
parameters
{
int NtaBaseYear; //EN NTA Base Year
double NtaInitialInterestRate; //EN Initial Interest Rate
};
////////////////////////////////////////////////////////////////////////////////////////////////////
// State Actor states and functions
////////////////////////////////////////////////////////////////////////////////////////////////////
actor State
{
double nta_initial_Y = { 0.0 }; //EN Initial year total income Y
double nta_initial_Yl = { 0.0 }; //EN Initial year labor income Yl
double nta_initial_Yk = { 0.0 }; //EN Initial year capital income Yk
double nta_initial_K = { 0.0 }; //EN Initial year capital stock
double nta_alpha = { 0.0 }; //EN Alpha of Cobb Douglas Function
double nta_initial_L = { 0.0 }; //EN Initial year total labor L
double nta_initial_w = { 0.0 }; //EN Initial year wage w
double nta_initial_SR = { 1.0 }; //EN Initial Support Ratio
double nta_initial_closed_IMP = { 1.0 }; //EN Initial Impact Factor closed economy
double nta_initial_open_IMP = { 1.0 }; //EN Initial Impact Factor open economy
double nta_current_N = { 0.0 }; //EN Current reference consumers N
double nta_current_L = { 0.0 }; //EN Current total Labor N
double nta_current_C = { 0.0 }; //EN Current total Consumption
double nta_current_C_open = { 0.0 }; //EN Current total Consumption (open economy)
double nta_current_Y = { 0.0 }; //EN Current total Y
double nta_current_K = { 0.0 }; //EN Current total Capital K
double nta_current_w = { 0.0 }; //EN Current wage w
double nta_current_r = { 0.0 }; //EN Current interest rate r
double nta_current_SR = { 1.0 }; //EN Current Support Ratio
double nta_current_closed_IMP = { 1.0 }; //EN Current Impact Factor closed economy
double nta_current_open_IMP = { 1.0 }; //EN Current Impact Factor open economy
logical nta_is_updated = { FALSE };
TIME time_nta_update = { 0.0 }; //EN Time of next NTA update
event timeUpdateNtaEvent, UpdateNtaEvent; //EN Update NTA production function
SIM_YEAR_RANGE tab_state_year = COERCE(SIM_YEAR_RANGE, state_year); //EN Calendar Year
};
////////////////////////////////////////////////////////////////////////////////////////////////////
// Implementation
////////////////////////////////////////////////////////////////////////////////////////////////////
TIME State::timeUpdateNtaEvent()
{
if (time_nta_update < NtaBaseYear ) return NtaBaseYear + 0.5;
else return time_nta_update;
}
void State::UpdateNtaEvent()
{
nta_is_updated = FALSE;
// Population size
//long nPersons = asAllPersons->Count();
long nPersons = asAllResidents->Count(); //CHANGE19
// nta_total_pop = nPersons;
if (state_year == NtaBaseYear)
{
// Values of initial year
for (long nI = 0; nI < nPersons; nI++)
{
//auto prPerson = asAllPersons->Item(nI);
auto prPerson = asAllResidents->Item(nI);//CHANGE19
nta_initial_Yl = nta_initial_Yl + prPerson->base_YL;
nta_initial_Yk = nta_initial_Yk + prPerson->base_YAF + prPerson->base_YAG;
}
nta_initial_Y = nta_initial_Yl + nta_initial_Yk;
nta_initial_K = nta_initial_Yk / NtaInitialInterestRate;
nta_alpha = nta_initial_Yl / nta_initial_Y;
nta_initial_L = pow(nta_initial_Y / pow(nta_initial_K,1-nta_alpha), 1.0 / nta_alpha);
nta_initial_w = nta_initial_Yl / nta_initial_L;
}
if (state_year >= NtaBaseYear)
{
double dNta_sx = 0.0; // applicable individual saving rate as in initial year
double dNta_lx = 0.0; // applicable individual labor input as in initial year
double dNta_kx = 0.0; // applicable individual capital as in initial year
double dNta_cx = 0.0; // applicable individual consumption as in initial year
nta_current_L = 0.0; // Current total Labor N
nta_current_K = 0.0; // Current total Capital K
nta_current_N = 0.0; // Current reference consumers N
nta_current_C = 0.0; // Current total Consumption
nta_current_C_open = 0.0; // Current total Consumption in open economy
nta_current_Y = 0.0; // Current total Y
for (long nI = 0; nI < nPersons; nI++)
{
//auto prPerson = asAllPersons->Item(nI);
auto prPerson = asAllResidents->Item(nI);//CHANGE19
dNta_lx = prPerson->base_YL / nta_initial_w;
dNta_kx = (prPerson->base_YAF + prPerson->base_YAG) / NtaInitialInterestRate;
dNta_cx = prPerson->base_CFE + prPerson->base_CFH + prPerson->base_CFX + prPerson->base_CGE
+ prPerson->base_CGH + prPerson->base_CGX;
nta_current_L = nta_current_L + dNta_lx;
nta_current_K = nta_current_K + dNta_kx;
nta_current_N = nta_current_N + dNta_cx;
}
nta_current_Y = pow(nta_current_L, nta_alpha) * pow(nta_current_K, 1 - nta_alpha);
nta_current_w = nta_alpha * nta_current_Y / nta_current_L;
nta_current_r = (1 - nta_alpha) * nta_current_Y / nta_current_K;
for (long nI = 0; nI < nPersons; nI++)
{
//auto prPerson = asAllPersons->Item(nI);
auto prPerson = asAllResidents->Item(nI);//CHANGE19
dNta_lx = prPerson->base_YL / nta_initial_w;
dNta_kx = (prPerson->base_YAF + prPerson->base_YAG) / NtaInitialInterestRate;
dNta_sx = 0.0;
if (prPerson->base_YL + prPerson->base_YAF + prPerson->base_YAG > 0.0 && prPerson->base_SF + prPerson->base_SG > 0.0 &&
prPerson->base_YL + prPerson->base_YAF + prPerson->base_YAG > prPerson->base_SF + prPerson->base_SG)
{
dNta_sx = (prPerson->base_SF + prPerson->base_SG) / (prPerson->base_YL + prPerson->base_YAF + prPerson->base_YAG);
}
nta_current_C = nta_current_C + (1 - dNta_sx) * (nta_current_w * dNta_lx + nta_current_r * dNta_kx);
nta_current_C_open = nta_current_C_open + (1 - dNta_sx) * (nta_initial_w * dNta_lx + NtaInitialInterestRate * dNta_kx);
}
}
// Indices
if (state_year == NtaBaseYear)
{
nta_initial_SR = nta_initial_L / nta_current_N;
nta_initial_closed_IMP = nta_current_C / nta_current_N;
nta_initial_open_IMP = nta_current_C_open / nta_current_N;
}
if (state_year >= NtaBaseYear)
{
nta_current_SR = ( nta_current_L / nta_current_N ) / nta_initial_SR;
nta_current_closed_IMP = ( nta_current_C / nta_current_N ) / nta_initial_closed_IMP;
nta_current_open_IMP = ( nta_current_C_open / nta_current_N ) / nta_initial_open_IMP;
}
// Update Clock
nta_is_updated = TRUE;
time_nta_update = WAIT(1.0);
}
////////////////////////////////////////////////////////////////////////////////////////////////////
// Table Output
////////////////////////////////////////////////////////////////////////////////////////////////////
table_group TG_NTAIndicators //EN NTA Indicators and Impact Index Lee 2017
{
TabNTAIndicators
};
table State TabNTAIndicators //EN NTA Indicators and Impact Index Lee 2017
[WITHIN(SIM_YEAR_RANGE,state_year) && nta_is_updated]
{
{
max_value_in(nta_current_SR), //EN Support Ratio SR decimals=4
max_value_in(nta_current_closed_IMP), //EN Impact Index IMP closed economy decimals=4
max_value_in(nta_current_open_IMP), //EN Impact Index IMP open economy decimals=4
max_value_in(nta_current_N), //EN Current reference consumers N
max_value_in(nta_current_L), //EN Current total Labor L
max_value_in(nta_current_C), //EN Current total Consumption
max_value_in(nta_current_Y), //EN Current total Income Y
max_value_in(nta_current_K), //EN Current total Capital K
max_value_in(nta_current_w), //EN Current wage w closed economy decimals=4
max_value_in(nta_current_r) //EN Current interest rate r closed economy decimals=4
}
* tab_state_year
};
The new StateCore.mpp Module
The welfare state core actor file introduces a ‘State’ actor. The actor maintains a state_year which is synchronized with the clock actor. The “State” is used for welfare state accounting
actor State //EN State Actor
{
void Start(); //EN Start Function
int state_year = lClock->clock_year; //EN Calendar year
void StateYearStart(); //EN Year End Function
};
link State.lClock Clock.lState; //EN Link State to Clock
actor_set State asState; //EN The State Actor Set
void State::Start()
{
// Setting the actor weight
Set_actor_weight(asGlobals->Item(0)->person_weight);
Set_actor_subsample_weight(asGlobals->Item(0)->person_weight);
lClock = asTheClock->Item(0);
time = lClock->time;
}
Initiating the State actor in model_core.mpp
The actor State has to be created after the clock actor (to which it links itself in order to synchronizes time)
// Create the Clock
auto prClock = new Clock();
prClock->Start();
// added at step 16:
// Create the State
auto prState = new State();
prState->Start();