《R语言初学指南》一2.5 实际案例

  1. 云栖社区>
  2. 博客>
  3. 正文

《R语言初学指南》一2.5 实际案例

异步社区 2017-05-02 14:43:00 浏览1665
展开阅读全文

本节书摘来自异步社区《R语言初学指南》一书中的第2章,第2.5节,作者【美】Brian Dennis(布莱恩·丹尼斯),更多章节内容可以访问云栖社区“异步社区”公众号查看

2.5 实际案例

R语言初学指南
下面回到金融学中。假设你现在准备花30 000美元购置第一套房子——一座活动房屋。你有资格申请一份小额抵押贷款,但想知道每月的偿还额是多少。

可拿出6000美元作为首付。此外,还要在借款中加入1000美元的附加费用,这样贷款总额为25 000美元。这就是贷款中的“本金”。抵押贷款的提供者同意将本金中未付余款的年利率定为5%。下面要确定:若要在30年内(即360个月内,这是一个标准的贷款期限,其月利率为5%÷12=0.417%)偿还所有的余额和利息,则每月应付多少钱。

这里有一个看起来有些复杂的方程来计算每月的偿还金额。每个进入商学院的学生都要学习这个方程。对本案例来说,该公式如下:


816447acf4ac891a022a8a4d06310f5655c23b45

若不知道如何得出这个方程,也没关系,可参见后面的内容(“贷款月供的方程推导”),里面提供了所有的代数推导步骤。这一推导很长,但并不难。在参考推导过程时,找一张纸记下并理解其中的每一步。这些努力是值得的(若能理解这些内容,就可轻松完成商学院的课程)。若只是想学习如何用R来计算,则可略过这一推导过程。

打开R控制台并计算每月偿还额。这里R命令以及计算结果应与下面内容相似:

> (1+.00417)^360*.00417*25000/((1+.00417)^360-1)
[1] 134.2665

在360个月内,每月偿还借贷方134.27美元。

由于上述计算仅占了一行,对这一特定的案例基本没有必要建立R脚本。但对所有的付款细节来说,如对不同额度的贷款本金,不同长度的贷款期限以及不同水平的贷款利率,通过建立脚本来计算是很有用的。若你已经开始考虑这些问题,则说明你已做好自己开银行的准备了。

在“贷款月供的方程推导”中,除了每月偿还额,还提供了另外两个方程:已偿还本金额度及未偿还本金额度。其定义符号如下:m为贷款(偿还)的总月数,P为借贷的本金总额。利用这些符号,得出三个借贷方程为:


6c5e1b6b2aa19d229fd45bc3ae002933f38d33e9

下面准备建立R脚本。需要脚本来做些什么呢?显然是为了计算每月偿还额和已偿还的金额。注意,已偿还的额度是每月都在变化的——若足够聪明的话可以发现,R中的向量运算非常适合用来建立这一脚本(确实如此,没有人想写360行命令对每月分别进行计算)。得到已偿还金额后,就可知每月的利息是多少了。之后可绘制一幅付款图,比如每月未偿还本金的额度是多少?同样地,还可将贷款期内的利息累加,得到的结果将会令人惊讶。

在开始写脚本之前,将所有任务按顺序列出来会有很大的帮助。

步骤0:为P(本金),m(还款总月数)及i(年利率)赋值。计算s(月利率)。将这些内容放在脚本的开始位置,以便脚本的使用者快速找到并调整它们。

步骤1:计算时间的向量值(1~m)。

步骤2:利用第一个贷款方程计算每月还款额(单个数值)。

步骤3:利用第二个贷款方程计算每月应偿还的本金额度向量。

步骤4:利用第三个贷款方程计算每月未偿还的本金额度向量。

步骤5:用每月还款额扣除每月应偿还的本金额度向量,计算月利息向量。

步骤6:将每月所付利息累加,计算总利息。在R中有一个指令可方便地完成这个任务:若x为向量,则sum(x)将对x的全部元素求和。

步骤7:在控制台中显示计算结果。

步骤8:以月份向量为横轴,以未偿还的本金额度向量为纵轴来绘图。

看上去是不是雄心勃勃的?是的!R就是要让人有雄心壮志。建议用户新打开一个空白的R编辑器来建立脚本,试着将上面每个步骤一次性写成R语句。每完成一步后,将写好的语句与下面相应的语句对照。记住,在R中,对同一个计算,可能会有几种不同的正确写法。你的方法可能与其他方法一样好,甚至更好。

作者在列出脚本的步骤后,习惯将这些步骤作为注释!若只想快些计算出结果,就先不用输入注释;但一定要记得,在保存需要长期使用的脚本前,为它们加上注释。下面开始:

#==============================================
# loan payment.R: R script to calculate and plot monthly loan
# payment information.
#==============================================
#----------------------------------------------
# Step 0. Assign numerical values to P (principal), m (total 
# number of monthly payments), and i (annual interest rate).
# Calculate s (monthly interest rate).
#----------------------------------------------
P=25000
m=360
i=.05  # Interest is 100*i percent per year.
s=i/12  # Monthly interest rate.
#----------------------------------------------
# Step 1. Calculate a vector of values of time (months) going
# from 1 to m.
#----------------------------------------------
t=1:m

#----------------------------------------------
# Step 2. Calculate the monthly payment (a single number)
# using the first loan equation.
#----------------------------------------------
monthly.payment=(1+s)^m*s*P/((1+s)^m−1)

#----------------------------------------------
# Step 3. Calculate a vector of principal amounts paid each
# month of the loan using the second loan equation.
#----------------------------------------------
principal.paid.month.t=(1+s)^(t−1)*s*P/((1+s)^m−1)

#----------------------------------------------
# Step 4. Calculate a vector of principal amounts remaining
# unpaid each month of the loan using the third loan equation.
#----------------------------------------------
principal.remaining=P*(1−((1+s)^t−1)/((1+s)^m−1))

#----------------------------------------------
# Step 5. Calculate a vector of the interest amounts paid
# each month by subtracting the principal amounts paid from the 
# monthly payment. 
#---------------------------------------------- 
interest.paid.month.t=monthly.payment-principal.paid.month.t

#----------------------------------------------
# Step 6. Calculate the total interest paid by summing all the
# interest amounts paid each month using the sum( ) function in R. 
#----------------------------------------------
total.interest.paid=sum(interest.paid.month.t)

#----------------------------------------------
# Step 7. Print the results to the console.
#----------------------------------------------
monthly.payment
total.interest.paid
t
principal.paid.month.t
interest.paid.month.t
principal.remaining
#----------------------------------------------
# Step 8. Draw a graph of the principal remaining in the loan 
# each month (vertical axis) versus the vector of months
# (horizontal axis).
#---------------------------------------------- 
plot(t,principal.remaining,type="l")

保存脚本,然后运行、调试、再运行、再调试。仔细比较R命令与对应的贷款方程,并确保熟悉R语法的规则(如需要,可复习第1章中的规则)。若脚本正确,则控制台中会显示一系列数值,并绘制图2.1所示图形。


fdaa86048cfb4ccebdf5e1ca17acdf8093f89483

图2.1 在t时刻(横轴)剩余的本金额度(纵轴)。其中总贷款额度为25 000美元,年利率为5%,还款总月数为360个月。

注意,用脚本计算得到的每月还款额为134.2054美元,与之前在控制台中用一行命令计算的结果134.2665美元略有不同。在较早的计算中所使用的月利率,其舍入后的近似值0.005/12≈0.00417,而在脚本中使用的是0.05/12的双精度近似值。若在控制台中直接计算0.05/12,R会将数值四舍五入显示为0.004166667。记住,在所有计算器和计算机中使用“浮点运算”都会产生舍入误差。这一误差将会传播到整个计算中,故一般最好不要在一开始就进行舍入,若需要,仅将最终结果舍入即可。

除每月还款额度外,控制台中开始显示的另一个数字是整个还款期内所需支付利息的总额。总利息与贷款本金几乎相等,这实在令人惊讶。用较短的贷款期再运行一遍脚本,比如用15年代替30年,看看还款方式有何不同。

网友评论

登录后评论
0/500
评论
异步社区
+ 关注