The key concept in this exercise is the discount rate. A typical discount rate less than 1 implies that future benefits and costs are de-prioritised in favour of more recent ones. Different people may subconsciously apply different discount rates, depending on how forward-thinking they are. Why discount the future?
The "net present value" is the sum of all discounted benefits minus the sum of all discounted costs. It's how we determine whether it's worth our investment to start a project which will take a long time.
What does this imply for how we think about stock pollutants and climate change?
The World Bank is considering an application from the country of Equatoria for a large dam project. Some costs and benefits of the project (dollar values) are as follow:
# costs
construction_cost <- 5e+8 # for three years
operation_cost <- 5e+7 # per year
agri_damage <- 4.5e+7 # per year
forest_damage <- 2e+7 #per year
# production
water_supply <- 5e+9
power_supply <- 3e+9
# prices
water_price <- 0.02
power_price <- 0.05
The dam takes three years to construct, during this period there are only initial costs but no revenue.
Present value of costs:
Present value of benefits:
PV_BENEFITS <- matrix(nrow = 33, ncol = 2)
PV_COSTS <- matrix(nrow = 33, ncol = 2)
# we want to calculate NPV using two different discount rates of 5% and 10%
discount_rate <- c(0.05, 0.1)
for ( i in 1:length(discount_rate)) {
for ( t in 1:33) {
if ( t > 3) {
PV_BENEFITS[t, i] <- (power_price*power_supply + water_price*water_supply)*(1/(1 + discount_rate[i])^(t-1))
PV_COSTS[t, i] <- (operation_cost + agri_damage + forest_damage)*(1/(1 + discount_rate[i])^(t-1))
}
else { PV_BENEFITS[t, i] <- 0
PV_COSTS[t, i] <- construction_cost*(1/(1 + discount_rate[i])^(t-1)) }
}
}
#
pv <- PV_BENEFITS - PV_COSTS
pv_total <- colSums(PV_BENEFITS) - colSums(PV_COSTS)
pv_data <- data.frame('PV' = c(pv[,1], pv[,2]), 'YEAR' = 0:32, 'RATE' = c(rep('5%', 33),rep('10%', 33)))
head(pv_data)
PV | YEAR | RATE | |
---|---|---|---|
<dbl> | <int> | <chr> | |
1 | -500000000 | 0 | 5% |
2 | -476190476 | 1 | 5% |
3 | -453514739 | 2 | 5% |
4 | 116618076 | 3 | 5% |
5 | 111064834 | 4 | 5% |
6 | 105776032 | 5 | 5% |
tail(pv_data[28:33,])
PV | YEAR | RATE | |
---|---|---|---|
<dbl> | <int> | <chr> | |
28 | 36159523 | 27 | 5% |
29 | 34437641 | 28 | 5% |
30 | 32797753 | 29 | 5% |
31 | 31235956 | 30 | 5% |
32 | 29748529 | 31 | 5% |
33 | 28331932 | 32 | 5% |
library(ggplot2)
library(dplyr)
ggplot(data = pv_data, aes(x = YEAR, y = PV, colour = RATE)) + geom_line(size = 2) + theme_bw()
Warning message: "package 'dplyr' was built under R version 4.0.3" Attaching package: 'dplyr' The following objects are masked from 'package:stats': filter, lag The following objects are masked from 'package:base': intersect, setdiff, setequal, union
pv_data %>% group_by(RATE) %>% summarize(NPV = sum(PV))
`summarise()` ungrouping output (override with `.groups` argument)
RATE | NPV |
---|---|
<chr> | <dbl> |
10% | -316005411 |
5% | 452635727 |