当每个计算值取决于先前值时如何使用应用

时间:2018-09-06 06:12:01

标签: r for-loop apply sapply

我有3列:

  1. 安装

  2. 兴趣

  3. 曝光

第一行是这样的

分期付款利息敞口

0          0        1000

第一行的安装量为0,此后为常数。设为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。我已经在R中使用for循环来完成此操作。但是我的数据很大,因此我不希望for环。 因此,我需要一种类似应用的方法,甚至可能更快的方法

还有没有其他方法可以执行此操作而无需循环。我正在寻找一个快速的过程。

1 个答案:

答案 0 :(得分:2)

就像贷款摊销一样,您可以在编码之前尝试创建一个公式。

<不幸的是,我不太确定如何在SO的Markdown中渲染LaTeX。很抱歉演示。 >

让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。

希望这会有所帮助。