Могу ли я получить доступ к предыдущим терминам вектора "p" в функции purrr :: накопления? - PullRequest
0 голосов
/ 23 апреля 2020

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

Вот что я пробовал:

library(tidyverse)
library(lubridate)

set.seed(123)
example.df<-data.frame(Date=seq.Date(Sys.Date(), by='day', length.out = 1000)) %>% 
  mutate(Age=floor(((Sys.Date() %m+% years(-70)) %--% Date)/years(1))) %>% 
  mutate(InitialBalance=100000,
         rmd.factor=if_else(month(Date)==5 & day(Date)==15, .05+(Age-70)*.02, 0),
         InterestCredited=if_else(month(Date)==4 & day(Date)==22 & row_number()>1, runif(n())*.2, 0)) %>% 
  left_join({.} %>% 
              sample_n(10) %>% 
              select(Date) %>% 
              mutate(Withdrawal=runif(n())*10000), by='Date') %>% 
  replace_na(replace=list(Withdrawal=0)) %>% 
  group_by(year(Date)) %>% 
  mutate(YearDay=row_number()-1) %>% 
  ungroup() %>% 
  mutate(Test=row_number())


output.df<-example.df %>% 
  nest() %>% 
  mutate(AVAccumulate=map(data, function(data) unlist(accumulate(
    .x=data$Test,
    .f=function(p, x){
        (p-data$Withdrawal[x]-data$rmd.factor[x]*lag(p, data$YearDay[x]))*(1+data$InterestCredited[x])
      },
    .init=data$InitialBalance[1])[2:(nrow(data)+1)]))) %>% 
  unnest()

head(output.df)

Это явно не работает, как только первый срок в рекурсии нет ошибки Если я удалю вычисление RMD, рекурсия сработает:


output.df2<-example.df %>% 
  nest() %>% 
  mutate(AVAccumulate=map(data, function(data) unlist(accumulate(
    .x=data$Test,
    .f=function(p, x){
      (p-data$Withdrawal[x])*(1+data$InterestCredited[x])
    },
    .init=data$InitialBalance[1])[2:(nrow(data)+1)]))) %>% 
  unnest()

head(output.df2)

Похоже, у меня нет доступа к "p" в функции накопления как к вектору, а скорее как к последнему значению. Есть ли способ получить доступ к предыдущим значениям "p"?

Кроме того, есть ли способ просто использовать фрейм данных в качестве моего аргумента "x" вместо вектора индекса? То, что я делаю, кажется немного неуклюжим и напоминает о-1012 *, от которого я пытаюсь избавиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...