Как использовать применить, когда каждое рассчитанное значение зависит от предыдущего значения - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть 3 столбца:

  1. платеж

  2. 1012 * интерес *

  3. экспонирование

1-й ряд выглядит так

процентная рассрочка

0          0        1000

Рассрочка 0 для 1-го ряда и постоянная цифра после. Пусть будет 100.

Процент i-й строки = 0,5% * Экспозиция (i-1) -ой строки

Экспозиция i-го ряда = экспозиция (i-1) -ого ряда - (взнос i-го ряда - проценты по i-му ряду)

installment interest   exposure

0           0          1000
100         0.005*1000 1000-(100-5)

текущий интерес зависит от предыдущего воздействия, а текущее воздействие зависит от текущего интереса. Это должно продолжаться до тех пор, пока воздействие не станет равным 0. Я сделал это с помощью цикла for в R. Но мои данные велики, и я не хочу для петля. Так что мне нужно что-то вроде применения или даже более быстрого метода, если это возможно

есть ли другой способ сделать это без цикла. Я ищу быстрый процесс.

1 Ответ

0 голосов
/ 06 сентября 2018

Похоже на амортизацию кредита, вы можете попытаться создать формулу до ее кодирования.

<К сожалению, я не совсем уверен, как визуализировать LaTeX в Markdown SO здесь. Извините за презентацию. >

Пусть L - начальная сумма кредита, я - рассрочка платежа, а r - процентная ставка.

В период n = 0 непогашенная сумма кредита составляет L.

В период, n = 1, непогашенная сумма кредита составляет (1 + r) * L - I.

В период n = 2 непогашенная сумма кредита составляет (1 + r) ^ 2 * L - (1 + r) * I - I.

В период n = 3 непогашенная сумма кредита составляет (1 + r) ^ 3 * L - (1 + r) ^ 2 * I - (1 + r) * I - I.

В период n, непогашенная сумма кредита составляет (1 + r) ^ n * L - I * sum_ {k = 0} ^ {n-1} (1 + r) ^ k.

После чего это вопрос кодирования этого:

amor <- function(L, r, I, nvec) {
    vapply(nvec, 
        function(n) {
            if (n < 1L) stop("n must be > 0.")
            L * (1+r)^n - I * sum((1+r)^(seq_len(n) -1L))
        },
        numeric(1))
}
amor(1000, r, 100, seq_len(12))

выход:

[1]  905.00000  809.52500  713.57262  617.14049  520.22619  422.82732  324.94146  226.56617  127.69900   28.33749  -71.52082 -171.87843

Следующая проблема, которую нужно решить, это «Это должно продолжаться до тех пор, пока экспозиция не станет равной 0». Вы можете приблизить общее количество периодов, используя n * I> L * (1 + r) ^ n

maxN <- round(uniroot(function(n) I*n - (1+r)^n*L, c(1, 1000))$root)

Затем используйте replace, чтобы установить эти отрицательные числа на 0.

Надеюсь, это поможет.

...