14. Equalizing Difference Model#

14.1. Overview#

This lecture presents a model of the college-high-school wage gap in which the “time to build” a college graduate plays a key role.

Milton Friedman invented the model to study whether differences in earnings of US dentists and doctors were outcomes of competitive labor markets or whether they reflected entry barriers imposed by governments working in conjunction with doctors’ professional organizations.

Chapter 4 of Jennifer Burns [Burns, 2023] describes Milton Friedman’s joint work with Simon Kuznets that eventually led to the publication of [Kuznets and Friedman, 1939] and [Friedman and Kuznets, 1945].

To map Friedman’s application into our model, think of our high school students as Friedman’s dentists and our college graduates as Friedman’s doctors.

Our presentation is “incomplete” in the sense that it is based on a single equation that would be part of set equilibrium conditions of a more fully articulated model.

This ‘‘equalizing difference’’ equation determines a college-high-school wage ratio that equalizes present values of a high school educated worker and a college educated worker.

The idea is that lifetime earnings somehow adjust to make a new high school worker indifferent between going to college and not going to college but instead going to work immediately.

(The job of the “other equations” in a more complete model would be to describe what adjusts to bring about this outcome.)

Our model is just one example of an “equalizing difference” theory of relative wage rates, a class of theories dating back at least to Adam Smith’s Wealth of Nations [Smith, 2010].

For most of this lecture, the only mathematical tools that we’ll use are from linear algebra, in particular, matrix multiplication and matrix inversion.

However, near the end of the lecture, we’ll use calculus just in case readers want to see how computing partial derivatives could let us present some findings more concisely.

And doing that will let illustrate how good Python is at doing calculus!

But if you don’t know calculus, our tools from linear algebra are certainly enough.

As usual, we’ll start by importing some Python modules.

import numpy as np
import matplotlib.pyplot as plt
from collections import namedtuple
from sympy import Symbol, Lambda, symbols

14.2. The indifference condition#

The key idea is that the entry level college wage premium has to adjust to make a representative worker indifferent between going to college and not going to college.

Let

  • R>1 be the gross rate of return on a one-period bond

  • t=0,1,2,T denote the years that a person either works or attends college

  • 0 denote the first period after high school that a person can work if he does not go to college

  • T denote the last period that a person works

  • wth be the wage at time t of a high school graduate

  • wtc be the wage at time t of a college graduate

  • γh>1 be the (gross) rate of growth of wages of a high school graduate, so that wth=w0hγht

  • γc>1 be the (gross) rate of growth of wages of a college graduate, so that wtc=w0cγct

  • D be the upfront monetary costs of going to college

We now compute present values that a new high school graduate earns if

  • he goes to work immediately and earns wages paid to someone without a college education

  • he goes to college for four years and after graduating earns wages paid to a college graduate

14.2.1. Present value of a high school educated worker#

If someone goes to work immediately after high school and works for the T+1 years t=0,1,2,,T, she earns present value

h0=t=0TRtwth=w0h[1(R1γh)T+11R1γh]w0hAh

where

Ah=[1(R1γh)T+11R1γh].

The present value h0 is the “human wealth” at the beginning of time 0 of someone who chooses not to attend college but instead to go to work immediately at the wage of a high school graduate.

14.2.2. Present value of a college-bound new high school graduate#

If someone goes to college for the four years t=0,1,2,3 during which she earns 0, but then goes to work immediately after college and works for the T3 years t=4,5,,T, she earns present value

c0=t=4TRtwtc=w0c(R1γc)4[1(R1γc)T31R1γc]w0cAc

where

Ac=(R1γc)4[1(R1γc)T31R1γc].

The present value c0 is the “human wealth” at the beginning of time 0 of someone who chooses to attend college for four years and then start to work at time t=4 at the wage of a college graduate.

Assume that college tuition plus four years of room and board amount to D and must be paid at time 0.

So net of monetary cost of college, the present value of attending college as of the first period after high school is

c0D

We now formulate a pure equalizing difference model of the initial college-high school wage gap ϕ that verifies

w0c=ϕw0h

We suppose that R,γh,γc,T and also w0h are fixed parameters.

We start by noting that the pure equalizing difference model asserts that the college-high-school wage gap ϕ solves an “equalizing” equation that sets the present value not going to college equal to the present value of going to college:

h0=c0D

or

(14.1)#w0hAh=ϕw0hAcD.

This “indifference condition” is the heart of the model.

Solving equation (14.1) for the college wage premium ϕ we obtain

(14.2)#ϕ=AhAc+Dw0hAc.

In a free college special case D=0.

Here the only cost of going to college is the forgone earnings from being a high school educated worker.

In that case,

ϕ=AhAc.

In the next section we’ll write Python code to compute ϕ and plot it as a function of its determinants.

14.3. Computations#

We can have some fun with examples that tweak various parameters, prominently including γh,γc,R.

Now let’s write some Python code to compute ϕ and plot it as a function of some of its determinants.

# Define the namedtuple for the equalizing difference model
EqDiffModel = namedtuple('EqDiffModel', 'R T γ_h γ_c w_h0 D')

def create_edm(R=1.05,   # gross rate of return
               T=40,     # time horizon
               γ_h=1.01, # high-school wage growth
               γ_c=1.01, # college wage growth
               w_h0=1,   # initial wage (high school)
               D=10,     # cost for college
              ):
    
    return EqDiffModel(R, T, γ_h, γ_c, w_h0, D)

def compute_gap(model):
    R, T, γ_h, γ_c, w_h0, D = model
    
    A_h = (1 - (γ_h/R)**(T+1)) / (1 - γ_h/R)
    A_c = (1 - (γ_c/R)**(T-3)) / (1 - γ_c/R) * (γ_c/R)**4
    ϕ = A_h / A_c + D / (w_h0 * A_c)
    
    return ϕ

Using vectorization instead of loops, we build some functions to help do comparative statics .

For a given instance of the class, we want to recompute ϕ when one parameter changes and others remain fixed.

Let’s do an example.

ex1 = create_edm()
gap1 = compute_gap(ex1)

gap1
1.8041412724969135

Let’s not charge for college and recompute ϕ.

The initial college wage premium should go down.

# free college
ex2 = create_edm(D=0)
gap2 = compute_gap(ex2)
gap2
1.2204649517903732

Let us construct some graphs that show us how the initial college-high-school wage ratio ϕ would change if one of its determinants were to change.

Let’s start with the gross interest rate R.

R_arr = np.linspace(1, 1.2, 50)
models = [create_edm(R=r) for r in R_arr]
gaps = [compute_gap(model) for model in models]

plt.plot(R_arr, gaps)
plt.xlabel(r'$R$')
plt.ylabel(r'wage gap')
plt.show()
_images/0e094697e4ccde8a5c974b9c666a43e29d4058567d82f64842e89fc7f0bc677e.png

Evidently, the initial wage ratio ϕ must rise to compensate a prospective high school student for waiting to start receiving income – remember that while she is earning nothing in years t=0,1,2,3, the high school worker is earning a salary.

Not let’s study what happens to the initial wage ratio ϕ if the rate of growth of college wages rises, holding constant other determinants of ϕ.

γc_arr = np.linspace(1, 1.2, 50)
models = [create_edm(γ_c=γ_c) for γ_c in γc_arr]
gaps = [compute_gap(model) for model in models]

plt.plot(γc_arr, gaps)
plt.xlabel(r'$\gamma_c$')
plt.ylabel(r'wage gap')
plt.show()
_images/e23e9fa82d90e6ac6ae82f8ae45da4c38ca6b0d691285804f895723726c3291b.png

Notice how the initial wage gap falls when the rate of growth γc of college wages rises.

The wage gap falls to “equalize” the present values of the two types of career, one as a high school worker, the other as a college worker.

Can you guess what happens to the initial wage ratio ϕ when next we vary the rate of growth of high school wages, holding all other determinants of ϕ constant?

The following graph shows what happens.

γh_arr = np.linspace(1, 1.1, 50)
models = [create_edm(γ_h=γ_h) for γ_h in γh_arr]
gaps = [compute_gap(model) for model in models]

plt.plot(γh_arr, gaps)
plt.xlabel(r'$\gamma_h$')
plt.ylabel(r'wage gap')
plt.show()
_images/6a20d4677c4391a910c9646977ee084cccdeb3afb4189bef6e50352189301bac.png

14.4. Entrepreneur-worker interpretation#

We can add a parameter and reinterpret variables to get a model of entrepreneurs versus workers.

We now let h be the present value of a “worker”.

We define the present value of an entrepreneur to be

c0=πt=4TRtwtc

where π(0,1) is the probability that an entrepreneur’s “project” succeeds.

For our model of workers and firms, we’ll interpret D as the cost of becoming an entrepreneur.

This cost might include costs of hiring workers, office space, and lawyers.

What we used to call the college, high school wage gap ϕ now becomes the ratio of a successful entrepreneur’s earnings to a worker’s earnings.

We’ll find that as π decreases, ϕ increases, indicating that the riskier it is to be an entrepreneur, the higher must be the reward for a successful project.

Now let’s adopt the entrepreneur-worker interpretation of our model

# Define a model of entrepreneur-worker interpretation
EqDiffModel = namedtuple('EqDiffModel', 'R T γ_h γ_c w_h0 D π')

def create_edm_π(R=1.05,   # gross rate of return
                 T=40,     # time horizon
                 γ_h=1.01, # high-school wage growth
                 γ_c=1.01, # college wage growth
                 w_h0=1,   # initial wage (high school)
                 D=10,     # cost for college
                 π=0       # chance of business success
              ):
    
    return EqDiffModel(R, T, γ_h, γ_c, w_h0, D, π)


def compute_gap(model):
    R, T, γ_h, γ_c, w_h0, D, π = model
    
    A_h = (1 - (γ_h/R)**(T+1)) / (1 - γ_h/R)
    A_c = (1 - (γ_c/R)**(T-3)) / (1 - γ_c/R) * (γ_c/R)**4
    
    # Incorprate chance of success
    A_c = π * A_c
    
    ϕ = A_h / A_c + D / (w_h0 * A_c)
    return ϕ

If the probability that a new business succeeds is 0.2, let’s compute the initial wage premium for successful entrepreneurs.

ex3 = create_edm_π(π=0.2)
gap3 = compute_gap(ex3)

gap3
9.020706362484567

Now let’s study how the initial wage premium for successful entrepreneurs depend on the success probability.

π_arr = np.linspace(0.2, 1, 50)
models = [create_edm_π(π=π) for π in π_arr]
gaps = [compute_gap(model) for model in models]

plt.plot(π_arr, gaps)
plt.ylabel(r'wage gap')
plt.xlabel(r'$\pi$')
plt.show()
_images/736f745f25c74fe85f95a9e31f4d1470f8ec8244407e5a39129fcb5f42143ea0.png

Does the graph make sense to you?

14.5. An application of calculus#

So far, we have used only linear algebra and it has been a good enough tool for us to figure out how our model works.

However, someone who knows calculus might want us just to take partial derivatives.

We’ll do that now.

A reader who doesn’t know calculus could read no further and feel confident that applying linear algebra has taught us the main properties of the model.

But for a reader interested in how we can get Python to do all the hard work involved in computing partial derivatives, we’ll say a few things about that now.

We’ll use the Python module ‘sympy’ to compute partial derivatives of ϕ with respect to the parameters that determine it.

Define symbols

γ_h, γ_c, w_h0, D = symbols(r'\gamma_h, \gamma_c, w_0^h, D', real=True)
R, T = Symbol('R', real=True), Symbol('T', integer=True)

Define function Ah

A_h = Lambda((γ_h, R, T), (1 - (γ_h/R)**(T+1)) / (1 - γ_h/R))
A_h
((γh, R, T)1(γhR)T+11γhR)

Define function Ac

A_c = Lambda((γ_c, R, T), (1 - (γ_c/R)**(T-3)) / (1 - γ_c/R) * (γ_c/R)**4)
A_c
((γc, R, T)γc4(1(γcR)T3)R4(1γcR))

Now, define ϕ

ϕ = Lambda((D, γ_h, γ_c, R, T, w_h0), A_h(γ_h, R, T)/A_c(γ_c, R, T) + D/(w_h0*A_c(γ_c, R, T)))
ϕ
((D, γh, γc, R, T, w0h)DR4(1γcR)γc4w0h(1(γcR)T3)+R4(1γcR)(1(γhR)T+1)γc4(1(γcR)T3)(1γhR))

We begin by setting default parameter values.

R_value = 1.05
T_value = 40
γ_h_value, γ_c_value = 1.01, 1.01
w_h0_value = 1
D_value = 10

Now let’s compute ϕD and then evaluate it at the default values

ϕ_D = ϕ(D, γ_h, γ_c, R, T, w_h0).diff(D)
ϕ_D
R4(1γcR)γc4w0h(1(γcR)T3)
# Numerical value at default parameters
ϕ_D_func = Lambda((D, γ_h, γ_c, R, T, w_h0), ϕ_D)
ϕ_D_func(D_value, γ_h_value, γ_c_value, R_value, T_value, w_h0_value)
0.058367632070654

Thus, as with our earlier graph, we find that raising R increases the initial college wage premium ϕ.

Compute ϕT and evaluate it at default parameters

ϕ_T = ϕ(D, γ_h, γ_c, R, T, w_h0).diff(T)
ϕ_T
DR4(γcR)T3(1γcR)log(γcR)γc4w0h(1(γcR)T3)2+R4(γcR)T3(1γcR)(1(γhR)T+1)log(γcR)γc4(1(γcR)T3)2(1γhR)R4(γhR)T+1(1γcR)log(γhR)γc4(1(γcR)T3)(1γhR)
# Numerical value at default parameters
ϕ_T_func = Lambda((D, γ_h, γ_c, R, T, w_h0), ϕ_T)
ϕ_T_func(D_value, γ_h_value, γ_c_value, R_value, T_value, w_h0_value)
0.00973478032996598

We find that raising T decreases the initial college wage premium ϕ.

This is because college graduates now have longer career lengths to “pay off” the time and other costs they paid to go to college

Let’s compute ϕγh and evaluate it at default parameters.

ϕ_γ_h = ϕ(D, γ_h, γ_c, R, T, w_h0).diff(γ_h)
ϕ_γ_h
R4(γhR)T+1(1γcR)(T+1)γc4γh(1(γcR)T3)(1γhR)+R3(1γcR)(1(γhR)T+1)γc4(1(γcR)T3)(1γhR)2
# Numerical value at default parameters
ϕ_γ_h_func = Lambda((D, γ_h, γ_c, R, T, w_h0), ϕ_γ_h)
ϕ_γ_h_func(D_value, γ_h_value, γ_c_value, R_value, T_value, w_h0_value)
17.8590485545256

We find that raising γh increases the initial college wage premium ϕ, in line with our earlier graphical analysis.

Compute ϕγc and evaluate it numerically at default parameter values

ϕ_γ_c = ϕ(D, γ_h, γ_c, R, T, w_h0).diff(γ_c)
ϕ_γ_c
DR4(γcR)T3(1γcR)(T3)γc5w0h(1(γcR)T3)24DR4(1γcR)γc5w0h(1(γcR)T3)DR3γc4w0h(1(γcR)T3)+R4(γcR)T3(1γcR)(1(γhR)T+1)(T3)γc5(1(γcR)T3)2(1γhR)4R4(1γcR)(1(γhR)T+1)γc5(1(γcR)T3)(1γhR)R3(1(γhR)T+1)γc4(1(γcR)T3)(1γhR)
# Numerical value at default parameters
ϕ_γ_c_func = Lambda((D, γ_h, γ_c, R, T, w_h0), ϕ_γ_c)
ϕ_γ_c_func(D_value, γ_h_value, γ_c_value, R_value, T_value, w_h0_value)
31.6486401973376

We find that raising γc decreases the initial college wage premium ϕ, in line with our earlier graphical analysis.

Let’s compute ϕR and evaluate it numerically at default parameter values

ϕ_R = ϕ(D, γ_h, γ_c, R, T, w_h0).diff(R)
ϕ_R
DR3(γcR)T3(1γcR)(T3)γc4w0h(1(γcR)T3)2+4DR3(1γcR)γc4w0h(1(γcR)T3)+DR2γc3w0h(1(γcR)T3)R3(γcR)T3(1γcR)(1(γhR)T+1)(T3)γc4(1(γcR)T3)2(1γhR)+R3(γhR)T+1(1γcR)(T+1)γc4(1(γcR)T3)(1γhR)+4R3(1γcR)(1(γhR)T+1)γc4(1(γcR)T3)(1γhR)+R2(1(γhR)T+1)γc3(1(γcR)T3)(1γhR)R2γh(1γcR)(1(γhR)T+1)γc4(1(γcR)T3)(1γhR)2
# Numerical value at default parameters
ϕ_R_func = Lambda((D, γ_h, γ_c, R, T, w_h0), ϕ_R)
ϕ_R_func(D_value, γ_h_value, γ_c_value, R_value, T_value, w_h0_value)
13.2642738659429

We find that raising the gross interest rate R increases the initial college wage premium ϕ, in line with our earlier graphical analysis.