Problem set 2. Modeling humanity's economic growth watersheds

These problem set assignments are a required part of the course.

Collaborating on the problem sets is more than okay—it is encouraged! Seek help from a classmate or an instructor or a roommate or a passerby when you get stuck! (Explaining things is beneficial, too—the best way to solidify your knowledge of a subject is to explain it.)

But the work should be your own.

No cutting-&-pasting from others' problem sets, please! We want you to learn this stuff, and your fingers typing every keystroke is an important way of building muscle memory here.

In this problem set, you will take a look at the very long-term structure of human economic history since the invention of agriculture 8000 years ago. It is, overwhelmingly, a story of innovation, fecundity and demography, and resources.

Let us get started!

 

1. Preliminaries

A. Computing environment

First, we set up the computing environment with the libraries we need:

In [ ]:
# set up the computing environment: ensure that graphs
# appear inline in the notebook & not in extra windows:

%matplotlib inline
In [ ]:
# set up the computing environment: get the ok system library...

from client.api.notebook import Notebook
# ok = Notebook('ps02.ok')
In [ ]:
# set up the computing environment: import other libraries

import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt

 

B. Reproduce the results of problem set 1

Recall our estimates of humanity's economy in the very long run from the last problem set. Let's repeat their construction:

In [ ]:
# repeating the work of problem set 1:

long_run_growth_list = [
    [-68000, 0.1, 1200, 379.47],
    [-8000, 2.5, 1200, 1897.37],
    [-6000, 7, 900, 2381.18],
    [-3000, 15, 900, 3485.68],
    [-1000, 50, 900, 6363.96],
    [1, 170, 900, 11734.56],
    [1500, 500, 900, 20124.61],
    [1770, 750, 1100, 30124.74],
    [1870, 1300, 1300, 46872.1],
    [2020, 7600, 11842, 1032370.8]
    ]

long_run_growth_df = pd.DataFrame(
  data=np.array(long_run_growth_list), columns = ['year', 'population', 
  'income_level', 'human_ideas']
  )

long_run_growth_df['year'] = long_run_growth_df['year'].apply(np.int64)

initial_year = long_run_growth_df['year'][0:10]

span = []
g = []
h = []
n = []

for t in range(9):
    span = span +[long_run_growth_df['year'][t+1]-long_run_growth_df['year'][t]]
    h = h + [np.log(long_run_growth_df['human_ideas'][t+1]/long_run_growth_df['human_ideas'][t])/span[t]]
    g = g + [np.log(long_run_growth_df['income_level'][t+1]/long_run_growth_df['income_level'][t])/span[t]]
    n = n + [np.log(long_run_growth_df['population'][t+1]/long_run_growth_df['population'][t])/span[t]]
    
long_run_growth_df.set_index('year', inplace=True)

# finally, add a note to the end of each observation, reminding
# us of what was going on in human history back in each of the
# eras into which we have divided it

eras = ['at the dawn', 'agriculture & herding', 'proto-agrarian age',
        'writing', 'axial age', 'dark & middle age slowdown', 'commercial revolution',
        'industrial revolution', 'modern economic growth', 'whatever the 21st century brings']

long_run_growth_df['eras'] = eras

format_dict = {'year': '{d}', 'human_ideas': '{0:,.0f}', 
    'income_level': '${0:,.0f}', 'population': '{0:,.1f}'}

long_run_growth_df.style.format(format_dict)
In [ ]:
data_list = np.array([span, h, g, n]).transpose()

long_run_growth_rates_df = pd.DataFrame(
    data=data_list, columns = ['span', 'n', 'g', 'h'])

long_run_growth_rates_df['initial_year'] = initial_year

eras2 = eras[0:9]

long_run_growth_rates_df['era'] = eras2

format_dict = {'initial_year':'{0:.0f}',  'span': '{0:.0f}', 'h': '{0:,.3%}', 
    'g': '{0:,.2%}', 'n': '{0:,.2%}'}

long_run_growth_rates_df.style.format(format_dict)

These are the conclusions from problem set 1: two tables, one of levels and one of growth rates, detailing biggest-picture human economic history over the past 70000 years.

 

C. My take on what we see here

We saw all this last problem set. We saw 69500 years during which humanity did not advance in standards of living, remaining desperately poor, while technology and population grew. By 1500 the human population was 5000 times what it had been 70000 years ago, and 70 times what it had been 8000 years ago. And our index of technology stood in 1770 at perhaps 80 times what it had been 70000 years and 8 times what it had been 8000 years ago.

In all that time we saw two watersheds. The first was the invention of agriculture—or perhaps it was the settling-down—that mattered, as before 8000 years ago invention was limited by being restricted to those light and easy-to-carry tools you needed to flourish in new or changing environments. Moreover, after 8000 years ago, there was definitely a two-heads-are-better-than-one phenomenon as more people applying their brains and communicating with each other further increased the rate of growth. But then, after about the year 150, the proportional growth rate of the ideas stock dropped. Growth slowed down with this arrival of the mid-first millennium Eurasian dark age—the late-antiquity pause. That is our second watershed.

(1) Then, 500 years ago, in 1500, we see a third watershed: the coming of the commercial revolution era and the knitting together economically of the entire world via ocean transport produced roughly a quadrupling in the proportional pace of ideas-stock growth.

(2) Then, in 1770, we see a fourth watershed: the industrial revolution, at first very highly concentrated in the northwestern tip of Eurasian continent, that more than tripled the proportional rate of ideas stock growth from its already unprecedentedly commercial-revolution pace.

(3) Then, in 1870, we see the coming (a) of full globalization as we know it, (b) of the industrial research lab to rationalize and routinize the creation and development of technologies, and (c) of the modern corporation to rationalize and routinize their global deployment, These brought the era of modern economic growth that we live in. In it the proportional growth rate of the human ideas stock has not been the 0.035% per year of the first millennium and a half, or the 0.15% per year of the commercial revolution era, or even the 0.45% per year of the 1770 to 1870 industrial revolution era. It has, rather, been more than four times as great as even this last: more than 2% per year.

It is the post-1870 modern economic growth era that has seen the real explosion of wealth. And it has been coupled with the demographic transition. Before 1870 growth in the ideas stock brought with it growth in population and not growth in typical living standards. Since 1870 humanity has decided it is rich enough to be able to afford to and to desire to restrict its fertility. So we now approach zero population growth. And we now have immense wealth in per capita terms. We now have almost 50 times as many people on the earth living almost 15 times as well as we had back in the year one.

How do we model and understand all this? That is what this problem set is for.

We are interested in tracking how an economy that evolves according to our three behavioral-relation equations. Thus the basic input will be the parameters of the model. And the basic output will be a table of numbers showing the "history" of an economy: the state of the economy at a particular moment will be a row; particular variables of interest in the economy—the level of per capita production and income E, the sized of the human population P, and the stock of valuable useful ideas about technology and organization H—will be the columns; thus the basic output will be a data table that tells us how an economy with these specific parameter values starting at this specific moment evolved—or will evolve, or would have evolved—over this range of years.

Let us get started:

 

2. Modeling very long run economic history

A. Basic assumptions

Our model has three and only three three behavioral relationships:

First, the average level of production and income E in the economy will be determined by the production function, which depends on two and only two things: the level of the current population P, and the current level of the ideas stock H. We write this production function mathematically as:

$ E = \frac{H}{P^{1/ɣ}} $

The level of production and income E is equal to the ideas stock H divided by the population raised to the power (1/ɣ). A better technological and organizational toolbox of ideas H raises the level of per capita production and income. And a higher population reduces per capita production and income.

Why this behavioral relationship? For Malthusian reasons. Limited resources mean that more people means smaller farm sizes, and less minerals per capita.

Second, the proportional growth rate h of the ideas stock H will be determined by the innovation function. Within each era the innovation function will be the simplest thing possible—an era-specific constant value:

$ \frac{dH/dt}{H} = h $

The left hand side is simply the proportional growth rate of the ideas stock H, written in the notation that Isaac Newton chose for such things back in the late 1600s. The right hand side is simply a constant: the assumption is that, within a historical era, the stock of valuable ideas that powers human productivity grows at a constant rate.

Why this behavioral relationship? Because people are inventive and communicative, so they figure out better ways to solve problems of production and organization, and then those better ways diffuse around the world. That gives us a positive h. And we identify watersheds in the economic growth process by big changes in h.

Third, the rate of growth n of the human population P will depend on the Malthusian reproduction function. In the Malthusian framework we use, n depends on the level of prosperity E:

$ \frac{dP/dt}{P} = n = β \left( \frac{E}{ϕ y_{sub}}-1 \right) $

The proportional growth rate of the human population P—again using Newton's symbols—which we will also sometimes call n for convenience, depends on prosperity and income E divided by what the "subsistence" level of necessities consumption $ y_{sub} $ is times an index $ ϕ $ of the share of income that is spent not on fitness-enhancing necessities but on luxuries.

Why this behavioral relationship? Were humanity to be poorer, children would be less well-nourished, their immune systems would become compromised, and they would die in greater numbers. Thus population growth is an increasing function of per capita income.

This behavioral relationship, however, breaks down after 1870, as humanity exits the Malthusian régime. There follow the demographic transition to lower fertility and forthcoming zero population growth. So this equation will hold only before 1870 or so.

These three behavioral relationships have a number of parameters:

  • The production function has one parameter ɣ, which governs how much more important ideas are in boosting productivity than limited resources are in sapping productivity.

  • The boring innovation function has its one parameter, its constant value h.

  • The Malthusian reproduction function has three parameters:

    • β that tells us how much population growth accelerates or decelerates as living standards rise and fall;
    • ϕ that tells us how much of income is spent on goods other than those that actually matter for health, fitness, and population growth; and
    • $ y_{sub} $ that tells us at what level of spending on "fitness" or "subsistence" goods is human health and nutrition so poor that the population does not grow.

How does an economy and, indeed, a species governed by these three behavioral relationship evolve and develop over time?

In order to see, we need to program up our very simple model.

 

B. The Basic Model

We are interested in tracking how an economy that evolves according to our three behavioral-relation equations. Thus the basic input will be the parameters of the model. And the basic output will be a table of numbers showing the "history" of an economy: the state of the economy at a particular moment will be a row; particular variables of interest in the economy—the level of per capita production and income E, the sized of the human population P, and the stock of valuable useful ideas about technology and organization H—will be the columns; thus the basic output will be a data table that tells us how an economy with these specific parameter values starting at this specific moment evolved—or will evolve, or would have evolved—over this range of years.

We will run through five code cells:

  • The first will initialize the economy we are modeling: we will, for now, start it up in the year -6000, with a human population on the earth of 7 million, and a level of production, prosperity, and income of 900 dollars per capita per year—which is what the human living standard was back then, about at the level that the World Bank sees as roughly 2.50 a day.

  • The second will set the parameter values for the actual or counterfactual economy we want to examine.

  • The third will use our three behavioral-relationship equations to project the state of the economy from its starting point for the time period that we wih to examine.

  • The fourth will collect our results and place them in a data structure that will then be easy for us to examine.

  • And the fifth will collect all the above code into a function, so we can repeat the calculations for different parameter values, different starting points, and different time ranges easily at our pleasure.

In [ ]:
# first, initialize our economy at its starting state:

# start by setting up four empty lists of numbers. we will
# make the python interpreter march through time, calculating
# what the numbers of humanity are, the typical standard of
# living, and the index of technology are at each moment we
# examine. we will then want to keep track of those three 
#quantities, and of the date to which they apply:

t_list = []
P_list = []
E_list = []
H_list = []


# tell the python interpreter that the current year is -6000:
t_current = -6000

# tell the python interpreter that the population in the current
# year is 7 million people:
P_current = 7

# tell the python interpreter that the average standard of living 
# in the current year is 900 a year:
E_current = 900

# never write a code cell without immediately checking to make
# sure that the code cell did what you thought it ought to do
# to the objects in the python interpreter's memory.
#
# check to make sure that everything is what it should be:
print('the next line should be: "-6000, 7, 900"')
print(t_current, P_current, E_current)
In [ ]:
# second, set the values of the parameters of our three-quation odel
#
# assign a value for the parameter ɣ (the salience of ideas relative
# to resources per capita in determining labor efficency and productivity:
ɣ = 2

# then calculate what the current value of the ideas stock H must be
# if our equations are to fit the historical starting point:
H_current = E_current * P_current**(1/ɣ) 

# think of H as what E would be if resources were incredibly
# abundant—if the world population were 1 million...

# remember the empty lists we started with? 
# 
# update them by adding the current values of t, P, E, and H to 
# the ends of the lists:
t_list = t_list + [t_current]
P_list = P_list + [P_current]
E_list = E_list + [E_current]
H_list = H_list + [H_current]

# set our other parameters: β, ϕ, y_sub, and h_growth:
β = 0.025
ϕ = 1
y_sub = 890.7364
h_growth = 0.000126

# & tell the python interpreter how large we want our time steps to
# be as we track the model forward through history.
#
# set our initial time step at a century: we will calculate growth rates,
# apply them for a hundred years, and then take another look and calculate
# new growth rates for the next century:
t_growth = 100
In [ ]:
# third, in this cell we project the state of the economy forward 
# until the endby t_growth x range years = 100 x 30 = 3000 years:
#
# we use a loop structure to do s:

for i in range(30):
    t_current = t_current + t_growth # we move our time clock ahead
    n = β * (E_current/(ϕ*y_sub) - 1) # this is our behavioral relationship (3)
    P_current = np.exp(n * t_growth) * P_current # we compound the population 
#     growth rate for 100 years to see what the next "P_current" will be 
    H_current = np.exp(h_growth * t_growth) * H_current # we compound 
#     the ideas growth rate for 100 years to see what the next 
#     "H_current" will be
    E_current = E_current = H_current * P_current**(-1/ɣ) # calculate the next "E_current"

# add the newly-calculated current-period variables to the respective lists
    t_list = t_list + [t_current]
    P_list = P_list + [P_current]
    E_list = E_list + [E_current]
    H_list = H_list + [H_current]

    # then go back and run through the list again to advance time some more... & do this 30 times...

# once again, do not write a code cell without immediately seeing that the code
# cell did what we thought it would do
#
# check to see that at least one of the objects created looks like it is supposed to:
H_list
In [ ]:
# fourth, prepare our results for examination:
#
# stuff our collection of lists into a dataframe to take a look at it
# labeling its columns, and then taking a peek:

malthus_df = pd.DataFrame(np.array([t_list, P_list , E_list, H_list])).transpose()
malthus_df.columns = ['date', 'population','income_level', 'human_ideas', ]
malthus_df['date'] = malthus_df['date'].apply(np.int64)

format_dict = {'human_ideas': '{0:,.0f}', 
    'income_level': '${0:,.0f}', 'population': '{0:,.2f}'}

malthus_df.style.format(format_dict)

We have—if everything went well—managed (close to) replicating how ideas H, population P, and income and labor-efficiency E evolved in history from the year -6000 to -3000.

The code cell above does simple calculations. But it does a lot of them. And we will want to repeat those calculations a number of times, for different starting dates, periods, and parameter values. So I am next going to stuff all of those calculations into a function: "malthus_update". Why? So that for the rest of this notebook, whenever you or I want to do calculations like those in the code cell immediately above, all you or I will have to do is to write a code line like:

output = malthus_update()

putting the appropriate symbols to tell the computer for what parameter values, what starting position, and over what period we wish the calculations, and then stuff the results into an object called "output" that we can then tell the computer to use.

Here is the function, with its defaults set to reproduce the -6000 to -3000 model run above:

In [ ]:
# fifth: transfer all of the above code into a _function_
#
# definition of the malthus_update function:

def malthus_update(t_current = -6000, t_step = 100, horizon = 30, 
  P_current = 7, E_current = 900, h_growth = 0.000126, ɣ = 2, 
  β = 0.025, ϕ = 1, y_sub = 890.7364):
    """
    Updates the three-variable Malthusian model—population, income, 
    technology—from starting year t_current, stepping through time
    with a step of t_growth, for t_growth x horizon years
    """
    
    P_list = []
    t_list = []
    E_list = []
    H_list = []

    H_current = E_current * P_current**(1/ɣ) # think of H as what E would be if the population were 1 million...

    P_list = P_list + [P_current]
    t_list = t_list + [t_current]
    E_list = E_list + [E_current]
    H_list = H_list + [H_current]

    for i in range(horizon):
        P_growth = β * (E_current/(ϕ*y_sub) - 1)
        P_current = np.exp(P_growth * t_step) * P_current
        t_current = t_current + t_step
        H_current = np.exp(h_growth * t_step) * H_current
        E_current = E_current = H_current * P_current**(-1/ɣ)

        P_list = P_list + [P_current]
        t_list = t_list + [t_current]
        E_list = E_list + [E_current]
        H_list = H_list + [H_current]
        
    update = [t_list, P_list, E_list, H_list]
    return(update)

Does it work? Let's call it from the vasty deep, letting it do what its defaults say it should do, and see:

In [ ]:
# calling malthus_update() with default parameter values:

output = malthus_update()

malthus2_df = pd.DataFrame(np.array(output)).transpose()

malthus2_df.columns = ['date', 'population', 'income_level', 'human_ideas']
malthus2_df['date'] = malthus2_df['date'].apply(np.int64)

format_dict = {'human_ideas': '{0:,.0f}', 
    'income_level': '${0:,.0f}', 'population': '{0:,.2f}'}

malthus2_df.style.format(format_dict)

It works! (On my machine, at least.) The function malthus_update()'s output stuffed into:

'malthus2_df.style.format(format_dict)'

is identical to our earlier calculations:

'malthus_df.style.format(format_dict)'

 

C. Understanding growth from -6000 to -3000

Let's get a sense of what this model of humanity's numbers and prosperity that we have set up tells us about the process of economic growth.

Suppose that ideas growth in the years after -6000 had been not 0.0126%/year but rather twice as fast: 0.0252%/year.

We model this by setting our initial h at 0.0252%, but otherwise performing the same steps as above. What we get out in 'malthus3_df' is not a historical but a counterfactual scenario: one in which human inventiveness from -6000 to -3000 had been twice its actual historical level:

In [ ]:
output = malthus_update(h_growth = 0.000252)

malthus3_df = pd.DataFrame(np.array(output)).transpose()

malthus3_df.columns = ['date', 'population', 'income_level', 'human_ideas']
malthus3_df['date'] = malthus2_df['date'].apply(np.int64)

format_dict = {'human_ideas': '{0:,.0f}', 
    'income_level': '${0:,.0f}', 'population': '{0:,.2f}'}

malthus3_df.style.format(format_dict)

In this counterfactual model run—this counterfactual scanario—the human population reached not $ P_{-3000} = 15 $ million but $ P^a_{-3000} = 31 $ million in year -3000. Twice as great a growth rate in the ideas stock meant that the human population did not double but quadrupled over that time span.

By contrast, twice as fast a degree of human inventiveness had very little impact on human standards of living. In our attempt to track history, we found an $ E_{-3000} = 900 $. In this alternative counteractual run we found an $ E^a_{-3000} = 909 $.

Why is that alternative-scenario $ E^a $ in -3000 so close to what we got when we tried to track history? And why, given that it is so close, is it not exactly the same? Double-click on the next markdown cell to change it to edit mode, and then write your answer to these questions after the blue "ANSWER:" (A paragraph should be sufficient.)

ANSWER: ...

 

D. Growth before the year 1

Now let us look forward and look over -3000 to -1000. We are going to have to change what we tell malthus_update to do. We are going to have to tell it that we want it to start in year -3000: tell it "t_current = -3000". We are going to want to tell it we want it to look 20 periods ahead to get from -3000 to -1000: "horizon = 20". We are going to want to tell it that we want it to start with the initial population P_current and the initial income level E_current at their historical -3000 values. Accomplish all those, and track the economy forward another 2000 years to -1000.

In [ ]:
# from -3000 to -1000: a more-than-doubling of h:
#
# in order to accomplish this task, five of the parameters passed to
# the malthus_update() function have to be set to values other than
# their defaults. Three of them have been filled in. Fill in the other
# two with the appropriate values, and then run the cell:

output = malthus_update(t_current = -3000, horizon = 20, 
  h_growth = 0.00031, ...)

malthus4_df = pd.DataFrame(np.array(output)).transpose()

malthus4_df.columns = ['date', 'population', 'income_level', 'human_ideas']
malthus4_df['date'] = malthus4_df['date'].apply(np.int64)

format_dict = {'human_ideas': '{0:,.0f}', 
    'income_level': '${0:,.0f}', 'population': '{0:,.2f}'}

malthus4_df.style.format(format_dict)

Did it work? If not, try to figure out why, change it, and rerun it.

If it worked, we see that the model has tracked history up to the year -1000, with a human population of 50 million, and yet still an average living standard and productivity level of about 900 dollars per year per capita.

We don't have to look at the entire table the malthus_update() function generates. Since we are focusing on where the model takes the economy, we can just look at the initial and the final rows using '.iloc':

In [ ]:
# look just at the final row:

malthus4_df.iloc[[20]].style.format(format_dict)

We have thus tracked history from -6000 to -1000 with our model. All we had to tell it was that the rate of growth h of the Human ideas stock H was 0.0126%/year over the first 3000 years, and then more than doubled 0.0315/year over the next 2000 years.

Now we wish to go forward from -1000 to the year 1.

(Yes, math does not play well with a calendar that does not have a year 0 in it and jumps from -1 to 1 in a single year. If you are upset enough, find a time machine and take it back to the year 500. Go to the city of Constanta in what is now Roumania. Argue with the monk Dionysius Exiguus—Denny the Dwarfish—who landed us with this system.)

See if you can set up malthus_update to use an ideas stock growth rate of 0.064%/year to calculate a population of about 170 million, an income level of about 936 dollars per capita per year, and a technology index in year zero of about 12243, all in the year 0... 1. Blame Denny:

In [ ]:
## from -1000 to the year 1: a further doubling of h:

output = malthus_update(t_current = -1000, ...)

malthus5_df = pd.DataFrame(np.array(output)).transpose()

malthus5_df.columns = ['date', 'population', 'income_level', 'human_ideas']
malthus5_df['date'] = malthus5_df['date'].apply(np.int64)

format_dict = {'human_ideas': '{0:,.0f}', 
    'income_level': '${0:,.0f}', 'population': '{0:,.0f}'}

malthus5_df.iloc[[0,10]].style.format(format_dict)

Thus the model is consistent: Given these behavioral relationships, and given this definition of H and of the changes in its growth rate, we can replicate human economic history at the broadest possible level from the year -6000 to the year 0... 1... whatever.

As we have tracked history from -6000 to the year 0... 1..., the ideas index H has grown from 2380 to 3500 to 6500 to 12250. What does this mean? Here is a picture of what kinds of boats people were making when to anchor your thinking:

Pre year 1 boats

 

3. Dark age, late-antiquity pause, & the commercial revolution

A. Two heads are better than one

We had proportional growth rates of h of about 0.013%/year from -6000 to -3000, of about 0.031%/year from -3000 to -1000, and of about 0.064%/year from -1000 to the year 1. Living standards were not rising much, true—Malthusian forces at work. But population, ideas, knowledge, indeed civilization seemed to be gathering strength and undergoing superexponential growth.

It seemed, indeed, to be that two heads were better than one. Ideas about technology and organization are what economists call nonrival. Standard economic goods are rival: if one steelmaking firm is using a particular ton of iron ore in its production processes, that means that another firm cannot be. If you want to make twice as much steel, you need not just twice as many steelmaking firms, you need twice as many mines and miners as well. By contrast, if one steelmaking firm is using the basic oxygen process to transform what would otherwise become brittle cast iron into durable steel, that in no way impedes the ability of the steelmaking firm nextdoor to do the same. Thus it would seem that the more inventors and innovators in an economy, the more rapidly should it discover useful ideas about production and organization. A larger economy should, in some sense, be a faster growing one.

This does indeed seem to have been the pattern from the year -6000 down to the year 1.

Thus it would have seemed reasonable in the year 1, or even the year 150, to have expected more of the same: two successive doublings of h ought to have been followed by a third doubling in the next millennium or so. For, as the professional lecturer Publius Aelius Aristides Theodorus put it in the year 155 in his lecture Regarding Rome, the inescapable impression was that the civilization of the Roman Empire had far outstripped everytihng in the past. Speaking to the Romans and especially to the Emperor Antoninus Pius, he said https://www.bradford-delong.com/2017/11/aelius-aristides-the-roman-oration-it-is-a-time-honored-custom-of-travelers-setting-forth-by-land-or-sea-to-m.html:

All localities are full of gymnasia, fountains, monumental approaches, temples, workshops, schools, and one can say that the civilized world... has been brought by the right knowledge to a state of health.... Cities gleam with radiance and charm.... The whole earth has been beautified like a garden.... Every charming spectacle and an infinite number of festal games have been introduced instead. Thus like an ever-burning sacred fire the celebration never ends, but moves around from time to time and people to people, always somewhere.... You have spanned the rivers with all kinds of bridges and hewn highways through the mountains and filled the barren stretches with posting stations; you have accustomed all areas to a settled and orderly way of life.... Life before your time... hard and boorish..... Though the citizens of Athens began the civilized life of today, this life in its turn has been firmly established by you, who came later but who, men say, are better…

 

B. The continued-progress counterfactual

What does our model say would have been the state of the human economy in 1500 if h had undergone a further doubling, and if the years 1 to 1500 had seen a further doubling of the ideas growth rate h, to 0.12%/year? Let us once again, as we economic historians like to say, "consider the counterfactual": something that did not happen, but might have happened, and then try to trace out what the consequences would have been.

Start our malthus_update() function with a population of 170 million and a standard of living of 935 dollars per year in year 0, and see what the state of the world economy would then be in the year 1500:

In [ ]:
# from year 1 to 1500: counterfactual: further doubling of h:

output = malthus_update(t_current = 0, ...)

malthus6_df = pd.DataFrame(np.array(output)).transpose()

malthus6_df.columns = ['date', 'population', 'income_level', 'human_ideas']
malthus6_df['date'] = malthus6_df['date'].apply(np.int64)

format_dict = {'human_ideas': '{0:,.0f}', 
    'income_level': '${0:,.0f}', 'population': '{0:,.0f}'}

malthus6_df.iloc[[0, 15]].style.format(format_dict)

But it was not to be. Compare this result to what happened in actual history:

In [ ]:
format_dict = {'year': '{d}', 'human_ideas_index': '{0:,.0f}', 
    'income_level': '${0:,.0f}', 'population': '{0:,.1f}'}

long_run_growth_df.iloc[[5,6]].style.format(format_dict)

Actual history had a year-1500 population of only 500 million in the year 1500, rather than the more than eleven times as much as the counteractual. Actual history had an ideas-stock index of about 20,000 in the year 1500. The counterfactual had an ideas-stock index of about 75,000—nearly four times as great.

Indeed, people for millennia afterwards would look back at the world of classical antiquity as a peak in human civilization. As late as 1776, Edward Gibbon could write in his History of the Decline and Fall of the Roman Empire that:

If a man were called to fix the period in the history of the world, during which the condition of the human race was most happy and prosperous, he would, without hesitation, name that which elapsed from the death of [the Emperor] Domitian [in year 96] to the accession of Commodus [in the year 180]...

Gibbon thought in 1776 that there had been an absolute decline, and did not think that the humanity of his own day had reattained the civilizational peak of "happ[iness] and prosper[ity]" of the classical Roman Empire. The failure of the progressive trend up to 150 to continue had come as an enormous shock, that had echoed down for well over a millennium.

Humanity was not, in our real history, to reach that level of the useful-ideas stock until 1890. What does that difference mean? Here is a picture of a boat like one of Cleopatra's warships in -34, and of the then-"modern" ocean-going vessels of 1490 and of 1890 in our history: the 120 feet-long Santa Maria that was Christopher Columbus's flagship, and the 460 foot-long Empress of India ocean liner:

Boats 1 1490 1890

In the counterfactual in which growth had followed what might have been expected from the year 1 to 1500, the world in 1500 would have had not late-medieval but rather post-steampunk technology. It would, however, stil have been as desperately poor, as was typical for the human economic history we have so far seen: Malthusian population increases in the counterfactual would have meant that the agricultural technologies we had in 1890 would have been trying to feed four times as many people. Thus the technologies of 1890 would have been staggering under the burden.

 

C. What went wrong?

But, as noted above, instead the world underwent its second growth watershed shortly after the year 1: rather than a renewed doubling to a useful ideas-stock growth rate h of counterfactually 0.12%/year, in our actual history the useful ideas-stock growth rate h fell back to 0.036%/year—only slightly more than starting in the year -3000, even though the world of the year 1 had more than eleven times as many people to think through problems and had vastly better information technologies for remembering and communicating.

This relative decline in absolute growth rates—and an absolute decline and then rebound in urbanization, literacy, and organization—is the late-antiquity pause, the dark age, the middle age. It was not in any broad sense localized. As of the year 1 there were four high civilizations in Eurasia, the Mediterranean basin, Mesopotamia-Iran (with Egypt variously attaching to one or the other), south Asia, and east Asia. Had one or two of them uffered some sort of civilization catastrophe that slowed innovation and economic growth, the others would have picked up the slack—and then arts and sciences would have diffused to the laggards.

My view is that the most likely scenario for what went wrong is the one painted by Willem Jongman (2006) in his Gibbon Was Right https://delong.typepad.com/jongman-gibbon-was-right.pdf: plagues, military pressures from barbarians, and climate changes that led elites to focus more on extracting as much as possible from the lower classes and less on good governance to enable prosperity. But Jongman focuses on the Roman Empire alone. Why were there analogous processes going on in and around other civilizational capitals like Ctesiphon and Baghdad; Pataliputra, Amaravati, and Delhi; and Chang'an and Luoyang?

Let's rerun history as it actually went:

In [ ]:
# from the year 1 to 1500: historical: Dark Ages: h falls back down to 0.0035%/year

output = malthus_update(t_current = 0, horizon = 15, h_growth = 0.00035, 
  P_current = 170, E_current = 935)

malthus7_df = pd.DataFrame(np.array(output)).transpose()

malthus7_df.columns = ['date', 'population', 'income_level', 'human_ideas']
malthus7_df['date'] = malthus6_df['date'].apply(np.int64)

format_dict = {'human_ideas': '{0:,.0f}', 
    'income_level': '${0:,.0f}', 'population': '{0:,.0f}'}

malthus7_df.iloc[[0,15]].style.format(format_dict)

The world in 1500 had about three times the population of the world in year 1. It's level of technology was about 2/3 higher than in year 1. Yet there was back then in 1500 or even later little civilizational confidence in human progress—as we noted in the quote from Edward Gibbon.

 

4. The three modern watersheds

A. The commercial revolution watershed

It is in the year 1500 that we see our third watershed—this time an acceleration of rather than a deceleration in growth—followed by a fourth and a fifth. The era from 1500 to 1770 we call the era of the "commercial revolution"; that from 1770 to 1870 the era of the "industrial revolution"; that from 1870 to today the era of "modern economic growth". Together they cover the remarkable last past helf-millennium:

In [ ]:
format_dict = {'year': '{d}', 'human_ideas_index': '{0:,.0f}', 
    'income_level': '${0:,.0f}', 'population': '{0:,.1f}'}

long_run_growth_df.iloc[[6,9]].style.format(format_dict)

How big were these three successive watersheds of increasing growth? Suppose the world had then continued after 1500 as it had gone from 1 to 1500—with a growth rate of h still equal to 0.035%/year. Our model can tell us today's world would now be like if the commercial revolution and the subsequent two watersheds had never come to pass:

In [ ]:
# from the year 1500 to 2000: counterfactual: h continues at 0.0035%/year

output = malthus_update(t_current = 1500, horizon = 5, h_growth = ..., 
  P_current = 500, E_current = 915)

malthus8_df = pd.DataFrame(np.array(output)).transpose()

malthus8_df.columns = ['date', 'population', 'income_level', 'human_ideas']
malthus8_df['date'] = malthus8_df['date'].apply(np.int64)

format_dict = {'human_ideas': '{0:,.0f}', 
    'income_level': '${0:,.0f}', 'population': '{0:,.0f}'}

malthus8_df.iloc[[0,5]].style.format(format_dict)

You should have gotten a world in 2000 with a population of 708 million or so, and an income level of 915 dollars per year.

That would have been a very different world than ours, no? 1/10 the population, and 1/12 the per capita wealth. And the level of human technology in 2000 in that counterfactual no-commercial revolution world? Roughly that seen in our world in 1630 or so.

But in fact 1500 was the third watershed, after the first with the coming of agriculture and the settling-down, and the second with the late-antiquity-dark age pause.

This third watershed saw the more-than-quadruling from 0.035%/year to 0.15%/year of the proportional rate h of the ideas stock. And, interestingly, demography did not fully keep pace with what one would have expected given the reaction of population growth to prosperity before 1500. In order to model this, we need not only to increase h from 0.035%/year to 0.15%/year, we need to allow for an increase in luxuries: if the parameter ϕ that tells us what total income was relative to the consumption of goods that directly affect and improve reproductive fitness, we need to raise ϕ from 1.0 before the third watershed of 1500 to 1.13 afterwards to track how innovation gained a few steps on fecundity. And it did. By 1770, historically, population had grown from 500 to 750 million. And typical living standards had risen from 900 to 1100 dollars per year: from 2.50 dollars a day to 3 dollars a day.

Use our malthus_update() function starting in 1500 to track the evolution of the human economy in this 1500-1770 commercial revolution era. And this time drop our interval length from 100 years to 10 years. Economic history, at least, was slow-moving before 1500. But now it begins to speed up, and we need to examine it more frequently:

In [ ]:
# starting in 1500: historical
# an increase in luxuries: ϕ = 1.13
# a more-than-quadrupling of ideas growth: h_growth = 0.0015

output = malthus_update(t_current = 1500, horizon = 27, h = 0.0015, 
  P_current = 500, E_current = 915, ϕ = 1.13, t_step = 10)

malthus9_df = pd.DataFrame(np.array(output)).transpose()

malthus9_df.columns = ['date', 'population', 'income_level', 'human_ideas']
malthus9_df['date'] = malthus8_df['date'].apply(np.int64)

format_dict = {'human_ideas': '{0:,.0f}', 
    'income_level': '${0:,.0f}', 'population': '{0:,.0f}'}

malthus9_df.iloc[[0,27]].style.format(format_dict)

B. The industrial revolution watershed

The third "commercial revolution" watershed—the more-than-quadruling from 0.035%/year to 0.15%/year in the proportional rate h of the ideas stock—was followed by a fourth: steam-power, automatic textile machinery, and improved ironmaking that allowed for the railroad and all the other innovations of the classic industrial revolution. This "industrial revolution" era from 1770-1870 saw, worldwide, a further tripling of the growth rate of humanity's applied technological and organization toolbox to 0.44%/year.

But, once again, let us first consider a counterfactual in which it did not. Let us remove this fourth watershed from history, maintain the growth rate of h at 0.15%/year as it was in the commercial revolution era, and see where that counterfactual world is today, say this year, in 2020:

In [ ]:
# since 1770: counterfactual—no industrial revolution:

output = malthus_update(t_current = 1770, horizon = 25, 
  h_growth = 0.0015, P_current = 750, E_current = 1100, 
  ϕ = 1.13, t_step = 10)

malthus10_df = pd.DataFrame(np.array(output)).transpose()

malthus10_df.columns = ['date', 'population', 'income_level', 'human_ideas']
malthus10_df['date'] = malthus10_df['date'].apply(np.int64)

format_dict = {'human_ideas': '{0:,.0f}', 
    'income_level': '${0:,.0f}', 'population': '{0:,.0f}'}

malthus10_df.iloc[[0,25]].style.format(format_dict)

You should get a counterfactual scenario population today of about 1.5 billion, and a standard of living average of about 1125 dollars per year.

Prosperity thus gained a few steps on fecundity from 1500 to 1770. But thereafter the two once again kept pace. And the level of technology today in that counterfactual? It is about the level of 1860: riverboats and early railroads and textile machinery, with the first cheap rifled muskets reaching the hands of soldiers, and with telegraph wires across land but not yet in undersea cables. It would then be a steampunk world.

However, there was an industrial revolution. The 1770 to 1870 century can be tracked, maintaining the luxuries parameter ϕ = 1.13, by a further tripling of h to 0.44%/year

In [ ]:
# since 1770: but there was an industrial revolution:

output = malthus_update(t_current = 1770, horizon = 10, h_growth = 0.0044, 
  P_current = 750, E_current = 1100, ϕ = 1.13, t_step = 10)

malthus11_df = pd.DataFrame(np.array(output)).transpose()

malthus11_df.columns = ['date', 'population', 'income_level', 'human_ideas']
malthus11_df['date'] = malthus11_df['date'].apply(np.int64)

format_dict = {'human_ideas': '{0:,.0f}', 
    'income_level': '${0:,.0f}', 'population': '{0:,.0f}'}

malthus11_df.iloc[[0,10]].style.format(format_dict)

That carries us to the historical world as it was in 1870, with 1.3 billion people in the world, and an average living standard of 4 dollars a day: 1300 a year.

 

C. The fifth watershed: modern economic growth

And then came the fifth watershed: a further more than quadrupling of h from 0.44% to 2.06% per year in our era of modern economic growth. But, once again, let us look first at the counterfactual in which that modern economic growth acceleration did not happen. What would the world be like now, if that counterfactual had become reality and h since 1870 had continued to plod along at 0.44%/year?

In [ ]:
# since 1870: counterfactual: no modern economic growth:

output = malthus_update(t_current = 1870, horizon = 15, h_growth = 0.0044, 
  P_current = 1270, E_current = 1300, ϕ = 1.13, t_step = 10)

malthus12_df = pd.DataFrame(np.array(output)).transpose()

malthus12_df.columns = ['date', 'population', 'income_level', 'human_ideas']
malthus12_df['date'] = malthus12_df['date'].apply(np.int64)

format_dict = {'human_ideas': '{0:,.0f}', 
    'income_level': '${0:,.0f}', 'population': '{0:,.0f}'}

malthus12_df.iloc[[0,15]].style.format(format_dict)

Contrast that with our actual history:

In [ ]:
# modern economic growth: actual history:

format_dict = {'year': '{d}', 'human_ideas_index': '{0:,.0f}', 
    'income_level': '${0:,.0f}', 'population': '{0:,.1f}'}

long_run_growth_df.iloc[[8,9]].style.format(format_dict)

The counterfactual no-modern-economic-growth scenario has a world today of 4.4 billion, but a typical living standard of 1350 dollars per year—3 2/3 dollars a day. And its level of technology? About that of 1900-1910. Technology would be a little bit post-steampunk—there would be internal combustion engines, and experiments with heavier-than-air flying machines. And it would be a populous world—but one still very, very poor.

5. You are done!

You're done with Problem set 2! Be sure to save as pdf and then send us this file.