Methodology · Formulas

The math, exactly.

Every animated number on the simulator is the output of one of the formulas below. They're applied in this order, every month, for every occupation.

1. AI adoption (S-curve)

For each month t, given a scenario:
raw(t)      = asymptote / (1 + exp(-steepness × (t − midpoint)))
adoption(t) = max(0, (raw(t) − raw(0)) / (asymptote − raw(0))) × asymptote

The S-curve is the standard logistic for technology diffusion. Each scenario (slow / central / fast) carries its own asymptote, midpoint, and steepness, all anchored on IMF (2024) and Goldman (2023) deployment ranges. We renormalise so that adoption(0) = 0 exactly - existing pre-AI displacement is treated as already baked into today's employment numbers, and the simulator shows incremental change from now forward.

Applied: once per month for the active scenario. Drives every other formula.

2. Customer-industry flow

For each customer industry i:
baseline_flow_i = wage_mean × employment_count × share_i
remaining_i(t)  = 1 − ai_exposure_i × adoption(t)
current_flow_i(t) = baseline_flow_i × remaining_i(t) × boost_factor(t)

Each occupation's revenue is decomposed into its customer industries. As AI adoption rises, each customer industry's spending capacity contracts in proportion to its ai_exposure - a parameter anchored on Felten-Raj-Seamans AIOE, IMF (2024) sectoral exposure, and Goldman (2023) industry deciles. boost_factor captures positive demand effects (AI-adjacent work) and is described below.

Applied: for each pipe in the cascade graph. The animated number on each customer-industry node is current_flow_i(t); the pipe width and pulse cadence encode remaining_i(t).

3. AI demand boost

For occupations whose work AI augments rather than replaces:
boost_factor(t) = 1 + ai_demand_boost × adoption(t)

Software developers, electricians wiring data centres, civil engineers consulting on AI-related infrastructure - these occupations see more demand as AI deploys. The boost is modest (typical values 0.05 – 0.25) and applies multiplicatively to customer-industry flows. Most occupations have a boost of 0.

Applied: uniformly across all customer industries for that occupation.

4. Workers remaining (direct displacement)

For each occupation:
employment_factor(t)  = max(0, 1 − automation_prob × adoption(t))
workers_remaining(t)  = employment_count × employment_factor(t)

Direct AI displacement - how many people in this occupation are still employed. automation_prob blends Frey-Osborne 2013 with a documented modern AI overlay so that occupations whose exposure has shifted post-2022 (graphic designer, software developer, financial analyst) are reflected accurately.

Applied: shown in the "Workers remaining" metric card. Used to compute income per worker.

5. Total revenue and income per worker

After all customer industries are summed:
total_revenue(t)  = Σ current_flow_i(t)              (then ×(1 − moretti_drag) if local-service)
income_per_worker(t) = total_revenue(t) / workers_remaining(t)

The big number at the centre of the cascade graph is total_revenue(t). Income per worker - the figure most users care about - falls when revenue contracts faster than headcount, and stays flat when both contract together.

Applied: central node of the cascade graph and the "Income / Worker" metric card.

6. Moretti spillover (second-order)

For each month t:
tradeable_drop(t)  = revenue-weighted average of (1 − revenue_ratio_j(t − lag))
                     across all tradeable occupations j

moretti_drag(t)    = min(0.6, tradeable_drop(t) × moretti_multiplier)

When tradeable occupations (software developer, accountant, financial analyst, marketing manager…) lose income, the downstream effect on local-service occupations (plumber, hairdresser, dentist, restaurant…) is captured here. The tradeable income drop at month t − lag is multiplied by a regional employment multiplier and applied as an additional drag on local-service revenue. multiplier ≈ 1.5–1.6 and lag ≈ 9 months per Moretti (2010, 2012). Capped at 60% so a single channel can't drive revenue to zero.

Applied: only to occupations tagged local-service. For the national aggregate, scaled by the local-service share of total revenue so we don't double-count tradeable income.

7. National aggregate (synthetic occupation)

Built at runtime from all occupations in the country:
aggregate_revenue       = Σ wage_mean × employment_count   (across all occupations)
aggregate_employment    = Σ employment_count
aggregate_automation    = revenue-weighted Σ (automation_prob)
aggregate_demand_boost  = revenue-weighted Σ (ai_demand_boost)

customer_industries are bucketed by category (Tech Sector, Financial
Services, Government / Public, Households, Office & Business Demand,
etc.), with each bucket's exposure being the revenue-weighted average
of its underlying customer industries.

Applied: the synthetic occupation runs through the same simulation engine as any real occupation. The cascade graph for the aggregate shows sector-level pipes rather than industry- level pipes - but the math is identical.

What's deliberately not in the math

  • Geographic dispersion. A single national mean per occupation. San Francisco software developers vs. Phoenix is not in the model.
  • Direct occupation-to-occupation cascades. The Moretti spillover is the only second-order channel. We don't yet resolve, e.g., "drop in software developer income → drop in real-estate agent revenue" through the customer industry of real-estate agents.
  • Income-decile distribution. A single mean wage; no spread within an occupation.
  • Policy interventions. No retraining subsidies, sectoral tariffs, or transfer-payment scenarios.
  • Capital reallocation. When AI displaces labour, the capital share of income rises - but this isn't fed back into the simulation.
← MethodologyCoefficient notes