Appendix D

Data Tables

Table 1: Science, Engineering & Health researcher numbers in US, over time

Code
# Import modules.
from IPython.display import Markdown
from tabulate import tabulate
import numpy as np
import pandas as pd

# Load datatable from csv file.
df_resnums = pd.read_csv("./data/Researcher_numbers_over_time.csv")

# Create the table.
Markdown(tabulate(
  df_resnums, 
  headers=[ "Year", "Graduate Student", "Postdoc",  "Non-Faculty Researcher",],
  showindex=False,
))
Table 1: Science, Engineering & Health researcher numbers in US, over time
Year Graduate Student Postdoc Non-Faculty Researcher
1979 357578 18101 2687
1980 367078 18399 3260
1981 375130 19634 3559
1982 382291 19363 4026
1983 390432 20712 4896
1984 394670 21535 5042
1985 404021 22387 5103
1986 415520 23721 4846
1987 421497 24881 4597
1988 424523 26123 4869
1989 434478 27932 4908
1990 452113 29565 5255
1991 471212 30865 5478
1992 493522 32747 5482
1993 504304 34322 6001
1994 504399 36377 6209
1995 499640 35926 6534
1996 494079 37107 6604
1997 487208 38481 6722
1998 485627 40086 7100
1999 493256 40800 7573
2000 493311 43115 7879
2001 509607 43311 7531
2002 540404 45034 7906
2003 567121 46728 8473
2004 574463 47240 9075
2005 582226 48555 9527
2006 597643 49343 10814
2007 619499 50840 10752
2008 631489 54164 13747
2009 631645 57805 14059
2010 632652 63439 21345
2011 626820 62639 21498
2012 627243 62851 21908
2013 633010 61942 22465
2014 666586 63593 23706
2015 685397 63861 25292
2016 684825 64712 25747
2017 649112 64733 28180
2018 668307 64783 29284
2019 690117 66247 30349
2020 697813 65681 29661

Corresponding graph: Science, Engineering & Health researcher numbers in US, over time

Source:

  • Table 1-1, Graduate students, postdoctoral appointees, and doctorate-holding nonfaculty researchers in science, engineering, and health: 1975–2020. From the NSF, “Survey of Graduate Students and Postdoctorates in Science and Engineering: Fall 2020”. https://ncses.nsf.gov/pubs/nsf22319

Table 2: Percentage of Science, Engineering & Health researchers in US who are on temporary visas, over time

Code
# Import modules.
from IPython.display import Markdown
from tabulate import tabulate
import numpy as np
import pandas as pd

# Load datatable from csv file.
df_visanums = pd.read_csv("./data/Researcher_temporary-visa-holder_percentage_over_time.csv")

# Create the table.
Markdown(tabulate(
  df_visanums, 
  headers=[ "Year", "Graduate Student", "Postdoc",],
  showindex=False,
))
Table 2: Percentage of Science, Engineering & Health researchers in US who are on temporary visas, over time
Year Graduate Student Postdoc
1980 13.7 35.4
1981 14.5 37.1
1982 17.7 37.4
1983 18.8 36.3
1984 19 37.1
1985 19.8 39.6
1986 21 40.8
1987 21.9 43.2
1988 22.9 44.8
1989 23.5 46.8
1990 23.7 48.9
1991 24 51
1992 23.1 51.8
1993 21.9 51.3
1994 21.1 50.6
1995 20.6 49.5
1996 20.8 50.4
1997 21.3 50.8
1998 22 50.8
1999 23.4 53.7
2000 26 54.9
2001 27.6 57.6
2002 28.3 56.3
2003 27.3 57.9
2004 26.3 57.3
2005 25.3 55.7
2006 25.3 57.1
2007 25.7 56.5
2008 26.6 54
2009 27.2 53.1
2010 27.5 52.5
2011 28.1 52.6
2012 29.3 52.5
2013 31.1 52.3
2014 34.1 52.7
2015 35.5 55
2016 36.3 53.9
2017 35.8 53.5
2018 34.4 54.3
2019 33.9 55.5
2020 30.2 54.5

Corresponding graph: Percentage of Science, Engineering & Health researchers in US who are on temporary visas, over time

Source:

  • Table 1-3a, Citizenship of graduate students and postdoctoral appointees in science, engineering, and health: 1980–2020. From the NSF, “Survey of Graduate Students and Postdoctorates in Science and Engineering: Fall 2020”. https://ncses.nsf.gov/pubs/nsf22319

Table 3: Annual mean wages for professional scientists in academic & non-academic roles in May 2021 (US$)

Code
# Import modules.
from IPython.display import Markdown
from tabulate import tabulate
import numpy as np
import pandas as pd

# Load datatable from csv file.
df_visanums = pd.read_csv("./data/salaries_acadVSnonacad2021.csv")

# Create the table.
Markdown(tabulate(
  df_visanums, 
  headers=[ "Discipline", "Academic (US$)", "Non-Academic (US$)",],
  showindex=False,
))
Table 3: Annual mean wages for professional scientists in academic & non-academic roles in May 2021 (US$)
Discipline Academic (US$) Non-Academic (US$)
Biochemist/biophysicist 66060 121310
Physical scientist 70580 130680
Life scientist 85770 107740
Physicist 104050 162240

Corresponding graph: Comparison of salaries for research scientist roles inside versus outside academia.

Sources:

Table 4: NIH Postdoc Salaries

Code
# Import modules.
from IPython.display import Markdown
from tabulate import tabulate
import numpy as np
import pandas as pd

# Load datatable from csv file.
df_nihsals = pd.read_csv("./data/NIH_Postdoc_Salaries.csv")

# Create the table.
Markdown(tabulate(
  df_nihsals, 
  headers=[ "2001 NIH Goal (US$)", "2001 NIH Goal, inflation-adjusted for 2022 (US$)",  "NIH Actual Minimum in 2022 (US$)",],
  showindex=False,
))
Table 4: NIH Postdoc Salaries
2001 NIH Goal (US$) 2001 NIH Goal, inflation-adjusted for 2022 (US$) NIH Actual Minimum in 2022 (US$)
45000 74403 54840

Corresponding graph: NIH Postdoc Salaries.

Sources:

Table 5: Minimum Postdoc Salary Over Time

Code
# Import modules.
from IPython.display import Markdown
from tabulate import tabulate
import numpy as np
import pandas as pd

# Load datatable from csv file.
df_nihsals = pd.read_csv("./data/min_postdoc_salary_overtime.csv")

# Create the table.
Markdown(tabulate(
  df_nihsals, 
  headers=["Year",  "Date", "Stanford (US$)",   "NIH (US$)",    "Difference (US$)", "Stanford min as Percentage of NIH min (%)",],
  showindex=False,
))
Table 5: Minimum Postdoc Salary Over Time
Year Date Stanford (US$) NIH (US$) Difference (US$) Stanford min as Percentage of NIH min (%)
2000 1-Sep-00 nan 26916 nan nan
2001 1-Sep-01 nan 28260 nan nan
2002 1-Sep-02 nan 31092 nan nan
2003 1-Sep-03 nan 34200 nan nan
2004 1-Sep-04 nan 35568 nan nan
2005 1-Sep-05 nan 35568 nan nan
2006 1-Sep-06 nan 36996 nan nan
2007 1-Sep-07 nan 36996 nan nan
2008 1-Sep-08 nan 36996 nan nan
2009 1-Sep-09 nan 37368 nan nan
2010 1-Sep-10 nan 37740 nan nan
2011 1-Sep-11 nan 38496 nan nan
2012 1-Sep-12 nan 39264 nan nan
2013 1-Sep-13 nan 39264 nan nan
2014 1-Sep-14 44310 42000 2310 106
2015 1-Sep-15 50000 42840 7160 117
2016 1-Sep-16 53406 43692 9714 122
2017 1-Sep-17 53406 47484 5922 113
2018 1-Sep-18 60000 48432 11568 124
2019 1-Sep-19 63618 50004 13614 127
2020 1-Sep-20 64268 52704 11564 122
2021 1-Sep-21 65568 53760 11808 122
2022 1-Sep-22 68238 54840 13398 125

Corresponding graph: Comparison of Stanford Postdoc Salary and National Institutes of Health (NIH) Postdoc Salary since 2012. Minimum Postdoc Salaries from Stanford and the NIH.

Source for Stanford Minimum Salaries:

Sources for NIH Salaries:

Table 6a: Average postdoc incomes by location, absolute & adjusted for local cost of living, 2016, all US states

Code
# Import modules.
from IPython.display import Markdown
from tabulate import tabulate
import numpy as np
import pandas as pd

# Load datatable from csv file.
df_nihsals = pd.read_csv("./data/Salaries_byLocation_USstates.csv")

# Create the table.
Markdown(tabulate(
  df_nihsals, 
  headers=[ "State", "Absolute Income ($)", "Income Adjusted for Local Cost of Living ($)",],
  showindex=False,
))
Table 6: Average postdoc incomes by location, absolute & adjusted for local cost of living, 2016, all US states
State Absolute Income ($) Income Adjusted for Local Cost of Living ($)
Alabama 42960 48394
Alaska 48750 37305
Arkansas 42030 45127
Arizona 45748 48305
California 48576 32036
Colorado 47184 42778
Connecticut 45776 36975
Delaware 45179 41988
District of Columbia 49947 33521
Florida 44394 45283
Georgia 43362 43933
Hawaii 54375 28603
Idaho 45313 51668
Illinois 45889 39032
Indiana 45655 49669
Iowa 44938 46935
Kansas 43422 47075
Kentucky 39125 43049
Louisiana 45012 46491
Maine 45500 40661
Maryland 49901 39862
Massachusetts 47908 33058
Michigan 45321 45011
Minnesota 43996 42254
Mississippi 41650 48922
Missouri 44388 48509
Montana 47850 47517
Nebraska 42132 46043
Nevada 42313 40520
New Hampshire 43975 41369
New Jersey 48026 39398
New Mexico 56736 59848
New York 48356 26027
North Carolina 44986 47325
North Dakota 43313 45005
Ohio 44869 49493
Oklahoma 44333 52660
Oregon 45900 42015
Pennsylvania 45361 43685
Rhode Island 47266 38743
South Carolina 44494 44244
South Dakota 41250 43977
Tennessee 47787 54644
Texas 44766 47202
Utah 44959 48033
Vermont 40667 48183
Virginia 44880 46967
Washington 47508 33181
West Virginia 39875 41710
Wisconsin 44424 41791
Wyoming 53750 58679

Corresponding graph: Comparison of 2016 postdoc salaries in absolute dollars and normalized to cost of living, ordered from lowest to highest based on adjusted salary.

Source:

  • Table S6 in McConnell, Westerman, Pierre, Heckler, Schwartz, (Dec 18, 2018) “Research: United States National Postdoc Survey results and the interaction of gender, career choice and mentor impact” eLife. https://doi.org/10.7554/eLife.40189

Table 6b: Average postdoc incomes by location, absolute & adjusted for local cost of living, 2016, US counties with more than 50 respondents

Code
# Import modules.
from IPython.display import Markdown
from tabulate import tabulate
import numpy as np
import pandas as pd

# Load datatable from csv file.
df_nihsals = pd.read_csv("./data/Salaries_byLocation_Counties.csv")

# Create the table.
Markdown(tabulate(
  df_nihsals, 
  headers=[ "County", "Absolute Income ($)",    "Income Adjusted for Local Cost of Living ($)",],
  showindex=False,
))
Table 7: Average postdoc incomes by location, absolute & adjusted for local cost of living, 2016, US counties with more than 50 respondents
County Absolute Income ($) Income Adjusted for Local Cost of Living ($)
Maricopa, AZ 46230 47709
Pima, AZ 45237 48642
Alameda, CA 48646 32780
Los Angeles, CA 52427 38302
Yolo, CA 46183 39711
San Diego, CA 45368 31462
San Francisco, CA 47490 26800
Santa Clara, CA 52723 23653
Denver, CO 44993 40792
New Haven, CT 45758 36932
Alachua, FL 43460 44392
Clarke, GA 41619 42168
DeKalb, GA 45104 45699
Cook, IL 45611 38840
Tippecanoe, IN 42806 49487
Johnson, IA 45083 46718
Douglas, KS 42815 46588
Baltimore City, MD 46718 40448
Montgomery, MD 53631 39993
Prince George’s, MD 50331 37532
Middlesex, MA 48433 34325
Suffolk, MA 47454 32085
Ingham, MI 44165 47901
Washtenaw, MI 45757 43745
Hennepin, MN 43955 41663
Boone, MO 43030 45343
St. Louis, MO 44916 49741
Los Alamos, NM 60000 63291
Monroe, NY 47311 46797
New York, NY 50811 22304
Orange, NC 45461 47404
Franklin, OH 43978 48919
Hamilton, OH 46443 50981
Benton, OR 46996 46030
Jackson, OR 45777 44836
Multnomah, OR 45426 35378
Allegheny, PA 44561 47480
Philadelphia, PA 46293 39066
Charleston, SC 45634 43921
Dallas, TX 44910 44776
Harris, TX 44896 45441
McLennan, TX 45446 51527
Salt Lake, UT 44873 47941
King, WA 47374 32694

Corresponding graph: Comparison of 2016 postdoc salaries in absolute dollars and normalized to cost of living, ordered from lowest to highest based on adjusted salary.

Source:

  • Table S6 in McConnell, Westerman, Pierre, Heckler, Schwartz, (Dec 18, 2018) “Research: United States National Postdoc Survey results and the interaction of gender, career choice and mentor impact” eLife. https://doi.org/10.7554/eLife.40189

Table 7: Postdoc Salary by Years Experience, Over Time

Code
# Import modules.
from IPython.display import Markdown
from tabulate import tabulate
import numpy as np
import pandas as pd

# Load datatable from csv file.
df_nihsals = pd.read_csv("./data/Salaries_Min_byYrsExperience.csv")

# Create the table.
Markdown(tabulate(
  df_nihsals, 
  headers=[ "Date", "Stanford (PhD + 0-5 yrs)", "Stanford (PhD + 6+ yrs)",  "NIH (PhD + 0 yrs)",    "NIH (PhD + 1 yr)", "NIH (PhD + 2 yrs)",    "NIH (PhD + 3 yrs)",    "NIH (PhD + 4 yrs)",    "NIH (PhD + 5 yrs)",    "NIH (PhD + 6 yrs)",    "NIH (PhD + 7 yrs)",],
  showindex=False,
))
Table 8: Postdoc Salary by Years Experience, Over Time
Date Stanford (PhD + 0-5 yrs) Stanford (PhD + 6+ yrs) NIH (PhD + 0 yrs) NIH (PhD + 1 yr) NIH (PhD + 2 yrs) NIH (PhD + 3 yrs) NIH (PhD + 4 yrs) NIH (PhD + 5 yrs) NIH (PhD + 6 yrs) NIH (PhD + 7 yrs)
1-Sep-2000 nan nan 26916 nan nan nan nan nan nan nan
1-Sep-2001 nan nan 28260 nan nan nan nan nan nan nan
1-Sep-2002 nan nan 31092 nan nan nan nan nan nan nan
1-Sep-2003 nan nan 34200 nan nan nan nan nan nan nan
1-Sep-2004 nan nan 35568 nan nan nan nan nan nan nan
1-Sep-2005 nan nan 35568 nan nan nan nan nan nan nan
1-Sep-2006 nan nan 36996 nan nan nan nan nan nan nan
1-Sep-2007 nan nan 36996 nan nan nan nan nan nan nan
1-Sep-2008 nan nan 36996 nan nan nan nan nan nan nan
1-Sep-2009 nan nan 37368 nan nan nan nan nan nan nan
1-Sep-2010 nan nan 37740 nan nan nan nan nan nan nan
1-Sep-2011 nan nan 38496 nan nan nan nan nan nan nan
1-Sep-2012 nan nan 39264 41364 44340 46092 47820 49884 51582 54180
1-Sep-2013 nan nan 39264 41364 44340 46092 47820 49884 51582 54180
1-Sep-2014 44310 nan 42000 43680 45432 47244 49128 51096 53148 55272
1-Sep-2015 50000 nan 42840 44556 46344 48192 50112 52116 54216 56376
1-Sep-2016 53406 nan 43692 45444 47268 49152 51120 53160 55296 57504
1-Sep-2017 53406 nan 47484 47844 48216 50316 52140 54228 56400 58560
1-Sep-2018 60000 nan 48432 48804 49188 51324 53184 55308 57528 59736
1-Sep-2019 63618 nan 50004 50376 50760 52896 54756 56880 59100 61308
1-Sep-2020 64268 64268 52704 53076 53460 55596 57456 59580 61800 64008
1-Sep-2021 65568 66888 53760 54144 54540 56712 58608 60780 63036 65292
1-Sep-2022 68238 69695 54840 55224 55632 57852 59784 61992 64296 66600

Corresponding graph: Comparison of Stanford Postdoc Salary and National Institutes of Health (NIH) Postdoc Salary since 2012. Postdoc Salaries by Number of Years Experience post-PhD.

Source for Stanford Minimum Salaries:

Sources for NIH Salaries:

  • As for Table 5.

Table 8a: Area Median Income (AMI) Levels for Santa Clara County over time, 1-person household (US$)

Code
# Import modules.
from IPython.display import Markdown
from tabulate import tabulate
import numpy as np
import pandas as pd

# Load datatable from csv file.
df_AMI_HH1 = pd.read_csv("./data/AMI_over_time,_Santa_Clara,_HH1.csv")

# Remove years before 2012 (they are empty).
df_AMI_HH1_after2012 = df_AMI_HH1[df_AMI_HH1['Year'] >= 2012]

# Create the table.
Markdown(tabulate(
  df_AMI_HH1_after2012, 
  headers=[ "Year", "Moderate Income (120% AMI)",   "Median Income (AMI)",  "Low Income (80% AMI)", "Very Low Income (50% AMI)",    "Extremely Low Income (30% AMI)",   "Acutely Low Income (15% AMI)"],
  showindex=False,
))
Table 9: Area Median Income (AMI) Levels for Santa Clara County over time, 1-person household (US$)
Year Moderate Income (120% AMI) Median Income (AMI) Low Income (80% AMI) Very Low Income (50% AMI) Extremely Low Income (30% AMI) Acutely Low Income (15% AMI)
2012 88200 73500 53000 36750 22050 nan
2013 nan nan nan nan nan nan
2014 88600 73850 59400 37150 22300 nan
2015 nan nan nan nan nan nan
2016 89950 74950 59400 39100 23450 nan
2017 95150 79300 59400 41800 25100 nan
2018 105200 87650 66150 46550 27950 nan
2019 110400 92000 72750 51250 30750 nan
2020 118950 99100 78550 55300 33150 nan
2021 127100 105900 82450 58000 34800 15900
2022 141550 117950 92250 59000 35400 17700

Corresponding graph: Comparison of Stanford Minimum Postdoc Salary with Area Median Income (AMI) levels for Santa Clara County (the county in which Stanford is located).

Source:

Table 8b: Area Median Income (AMI) Levels for Santa Clara County over time, 2-person household (US$)

Code
# Import modules.
from IPython.display import Markdown
from tabulate import tabulate
import numpy as np
import pandas as pd

# Load datatable from csv file.
df_AMI_HH2 = pd.read_csv("./data/AMI_over_time,_Santa_Clara,_HH2.csv")

# Remove years before 2012 (they are empty).
df_AMI_HH2_after2012 = df_AMI_HH2[df_AMI_HH2['Year'] >= 2012]

# Create the table.
Markdown(tabulate(
  df_AMI_HH2_after2012, 
  headers=[ "Year", "Moderate Income (120% AMI)",   "Median Income (AMI)",  "Low Income (80% AMI)", "Very Low Income (50% AMI)",    "Extremely Low Income (30% AMI)",   "Acutely Low Income (15% AMI)"],
  showindex=False,
))
Table 10: Area Median Income (AMI) Levels for Santa Clara County over time, 2-person household (US$)
Year Moderate Income (120% AMI) Median Income (AMI) Low Income (80% AMI) Very Low Income (50% AMI) Extremely Low Income (30% AMI) Acutely Low Income (15% AMI)
2012 100800 84000 60600 42000 25200 nan
2014 101300 84400 67900 42450 25500 nan
2016 102800 85700 67900 44650 26800 nan
2017 108750 90650 67900 47800 28650 nan
2018 120200 100150 75600 53200 31950 nan
2019 126150 105100 83150 58550 35150 nan
2020 135900 113300 89750 63200 37900 nan
2021 145250 121050 94200 66300 39800 18150
2022 161750 134800 105400 67400 40450 20250

Corresponding graph: Comparison of Stanford Minimum Postdoc Salary with Area Median Income (AMI) levels for Santa Clara County (the county in which Stanford is located).

Source:

Table 8c: Area Median Income (AMI) Levels for Santa Clara County over time, 3-person household (US$)

Code
# Import modules.
from IPython.display import Markdown
from tabulate import tabulate
import numpy as np
import pandas as pd

# Load datatable from csv file.
df_AMI_HH3 = pd.read_csv("./data/AMI_over_time,_Santa_Clara,_HH3.csv")

# Remove years before 2012 (they are empty).
df_AMI_HH3_after2012 = df_AMI_HH3[df_AMI_HH3['Year'] >= 2012]

# Create the table.
Markdown(tabulate(
  df_AMI_HH3_after2012, 
  headers=[ "Year", "Moderate Income (120% AMI)",   "Median Income (AMI)",  "Low Income (80% AMI)", "Very Low Income (50% AMI)",    "Extremely Low Income (30% AMI)",   "Acutely Low Income (15% AMI)"],
  showindex=False,
))
Table 11: Area Median Income (AMI) Levels for Santa Clara County over time, 3-person household (US$)
Year Moderate Income (120% AMI) Median Income (AMI) Low Income (80% AMI) Very Low Income (50% AMI) Extremely Low Income (30% AMI) Acutely Low Income (15% AMI)
2012 113400 94500 68150 47250 28350 nan
2013 nan nan nan nan nan nan
2014 113950 94950 76400 47750 28650 nan
2015 nan nan nan nan nan nan
2016 115650 96400 76400 50250 30150 nan
2017 122350 101950 76400 53750 32250 nan
2018 135250 112700 85050 59850 35950 nan
2019 141950 118250 93550 65850 39550 nan
2020 152900 127450 100950 71100 42650 nan
2021 163400 136150 106000 74600 44750 20450
2022 182000 151650 118600 75850 45500 22750

Corresponding graph: Comparison of Stanford Minimum Postdoc Salary with Area Median Income (AMI) levels for Santa Clara County (the county in which Stanford is located).

Source:

Table 8d: Area Median Income (AMI) Levels for Santa Clara County over time, 4-person household (US$)

Code
# Import modules.
from IPython.display import Markdown
from tabulate import tabulate
import numpy as np
import pandas as pd

# Load datatable from csv file.
df_AMI_HH4 = pd.read_csv("./data/AMI_over_time,_Santa_Clara,_HH4.csv")

# Remove years before 2012 (they are empty).
df_AMI_HH4_after2012 = df_AMI_HH4[df_AMI_HH4['Year'] >= 2012]

# Create the table.
Markdown(tabulate(
  df_AMI_HH4_after2012, 
  headers=[ "Year", "Moderate Income (120% AMI)",   "Median Income (AMI)",  "Low Income (80% AMI)", "Very Low Income (50% AMI)",    "Extremely Low Income (30% AMI)",   "Acutely Low Income (15% AMI)"],
  showindex=False,
))
Table 12: Area Median Income (AMI) Levels for Santa Clara County over time, 4-person household (US$)
Year Moderate Income (120% AMI) Median Income (AMI) Low Income (80% AMI) Very Low Income (50% AMI) Extremely Low Income (30% AMI) Acutely Low Income (15% AMI)
2012 126000 105000 75700 52500 31500 nan
2013 nan nan nan nan nan nan
2014 126600 105500 84900 53050 31850 nan
2015 nan nan nan nan nan nan
2016 128500 107100 84900 55800 33500 nan
2017 135950 113300 84900 59700 35800 nan
2018 150250 125200 94450 66500 39900 nan
2019 157770 131400 103900 73150 43900 nan
2020 169900 141600 112150 78950 47350 nan
2021 181550 151300 117750 82850 49700 22700
2022 202200 168500 131750 84250 50550 25300

Corresponding graph: Comparison of Stanford Minimum Postdoc Salary with Area Median Income (AMI) levels for Santa Clara County (the county in which Stanford is located).

Source: