Instead, you can use SAS or R to calculate what you might pay for a new loan with various posted rates. There are some sophisticated tools available for either package if you're interested in the remaining principal or the proportion of each payment that's principal. Here, we just want to check the monthly payment.
R
We'll begin by writing a little function to calculate the monthly payment from the principal, interest rate (in per cent), and term (in years) of the loan. This is basic stuff, but the code here is adapted from a function written by Thomas Girke of UC Riverside.
mortgage <- function(principal=300000, rate=3.875, term=30) { J <- rate/(12 * 100) N <- 12 * term M <- principal*J/(1-(1+J)^(-N)) monthPay <<- M return(monthPay) }To compare the monthly costs for a series of loans offered by a local bank, we'll input the bank's loans as a data frame. To save typing, we'll use the rep() function to generate the term of the loan and the points.
offers = data.frame( principal = rep(275000, times=9), term = rep(c(30,20,15), each=3), points = rep(c(0,1,2), times=3), rate = c(3.875, 3.75, 3.5, 3.625, 3.5, 3.375, 3, 2.875, 2.75)) > offers principal term points rate 1 275000 30 0 3.875 2 275000 30 1 3.750 3 275000 30 2 3.500 4 275000 20 0 3.625 5 275000 20 1 3.500 6 275000 20 2 3.375 7 275000 15 0 3.000 8 275000 15 1 2.875 9 275000 15 2 2.750(Points are an up-front cost a borrower can pay to lower the mortgage rate for the loan.) With the data and function in hand, it's easy to add the monthly cost to the data frame:
offers$monthly = with(offers, mortgage(rate=rate, term=term, principal=principal)) > offers principal term points rate monthly 1 275000 30 0 3.875 1293.152 2 275000 30 1 3.750 1273.568 3 275000 30 2 3.500 1234.873 4 275000 20 0 3.625 1612.610 5 275000 20 1 3.500 1594.889 6 275000 20 2 3.375 1577.282 7 275000 15 0 3.000 1899.100 8 275000 15 1 2.875 1882.611 9 275000 15 2 2.750 1866.210In theory, each of these costs are fair, and the borrower should choose based on monthly costs they can afford, as well as whether they see a better value in having money in hand to spend on a better quality of life or to invest it in savings or in paying off their house sooner. Financial professionals often discuss things like the total dollars spent or the total spent on interest vs. principal, as well.
SAS
The SAS/ETS package provides the LOAN procedure, which can calculate the detailed analyses mentioned above. For simple calculations like this one, we can use the mort function in the data step. It will find and return the missing one of the four parameters-- principal, payment, rate, and term. To enter the data in a manner similar to R, we'll use array statements and do loops.
data t; principal = 275000; array te [3] (30,20,15); array po [3] (0,1,2); array ra [9] (.03875, .0375, .035, .03625, .035, .03375, .03, .02875, .0275); do i = 1 to 3; do j = 1 to 3; term = te[i]; points = po[j]; rate = ra[ 3 * (i-1) +j]; monthly = mort(principal,.,rate/12, term*12); output; end; end; run; proc print noobs data = t; var principal term points rate monthly; run; principal term points rate monthly 275000 30 0 0.03875 1293.15 275000 30 1 0.03750 1273.57 275000 30 2 0.03500 1234.87 275000 20 0 0.03625 1612.61 275000 20 1 0.03500 1594.89 275000 20 2 0.03375 1577.28 275000 15 0 0.03000 1899.10 275000 15 1 0.02875 1882.61 275000 15 2 0.02750 1866.21An unrelated note about aggregators: We love aggregators! Aggregators collect blogs that have similar coverage for the convenience of readers, and for blog authors they offer a way to reach new audiences. SAS and R is aggregated by R-bloggers, PROC-X, and statsblogs with our permission. If you read this on another aggregator that does not credit the blogs it incorporates, please come visit us at SAS and R. We answer comments there and offer direct subscriptions if you like our content. In addition, no one is allowed to profit by this work under our license; if you see advertisements on this page other than as noted above, the aggregator is violating the terms by which we publish our work.->
Not sure why you want the global assignment in your function mortgage. Seems like you should just return M.
ReplyDeleteAlso, I prefer 'within' over 'with' when creating a variable in a dataset.
offers <- within(offers, monthly <- mortgage(rate=rate, term=term, principal=principal))
No reason at all! As I mentioned, I swiped the function from somewhere else, and mercilessly chopped it down. But I left it one line too long, I guess.
ReplyDeleteWhat is it you especially like about within()? Perhaps we should use transform()?
My preference would be to use "mutate()" from the dplyr package. It's likely to be fastest of all of the options (particularly if you are interacting with a data table). Just my $0.02, Nick
ReplyDelete