OWE repository
  • Overview
  • Explore
  • Download
  • Documentation
  • Exclusions
  • What’s New
  • Submit

Minimum wage own-wage elasticity repository

The Minimum Wage Own-Wage Elasticity Repository contains a representative estimate of the own-wage elasticity (OWE) of employment from every minimum wage study published since 1992. The OWE measures the employment change caused by a minimum wage increase, divided by the change in average wages due to the minimum wage.

viewof group = {
  const input = Inputs.radio(
    new Map([["Any group", null], ["Teens", "teens"], ["Restaurants or retail", "restaurants_retail"], ["Overall workforce", "overall"]]), 
    {value: null, label: "Group of workers"}
  );
  d3.select(input).select("label").style("width", "160px");
  d3.select(input).select("label").style("padding-bottom", "px");
  return input;
}
viewof country = {
  const input = Inputs.radio(new Map([["Any country", null], ["United States", "US"]]), 
  {value: null, label: "Country"});
  d3.select(input).select("label").style("width", "160px");
  return input;
}
viewof published = {
  const input = Inputs.radio(
    [null, "Published"], 
    {value: null, format: x => x ?? "All studies", label: "Publication status"}
  );
  d3.select(input).select("label").style("width", "160px");
  return input;
}

Distribution of estimates from minimum wage research studies

my_plot = Plot.plot({
  width: Math.max(width, 600),
  height: 600,
  color: {
    type: "categorical",
    domain: ['Large negative', 'Medium negative', 'Small negative', 'Positive'],
    range: ["#440154FF", "#3B528BFF", "#21908CFF", "#5DC863FF"]
  },
  y: {reverse:true, padding: 0},
  marginLeft: 160,
  marginBottom: 40,
  marks: [
    Plot.rectX(final_data, Plot.binY(
      {x: "count"}, 
      {y: "bin", 
       thresholds: [-1.6, -1.2, -0.8, -0.4, 0, 0.4, 0.8, 1.2, 1.6, 2.0], 
       insetTop: 2,
       insetBottom: 2,
       fill: "owe_magnitude"
      }
    )),
    Plot.axisX([0,10,20,30], {label:"Number of studies", fontSize: 14}),
    Plot.ruleY([median], {strokeDasharray: "5, 2", dx:10}),
    Plot.axisY([-1.4, 1.7], {fontSize: 0, tickSize: 0}),
    Plot.textY([-1.4, -1.0, -0.6, -0.2, 0.2, 0.6, 1.0, 1.4], {
      text: [
        "More negative than -1.2", 
        "-1.2  to -0.8", 
        "-0.8  to -0.4", 
        "-0.4  to  0.0", 
        "0.0  to  0.4", 
        "0.4  to  0.8", 
        "0.8  to  1.2", 
        "More positive than 1.2"
      ], 
      textAnchor: "end", x: -0.9,
      fontSize: 14
    }),
    Plot.text([[28, median]], {text: ["Median OWE"], dy: -10, fontSize:12}),
    Plot.text([[28, median]], {text: [median_formatted], dy: 10, fontSize:12}),
  ]
})

test = my_plot.legend("color", {
  className: "legend",
  tickFormat: (d) => d + ": " + d3.rollup(final_data, v => v.length, d => d.owe_magnitude).get(d) + " studies " + "(" + d3.format(".0%")([d3.rollup(final_data, v => v.length, d => d.owe_magnitude).get(d) / count_studies]) + ")"
})

Estimates and 95% confidence intervals from studies

Plot.plot({
  width: Math.max(width, 600),
  marginLeft: 250,
  color: {
    type: "categorical",
    domain: ['Large negative', 'Medium negative', 'Small negative', 'Positive'],
    range: ["#440154FF", "#3B528BFF", "#21908CFF", "#5DC863FF"]
  },
  x: {
    axis: "top",
    grid: true,
    domain: [-3, 3]
  },
  y: {
    label: null,
    tickSize: 0,
    domain: d3.sort(final_data, d => d.owe_b).map(d => d.study)
  },
  marks: [
    Plot.ruleX(data, {
      x: 0, 
      opacity: 0.05
    }),
    Plot.ruleY(data, {
      x1: "owe_lb",
      x2: "owe_ub",
      y: "study",
      strokeWidth: 4,
      strokeOpacity: 1,
      strokeLinecap: "round",
      stroke: "owe_magnitude"
    }),
    Plot.dot(data, {
      x: "owe_b",
      y: "study",
      r: 5,
      fill: "owe_magnitude"
    })
  ]
})
Plot = import("https://cdn.jsdelivr.net/npm/@observablehq/plot/+esm")

For more information, explore a table of all the studies, view the documentation, or download the underlying data. If you use the data or this site in your own work, please reference or cite it:

Source

Arindrajit Dube and Ben Zipperer. 2024. Minimum wage own-wage elasticity repository, Version 1.1.0. https://economic.github.io/owe

data = FileAttachment("web_assets/index_data.csv").csv({typed: true})

country_filtered_data = data.filter(d => d.country == country || country == null)
group_filtered_data = {
  if (group == "overall") {
    return country_filtered_data.filter(d => d.overall == 1)
  } else if (group == "teens") {
    return country_filtered_data.filter(d => d.teens == 1)
  } else if (group == "restaurants_retail") {
    return country_filtered_data.filter(d => d.restaurants_retail == 1)
  } else {
    return country_filtered_data
  }
}
final_data = group_filtered_data.filter(d => d.published == 1 || published == null)

count_studies = d3.count(final_data, d => d.owe_b)

median = d3.median(final_data, d => d.owe_b)

median_formatted = median.toFixed(2)

mean = d3.mean(final_data, d => d.owe_b)

mean_formatted = mean.toFixed(2)