muData = FileAttachment("draws_mu.csv").csv({typed: true})
muModels = ["Simple", "Intermediate", "Full"]
muColors = ["#9aa7b1", "#c98a3a", "#1c3d5a"]
// Shared bin edges so every model's area and line use the *same* bins —
// otherwise each series would bin over its own range and not line up.
muThresholds = d3.range(57).map(i => -0.05 + i * (0.225 / 56))
muSummary = muModels.map(m => {
const v = muData.filter(d => d.model === m).map(d => d.mu).sort(d3.ascending);
return {
model: m,
median: d3.quantile(v, 0.5),
lo: d3.quantile(v, 0.025),
hi: d3.quantile(v, 0.975),
pPos: d3.sum(v, x => x > 0) / v.length
};
})
Plot.plot({
height: 300,
marginLeft: 48,
marginBottom: 42,
x: {label: "Average merger price effect (μ) →", tickFormat: "+.0%",
grid: true, domain: [-0.05, 0.175]},
y: {label: "posterior density", ticks: []},
color: {domain: muModels, range: muColors, legend: true},
marks: [
Plot.ruleX([0], {strokeDasharray: "4 3", stroke: "#888"}),
// One area + one line per model, as separate marks, so the fills OVERLAP
// rather than stack. Each line traces the top of its own fill exactly.
...muModels.flatMap(m => {
const d = muData.filter(r => r.model === m);
return [
Plot.areaY(d, Plot.binX({y: "count"},
{x: "mu", fill: () => m, curve: "basis", fillOpacity: 0.2,
thresholds: muThresholds})),
Plot.lineY(d, Plot.binX({y: "count"},
{x: "mu", stroke: () => m, curve: "basis", strokeWidth: 2.2,
thresholds: muThresholds}))
];
}),
Plot.dot(muSummary, {x: "median", y: () => 0, fill: "model", r: 4.5,
stroke: "white", strokeWidth: 1.5,
title: d => `${d.model} model\nMedian: ${(d.median*100).toFixed(1)}%\n` +
`95% CrI: ${(d.lo*100).toFixed(1)}% to ${(d.hi*100).toFixed(1)}%`,
tip: true})
]
})U.S. Merger Retrospectives
A living Bayesian meta-analysis of merger price effects
This project collects reduced-form, difference-in-differences estimates of the price effects of U.S. horizontal mergers and synthesizes them in a Bayesian hierarchical model. The website summarizes the results, shows where the literature is concentrated, and accepts submissions of new estimates so the synthesis can stay current.
7.1% Mean post-merger price increase across log-price retrospectives (95% CrI: 2.0% to 12.0%)
1.7x In a broader analysis, anticompetitive price outcomes are about 1.7 times more likely than procompetitive ones