Code
rm(list=ls())
library(ggplot2)
library(dplyr)
library(plyr)
library(readxl)
library(plotly)
pop <- read_excel("~/Desktop/ECOLABTRAINING/pop.xlsx")Examining social security allowances to make them sustainable equitable and effective
The analyses uses R (IDE Rstudio). The UN single age, single year population projections are loaded along with the libraries required. The raw data file containing UN population projections is in excel and called “pop.xlsx”. We will also load the following libraries required by R for the data processing, analyses and plots: ggplot2 (Wickham 2016), dplyr (Wickham et al. 2023), plyr (Wickham 2011), readxl (Wickham and Bryan 2023) and plotly (Sievert 2020).
Note: in the code below, please use the correct file path to your pop.xlsx file. In my case, this file is located in a folder on my desktop called ECOLABTRAINING. Please change accordingly.
rm(list=ls())
library(ggplot2)
library(dplyr)
library(plyr)
library(readxl)
library(plotly)
pop <- read_excel("~/Desktop/ECOLABTRAINING/pop.xlsx")The pop data file, when loaded into R looks as follows.
head(pop)# A tibble: 6 × 3
age year tpop
<dbl> <dbl> <dbl>
1 0 2020 545.
2 1 2020 542.
3 2 2020 540.
4 3 2020 540.
5 4 2020 541.
6 5 2020 543.
The data file contains three variables: age, year and tpop. Age runs from 0 to 100 (101 age groups) and year runs from 2020 to 2065 (46 years). tpop contains the total population of each age group. Hence there are 46 \(\times\) 101 (4646) rows of data (1 row for each age in each year) and 3 columns (age, year and total population).
This file format, as rich as it may be is not useful for our purposes as we are more focused on the total of under-fives and senior citizen’s rather than individual ages (which is tracked in the appendix). For our purposes, we just need for every year, the total number of U5 children, the total number of senior citizens (and other age groups we may be interested in) rather than the individual ages themselves.
We first create dummy variables for the following age groups: U5, School Age (SA, 5-17), Working Age (WA, 18-68), and Old Age (OA, 68+). We can see what has been created by looking at the first few lines of our data file.
pop$retage<-ifelse(pop$year<=2022,70,68)
pop$u5<-ifelse(pop$age<5,1,0)
pop$sa<-ifelse(pop$age>4 & pop$age<18,1,0)
pop$wa<-ifelse(pop$age>17 & pop$age<pop$retage,1,0)
pop$oa<-ifelse(pop$age>=pop$retage,1,0)# A tibble: 6 × 8
age year tpop retage u5 sa wa oa
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 0 2020 545. 70 1 0 0 0
2 1 2020 542. 70 1 0 0 0
3 2 2020 540. 70 1 0 0 0
4 3 2020 540. 70 1 0 0 0
5 4 2020 541. 70 1 0 0 0
6 5 2020 543. 70 0 1 0 0
We then aggregate these dummies by year to get the total count of U5 children, SA children WA adults and OA elderly. Then the files are merged together.
u5<-aggregate(tpop~year,data=subset(pop,u5==1),sum)
sa<-aggregate(tpop~year,data=subset(pop,sa==1),sum)
oa<-aggregate(tpop~year,data=subset(pop,oa==1),sum)
wa<-aggregate(tpop~year,data=subset(pop,wa==1),sum)
tpop<-aggregate(tpop~year,data=pop,sum)
df <- merge(u5, sa, by = "year", all = TRUE)
df <- merge(df, oa, by = "year", all = TRUE)
df <- merge(df, wa, by = "year", all = TRUE)
df <- merge(df, tpop, by = "year", all = TRUE)
# Rename the columns
colnames(df) <- c("year", "u5_tpop", "sa_tpop", "oa_tpop", "wa_tpop", "tpop")
# Fill NA values with 0 if any (not required)
df[is.na(df)] <- 0Finally, we have the following data file (df) and first few lines of the data file are shown below:
head(df) year u5_tpop sa_tpop oa_tpop wa_tpop tpop
1 2020 2706.773 7576.564 1033.148 17820.32 29136.81
2 2021 2708.100 7469.172 1072.755 18424.89 29674.92
3 2022 2716.798 7379.726 1113.678 19015.38 30225.58
4 2023 2727.158 7302.036 1421.545 19318.97 30769.71
5 2024 2728.192 7231.396 1468.258 19857.84 31285.68
6 2025 2714.069 7163.153 1515.139 20365.08 31757.45
We have transformed the information in the original UN population data file into a format useful for our purposes. Each row in the file contains a specific year from 2020 to 2065 (46 rows). The data for each year hold the U5 population, the SA population, WA population, OA population and the total population. Armed with this information, it becomes possible to look into future costs as beneficiaries will have to come from this pool of projections.
Convert population data to 1000s, derive dependency ratios for each year, and, derive growth rates for the population sub groups for visual plotting. The first few lines of the data file are now:
year u5_tpop sa_tpop oa_tpop wa_tpop tpop dep_yng dep_old dep_tot
1 2020 2.706773 7.576564 1.033148 17.82032 29.13681 57.70567 5.797583 63.50325
2 2021 2.708100 7.469172 1.072755 18.42489 29.67492 55.23653 5.822313 61.05885
3 2022 2.716798 7.379726 1.113678 19.01538 30.22558 53.09662 5.856723 58.95335
4 2023 2.727158 7.302036 1.421545 19.31897 30.76971 51.91371 7.358286 59.27200
5 2024 2.728192 7.231396 1.468258 19.85784 31.28568 50.15444 7.393846 57.54829
6 2025 2.714069 7.163153 1.515139 20.36508 31.75745 48.50077 7.439886 55.94065
u5gro sagro wagro oagro tpopgro
1 NA NA NA NA NA
2 0.04902517 -1.4174235 3.392587 3.833623 1.846846
3 0.32118459 -1.1975357 3.204827 3.814757 1.855644
4 0.38133126 -1.0527491 1.596555 27.644166 1.800223
5 0.03791493 -0.9674014 2.789326 3.286073 1.676896
6 -0.51766884 -0.9437044 2.554382 3.192967 1.507910
We have all the information we need to produce visualizations of the demographic transition as well as make estimates about costs using the underlying population projections to derive the flow of beneficiaries.
The following visualizations show Nepal’s demographic transition using our transformed data set. Population growth will turn negative after 2050 after which point the population dependency ratio starts rising. The population of children, including under-five children declines due to the fertility drop in Nepal.
f<-plot_ly(pop, x = ~age, y = ~(tpop),type = "bar",
frame = ~year,colors="Blues_r",name="Population (000)")%>%
layout(xaxis = list(title = "Age"), yaxis = list(title = "Population")) %>%
animation_opts(frame = 75, redraw = FALSE)
f# Population dependency ratios
g<-ggplot(subset(df,year<=2065)) +
geom_point(aes(x=year,y=u5_tpop,color='U5')) +
geom_point(aes(x=year,y=sa_tpop,color='SA'))+
geom_point(aes(x=year,y=wa_tpop,color='WA'))+
geom_point(aes(x=year,y=oa_tpop,color='OA'))+
geom_point(aes(x=year,y=tpop,color='Total'))+
labs(x = "Year", y = "Population (Mill)") +
ggtitle("Population")+
theme_minimal()+
scale_color_manual(name = "Legend",
values = c("U5" = "blue",
"SA" = "orange",
"WA" = "green",
"OA"="red",
"Total"='purple'))
#guides(fill = guide_legend(title = "Legend")))
#g
ggplotly(g)g<-ggplot(subset(df, year>2023)) +
geom_col(aes(x = year, y = tpopgro, fill = tpopgro > 0),alpha=0.8) +
geom_line(aes(x = year, y = oagro,color='OA')) +
geom_line(aes(x = year, y = u5gro,color='U5')) +
geom_line(aes(x = year, y = sagro,color='SA')) +
geom_line(aes(x = year, y = wagro,color='WA')) +
#geom_line(aes(x= year, y=mean(oagro)),color='purple',alpha=0.25)+
#geom_line(aes(x= year, y=mean(u5gro)),color='red',alpha=0.25)+
#geom_line(aes(x= year, y=mean(sagro)),color='pink',alpha=0.25)+
#geom_line(aes(x= year, y=mean(wagro)),color='darkgreen',alpha=0.25)+
labs(x = "Year", y = "Pct Change") +
ggtitle("Growth over the years: Population and subgroups") +
scale_fill_manual(name = "Change", values = c("red", "green"), labels = c("Decrease", "Increase")) +
scale_color_manual(name = "Legend",
values = c("U5" = "red",
"SA" = "pink",
"WA" = "darkgreen",
"OA"="purple"))+
theme_minimal()
gIn any year \(t\) (running from \(2020\) to \(2050\)), total costs are an aggregate of the U5 costs (\(U5_{t}\)) and the costs associated with senior citizens allowances (\(OA_{t}\)).
The costs associated with each of these components in any year are a product of the benefit levels and number of beneficiaries. Hence, the total costs for the U5CG, \(U5_{t} = \beta_{ct}*U5B_{t}\), where \(\beta_{ct}\) is the value of the U5CG (NPR \(6,384\)/year currently) and \(U5_{t}\) are the estimated number of beneficiaries in time \(t\). Similarly costs associated with the senior citizens allowances, \(OA_{t}=\beta_{ot} * OAB_{t}\), where \(\beta_{ot}\) is the annual benefit level for senior citizen’s allowances (currently NPR \(48000\)/year) and \(OAB_{t}\) denotes the flow of beneficiaries of the senior citizen’s allowances.
The number of beneficiaries are in turn, defined as a fraction of the underlying population bases that participate or are covered by these allowances. This is defined by the take-up rate. Hence, given the take up rate of \(\gamma_{ct}\), the flow of beneficiaries for the U5CG, \(U5B_{t} = \gamma_{ct} * U5P_{t}\). Currently, since the U5CG is not yet universal (although there are plans to make it so imminently), \(\gamma_{c0}\) is approximately \(45\%\). Similarly, \(OAB_{t} =\gamma_{ot} * OAP_{t}\). Triangulating between the beneficiary databases and the population forecasts, \(\gamma_{o}\) is assumed to be very high (\(100\%\)).
All the underlying population bases are known for all \(t\) since updated UN single age population forecasts are being used (U.N, Population Division, 2023). Hence \(U5P_{t}\) is the sum of the population aged \(0-4\) each time period \(t\), and \(OAP_{t}\) is the sum of individual’s aged \(r_{t}\) and above, the eligibility age for the senior citizen’s allowances (currently 68 years old or above). Hence costs at any time period \(C_{t}\) can be written as a sum of two components:
\[ C_{t} = [{\beta_{ct}\times\gamma_{ct}\times\sum_{a=0}^4 POP_{a,t} }]+ [{\beta_{ot}\times\gamma_{ot}\times\sum_{a=r_{t}}^{100} POP_{a,t} }] \]
Given that the dynamics of
\(POP_{t}\) are known from population projections (U.N, op. cit.), and the values of
\(\beta\) and \(\gamma\) are known for both groups, then costs are heavily dependent on the number of beneficiaries which are in turn reliant on the \(POP_{t}\) and the benefit levels \((\beta)\) as well as the retirement age \(r_{t}\). Or to put it simply:
\[\begin{equation*} C_{t} = f(\beta_{t},\Gamma_{t},r_{t},P_{t}) \end{equation*}\]Where \(\beta_{t}\) denotes the vector of benefit levels for children and senior citizens, \(\Gamma_{t}\) is a vector comprising of the take-up or participation rates of under five children and senior citizens, \(r_t\) is the retirement age at \(t\), and \(P_{t}\) is a vector that contains the population of under five children and senior citizens. Any changes to these would result in an impact for \(C_{t}\). In particular \(P_{t}\) is expected to grow rapidly for the senior citizen’s while it is expected to reduce for the under-five age group. Hence the future dynamics of social assistance would be dominated by the senior citizen’s categories.
The net present value (NPV) is often used to create a summary statistic (from today’s perspective) of the total value of costs each year for a certain number of years, which in our case is till 2050. It is also possible to calculate, just as in the case of total costs, the NPV of the U5CG and the senior citizen’s allowances using the exact same methodology. Let \(\Delta_{t}\) denote the difference in time compared to 2024 (the distance of the future) and \(\rho_{t}\) denote the rate of discount for time period \(t\). Then:
\[\begin{equation*} NPV=\sum_{t=2024}^{t=2050}\dfrac{C_{t}}{(1+\rho_{t})^{\Delta_{t}}} \end{equation*}\]u5ben<-rep(532*12,nrow(u5)) # can be made to vary
oaben<-rep(4000*12,nrow(oa)) ## benefit level 4000 per month ##
gdp<-4353 # nominal GDP
gdpgro<-0.05 # Growth in nominal GDP (including inflation)
df$gdp<-gdp*(1+gdpgro)^(df$year-2020)
turoa<-rep(1.05,nrow(oa))
turu50<-c(0.40,0.40,0.40,0.40,0.40,0.45,0.50,0.55,0.6,0.65,0.75)
turu51<-rep(0.80,nrow(u5)-length(turu50))
turu5<-c(turu50,turu51)
u5$cov<-u5$tpop*turu5
oa$cov<-oa$tpop*turoa
u5$tcost<-u5ben*u5$cov*1000/1000000000 #because population is in 000, convert to billion
oa$tcost<-oa$cov*oaben*1000/1000000000 #because population is in 000, convert to bill
df$u5ben<-u5$cov/1000
df$oaben<-oa$cov/1000
df$tben<-(u5$cov+oa$cov)/1000
df$oacost<-oa$tcost
df$u5cost<-u5$tcost
df$tcost<-df$oacost+df$u5cost
df$costgdp<-100*(df$tcost/df$gdp)
# Create discounted values
r<-0.05
df$tcost_pdv=df$tcost/((1+r)^(df$year-2024))
df$oacost_pdv=df$oacost/((1+r)^(df$year-2024))
df$u5cost_pdv=df$u5cost/((1+r)^(df$year-2024))In the base case or status-quo scenario, it is assumed that current policy and demographics will prevail (this implies that the U5CG will be made universal by 2030). The U5 benefit levels are at NPR \(532\) per month and OA benefit levels are NPR \(4000\) per month. It is assumed that the take-up rate for the U5 child grant will increase from \(0.45\) to \(0.75\) by \(2030\) after which it will remain at \(80\%\) till 2065. Hence we have:
\(\beta_{ct} = 532*12\) = \(6,384\) for all \(t\)
\(\beta_{ot} = 4000*12\) =\(48,000\) for all \(t\)
\(\lambda_{ot} = 1\)
\(\lambda_{ut}=0.8\) if \(t>2030\) and \([0.45,0.75]\) when \(t \le 2030\)
\(r_{t} = 68\)
We can write the costs for each year in the base case as:
\[ C_{t}^0 = [{6384\times\gamma_{ct}\times\sum_{a=0}^4 POP_{a,t} }]+ [{48000\times\sum_{a=68}^{100} POP_{a,t} }] \]
The above equation is solvable if we know the path of \(\gamma_{ct}\) as all other values are known. For the status-quo or base case it is assumed that between \(2024\)-\(2030\), coverage would be increased gradually from \(45\%\) to \(75\%\) and after 2030, \(80\%\) of all under-five children would covered. The projection of beneficiaries is shown below:
g<-ggplot(subset(df, year>2023 & year<2051)) +
geom_line(aes(x=year,y=tben,color='Tot')) +
geom_line(aes(x=year,y=oaben,color='OA'))+
geom_line(aes(x=year,y=u5ben,color='U5'))+
labs(x = "Year", y = "Beneficiaries (mill.)") +
ggtitle("Beneficiaries 2024-2050 (Base case)")+
theme_minimal()+
scale_color_manual(name = "Legend",
values = c("OA" = "purple",
"U5" = "green",
"Tot" = "red"))+
guides(fill = guide_legend(title = ""))
ggplotly(g)Since the population of under-five children are expected to decline, the number of beneficiaries of the U5CG would decline in tandem after becoming universal in 2030. In the meanwhile, beneficiaries of the senior citizen’s allowances would begin to dominate beneficiaries. The decline in the U5 beneficiaries is more than offset by the increase in the senior citizen’s beneficiaries and the total number of beneficiaries rises continuously through the simulation horizon.
Costs under the base case will also increase continuously through the simulation horizon as they are driven by the size of the beneficiary pool in each component. It can be seen that senior citizen’s allowances, because of the demographic increase in the pool of beneficiaries as well as higher benefit levels, influence total costs so that it keeps rising even as the costs associated with U5CG decline after 2030. This can be seen in the figure below.
g<-ggplot(subset(df,year>2023 & year<2051)) +
geom_line(aes(x=year,y=tcost,color='total'))+
geom_point(aes(x=year,y=oacost,color='oa'))+
geom_col(aes(x=year,y=u5cost,color='u5'))+
labs(x = "Year", y = "Costs (Bill NPR)") +
ggtitle("Annual Costs 2024-2050 (Base Case)")+
theme_minimal()+
scale_color_manual(name = "Legend",
values = c("total" = "red",
"oa" = "purple",
"u5" = "green"))+
guides(fill = guide_legend(title = "Legend"))
ggplotly(g)These costs estimates are projections of future costs. The NPV is used to summarize the totality of costs from today’s perspective. If we assume \(\gamma_{t}\) = 0.05, then:
\[ NPV_{t}^{0}=\dfrac{C_{t}^{0}}{(1+0.05)^{\Delta_{t}}} \]
Where \(\Delta_{t}\) denotes \(t-2024\) the distance of the future from today. These projections are shown in the figure below.1
g<-ggplot(subset(df,year>2023 & year<2051)) +
geom_line(aes(x=year,y=tcost_pdv,color='total'))+
geom_point(aes(x=year,y=oacost_pdv,color='oa'))+
geom_col(aes(x=year,y=u5cost_pdv,color='u5'))+
labs(x = "Year", y = "Costs (Bill NPR)") +
ggtitle("NPV of costs 2024-2050 (Base Case)")+
theme_minimal()+
scale_color_manual(name = "Legend",
values = c("total" = "red",
"oa" = "purple",
"u5" = "green"))+
guides(fill = guide_legend(title = "Legend"))
ggplotly(g)The sum of these NPVs denotes the full fiscal liabilities when summed till
\(2050\) can be denoted by:
\[ NPV_{0}=\sum_{t=2024}^{t=2050} NPV_{t}^{0} \]
In Table 1, the sum of the NPVs for different time periods are shown. Total implicit pension liabilities (\(NPV_{0}\)) under the status quo or base case is NPR 1,813 billion (31% of current GDP). This can be split into the U5CG component liabilities of NPR 157 billion (3% of GDP)and NPR 1,656 billion (28% of GDP) for the senior citizen’s component (Table 1).
| 2024-2030 | 2030-2040 | 2040-2050 | Total | % GDP | |
| Total | 548 | 688 | 577 | 1813 | 31 |
| Senior Citizens | 492 | 621 | 543 | 1656 | 28 |
| U5 | 56 | 66 | 34 | 157 | 3 |
4 alternative scenarios were considered. These are shown below. The base case describes the status-quo situation and has already been discussed. Scenarios \(1\) and \(2\) are aimed at the U5 child social security allowances. The first scenario makes the U5CG universal in \(2025\). The second scenario increases the U5CG benefit level from NPR \(532\) per month to NPR \(1,216\) per month to align it closer to the minimum per capita per monthly consumption requirement of NPR \(6,082\).2 Scenarios \(3\) and \(4\) are for the senior citizens or old age social security allowances. In scenario \(3\), the benefit level for senior citizens are increased from NPR \(4000\), to NPR \(5,000\) per month - an increase of \(1000\) or \(25\%\). In scenario \(4\), in addition to the benefit level increase, retirement ages are raised from \(68\) to \(72\) after \(2030\).
The flow of beneficiaries changes in scenario \(1\) and \(4\). The benefit levels change in scenario \(2\) and \(3\).
turu501<-c(0.40,0.40,0.40,0.40,0.40)
turu511<-rep(0.80,nrow(u5)-length(turu501))
turu51<-c(turu501,turu511)
turoa1<-rep(1.05,nrow(oa))
u5$cov1<-u5$tpop*turu51
oa$cov1<-oa$tpop*turoa1
u5$tcost1<-u5ben*u5$cov1*1000/1000000000 #because population is in 000, convert to billion
oa$tcost1<-oa$cov1*oaben*1000/1000000000 #because population is in 000, convert to bill
df$u5ben1<-u5$cov1/1000
df$oaben1<-oa$cov1/1000
df$tben1<-(df$u5ben1+df$oaben1)
df$oacost1<-oa$tcost1
df$u5cost1<-u5$tcost1
df$tcost1<-df$oacost+df$u5cost1
df$cost1gdp<-100*(df$tcost1/df$gdp)
df$tcost1_pdv<-df$tcost1/((1+r)^(df$year-2024))
df$oacost1_pdv<-df$oacost1/((1+r)^(df$year-2024))
df$u5cost1_pdv<-df$u5cost1/((1+r)^(df$year-2024))In this scenario, the U5 child grant is made universal while all other parameters are left unchanged. In this scenario the time path for \(\gamma_{ct}\) is that it rises to \(80\%\) in \(t=2025\). Hence \(\gamma_{t} = 0.8\%\) for \(t \ge 2025\) and \(\gamma_{ct} = 0.45\) for \(t=2024\). This scenario just compresses the time path of the new U5CG beneficiaries being added and does not significantly affect overall costs relative to the base line scenario.
We have: \(C_{t}^1 > C_{t}^0\) for \(t < 2030\) but \(C_{t}^1 = C_{t}^0\) for \(t \ge 2030\).
\(\beta_{ct} = 532*12 = 6,384\)
\(\beta_{ot} = 4000*12 = 48,000\)
\(\gamma_{ct} = 0.8\) if \(t \ge 2025\) and \(0.45\) if \(t = 2024\)
Total costs are now written (for \(t \ge 2025\)) as:
\[ C_{t}^1 = [{6384\times.8\times\sum_{a=0}^4 POP_{a,t} }]+ [{48000\times\sum_{a=68}^{100} POP_{a,t} }] \]
In \(t=2024\), \(C_{t}^{2} = C_{t}^{1} = C_{t}^{0}\). The flow of beneficiaries under scenario 1 would change while the senior citizen’s component is left unaffected. The projected beneficiaries are shown below and shows a spike in the U5CG beneficiaries in 2025, followed by a declining trajectory over time.
g<-ggplot(subset(df, year>2023 & year<2051)) +
geom_line(aes(x=year,y=u5ben1,color='U5')) +
geom_line(aes(x=year,y=oaben1,color='OA')) +
geom_line(aes(x=year,y=tben1,color='Tot')) +
geom_col(aes(x=year,y=u5ben,color='U5 Base Case')) +
geom_point(aes(x=year,y=tben,color='Tot Base Case')) +
labs(x = "Year", y = "Beneficiaries") +
ggtitle("Beneficiaries (Scenario 1)")+
theme_minimal()+
scale_color_manual(name = "Legend",
values = c("U5" = "green",
"OA" = "purple",
"Tot" = "red",
"U5 Base Case" = "pink",
"Tot Base Case" = "darkgreen"))+
guides(fill = guide_legend(title = "Legend"))
ggplotly(g)The annual costs and their net present values are shown below:
g<-ggplot(subset(df,year>2023 & year<2051)) +
geom_line(aes(x=year,y=tcost1,color='Total'))+
geom_point(aes(x=year,y=oacost1,color='OA'))+
geom_col(aes(x=year,y=u5cost1,color='U5'))+
geom_line(aes(x=year,y=u5cost,color='U5 Base Case'))+
geom_point(aes(x=year,y=tcost,color='Total Base Case'))+
labs(x = "Year", y = "Costs (Bill NPR)") +
ggtitle("Annual costs 2024-2050 (Scenario 1)")+
theme_minimal()+
scale_color_manual(name = "Legend",
values = c("total" = "red",
"OA" = "purple",
"U5" = "green",
"U5 Base Case"="pink",
"Total Base Case"= "darkgreen"
))+
guides(fill = guide_legend(title = "Legend"))
ggplotly(g)g<-ggplot(subset(df,year>2023 & year<2051)) +
geom_line(aes(x=year,y=tcost1_pdv,color='Total'))+
geom_point(aes(x=year,y=oacost1_pdv,color='OA'))+
geom_col(aes(x=year,y=u5cost1_pdv,color='U5'))+
geom_point(aes(x=year,y=u5cost_pdv,color='U5 Base Case'))+
geom_point(aes(x=year,y=tcost_pdv,color='Total Base Case'))+
labs(x = "Year", y = "Costs (Bill NPR)") +
ggtitle("NPV of annual costs 2024-2050 (Scenario 1)")+
theme_minimal()+
scale_color_manual(name = "Legend",
values = c("Total" = "red",
"OA" = "purple",
"U5" = "green",
"U5 Base Case"="pink",
"Total Base Case"="darkgreen"))+
guides(fill = guide_legend(title = "Legend"))
ggplotly(g)The net present values are derived as:
\[ NPV_{t}^{1}=\dfrac{C_{t}^{1}}{(1+0.05)^{\Delta_{t}}} \]
Where \(\Delta_{t}\) denotes the distance of the future from \(t=2024\) for any time \(t\). The sum of these net present values till \(2050\) denotes the total fiscal liabilities associated with scenario 1 till \(2050\) and may be written as:
\[ NPV_{1}=\sum_{t=2024}^{t=2050} NPV_{t}^{1} \]
Under scenario 1, the sum of the NPV of social security allowances, \(NPV_{1}\), rises to NPR 1,832 billion, an increase of NPR 19 billion caused entirely by making the U5CG universal by 2025 (Table 2).
As a ratio to GDP, there is no change: it remains at \(31\%\). This scenario is fiscally neutral as the added costs in terms of GDP are negligible.
The U5CG components implicit liability rises from NPR 157 billion to NPR 176 billion. \(\Delta_{1}\) = NPR 19 billion till 2050 ( \(NPV_{1}\) - \(NPV_{0}\)). As a ratio to GDP these additional costs are negligible.
| 2024-2030 | 2030-2040 | 2040-2050 | Total | % GDP | |
| Total | 548 | 688 | 577 | 1832 | 31 |
| Senior Citizens | 492 | 621 | 543 | 1656 | 28 |
| U5 | 76 | 66 | 34 | 176 | 3 |
u5bena<-c(532*12,532*12,532*12,532*12,532*12) # Till 2024 same benefits
u5benb<-rep(1216*12,nrow(u5)-length(u5bena)) # raise benefit level to 1216 NPR in 2025
u5ben2<-c(u5bena,u5benb)
u5$tcost2<-u5ben2*u5$cov1*1000/1000000000 #because population is in 000, convert to billion
df$u5ben2<-u5$cov1/1000
df$oaben2<-df$oaben1
df$tben2<-df$oaben2+df$u5ben2
df$u5cost2<-u5$tcost2
df$oacost2<-df$oacost1
df$tcost2<-df$oacost2+df$u5cost2
df$cost2gdp<-100*(df$tcost2/df$gdp)
df$tcost2_pdv=df$tcost2/((1+r)^(df$year-2024))
df$oacost2_pdv=df$oacost2/((1+r)^(df$year-2024))
df$u5cost2_pdv=df$u5cost2/((1+r)^(df$year-2024))In scenario 2, in addition to making the U5GCG universal in 2025, the benefit level is also raised to NPR \(1,216\) per month. This is in order to make the cash transfer more meaningful as a nutrition intervention because the minimum per capita consumption per month is NPR \(6,082\) (NLSS 2022/23). We can write the total costs for \(2024\) to be the same as the total costs from scenario 1. From \(2025\), it would become:
\[ C_{t}^2 = [{14592\times.8\times\sum_{a=0}^4 POP_{a,t} }]+ [{48000\times\sum_{a=68}^{100} POP_{a,t} }] \]
The costs associated with the benefit increase for the U5CG would rise exactly in proportion to the increase in the benefit levels (from \(532\) NPR to \(1,216\)NPR per month) in \(2025\). The projected costs and their net present values are shown below.
g<-ggplot(subset(df,year>2023 & year<2051)) +
geom_line(aes(x=year,y=tcost2,color='Total'))+
geom_point(aes(x=year,y=oacost2,color='OA'))+
geom_col(aes(x=year,y=u5cost2,color='U5'))+
#geom_point(aes(x=year,y=u5cost,color='U5 Base Case'))+
#geom_point(aes(x=year,y=u5cost1,color='U5 Scenario 1'))+
#geom_point(aes(x=year,y=tcost1,color='Total Scenario 1'))+
#geom_line(aes(x=year,y=tcost,color='Total Base Case'))+
labs(x = "Year", y = "Costs (Bill NPR)") +
ggtitle("Annual costs 2024-2050 (Scenario 2)")+
theme_minimal()+
scale_color_manual(name = "Legend",
values = c("Total" = "red",
"OA" = "purple",
"U5" = "green"))+
guides(fill = guide_legend(title = "Legend"))
ggplotly(g)g<-ggplot(subset(df,year>2023 & year<2051)) +
geom_line(aes(x=year,y=tcost2_pdv,color='total'))+
geom_point(aes(x=year,y=oacost2_pdv,color='oa'))+
geom_col(aes(x=year,y=u5cost2_pdv,color='u5'))+
labs(x = "Year", y = "Costs (Bill NPR)") +
ggtitle("NPV of annual costs 2024-2050 (Scenario 2)")+
theme_minimal()+
scale_color_manual(name = "Legend",
values = c("total" = "red",
"oa" = "purple",
"u5" = "green"))+
guides(fill = guide_legend(title = "Legend"))
ggplotly(g)For all \(t \ge 2025\), let
\[ \Delta_{t}^{1} = C_{t}^{2} - C_{t}^{1} \]
It is easy to see that
\[ \Delta_{t}^{1} = (14592 - 6384) \times 0.8\times\sum_{a=0}^{a=4}POP_{a,t}=8208\times\sum_{a=0}^{a=4}POP_{a,t} \]
So the difference in costs each year, \(t\) from \(2025\), is entirely attributable to the difference in benefit levels between scenarios 2 and 1.
Under scenario 2, \(C_{t}^{2}>C_{t}^{1}>C{t}^{0}\) for all \(t > 2025\). \(NPV^{2}\) is estimated to be NPR \(2,050\) (35% of GDP).
The increase in costs is completely due to the increase in the value of the U5CG from NPR \(532\) per month to NPR \(1,216\) per month. The NPV of costs associated with the U5CG till \(2050\)has risen to NPR \(394\) billion, which is about \(7\%\) of GDP.
The change in the NPV between the base case and this case, can be shown as \(\Delta_{2}\) = \(NPV_{2} - NPV_{0}\)=NPR \(237\) ( \(4\%\) of GDP). This includes \(\Delta_{1}\) whose values inNPR \(19\) billion.
As before, the senior citizen’s component continues to consume a significant share of expenditures because that component has not changed compared to the status quo.
| 2024-2030 | 2030-2040 | 2040-2050 | Total | % GDP | |
| Total | 656 | 773 | 621 | 2050 | 35 |
| Senior Citizens | 492 | 621 | 543 | 1656 | 28 |
| U5 | 164 | 152 | 78 | 394 | 7 |
oabena<-rep(4000*12,5) ## benefit level 4000 per month till 2024##
oabenb<-rep(5000*12,nrow(oa)-length(oabena))
oaben3<-c(oabena,oabenb)
oa$tcost3<-oa$cov*oaben3*1000/1000000000 #because population is in 000, convert to bill
df$oacost3<-oa$tcost3
df$u5cost3<-df$u5cost2
df$tcost3<-df$u5cost3+df$oacost3
df$u5ben3<-df$u5ben2
df$oaben3<-df$oaben2
df$tben3<-df$u5ben3+df$oaben3
df$oacost3_pdv<-df$oacost3/((1+r)^(df$year-2024))
df$u5cost3_pdv<-df$u5cost2_pdv
df$tcost3_pdv<-df$tcost3/((1+r)^(df$year-2024))In this scenario, in addition to the assumptions in scenario 2, the senior citizen’s allowances are raised to NPR 5,000 in 2025. In other words, this scenario jointly models an increase in U5CG coverage, increased benefit levels for the U5CG and senior citizens in 2025. This scenario can also be used to isolate the impact of raising the senior citizen’s allowances by NPR 1,000. For the year 2024, the costs are unchanged compared to all other cases. For the years 2025 and beyond, costs can be written as (for \(t \ge 2025\)):
\[ C_{t}^3 = [{14592*.8\times\sum_{a=0}^4 POP_{a,t} }]+ [{60000\times\sum_{a=68}^{100} POP_{a,t} }] \]
The projected flow of costs and their discounted values are shown below.
g<-ggplot(subset(df,year>2023 & year<2051)) +
geom_line(aes(x=year,y=tcost3,color='Total'))+
geom_point(aes(x=year,y=oacost3,color='OA'))+
geom_col(aes(x=year,y=u5cost3,color='U5'))+
#geom_point(aes(x=year,y=u5cost,color='U5 Base Case'))+
#geom_point(aes(x=year,y=u5cost1,color='U5 Scenario 1'))+
#geom_point(aes(x=year,y=tcost1,color='Total Scenario 1'))+
#geom_line(aes(x=year,y=tcost,color='Total Base Case'))+
labs(x = "Year", y = "Costs (Bill NPR)") +
ggtitle("Annual costs 2024-2050 (Scenario 3)")+
theme_minimal()+
scale_color_manual(name = "Legend",
values = c("Total" = "red",
"OA" = "purple",
"U5" = "green"))+
guides(fill = guide_legend(title = "Legend"))
ggplotly(g)g<-ggplot(subset(df,year>2023 & year<2051)) +
geom_line(aes(x=year,y=tcost3_pdv,color='Total'))+
geom_point(aes(x=year,y=oacost3_pdv,color='OA'))+
geom_col(aes(x=year,y=u5cost3_pdv,color='U5'))+
#geom_point(aes(x=year,y=u5cost,color='U5 Base Case'))+
#geom_point(aes(x=year,y=u5cost1,color='U5 Scenario 1'))+
#geom_point(aes(x=year,y=tcost1,color='Total Scenario 1'))+
#geom_line(aes(x=year,y=tcost,color='Total Base Case'))+
labs(x = "Year", y = "Costs (Bill NPR)") +
ggtitle("PDV of costs 2024-2050 (Scenario 3)")+
theme_minimal()+
scale_color_manual(name = "Legend",
values = c("Total" = "red",
"OA" = "purple",
"U5" = "green"))+
guides(fill = guide_legend(title = "Legend"))
ggplotly(g)Under scenario \(3\), there is a sharp increase in costs in \(2025\) as benefits are raised by NPR \(1,000\). We have \(C_{t}^{3}\)>\(C_{t}^{2}\)>\(C_{t}^{1}\)>\(C_{t}^{0}\) for all \(t \ge 2025\). The difference in costs can be traceable directly to the increase in the benefit level. Compared to the base case, the difference in costs attributable to the benefit increase for senior citizen’s can be written as \(\Delta_{t}^{2}\) = \(C_{t}^{3} - C_{t}^{2}\)
\[ \Delta_{t}^{2} = (60000 - 48000) \times \sum_{a=r_{t}}^{a=100}POP_{a,t} = 12000 \times \sum_{a=r_{t}}^{a=100}POP_{a,t} \]
The net present values are derived as:
\[ NPV_{t}^{3}=\dfrac{C_{t}^{3}}{(1+0.05)^{\Delta_{t}}} \]
Where \(\Delta_{t}\) denotes the distance of the future from \(t=2024\) for any time \(t\). The sum of these net present values till \(2050\) denotes the total fiscal liabilities associated with scenario \(3\) till \(2050\) and may be written as:
\[ NPV_{3}=\sum_{t=2024}^{t=2050} NPV_{t}^{3} \]
| 2024-2030 | 2030-2040 | 2040-2050 | Total | % GDP | |
| Total | 760 | 928 | 756 | 2445 | 41 |
| Senior Citizens | 596 | 777 | 678 | 2052 | 35 |
| U5 | 164 | 152 | 78 | 394 | 7 |
Under this scenario, retirement age is raised to \(72\) after \(2030\). Hence we have:
\(r_t = 72\) for \(t \ge 2031\) and \(r_t\) = 68 for \(t<2031\)
\(\beta_{ct} = 1216\times 12 = 14529\) for \(t \ge 2025\)
\(\beta_{ot} = 5000\times12 = 60000\) for \(t\ge2025\)
\(\gamma_{ct} = 0.8\) if \(t \ge 2025\) and \(0.45\) if \(t = 2024\)
Hence we can write for \(t\ge2025\) the costs for each year as:
\[ C_{t}^4 = [{14592*.8*\sum_{a=0}^4 POP_{a,t} }]+ [{60000*\sum_{a=r_{t}}^{100} POP_{a,t} }] \]
The present discounted value of these costs are:
\[ NPV_{t}^{4}=\dfrac{C_{t}^{4}}{(1+0.05)^{\Delta_{t}}} \]
Where \(\Delta_{t}\) denotes the distance of the future from \(t=2024\) for any time \(t\). The sum of these net present values till \(2050\) denotes the total fiscal liabilities associated with scenario \(3\) till \(2050\) and may be written as:
\[ NPV_{4}=\sum_{t=2024}^{t=2050} NPV_{t}^{4} \]
The projected costs and their present discounted values are shown below:
pop$retage1 <- ifelse(pop$year <=2022, 70,
ifelse(pop$year >= 2023 & pop$year <= 2030, 68, 72))
pop$oa4<-ifelse(pop$age>=pop$retage1,1,0)
oa1<-aggregate(tpop~year,data=subset(pop,oa4==1),sum)
oaben4<-oaben3
turoa4<-rep(1.05,nrow(oa1)) # Adjusting population for actual known values
oa1$cov4<-oa1$tpop*turoa4
oa1$tcost4<-oa1$cov4*oaben3*1000/1000000000 #because population is in 000, convert to bill
df$oaben4<-oa1$cov4/1000
df$u5ben4<-df$u5ben2
df$tben4<-df$oaben4+df$u5ben4
df$oacost4<-oa1$tcost4
df$u5cost4<-df$u5cost3
df$tcost4<-df$oacost4+df$u5cost3
df$tcost4_pdv<-df$tcost4/((1+r)^(df$year-2024))
df$oacost4_pdv<-df$oacost4/((1+r)^(df$year-2024))
df$u5cost4_pdv<-df$u5cost4/((1+r)^(df$year-2024))g<-ggplot(subset(df,year>2023 & year<2051)) +
geom_line(aes(x=year,y=tcost4,color='Total'))+
geom_point(aes(x=year,y=oacost4,color='OA'))+
geom_col(aes(x=year,y=u5cost4,color='U5'))+
#geom_point(aes(x=year,y=u5cost,color='U5 Base Case'))+
#geom_point(aes(x=year,y=u5cost1,color='U5 Scenario 1'))+
#geom_point(aes(x=year,y=tcost1,color='Total Scenario 1'))+
#geom_line(aes(x=year,y=tcost,color='Total Base Case'))+
labs(x = "Year", y = "Costs (Bill NPR)") +
ggtitle("Annual costs 2024-2050 (Scenario 4)")+
theme_minimal()+
scale_color_manual(name = "Legend",
values = c("Total" = "red",
"OA" = "purple",
"U5" = "green"))+
guides(fill = guide_legend(title = "Legend"))
ggplotly(g)g<-ggplot(subset(df,year>2023 & year<2051)) +
geom_line(aes(x=year,y=tcost4_pdv,color='Total'))+
geom_point(aes(x=year,y=oacost4_pdv,color='OA'))+
geom_col(aes(x=year,y=u5cost4_pdv,color='U5'))+
#geom_point(aes(x=year,y=u5cost,color='U5 Base Case'))+
#geom_point(aes(x=year,y=u5cost1,color='U5 Scenario 1'))+
#geom_point(aes(x=year,y=tcost1,color='Total Scenario 1'))+
#geom_line(aes(x=year,y=tcost,color='Total Base Case'))+
labs(x = "Year", y = "Costs (Bill NPR)") +
ggtitle("NPV costs 2024-2050 (Scenario 4)")+
theme_minimal()+
scale_color_manual(name = "Legend",
values = c("Total" = "red",
"OA" = "purple",
"U5" = "green"))+
guides(fill = guide_legend(title = "Legend"))
ggplotly(g)Under this scenario:
\(C_{t}^{4}=C_{t}^{3}>C_{t}^{2}>C_{t}^{1}>C_{t}^{0}\) for \(t \le 2030\) and \(C_{t}^{4}\) \(<\) \(C_{t}^{0}\) for \(t \ge 2031\). Hence there are imminent savings in the medium to long term. The NPV of total costs are a little higher than the base case but there is considerable savings in the senior citizen’s expenses as the inflow of beneficiaries has been effectively reduced to the the retirement age increasing to \(72\) years after \(2030\).
Total implicit liabilities or \(NPV_{4}\) has risen reduced to NPR \(1,943\) (\(33\%\) of GDP of which the UG child grant would cost \(7\%\) of GDP and senior citizen’s \(26\%\)). The difference in costs between this case the scenario \(3\) can be written as \(\Delta_{4}\) = \(NPV_{4} - NPV_{3}\) = NPR \(-502\) billion (\(8\%\) of GDP).
In other words, raising the senior citizen’s allowances by NPR \(1,000\) is feasible only if matched by an increase in retirement age.
| 2024-2030 | 2030-2040 | 2040-2050 | Total | % GDP | |
| Total | 760 | 928 | 756 | 2445 | 41 |
| Senior Citizens | 596 | 777 | 678 | 2052 | 35 |
| U5 | 164 | 152 | 78 | 394 | 7 |
Total Costs and NPVs are plotted for all scenarios together. Separate plots are also drawn for U5CG and senior citizen’s allowances.
g<-ggplot(subset(df,year>2023 & year<2051)) +
geom_line(aes(x=year,y=tcost,color='base'))+
geom_point(aes(x=year,y=tcost1,color='scenario 1'))+
geom_point(aes(x=year,y=tcost2,color='scenario 2'))+
geom_point(aes(x=year,y=tcost3,color='scenario 3'))+
geom_line(aes(x=year,y=tcost4,color='scenario 4'))+
labs(x = "Year", y = "Costs (Bill NPR)") +
ggtitle("Total Costs (4 scenarios)")+
theme_minimal()+
scale_color_manual(name = "Legend",
values = c("base" = "red",
"scenario 1" = "purple",
"scenario 2" = "green",
"scenario 3" = "blue",
"scenario 4" = "orange"))+
guides(fill = guide_legend(title = "Legend"))
ggplotly(g)g<-ggplot(subset(df,year>2023 & year<2051)) +
geom_line(aes(x=year,y=tcost_pdv,color='base'))+
geom_point(aes(x=year,y=tcost1_pdv,color='scenario 1'))+
geom_point(aes(x=year,y=tcost2_pdv,color='scenario 2'))+
geom_point(aes(x=year,y=tcost3_pdv,color='scenario 3'))+
geom_line(aes(x=year,y=tcost4_pdv,color='scenario 4'))+
labs(x = "Year", y = "NPV (Bill NPR)") +
#ggtitle("NPV of Total Costs (4 scenarios)")+
theme_minimal()+
scale_color_manual(name = "Legend",
values = c("base" = "red",
"scenario 1" = "purple",
"scenario 2" = "green",
"scenario 3" = "blue",
"scenario 4" = "orange"))+
guides(fill = guide_legend(title = "Legend"))
ggplotly(g)g<-ggplot(subset(df,year>2023 & year<2051)) +
geom_line(aes(x=year,y=u5cost,color='base'))+
geom_point(aes(x=year,y=u5cost1,color='scenario 1'))+
geom_point(aes(x=year,y=u5cost2,color='scenario 2'))+
geom_point(aes(x=year,y=u5cost3,color='scenario 3'))+
geom_line(aes(x=year,y=u5cost4,color='scenario 4'))+
labs(x = "Year", y = "Costs (Bill NPR)") +
ggtitle("Figure 14: U5CG Costs (4 scenarios)")+
theme_minimal()+
scale_color_manual(name = "Legend",
values = c("base" = "red",
"scenario 1" = "purple",
"scenario 2" = "green",
"scenario 3" = "blue",
"scenario 4" = "orange"))+
guides(fill = guide_legend(title = "Legend"))
ggplotly(g)g<-ggplot(subset(df,year>2023 & year<2051)) +
geom_line(aes(x=year,y=u5cost_pdv,color='base'))+
geom_point(aes(x=year,y=u5cost1_pdv,color='scenario 1'))+
geom_point(aes(x=year,y=u5cost2_pdv,color='scenario 2'))+
geom_point(aes(x=year,y=u5cost3_pdv,color='scenario 3'))+
geom_line(aes(x=year,y=u5cost4_pdv,color='scenario 4'))+
labs(x = "Year", y = "NPV (Bill NPR)") +
#ggtitle("Figure 15: NPV of U5CG Costs (4 scenarios)")+
theme_minimal()+
scale_color_manual(name = "Legend",
values = c("base" = "red",
"scenario 1" = "purple",
"scenario 2" = "green",
"scenario 3" = "blue",
"scenario 4" = "orange"))+
guides(fill = guide_legend(title = "Legend"))
ggplotly(g)| Time Period | Base Case | Scenario 1 | Scenario 2 | Scenario 3 | Scenario 4 |
|---|---|---|---|---|---|
| 2024-2030 | 548 | 568 | 656 | 760 | 760 |
| 2030-2040 | 688 | 688 | 773 | 928 | 653 |
| 2040-2050 | 577 | 577 | 621 | 756 | 530 |
| Total | 1813 | 1832 | 2050 | 2445 | 1943 |
| Total as % GDP | 31 | 31 | 35 | 41 | 33 |
| Time Period | Base Case | Scenario 1 | Scenario 2 | Scenario 3 | Scenario 4 |
|---|---|---|---|---|---|
| 2024-2030 | 56 | 76 | 164 | 164 | 164 |
| 2030-2040 | 66 | 66 | 152 | 152 | 152 |
| 2040-2050 | 34 | 34 | 78 | 78 | 78 |
| Total | 157 | 176 | 394 | 394 | 394 |
| Total as % GDP | 3 | 3 | 7 | 7 | 7 |
| Time Period | Base Case | Scenario 1 | Scenario 2 | Scenario 3 | Scenario 4 |
|---|---|---|---|---|---|
| 2024-2030 | 492 | 492 | 492 | 596 | 596 |
| 2030-2040 | 621 | 621 | 621 | 777 | 653 |
| 2040-2050 | 543 | 543 | 543 | 678 | 530 |
| Total | 1656 | 1656 | 1656 | 2052 | 1943 |
| Total as % GDP | 28 | 28 | 28 | 35 | 26 |