Much of this site, the agents and their code was made with AI assistance. It can contain errors. Use it at your own risk, and check results before you rely on them. Feedback is much appreciated: use the Feedback button at the bottom right.

Wages grow over a career for several reasons. Workers learn and become more productive. They move to better firms. They get raises when their employer matches an outside offer. The model puts these mechanisms in one framework and estimates them on matched employer-employee data.

Here you run the model at the published estimates or at your own values for three parameters. The server solves the model, simulates careers and splits wage growth over the first 20 years into its sources.

Log wage growth over 20 years–Published estimates
Share from human capital–After 20 years
Share from raises within a job–After 20 years
Monthly offer rate on the job–Middle ability type

The model

Search, competing offers and human capital

Workers differ in ability. Firms differ in productivity. Unemployed workers meet firms at a rate that depends on ability. Employed workers keep searching and meet other firms. When an outside firm makes an offer, the two firms compete for the worker, as in Postel-Vinay and Robin (2002). The worker moves if the new firm is more productive. If the worker stays, the current employer raises the piece rate to match the offer. Wages therefore grow within a job without any change in productivity.

Wages are piece rates on output, with a bargaining share β for the worker (p. 1552). Output is firm productivity plus the worker's ability, a human capital profile g(t) in experience and a persistent individual shock. Workers also lose their job, are reallocated to a new firm, or retire. All transition rates are monthly.

The log wage of a worker of ability α and experience t, at a firm of productivity p, whose best outside option so far is a firm of productivity q, is

w = (1-β) q + β p + g(t) + α + ε - λ1 (1-β)² ∫[q,p] F̄(x) / (ρ + μ + δ + β λ1 F̄(x)) dx

The integral is the price the worker pays now for expected future raises at a high-productivity firm.

Why it is a workhorse

Four sources of wage growth, each with its own parameters

  • Human capital, which grows with experience at any employer.
  • Climbing the job ladder by moving to more productive firms.
  • Raises within a job when the employer matches outside offers.
  • Persistent individual productivity shocks.

The paper estimates the model on Danish matched employer-employee data for 1985-2003, separately for three education groups (pp. 1562-1564). The data contain both wages and firm value added. Rent sharing is therefore pinned down by data, not by functional form alone (p. 1552). The model gives a structural answer to the old question of tenure versus experience effects (p. 1553). It decomposes life-cycle wage growth into human capital, within-job raises and job changes (Section VII, Figures 7 and 8). The piece-rate contract keeps it simple enough to simulate and estimate by simulated method of moments (p. 1553, footnote 3).

Simulate · from the tools bfpr_solve and bfpr_decompose

Where wage growth comes from

β is the worker's share of the surplus when firms compete. The two intercepts enter logits. A higher offer-rate intercept means employed workers get outside offers more often. A higher job-destruction intercept means matches end more often. Only the parameters you move are changed. The rest stay at the published estimates for the group. Each run solves the model and simulates a panel of workers. The figure sums the monthly contributions of each source. A run can take some seconds.

Left: the published estimates. Right: your values, with the published total as a dashed line. Both panels use the same vertical axis. The numbers are in the table below and under "The numbers by year".

QuantityPublishedYour values
The numbers by year

From the tool bfpr_estimates

The published estimates

The 20 parameters for each education group, read from the authors' replication package. Table 6 on p. 1573 prints γ2 times 10 and γ3 times 1,000. The table here shows the values as they enter g(t). The transition-rate logits are not in Table 6 (p. 1564).

Get the code

The model in Python

Download bfpr-python.zip

The zip holds a Python port of the model. It has the solved model, the monthly simulation of a panel of workers, the 229 moments of the estimation with the objective, the wage-growth decomposition of Section VII and estimation by simulated method of moments. It also holds the authors' estimates, data moments and output files from the replication package, with their licence. It needs Python 3.10 or later. The first call compiles the simulation kernels with numba, which takes a few seconds.

pip install -e .                          # from the unzipped folder
python examples/quickstart.py             # a short run of all parts
from bfpr.estimate import estimate        # re-estimate: estimate("1214c", free=("beta", "clam1_0", "cdelta_0"))

The README in the zip explains how to re-estimate the model on new data. It lists what that requires:

  • A matched employer-employee panel with employment spells, wages, the unemployment spells between jobs and value added per worker for the firms.
  • The 49 targeted moments, computed on that panel as defined in the replication package.
  • The bootstrap covariance matrix of those moments.
  • Values for the two calibrated rates, the monthly discount rate ρ and the exit rate μ.
  • Computing time. The README reports timings and advises freeing a few parameters at a time.

Use it in your own AI assistant

The bfpr_ tools

Add the tools to an AI assistant that supports MCP with this address:

https://andreaskostol.no/mcp

How to connect your assistant.

bfpr_estimates
The published estimates with the paper's labels, for one group or all three.
bfpr_solve
The solved model at a parameter vector: worker types, offer distribution, g(t) and the wage function.
bfpr_wage_profile
Mean log wage by experience and tenure on a simulated panel (Figure 1).
bfpr_simulate_moments
The 49 targeted moments and the objective of the estimation (Tables 2-5).
bfpr_decompose
Wage growth by experience split into human capital, raises within a job and job changes (Figures 7 and 8).
bfpr_counterfactual
The decomposition or the wage profile run twice on the same draws, with one parameter changed or one Fortran behaviour switched to the paper's formula.
bfpr_quirks
The behaviours of the authors' Fortran code that the port reproduces by default, with switches.

Result files come back as download links that are deleted after a day. Simulation sizes are smaller than in the Fortran, so a call finishes in seconds. Results agree with the published files up to simulation noise.

Credit

Source of the code

The code is a port of the authors' Fortran replication package (openICPSR project 112823, American Economic Association). The package's code is under the BSD 3-Clause licence and its data under CC BY 4.0. Andreas Kostøl wrote the port for teaching. The authors have not reviewed it. Judge designs, instrumental variables and firm wage effects have their own agents on Research agents.