Расчет сложного процента с вектором ставок - PullRequest
0 голосов
/ 30 мая 2018

Я пытаюсь выяснить, есть ли способ векторизации выполненных мной вычислений.Я искал этот ответ и не смог найти то, что мне нужно.

У меня есть вектор темпов роста.Каждый представляет один период (один год в моем случае).Я хочу применить этот вектор к некоторой основной сумме.Затем, после того, как первая скорость роста будет применена к принципалу, используйте результат первой итерации и примените второй элемент роста к новому значению.

Вот некоторый код для воспроизведения (все в 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)

Вот моя попытка векторизации:

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

Проблема в том, что функция sapply не сохраняет новую сумму и вместо этого применяет вектор ставок ктот же начальный принципал.Это на самом деле то, что я ожидал от этого кода.Я не знаю, как сохранить новое значение после каждой итерации от элемента к элементу.

Вот как я решил проблему, используя цикл:

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 Ответ

0 голосов
/ 30 мая 2018

Это «накопительный продукт», поэтому ?cumprod - это то, что вам нужно:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...