当每个计算值都依赖于先前的值时如何使用 apply
How to use apply when each calculated value depends on previous value
我有 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。
希望这对您有所帮助。
我有 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。
希望这对您有所帮助。