This code answers the question "given my income, how much would I be able to retire with if I retire at a given age and save at a given rate?" The main output is a file Pensions.pdf, which plots the posibilities frontier for this in savings rate-retirement age space. Taxes Taxes are calculated using NBER's Taxsim v9 software. These taxes are calculated remotely on the NBER's server, and exchanged via FTP. Taxes are calculated once and then stored in a matrix for a lookup table. Tax lookup is by necessity approximate. Income elements (labor income, capital gains, and social security) are rounded down to the next grid point. Then, income between the last grid point and current levels is assumed to be taxed at the marginal rate from the grid point to the actual level. This method requires making two calls to Taxsim, since taxsim only calculates a single set of marginal rates. The first call calculates marginal rates WRT earned income, and the second call calculates marginal rates WRT capital income. Features This code calculates how much money an individual will have left in retirement given income as well as savings and retirement decisions. Economic features *Calculate taxes using state-of-the-art bulk tax program, Taxsim. *Use income assumptions based on recent Census estimates by Heckman, Lochner, and Todd *Calculates social security benefits using current exact eligibility formula. *Uses exact dating (birth date, retirement date) in order to calculate exact social security benefits Potential features *With a small amount of work, it could calculate alternative benefits under the Domenici-Rivlin or Simpson-Bowles reform plans *Compare decisions to marry, live in two states, have a child, etc. *Maintain several accounts (IRAs, etc) to accurately determine tax liability *Take arbitrary income schedules (compare income to other assumptions) *Take arbitrary savings decisions (save x dollars per year) *Finite differencing or marginal effects -- answer the question "if I save $1 today, how much will that affect my pension for the rest of my life, depending on other decisions?" *Take different/historical return assumptions There are currently 3 key .R files that need to be run. rettest.R -- This file takes a variety of income, capital gains income, and social security income grid points and calculates taxes from NBER's taxsim. It saves the tax grids, variables taxsim and taxsimcapitalgains, in taxsim.RData. Note that it's conceivable that if you ran this code, it woudl give an error if the internet connection is too slow. If the internet connection is too slow, I believe that the RCurl package times out and decides that there were no rows in the result, which is a symptom of a bad input file. rettest.R doesnt' actually have to be run in general - it should be saved with a given taxsim.RData which matches the lookup grid points. calculate.R -- This file sets paramters to reasonable values and then calls Pension(), the main function which returns a finances object that includes the answer to the question how much you would have at retirement if you save at a given rate and retire at a given age. ret2.R -- This file contains the bulk of the code. Objects There are 3 main objects that are used. decisions and parameters contain input parameters that go into calculating the output 'finances' objects. Below the objects' structures are described. finances -- The finances object should contain the variables which characterize a person's lifetime financial history. *laborincome -- labor income is the vector of annual amounts, in 2011 dollars, that the individual earns. *currentSavings -- This is the amount that the individual adds to savings in a given period, equal to labor income times the savings rate *toIRA -- currently unused, this is the amount of savings that goes to an IRA - as of now there is no separate IRA account so this does nothing. *retirementConsumptionPath -- This is a life-length vector which scales a retirement annuity (in retirementIncome) to future dollars for each year. This variable takes a value of zero when the individual is not retired. *retirementIncome -- This variable is the level of 2011 dollars that the individual can retire with as an annuity. *capitalgains -- This is the value of savings in a given period times the asset return for the year. It feeds directly into capital gains for tax purposes. I would like to treat long-term capital gains more cleverly, but currently I just realize all gains every year. Since I have no offsetting losses in the model either, this isn't too far off, but it doesn't mdoel robust financial decisionmaking. *netincome -- This isn't used, but it is equal to labor incomeplus caoital income minus taxes. *socialsecurity -- This is the social security income over the year for years when the individual is retired and zero for other years. It DOES feed into taxes. *savings -- This is the main state variable throughout the individual's life. It is equal to the total assets that an individual has at the [end or beginning] of a given year. It is constrained to go to the bequest amount at the end of life. *consumption -- This is the total money available for consumption, after taxes, in each year of life. It is plotted in the second graph, income.pdf. [NOTE: it might be good to plot annuity CONSUMPTION in 2011 dollars in Pensions.pdf, except that since social security goes up faster than inflation, real consumption wouldn't remain constant over the annuity but would increase instead. *optimizationInfo -- the results object of the optim function, reported for diagnostic purposes *decisions, parameters -- these are the decisions and parameters objects which are useful to match up specific parameters to output. decisions -- The decisions object contains the information that characterizes an individual's decisions. This includes information about the retirement date and savings rate *retirementDate -- a date that represents when the individual will retire *savingsRate -- the fraction of income that an individual saves every year *estate -- the number of 2011 dollars that hte indivual's consumption plan will leave after period T2 *T1 -- the index date of retirement (it measures how many years from now retirement will happen) *returnHistory -- this is where a smarter or more realistic return would be inserted, but currently it just replicates the pre and post-retirement returns. It is part of this object instead of parameters since it even now depends on the retirement date. parameters -- This object contains things like assumed asset returns, life length, the person's birthday, initial savings, and a time vector. I tried to make parameters stuff that wouldn't change and decisions stuff that would, but really I don't think there's much difference *ssInflation -- The rate of growth for social security (which is indexed to the CPI for all urban wage earners). This grows faster than CPI-U, with the original idea being ot let the elderly share in the benefits of wage growth. *birthday -- a date objet containing the individual's birthday *today -- a date object that starts things *myage -- an integer representing the individual's current age *T2 -- the number of years from now that the individual will die *w0 -- initial savings *t -- a vector running from 1 to T2 that is used for indexing and calculating inflation *investmentReturn -- the rate of return on pre-retirement investments. *retirementInvestmentReturn -- the rate of return on post-retirement investments *inflation -- rate of inflation *initialIncome -- the assumption is that every individual has the level of deviation from the experience wage profile of Heckman et al at every point. The current initialIncome variable is used to calculate future wages as well *avgwage - this is the current average wage, which the social security logic uses to calculate bend points now and in the future to determine social security benefits. *initwage - this is also for social security calculations *ssType - the type of SS law used for social security calcualtions. This currently doesn't work. *IRAlimit - the nominal predicted IRA limit based on indexing rules - this isn't used