Life-cycle productivity profiles#

income.py modules

ogzaf.income#

percentiles, as it uses fitted polynomials to those percentiles.#

ogzaf.income.arc_error(abc_vals, params)[source]#

This function returns a vector of errors in the three criteria on which the arctan function is fit to predict extrapolated ability in ages 81 to 100.:

1) The arctan function value at age 80 must match the estimated
   original function value at age 80.
2) The arctan function slope at age 80 must match the estimated
   original function slope at age 80.
3) The level of ability at age 100 must be a given fraction
   (abil_deprec) below the ability level at age 80.
Parameters:
  • abc_vals (tuple) –

    contains (a,b,c)

    • a (scalar): scale parameter for arctan function

    • b (scalar): curvature parameter for arctan function

    • c (scalar): shift parameter for arctan function

  • params (tuple) –

    contains (first_point, coef1, coef2, coef3, abil_deprec)

    • first_point (scalar): ability level at age 80, > 0

    • coef1 (scalar): coefficient in log ability equation on

      linear term in age

    • coef2 (scalar): coefficient in log ability equation on

      quadratic term in age

    • coef3 (scalar): coefficient in log ability equation on

      cubic term in age

    • abil_deprec (scalar): ability depreciation rate between

      ages 80 and 100, in (0, 1).

Returns:

errors ([error1, error2, error3])

  • error1 (scalar): error between ability level at age 80

    from original function minus the predicted ability at age 80 from the arctan function given a, b, and c

  • error2 (scalar): error between the slope of the original

    function at age 80 minus the slope of the arctan function at age 80 given a, b, and c

  • error3 (scalar): error between the ability level at age

    100 predicted by the original model value times abil_deprec minus the ability predicted by the arctan function at age 100 given a, b, and c

Return type:

error_vec (Numpy array)

ogzaf.income.arctan_deriv_func(xvals, a, b, c)[source]#

This function generates predicted derivatives of arctan function given data (xvals) and parameters a, b, and c. The functional form of the derivative of the function is the following:

\[y = - (a * b) / (\pi * (1 + (b * xvals + c)^2))\]
Parameters:
  • xvals (Numpy array) – data inputs to arctan derivative function

  • a (scalar) – scale parameter for arctan function

  • b (scalar) – curvature parameter for arctan function

  • c (scalar) – shift parameter for arctan function

Returns:

predicted values (output) of arctan

derivative function

Return type:

yvals (Numpy array)

ogzaf.income.arctan_fit(first_point, coef1, coef2, coef3, abil_deprec, init_guesses)[source]#

This function fits an arctan function to the last 20 years of the ability levels of a particular ability group to extrapolate abilities by trying to match the slope in the 80th year and the ability depreciation rate between years 80 and 100.

Parameters:
  • first_point (scalar) – ability level at age 80, > 0

  • coef1 (scalar) – coefficient in log ability equation on linear term in age

  • coef2 (scalar) – coefficient in log ability equation on quadratic term in age

  • coef3 (scalar) – coefficient in log ability equation on cubic term in age

  • abil_deprec (scalar) – ability depreciation rate between ages 80 and 100, in (0, 1)

  • init_guesses (Numpy array) – initial guesses

Returns:

extrapolated ability levels for ages

81 to 100, length 20

Return type:

abil_last (Numpy array)

ogzaf.income.arctan_func(xvals, a, b, c)[source]#

This function generates predicted ability levels given data (xvals) and parameters a, b, and c, from the following arctan function:

\[y = (-a / \pi) * \arctan(b * x + c) + (a / 2)\]
Parameters:
  • xvals (Numpy array) – data inputs to arctan function

  • a (scalar) – scale parameter for arctan function

  • b (scalar) – curvature parameter for arctan function

  • c (scalar) – shift parameter for arctan function

Returns:

predicted values (output) of arctan

function

Return type:

yvals (Numpy array)

ogzaf.income.get_e_interp(S, age_wgts, age_wgts_80, abil_wgts, plot_path=None)[source]#

This function takes a source matrix of lifetime earnings profiles (abilities, emat) of size (80, 7), where 80 is the number of ages and 7 is the number of ability types in the source matrix, and interpolates new values of a new S x J sized matrix of abilities using linear interpolation. [NOTE: For this application, cubic spline interpolation introduces too much curvature.]

This function also includes the two cases in which J = 9 and J = 10 that include higher lifetime earning percentiles calibrated using Piketty and Saez (2003).

Parameters:
  • S (int) – number of ages to interpolate. This method assumes that ages are evenly spaced between the beginning of the 21st year and the end of the 100th year, >= 3

  • age_wgts (Numpy array) – distribution of population in each age for the interpolated ages, length S

  • age_wgts_80 (Numpy array) – percent of population in each one-year age from 21 to 100, length 80

  • abil_wgts (Numpy array) – distribution of population in each ability group, length J

  • plot_path (str)) – if True, creates plots of emat_orig and the new interpolated emat_new

Returns:

interpolated ability matrix scaled

so that population-weighted average is 1, size SxJ

Return type:

emat_new_scaled (Numpy array)

ogzaf.income.get_e_orig(age_wgts, abil_wgts, plot_path=None)[source]#

This function generates the 80 x 7 matrix of lifetime earnings ability profiles, corresponding to annual ages from 21 to 100 and to paths based on income percentiles 0-25, 25-50, 50-70, 70-80, 80-90, 90-99, 99-100. The ergodic population distribution is an input in order to rescale the paths so that the weighted average equals 1.

The base curves are the ones in OG-USA, which are then adjusted for ZAF.

The polynomials are of the form

\[\ln(abil) = \alpha + \beta_{1}\text{age} + \beta_{2}\text{age}^2 + \beta_{3}\text{age}^3\]

To calibrate for ZAF, the USA curves are adjusted in 2 ways (in this order) 1) Adjustment by income (J): adjust the gaps between the J-income earning curves

using data from WID.

  1. Adjustment by age (S): adjust the shape/distribution of each J-income earning

    profile curve using data from NTA.

The methodology is described here: EAPD-DRB/OG-ZAF#18

Parameters:
  • age_wgts (Numpy array) – ergodic age distribution, length S

  • abil_wgts (Numpy array) – population weights in each lifetime earnings group, length J

  • plot_path (str) – Path to save plots to

Returns:

= lifetime ability profiles scaled

so that population-weighted average is 1, size SxJ

Return type:

e_orig_scaled (Numpy array)