Calculating compound interest with vector of rates

2020-04-13 20:47发布

I'm trying to see if there is a way to vectorize a calculation I performed. I searched for this answer and couldn't find what I needed.

I have a vector of growth rates. Each one represents one period (one year in my case). I want to apply this vector to some principal amount. Then, after the first growth rate is applied to the principal, use the result from the first iteration and apply the second growth element to the new value.

Here's some code for reproduction (all in base):

# Vector of interest or inflation rates
RateVector <- c(0.02, 0.03, 0.04, 0.05, 0.06, 0.05, 0.04, 0.03, 0.02, 0.01) # forecasted rates
Principal <- data.frame(Principal = 1000000) # actual value of indicator in most recent period as data frame (list)

Here was my attempt to vectorize:

sapply(Principal, "*", 1 + cumsum(RateVector))

The problem with this is that the sapply function does not save the new amount and instead applies the vector of rates to the same initial principal. This is actually what I expected from this code. I don't know how to go about saving the new value after each iteration from element to element.

This is how I solved the problem, using a loop:

AmountVector <- Principal # initialize output vector

# Compound growth growth calculation loop
for(i in 1:length(RateVector)){
  Principal = Principal * (1 + RateVector)[i]
  AmountVector <- rbind(AmountVector,Principal)
}

# Print result
AmountVector

1条回答
别忘想泡老子
2楼-- · 2020-04-13 21:25

This is a "cumulative product", so ?cumprod is what you need:

1000000 * cumprod(1+RateVector)
# [1] 1020000 1050600 1092624 1147255 1216091 1276895 1327971 1367810 1395166
#[10] 1409118

cbind(AmountVector, newresult = 1000000 * c(1,cumprod(1+RateVector)))
#   Principal newresult
#1    1000000   1000000
#2    1020000   1020000
#3    1050600   1050600
#4    1092624   1092624
#5    1147255   1147255
#6    1216091   1216091
#7    1276895   1276895
#8    1327971   1327971
#9    1367810   1367810
#10   1395166   1395166
#11   1409118   1409118
查看更多
登录 后发表回答