Мне нужно смоделировать базовый баланс, в котором 1) окончательный баланс - это начальный баланс плюс денежный поток, и 2) начальный баланс равен предыдущему конечному балансу. Следующий код работает нормально:
init_balance <- c(0,0,0,0)
cash_flow <- 1:4
final_balance <- c(0,0,0,0)
n <- length (final_balance)
for (i in 1:n) {
final_balance[i] <- init_balance[i] + cash_flow[i]
if (i < n) {
init_balance[i+1] <- final_balance[i]
}
}
> init_balance
[1] 0 1 3 6
> cash_flow
[1] 1 2 3 4
> final_balance
[1] 1 3 6 10
Однако эта реализация использует циклы for и мне не кажется R-ish. Все финансовые пакеты, которые я нашел, относятся к финансовому анализу, а не к финансовому моделированию.
Может ли кто-нибудь предложить другой подход или пакет для такого моделирования?
Спасибо.





Нет необходимости в циклах, и все, что вам действительно нужно, это cash_flow, чтобы начать:
library(tidyverse)
df <- tibble(
cash_flow = 1:4
)
df
#> # A tibble: 4 x 1
#> cash_flow
#> <int>
#> 1 1
#> 2 2
#> 3 3
#> 4 4
df %>%
mutate(
final_balance = cumsum(cash_flow),
init_balance = lag(final_balance, 1, default = 0)
)
#> # A tibble: 4 x 3
#> cash_flow final_balance init_balance
#> <int> <int> <dbl>
#> 1 1 1 0
#> 2 2 3 1
#> 3 3 6 3
#> 4 4 10 6
Created on 2019-03-21 by the reprex package (v0.2.1)
Ваш final_balance — это просто совокупные денежные потоки. Для init_balance мы используем lag из final_balance на 1 период (думаем, на 1 период раньше); мы также устанавливаем его количество по умолчанию равным нулю вместо NA.
Базовый вариант R-ish может выглядеть так.
finance <- data.frame(cash.flow=1:4)
within(finance, {
final.balance <- cumsum(cash.flow)
init.balance <- final.balance - cash.flow
})
# cash.flow init.balance final.balance
# 1 1 0 1
# 2 2 1 3
# 3 3 3 6
# 4 4 6 10
Разница в том, что это решение (и решение другого ответа) вычисляется со всем вектором одновременно, а не с каждым отдельным значением, которое можно было бы назвать «R-ish».