Student Loan Calculator

Student Loan Calculator - Documentation

(Version 1.0)

The Student Loan Calculator is intended to help with student loan repayment planing when things are not just simple and static. For professions such as physicians with federal loans, income based repayment may be available with loan forgiveness at the end of the initial loan period. Physicians are also commonly expected to have a huge jump in their income level at some point during the original loan period. I have come in contact with some misleading information around these topics and often “back-of-the-envelope” calculations fail to capture the basic scope of the problem.

I’m not a financial expert, I’m not giving any official financial advice, but I am an engineer, scientist, and proficient at maths. My family and I have some skin in this game of student loans and I got tired of getting half answers and relying on just intuition despite good success. Therefore, I created this little tool to help get some reasonable financial estimates and gain some insight into problems similar to mine and perhaps also yours. It’s not a perfect tool but I think the estimates are good enough to inform some of my personal and family financial decisions.

After describing the loan parameters, the following repayment plans are considered

Comparison Results of the repayment plan calculations are presented in a small graph.

Saving/Investment comparisons are also presented

The link below the “Comparison Results” section provides a url link with your current settings of the calculator that can be used to save or share results.

The following sections describe the repayment plans and the workings of the calculator.


Standing Assumptions / Comments

  • Any extra loan payments are assumed to go towards paying (lowering) the principal of the loan
    • THIS IS VERY IMPORTANT: If you are paying more than the minimum payments on your loans, make sure that those payments are going towards the principal of the loan. Some lenders may default to putting the extra payments towards future interest which doesn’t help you pay off the loan faster or more efficiently in most all cases.
  • The pay-period is a month, i.e., 12 pay-periods per year. So payments are made every month and interest is calculated every month (APR/12).
  • Unless otherwise stated, parameters such as payments per month and interest rates are assumed fixed.
  • Interest is normally calculated as compound interest.
    • For the saving/investment and loan projections.
    • The only exception currently is a presentation of a special case shown in the “Other Results/Warnings/Comments:” textbox: if the phase 1 income based repayment plan monthly payment is less than the current interest.
  • All text input entries are expected to be positive numbers with “.” as the decimal point and no other characters. Example: a loan principal of $200,123.11 loan should be entered as 200123.11 in the Current Loan Principal field in the Loan Parameters section. The calculator won’t yell at you if you do something wrong, like entering letters or zero or negative or non standard numbers, the results will just be garbage, e.g. NAN, negative numbers, nonsense.
  • Another programming note, weird things can happen if you set a rate to zero so if you want to look at such cases (not sure why) then just set the rate to an extremely low value to estimate the results (e.g. 0.0001% will be fine, too close to zero and you’ll see numerical issues arise).

Loan Parameters

The parameters are:

  • Current Loan Principal
    • The current principal of the loan
    • If you have multiple loans, then this should be the sum of the principals
  • Loan APR
    • The annual interest rate of the loan
    • The APR is assumed to be fixed
    • If you have multiple loans, then you can estimate the APR as the weighted average of the loans (e.g. loan one is for $10,000 at 4%, loan two is for $20,000 at 6%, then the weighted average is (10000x4+20000x6)/(10000+20000)=5.33%
    • Keep in mind that if one loan has significantly higher interest than another, then if you pay more than the monthly minimum payment, pay it towards the highest interest loan. This will lower your total payment on aggressive repayment plans.
  • Loan Period
    • The period of the loan
    • If you are unsure of the period and are currently not in any special repayment program, then your minimum payment should be set such that you will pay the loan off on time.
    • If the above applies, then you can estimate the period of the loan by tweaking the loan period until you get your minimum monthly payment in the Minimum Repayment Plan section.

Repayment Plans


Minimum Repayment Plan

This is the nominal plan if you can afford it.

There are no editable parameters.

The calculated fields are:

  • Min Monthly Payment
    • The minimum monthly payment which makes you to pay off the loan on time.
    • Throughout this document, when referring to the minimum monthly payment or original minimum monthly payment then this is that amount unless otherwise explicitly stated.
  • Total Paid
    • The total amount you will pay on this plan.

Aggressive Repayment Plan

This is likely the best plan if you can afford more than the minimum payment.

The parameters are:

  • Extra Payment
    • The amount you plan to pay every month that exceeds the monthly minimum payment.
    • These payments go 100% towards lowering the principal of the loan.

The calculated fields are:

  • Monthly Payment
    • The extra payment plus the minimum monthly payment.
  • Loan Paid In
    • How long it will take to pay off the loan under this plan.
    • This will be shorter than the loan period.
  • Total Paid
    • The total amount you will pay on this plan.

Aggressive Two Phase Repayment Plan

This is the same as the aggressive plan but in two phases. If you expect to have a huge jump in income during the loan period, you are likely to be able to afford to pay more at a later date.

For example, if you are a physician resident earning a 1/4 of your minimum expected pay in 3–5 years.

If you have a drop in disposable income during your loan period, you may afford to pay less extra at a later date.

For example, due to foreseeable life events such as loss of employment, relocation, or expanding your family, all of which may reduce your disposable income. These cases can also be modeled here by lowering the extra payment or possibly taking advantage of a lower minimum monthly payment needed to complete paying off the loan on time, assuming the terms of your loan allows for that (they should, assuming you were allowed to pay towards the capital of the loan).

The editable parameters are:

  • Phase 1
    • Extra Payment
      • The amount you plan to pay every month during phase 1 that exceeds the monthly minimum payment.
    • Period
      • How long you will apply the phase 1 extra payment.
  • Phase 2
    • Extra Payment
      • The amount you will pay every month during phase 2 that exceeds the monthly minimum payment for phase 2
      • The original minimum monthly payment is more than the minimum monthly payment for phase 2 if the phase 1 extra payment is greater than 0.

The calculated fields are:

  • Phase 1
    • Monthly Payment
      • The extra payment plus the minimum monthly payment.
    • Total Paid
      • The total amount you will pay on this plan during phase 1.
    • Loan Principal Remaining
      • The loan principal remaining after phase 1
  • Phase 2
    • Adjusted Monthly Payment
      • If the extra payment in phase 1 is greater than 0, then the principal of the loan is less than it would be applying the original minimal payments.
      • This is the minimum monthly payment needed to pay the loan on time according to the loan period, given that phase 1 has paid off more than the minimum.
    • Monthly Payment
      • The extra payment plus the adjusted minimum monthly payment.
    • Total Paid
      • The total amount you will pay on this plan during phase 2.
  • Results:
    • Loan Paid In
      • How long it will take to pay off the loan under this plan.
      • This will be shorter than the loan period.
    • Total Paid
      • The total amount you will pay on this

Income Based Repayment Plan With Loan Forgiveness

Some loans allow for income based repayment, possibly lower than the minimum payment on the loan in order to pay it back on time. Furthermore, if there is a remaining balance at the end of the loan period, that balance is forgiven. For example, a physician may work for a non-profit organization and at the end of the loan period, may have been working there long enough to qualify for loan forgiveness.

The motivating example for this is if a person has the option to live frugally enough to make extra payments but might also qualify for forgiveness. What will allow for minimum total payment? Will faster repayment be sufficient to result in a lower overall payment than to take advantage of potential forgiveness at the end of the loan period.

Special Case: If the income based repayment is less than the interest being accrued on the loan, then the nominal case is that the unpaid interest is added to the principal. In the “Other Results/Comments/Warnings” text field, an alternative case is computed where the remaining interest is forgiven. There are certain loans and repayment plans that correspond to this case. There are also loans where 50% of the remaining interest is forgiven but that case is not considered here. The total payment for such a loan will be somewhere between the nominal and the interest forgiven cases that are considered.

The editable parameters are:

  • Federal Poverty Level Income
    • Used for calculating the income based repayment
    • In 2017: about $12,060 for individuals, $16,240 for a family of 2, $20,420 for a family of 3.
    • Source
  • Income Based Repayment Rate
    • Used for calculating the income based repayment
    • Probably either 15% or 20%, depends on the program and loan
  • Phase 1
    • Adjusted Gross Income
      • From your tax forms, the adjusted gross income for yourself and your spouse (even if you file separate tax returns).
    • Period
      • How long the phase 1 adjusted gross income applies
  • Phase 2
    • Adjusted Gross Income
      • From your tax forms, the adjusted gross income for yourself and your spouse (even if you file separate tax returns), after the phase 1 period.

The calculated fields are:

  • Phase 1
    • Monthly Payment
      • Monthly payment during phase 1.
      • The lesser of:
        • The minimum payment
        • The income based monthly repayment, which is:
        • (Adjusted gross income - Federal Poverty Level)*(Income Based Repayment Rate)/12
    • Total Paid
      • The total paid during the phase 1 period.
    • Loan Principal Remaining
      • Amount remaining of the principal after the phase 1 period.
      • If the phase 1 monthly payment is less than the interest of the loan, then the interest remainder is added to the principal each month.
  • Phase 2
    • Adjusted Min Monthly Payment
      • The minimum payment needed after phase 1 to pay the loan on time.
      • If phase 1 resulted in a monthly payment less than the minimum payment, then this will be greater the original minimum payment.
      • According to phone calls with federal student loan officers/advisors, this is how adjust income repayment plans work for those loans.
    • Monthly payment
      • Monthly payment during phase 2.
      • The lesser of:
        • The adjust minimum monthly payment for phase 2
        • The income based monthly repayment, which is:
        • (Adjusted gross income - Federal Poverty Level)*(Income Based Repayment Rate)/12
      • If your income goes up sufficiently, then provided that the adjusted minimum payment is lower than the income based monthly payment, your payment will go up to the point of paying the loan off on time and there will be no remaining balance to forgive.
    • Total Paid
      • The total amount paid during phase 2
  • Results
    • Total Paid
      • The total amount paid during both phase 1 and 2
    • Amount Forgiven
      • The remaining loan balance after phase 2
      • This amount is assumed to be forgiven and not accounted for in comparing the payment plans
      • Note that the total paid amount is the number you’ll be more interested in. If you end up paying more than on a different plan that you find feasible, then the amount forgiven is really irrelevant, and the financially superior plan is the one with the lower total amount paid.

Compare Results

Total Payments

The length of the bars shown are proportional to the total amount paid under each repayment plan, as indicated by the text on each bar. The text at the end of the bar restates the amount.

This allows for a quick comparison of the total amount paid under all the plans and helps evaluate which one fits your finances best, or if the differences are small enough for you to rather be guided by other life goals.

Savings/Investments comparisons are also made and are discussed in the next section.


Saving/Investment

The editable parameter is:

  • Savings/Investments APR
    • The annual rate of return on you savings/investments
    • As a rule of thumb you can guesstimate:
      • 0.x% for savings accounts
      • 1% for CDs
      • 2–3% for bonds
      • 5–10% for index funds (over long multi year horizon)
      • Retirement savings (e.g. 401k/Roth) are usually a mixture of bonds and market funds but also have some extra tax incentives and possibly employer matching.
      • If you have the chance to get employer matching towards a retirement fund, then that is 50–100% multiplier on the money you put in. This is most always going to be your top priority over paying more than a minimum on long term loans or paying into other savings.

Savings Comparison 1 (minimum number of extra payments):

This is attempting an apples-to-apples comparison given that you can afford the aggressive repayment plan and that you can sustain paying the original minimum payment throughout original loan period.

For example, if you can afford the minimum repayment plan throughout the loan period but are able to live extra frugally for a while and execute the aggressive plan. How much will you have saved on each plan if you put your extra funds towards savings/investments.

The length of the bars show the savings accumulated on each plan according to the list below. The text shows the total savings.

  • The Minimum
    • During the time that the aggressive plan is paying off the loan, payments are made towards savings equaling the extra payment amount for the aggressive plan.
    • Thus, during the first few months/years of the loan, while the aggressive is paying off the whole loan, payments are being made here to savings. Those savings then earn compound interest until the end of the original loan period without further additional payments.
  • The Aggressive
    • After loan is paid off, payments are put into savings each month equaling the original minimum loan payment until the end of the original loan period
    • Thus, no payments are made towards savings during the time the loan is being payed off. But after that, payments are made towards savings and those savings earn compound interest.

Savings Comparison 2 (maintain extra payments):

This is attempting an apples-to-apples comparison assuming you can afford the aggressive repayment plan throughout the original loan period.

For example, if you can afford the aggressive repayment plan throughout the original loan period: How much will you have saved on each plan if you put your extra funds towards savings/investments throughout the original loan period.

The length of the bars show the savings accumulated on each plan according to the list below. The text shows the total savings.

  • The Minimum
    • During the loan period, payments are made towards savings equaling the amount of extra payments under the aggressive plan.
    • The savings earn compound interest throughout the loan period.
  • The Aggressive
    • After loan is paid off, payments are put into savings each month equaling the aggressive monthly payment until the end of the original loan period.
    • Thus, no payments are made towards savings during the time the loan is being payed off. But after that, an unchanged amount of monthly payments are made towards savings and those savings earn compound interest.

Keep it simple, Javascript and Mobile Safari iOS Audio

I had  my little workout timer app all written out nice and neat, with little beeps for breaks and starts.  But I heard nothing on my iPad.  I find out mobile Safari doesn't support automatically played audio, it must be initialized by the user. Soon after, I see there are ways around the limitation.  With other people providing more details.  My thanks for their help and input which I rely on below.

I wanted it simple and "easy", so I boiled it all down.

The basic audio limitations of Mobile Safari:
(see more details in the links above)

  • Can only start play from a user prompt like a "onclick" event .
  • Only allows one audio file loaded at a time.

The basic workarounds are:

  • Push Once: Make the user push a button just once.
  • Never Stop:  After that first click, use play, pause, and adjust playback time however many times you like.   But never actually finish playing the whole audo file.
  • Use Sprites: Use audio sprites, i.e. use one audio file with all the clips you want to play in one file and keep track of at what time each clip is located an how long it is.

Creating the Audio

Using Audacity or other audio editor, record/combine/edit/track your audio clips all together in one file such that:

  1. First 1 sec is silence.
  2. Keep track of where each clip starts and how long it is, leaving at least about 0.5sec of silence between clips.
  3. End with 1sec of silence.

Export the audio sprites file to a compatible format, e.g.,  .mp3 or .m4a (I used .m4a in the example).

The Code

The HTML includes assigning the audio source (here the file is named "12345.m4a")
[code language="html"]<audio id="audio"> <source src="12345.m4a" type="audio/mp4" /> </audio>
[/code]

The Javascript has the following commented setup near the top.  The "spriteData" contains the names of the clips/sprites, their start time in sec, and their length.  This particular audio sprite file is a sequence of counts from one to five, each starting at their respective second and 0.5sec long.  The "currentSprite" will be used to keep track of the current sprite begin played or most recently played.

[code language="javascript"]// Audio Sprite Setup
// Get the sprite element
var audioSprite = document.getElementById('audio');
// Assign the sprite data (field names for id, start time of the clip in sec and length in sec)
// Place a silence at the beginning and end of the clip (about a second each) as a buffer to avoid undesired playback or termination due to inaccuracy in audio timing due to the browser
var spriteData = {
// Always have the first second silence and named "silence"
silence: {start: 0.0, length: 0.5},
one: {start: 1, length: 0.5},
two: {start: 2, length: 0.5},
three: {start: 3, length: 0.5},
four: {start: 4, length: 0.5},
five: {start: 5, length: 0.5}
};
// current sprite being played
var currentSprite = {};
// End Audio Sprite Setup
[/code]

Then somewhere below it has the remaining setup for playing the sprite, commented for clarity.

[code language="javascript"]// AUDIO SPRITE HANDLING
// time update handler to ensure we are in the current sprite and stop when it is complete
var onTimeUpdate = function() {
var timing_tolerance = 0.2; // .currentTime is not accurate, set this as the tolerance for its inaccuracy
// If at the end of the current sprite, then pause
if (this.currentTime >= currentSprite.start + currentSprite.length) {
this.pause();
}
// If playing but not in the current sprit, then go there (this can occure due to iOS timing issues and start playing from the start of the sprite file unintentionally)
else if (this.currentTime < currentSprite.start-timing_tolerance) {
audioSprite.currentTime = currentSprite.start;
}
};
// Set listener for timeupdate to have the currentTime be in the current sprite
audioSprite.addEventListener('timeupdate', onTimeUpdate, false);
// in mobile Safari, the first time this is called will load the audio. Ideally, we'd load the audio file completely before doing this.
// This function needs to be called first from a user touch event such as onmousedown, onmouseup, onclick, or ontouchstart.
var playSprite = function(id) {
if (spriteData[id] && spriteData[id].length) {
currentSprite = spriteData[id];
audioSprite.currentTime = currentSprite.start;
audioSprite.play();
}
};
var playSpriteInitialize = function(){
playSprite('silence');
// Whatever code you want first executed
//...
};
[/code]

That's all.  As long as "playSprite" or "playSpriteInitialize" are called using a button first (or other compatible event), then the sprites can be played programmatically from that point on using
[code language="javascript"]playSprite["name_of_clip"][/code]
Note that the "currentTime" is not accurate to within about 0.2 or maybe even more seconds.  So this solution may have some limits if vary rapid audio transitions are needed.

Example

Here is a little code snip wrapped with HTML/CSS to play a count from 1 to 5 using text and audio.  The proof of concept is in that once you push the start button once, the program is able to use "setInterval" to automatically/programmatically play the count from the audio sprite file.

Here is the complete code for the example:
[code language="javascript"]
<!DOCTYPE html>
</html>
<audio id="audio"> <source src="12345.m4a" type="audio/mp4" /> </audio>
<button onclick="start_count();">Start Counting</button>
<button onclick="stop_count();">Stop Counting</button>
<div id="count_txt"> --- </div>

<script>
// Audio Sprite Setup
// Get the sprite element
var audioSprite = document.getElementById('audio');
// Assign the sprite data (field names for id, start time of the clip in sec and length in sec)
// Place a silence at the beginning and end of the clip (about a second each) as a buffer to avoid undesired playback or termination due to inaccuracy in audio timing due to the browser
var spriteData = {
// Always have the first second silence and named "silence"
silence: {start: 0.0, length: 0.5},
one: {start: 1, length: 0.5},
two: {start: 2, length: 0.5},
three: {start: 3, length: 0.5},
four: {start: 4, length: 0.5},
five: {start: 5, length: 0.5}
};
// current sprite being played
var currentSprite = {};
// End Audio Sprite Setup

// DEMO ------------------------------------------
var myTimer = {}; // Initialize variable used for timers
var counter = 0; // Initialize counter
var Ncounter = 5; // Up to how many counts

// Assign audio sprite according to the counter, and increment
function sound_count(){
var ids = ["one","two","three","four","five"]; // Array of the sprite names
counter = (counter%Ncounter); // make sure counter is in bounds
playSprite(ids[counter]); // play sprite
document.getElementById('count_txt').innerHTML = ids[counter]; // show counter
counter++; // increment counter
}

// Start a count on a timer
function start_count(){
clearInterval(myTimer); // Clear timer if in case it was already running
myTimer = setInterval(sound_count,1000); // Set timer to run the sound count every 1000ms
}

// End a count
function stop_count(){
clearInterval(myTimer);
}
// End DEMO ------------------------------------------

// AUDIO SPRITE HANDLING
// time update handler to ensure we are in the current sprite and stop when it is complete
var onTimeUpdate = function() {
var timing_tolerance = 0.2; // .currentTime is not accurate, set this as the tolerance for its inaccuracy
// If at the end of the current sprite, then pause
if (this.currentTime >= currentSprite.start + currentSprite.length) {
this.pause();
}
// If playing but not in the current sprit, then go there (this can occure due to iOS timing issues and start playing from the start of the sprite file unintentionally)
else if (this.currentTime < currentSprite.start-timing_tolerance) {
audioSprite.currentTime = currentSprite.start;
}
};
audioSprite.addEventListener('timeupdate', onTimeUpdate, false);
// in mobile Safari, the first time this is called will load the audio. Ideally, we'd load the audio file completely before doing this.
// This function needs to be called first from a user touch event such as onmousedown, onmouseup, onclick, or ontouchstart.
var playSprite = function(id) {
if (spriteData[id] && spriteData[id].length) {
currentSprite = spriteData[id];
audioSprite.currentTime = currentSprite.start;
audioSprite.play();
}
};
var playSpriteInitialize = function(){
playSprite('silence');
// Whatever code you want first executed
//...
};
// End Audio Sprite Setup
</script>
</html>
[/code]