我有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环。 因此,我需要一种类似应用的方法,甚至可能更快的方法
还有没有其他方法可以执行此操作而无需循环。我正在寻找一个快速的过程。
答案 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。
希望这会有所帮助。