Моделирование баланса в R - PullRequest
2 голосов
/ 21 марта 2019

Мне нужно смоделировать базовый баланс, в котором 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 для меня.Все финансовые пакеты, которые я нашел, связаны с финансовым анализом, а не с финансовым моделированием.

Кто-нибудь может предложить другой подход или пакет для такого рода моделирования?

Спасибо.

Ответы [ 2 ]

1 голос
/ 21 марта 2019

Базовый R-образный путь может выглядеть следующим образом.

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».

1 голос
/ 21 марта 2019

Нет необходимости в циклах, и все, что вам действительно нужно, это 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

Создано в 2019-03-21 пакетом представ. (v0.2.1)

Ваш final_balance - это просто совокупный денежный поток. Для init_balance мы используем lag из final_balance на 1 период (думаю, за 1 период до этого); мы также устанавливаем значение по умолчанию на ноль вместо NA.

...