LODES

Description

LODES, or the LEHD Origin-Destination Employment Statistics, is a collection of workplace mobility data produced by the US Census Bureau. It is part of the Longitudinal Employer-Household Data (LEHD) program. The data are compiled from various census and survey data and administrative records. Participation by US states in providing data is voluntary, so data may not be available in all states and years encompassed by the product. 1

LODES provides counts of unemployment insurance covered wage and salary jobs, as reported by state labor market information offices and by OPM (for 2010 onwards). The state data, covering employers in the private sector and state and local government, account for approximately 95 percent of wage and salary jobs.

epymorph’s LODES ADRIO supports LODES version 8.1 (since epymorph v1.0.0) which includes data from 2002 through 2021 but enumerates this data using 2020 Census geographic delineations only. We load data from the LODES Origin-Destination files, which (generally speaking) lists the number of workers for every residence location and every workplace location. This provides an approximate picture of the flow of commuters around the nation, although there are numerous caveats worth understanding in the LODES documentation.

The total number of commuters is also available subdivided by characteristics including worker age, monthly income, and industry of work.

Geographic Coverage

LODES 8 includes data from 50 US states and the District of Columbia. The geographic granularity is Census Block Groups, and the LODES ADRIO will aggregate up to coarser granularities as requested.

Not all states provided data for all years. Notable exceptions include:

  • 2002: Arkansas, Arizona, DC, Massachusetts, Mississippi, New Hampshire
  • 2003: Arizona, DC, Massachusetts, Mississippi
  • 2004-2009: DC, Massachusetts
  • 2010: Massachusetts
  • 2017-2018: Alaska
  • 2019-2021: Alaska, Arkansas, Mississippi

If your geo scope or time frame includes any of these locations and times, an error will be raised detailing the issues.

Additional Resources

For direct access to the LEHD data, see the LEHD Data Page.

For additional technical details see the LODES 8.1 technical document.

Attributes

There are four LODES ADRIOs which provide different categorical breakdowns: total, by age, by earnings, and by industry. Additionally, every ADRIO can filter to include only a specific job type.

ADRIO Description
Commuters Total commuters.
CommutersByAge Commuters broken down by age group.
CommutersByEarnings Commuters broken down by monthly income bracket.
CommutersByIndustry Commuters broken down by broad employment industry.

Usage Notes

When using epymorph’s LODES ADRIOs, it’s critical to understand that your geo scope MUST use a vintage 2020 US Census delineation. For the data year, on the other hand, you can either specify this directly when constructing the ADRIO or else we use the start of your time frame as a default.

So to load 2015 counts of commuters between Arizona, Colorado, Nevada, and New Mexico, I could evaluate the ADRIO with this context:

from epymorph.kit import *
from epymorph.adrio import lodes

adrio = lodes.Commuters(year=2015)

commuters = adrio.with_context(
    scope=StateScope.in_states(["AZ", "CO", "NV", "NM"], year=2020),
).evaluate()

commuters
array([[2550132,    2582,   13263,    8100],
       [   1202, 2405258,     382,    5557],
       [   3552,     535, 1179411,     361],
       [   6813,    4824,     409,  764244]])

In this result, each row represents a residence location (in canonical geo scope order) and each column represents a workplace location (also in canonical order.)

If you would prefer to use a geo scope which is not equivalent to 2020’s geography (for example, if you are modeling at the Census Tract granularity, but there have been tracts added or removed between then and 2020), you may simply have to use a different data source. Adapting geography across years is (currently) beyond the scope of epymorph.

Even if your scopes are equivalent, however, differences between the handling of geo scope year and time frame year can cause other issues. If you are using ADRIOs which prefer to use the geo scope vintage year to determine which data to load (like the ACS5 ADRIOs do) you can wind up with a mix of data from different time periods. In this situation, instead of passing the LODES ADRIO to the RUME as a parameter value, you may wish to evaluate the ADRIO separately, save the result (a numpy array) to a variable, and pass this to your RUME. This approach effectively allows you to provide different contexts to different ADRIOs, giving you more control.

Examples

Every LODES ADRIO can be optionally filtered by job type. Available job types are:

  • “All Jobs”: all jobs regardless of job type. May allow for multiple jobs per person. This is the default when unspecified.
  • “Primary Jobs”: the highest paying (primary) job for an individual worker for the year. Implies there can be only one job per worker.
  • “All Private Jobs”: all private jobs, which are privately owned businesses and organizations excluding federal government jobs.
  • “Private Primary Jobs”: primary jobs within the private sector.
  • “All Federal Jobs”: all jobs within the federal government sector.
  • “Federal Primary Jobs”: primary jobs within the federal government sector.

Commuters

(API) Here we use the jobs type filter to fetch only private primary jobs.

adrio = lodes.Commuters(job_type="Private Primary Jobs", year=2020)

adrio.with_context(
    scope=CountyScope.in_counties(["04005", "04013", "04021"], year=2020),
).evaluate()
array([[  24482,    7104,     118],
       [   4041, 1509617,   14412],
       [    364,  100539,   21302]])

Commuters by Age

(API) Available age categories are:

  • “29 and Under”: commuters that are age 29 and under.
  • “30_54”: commuters that are between the ages of 30 and 54.
  • “55 and Over”: commuters that are age 55 and over.

Here we fetch only commuters aged 29 and under.

adrio = lodes.CommutersByAge(age_range="29 and Under", year=2020)

adrio.with_context(
    scope=CountyScope.in_counties(["04005", "04013", "04021"], year=2020),
).evaluate()
array([[  8169,   2341,     48],
       [  1658, 410646,   4398],
       [   184,  26284,   6558]])

Commuters by Earnings

(API) Available earnings categories are:

  • “$1250 and Under”: commuters earning $1250 and under per month.
  • “$1251_$3333”: commuters earning between $1251 and $3333 per month.
  • “$3333 and Over”: commuters earning over $3333 per month.

Here we fetch only commuters in the middle earnings bracket.

adrio = lodes.CommutersByEarnings(earning_range="$1251_$3333", year=2020)

adrio.with_context(
    scope=CountyScope.in_counties(["04005", "04013", "04021"], year=2020),
).evaluate()
array([[ 11288,   2807,     65],
       [  1542, 542871,   6471],
       [   177,  39126,  12214]])

Commuters by Industry

(API) Available employment industries are:

  • “Goods Producing”: commuters that work in Goods Producing industry sectors.
  • “Trade Transport Utility”: commuters that work in Trade, Transportation, and Utility industry sectors.
  • “Other”: commuters that work under all other service industry sectors other than the above claimed industries.

Here we fetch commuters in “goods producing” jobs. We can also include job type if we want to further narrow to private sector jobs.

adrio = lodes.CommutersByIndustry(
    industry="Goods Producing",
    year=2020,
    job_type="All Private Jobs",
)

adrio.with_context(
    scope=CountyScope.in_counties(["04005", "04013", "04021"], year=2020),
).evaluate()
array([[  5300,    939,     18],
       [   632, 239579,   2966],
       [    26,  18306,   5524]])