Methodology · Career advisory

How the recommendations are scored.

Inspired by DOORS · public-data adaptation · descriptive, not causal

What we do

Given your most recent role and skills, we rank Standard Occupational Classification (SOC) codes by a weighted average of three z-scores: an earnings score, a skill-similarity score, and a job-demand score. Education distance, current job-posting volume, STEM matching, and a salary-ratio adjustment act as filters or tilts on top of that base.

The architecture mirrors the DOORS system described inHowison, Long & Hastings (2024). Our adaptation swaps DOORS' causal earnings model for a public-data proxy because we don't have access to state Unemployment Insurance wage records.

The three scores

1. Earnings score

Z-score of median_wage[receiver] − median_wage[sender], taken from the BLS Occupational Employment and Wage Statistics (OES) annual table, optionally tilted by 10-year BLS Employment Projections growth.

This is descriptive. It tells you how the median earner in the receiving occupation compares to the median earner in your sending occupation today. It is not a causal estimate of what you would earn after switching, because we lack the matched-individual administrative data required to estimate that effect.

2. Skill similarity

Cosine similarity between the O*NET skill-importance vector for your most recent SOC and the same vector for each candidate SOC. We use the O*NET descriptor list (~35 skills) rather than the 775-skill ontology DOORS derives from 42M postings.

3. Demand

Log-normal z-score over the count of current postings per SOC, fetched nightly from the USDOL CareerOneStop API.

Final score = w_e · z_earnings + w_s · z_similarity + w_d · z_demand + STEM-match bonus + salary-ratio penalty + user-goal boost. The user-goal boost adds a multiple of whichever z-score matches the goal you picked (earnings / similarity / availability).

Filters

  • Receivers with no current postings are dropped (you can't apply to a job that doesn't exist).
  • Receivers whose typical education differs from yours by more than one level on the 7-level scale are dropped — same threshold the paper uses.
  • Your sender SOC is excluded from the candidate set so we never recommend the role you're already in.

Honest limitations

  • Earnings is not causal. A higher OES median for the receiving occupation does not mean you personally would earn more after switching. Confounders — geography, age, prior tenure, whether the people who actually transition are positively selected — are not controlled.
  • Skill similarity is coarser than the paper. The O*NET descriptor list is ~35 dimensions; DOORS uses ~775 derived from millions of full-text postings. Expect more ties and less separation between adjacent occupations.
  • Demand counts are biased. Online posting volume systematically under-represents legal, food, farming, and construction occupations and over-represents tech and healthcare. We don't currently correct for this.
  • No outcome feedback. The paper plans to incorporate administrative data on whether users actually transitioned and what they earned afterwards. We don't have that data, so the recommendations can't yet improve based on outcomes.

Data sources

  • O*NET Web Services — SOC taxonomy, skill vectors, typical education, STEM flag
  • BLS OES — annual median wages per SOC
  • BLS Employment Projections — 10-year growth (optional tilt on the earnings score)
  • CareerOneStop API — nightly job posting counts and a sample per SOC; on-demand training programs
  • Claude — resume → SOC + skills extraction

back to the advisor