Quarterly estimates from 1962 to 2024 combining functional data analysis and Bayesian state-space models
import pandas as pd df = pd.read_csv("https://www.distributionaldynamics.com/data/dd_series.csv") items = pd.read_csv("https://www.distributionaldynamics.com/data/items/dd_items_SCF.csv")
use "https://www.distributionaldynamics.com/data/dd_series.dta", clear * balance-sheet items (SCF), a separate file: use "https://www.distributionaldynamics.com/data/items/dd_items_SCF.dta", clear
using CSV, DataFrames, Downloads url = "https://www.distributionaldynamics.com/data/" df = CSV.read(Downloads.download(url * "dd_series.csv"), DataFrame) items = CSV.read(Downloads.download(url * "items/dd_items_SCF.csv"), DataFrame)
dd_series: one row per quarter, 1962Q3–2024Q1, with decile shares, totals and means per household of consumption, income and wealth.
Five U.S. household surveys (C = consumption, I = income, W = wealth; *PSID wealth from 1984, consumption from 1999):
The household-level files the estimation reads, cleaned and in 2019Q4 dollars (gzipped CSV).
Derived from the original surveys; the original providers’ terms apply.
Consumption, income and wealth per household from the national accounts, and the number of households. They set the dollar levels of the outputs.
aggregate_anchorsCSVMeans and shares of consumption, income and wealth by group, every quarter. Start here. Each comes in a PSID and an SCF view: the distribution as that survey measures it (the SCF covers the top tail better). Income also comes in two CPS views (1967–1993 and 1993 on).
dd_tidy_long long, one row per quarter × group: deciles, quintiles and bottom 50 / next 40 / top 10, also across variables (e.g. consumption by income quintile)CSV*Stocks: next 40 and top 10 only. Compare: Fed DFA
Distributional factors
smoothed_factors posterior mode: x1–x8 x9–x32 lags, x33–x43 smoothed_factor_draws 200 posterior draws (parameter and state uncertainty) and 5/50/95% bandsPosterior draws5/50/95% bandsData: CC BY 4.0, publicly available. Please cite the paper when you use them. Code: MIT.
Pick your question for a short description of the product and a direct download. Everything is quarterly and publicly available. The data guide (PDF) describes all of it in plain English.
Mean per household and share of the total for consumption, income and wealth, by decile, quintile and bottom 50 / next 40 / top 10. Two views of the same distribution: as the SCF measures it (income and wealth, 1962-Q3 to 2024-Q1, best for the top tail) and as the PSID measures it (income from 1968, wealth from 1984, consumption from 1999). Income also comes as the CPS measures it, in two views: cps1967 (1967-Q4 to 1993-Q3) and cps (from 1993-Q4), separate because the CPS changed how it measures income in 1993. Use dd_tidy_long for one row per quarter and group, dd_series for one row per quarter with decile columns.
dd_tidy_longCSVThe model estimates the joint distribution in every quarter from 1962-Q3 to 2024-Q1. Published for that full period: the factors, everything in the SCF view (income and wealth), the balance-sheet items (pensions from 1983) and the national-accounts anchors. Files in the PSID view follow the PSID’s own coverage (income from 1968, wealth from 1984, consumption from 1999), and the micro data start in 1984. Our scripts turn the factors into the model’s full distribution for any quarter, including consumption before 1999 (with a time-averaged trend).
Each variable within groups ranked by another: for example consumption by income quintile, or wealth of the top 10% by income. Quintiles and bottom 50 / next 40 / top 10, in every direction for the PSID view; income by wealth group and wealth by income group for the SCF view. They come from the estimated joint distribution, so they add up to the totals.
dd_tidy_long rows where ranked_by differs from variableCSVSynthetic micro data for the PSID view: each quarter from 1984-Q2 to 2024-Q1, households are grouped into 1,000 cells by their consumption, income and wealth decile. Each cell has a population weight (cop_share) and its mean consumption (from 1999-Q2), income and wealth. Weighted means, shares or your own groups work as with survey data.
The micro data come in five implicates, the same file at five draws from the posterior. Compute your statistic on each and combine them as with the SCF implicates. For the factors there are 200 posterior draws and 5/50/95% bands. The Explorer shows a 95% band.
The eight distributional factors that drive the joint distribution (x1–x8), with their lags and the aggregate factors, 1962-Q3 to 2024-Q1: the posterior mode, 200 posterior draws, and 5/50/95% bands. Feed a factor path (ours or a counterfactual) to the DD_data scripts to get the distribution it implies.
Real estate, mortgages, consumer credit, pensions (from 1983) and stocks: mean per household and share of the total by wealth group (bottom 50 / next 40 / top 10, as in the Fed’s Distributional Financial Accounts), by income quintile and by own decile, SCF view. Stocks are published for the next 40 and top 10 only.
Four more joint distributions, each estimated separately with consumption and two balance-sheet measures, quarterly 1962-Q3 to 2024-Q1 in the SCF and PSID views: group means and shares (deciles, quintiles, bottom 50 / next 40 / top 10, and each measure by the groups of the others) and the quarterly share of households with no debt. Gross liquid assets are deposits, CDs, savings bonds, stocks and mutual funds; total assets exclude pensions.
The distribution of every quarter is stored as polynomial coefficients, one file per survey view. Our Python and Julia scripts turn them into shares, means, quantiles, group means across variables or micro data, with posterior bands.
Consumption, income and wealth per household from the national accounts, and the number of households. They set the dollar levels of every output.
aggregate_anchorsCSVThe cleaned household files from the CPS, PSID, CEX, SCF and SIPP that the estimation reads (gzipped CSV). They are derived from the original surveys, whose providers’ terms apply.
The replication package has the code, the processed inputs and the estimated parameters. Reproducing the baseline results takes under 30 minutes; re-estimating the baseline model takes up to 24 hours.
The data guide explains every product, its coverage and its caveats in plain English. The codebook lists every column of every file.
Explore the synthetic distributional data across consumption, income, and wealth. Select a variable and metric, and show deciles or the bottom 50 / next 40 / top 10. Gray bands indicate NBER recession periods.
Source: Bayer, Calderon & Kuhn (2026), PSID view. Decile groups D1 (bottom 10%) to D10 (top 10%); totals in trillions, means per household, both in 2019Q4 USD (CPI-U). Wealth starts in 1984 (PSID), consumption in 1999. The 95% band covers parameter and factor uncertainty (200 posterior draws).
Source: Bayer, Calderon & Kuhn (2026). Share of households in each pair of deciles. I × W: SCF view, 1962–2024; C × I and C × W: PSID view, 1999–2024.
We develop a new method for deriving high-frequency synthetic distributions of consumption, income, and wealth. The core of the method is to treat the distributional data as a time series of functions whose underlying factor structure follows a state-space model, estimated using Bayesian techniques. The method incorporates different sources of microdata regardless of their frequency and variable coverage.
PSID, SCF, CEX, SIPP, and CPS — each with different frequency and variable coverage
Quantile functions for marginals plus copula for joint dependence
PCA on Legendre polynomial coefficients captures variation in a few factors
Factor dynamics follow a VAR in companion form with aggregate covariates
MCMC with Kalman smoother produces posterior draws of the latent factors
High-frequency quarterly output: full distributions for all 247 quarters
State equation
Observation equation
Here
All code is open source (MIT). There are two repositories, depending on what you want to do.
Short scripts that work with the downloads above. Python and Julia versions do the same things and need only standard packages.
The paper’s replication package. The processed survey files and aggregate series it reads are included. Reproducing the baseline estimates takes two steps:
The full replication also re-estimates the robustness and simulation exercises, which takes several days depending on the number of cores.
@techreport{BayerCalderonKuhn2026,
author = {Bayer, Christian and Calderon, Luis and Kuhn, Moritz},
title = {Distributional Dynamics},
institution = {CEPR},
type = {Discussion Paper},
number = {19829},
year = {2026},
url = {https://www.distributionaldynamics.com}
}