当每个计算值都依赖于先前的值时如何使用 apply

How to use apply when each calculated value depends on previous value

我有 3 列:

  1. 分期付款

  2. 兴趣

  3. 曝光

第一行是这样的

分期利息风险

0          0        1000

第1行的分期付款为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)

当前兴趣取决于之前的曝光,当前曝光取决于当前 interest.This 应该继续直到曝光为 0。我已经使用 R 中的 for 循环完成了此操作。但是我的数据很大,我不知道不需要 for 循环。 所以我需要类似应用的东西,如果可能的话甚至更快的方法

有没有其他方法可以不用循环来做到这一点。我正在寻找一个快速的过程。

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

< 不幸的是,我不太确定如何在 SO 的 Markdown 中渲染 LaTeX。对不起,我的演讲。 >

L为起始贷款金额,I为分期付款,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

下一个要解决的问题是 "This should go on till exposure is 0"。您可以使用 n * I > L * (1+r)^n

近似 周期总数
maxN <- round(uniroot(function(n) I*n - (1+r)^n*L, c(1, 1000))$root)

然后使用replace将那些负数设置为0。

希望这对您有所帮助。