假设我在 60 (n) 个月内每月在银行存入 1000 (P) 美元,银行每月向我支付 1 (R)% 作为利息。因此,我可以计算每笔存款的利息:
P=1000
n=60
rate=1
P*(rate/100)*(n:1)
[1] 600 590 580 570 560 550 540 530 520 510 500 490 480 470 460 450 440 430 420 410 400 390 380 370 360 350 340 330 320 310 300
[32] 290 280 270 260 250 240 230 220 210 200 190 180 170 160 150 140 130 120 110 100 90 80 70 60 50 40 30 20 10
Run Code Online (Sandbox Code Playgroud)
和总利息 (totalInt) 为
totalInt = sum(P*(rate/100)*(n:1))
totalInt
[1] 18300
Run Code Online (Sandbox Code Playgroud)
如果我知道 P、n 和 totalInt,如何计算“比率”?我尝试了以下公式,但它产生了一系列没有意义的值:
rate = totalInt * 100 / (P*(n:1))
> rate
[1] 30.50000 31.01695 31.55172 32.10526 32.67857 33.27273 33.88889 34.52830 35.19231 35.88235 36.60000
[12] 37.34694 38.12500 38.93617 39.78261 40.66667 41.59091 42.55814 43.57143 44.63415 45.75000 46.92308
[23] 48.15789 49.45946 50.83333 52.28571 53.82353 55.45455 57.18750 59.03226 61.00000 63.10345 65.35714
[34] 67.77778 70.38462 73.20000 76.25000 79.56522 83.18182 87.14286 91.50000 96.31579 101.66667 107.64706
[45] 114.37500 122.00000 130.71429 140.76923 152.50000 166.36364 183.00000 203.33333 228.75000 261.42857 305.00000
[56] 366.00000 457.50000 610.00000 915.00000 1830.00000
>
mean(rate)
[1] 142.736
Run Code Online (Sandbox Code Playgroud)
平均值也太高,没有意义。
您似乎是 R 的新手,所以这里有几种方法可以做到这一点。
如果这是另一种编程语言,您可以这样计算复利:
# approach using loops - very inefficient in R
totalInt <- 0
prin <- P
for (i in 1:n) {
totalInt <- totalInt + prin*rate/100
prin <- prin * (1+rate/100)
}
totalInt
# [1] 816.6967
Run Code Online (Sandbox Code Playgroud)
由于 R 是一种矢量化语言,这是 R 中的首选方式。
# vectorized approach - very efficient in R
prin <- P * (1+rate/100)^(0:(n-1))
int <- prin * rate/100
totalInt <- sum(int)
totalInt
# [1] 816.6967
Run Code Online (Sandbox Code Playgroud)
这段代码创建了一个向量,prin在每个时期的开始都有原则,然后是一个int包含该时期赚取的利息的向量。下面的方法是同一事物的更紧凑版本。
# vectorized approach simplified
P * sum((1+rate/100)^(0:(n-1))*rate/100)
# [1] 816.6967
Run Code Online (Sandbox Code Playgroud)
因此,要进行相反的操作,例如计算给定 P、n 和 totalInt 的比率,我们使用uniroot(...)应用于函数 的函数f(...),如下所示。阅读 上的文档uniroot(...)。
f <- function(rate,P,n,totalInt) {
totalInt - P * sum((1+rate/100)^(0:(n-1))*rate/100)
}
result <- uniroot(f,P=1000,n=60,totalInt=816.7, lower=0, upper=100)$root
result
# [1] 1.000003
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7697 次 |
| 最近记录: |