We estimate the causal effect of three U.S. state firearm policies — permitless concealed carry, civil-petition extreme risk protection orders ("red-flag laws"), and universal background checks (UBC) — on six outcomes: firearm suicide rate, non-firearm suicide rate, total suicide rate, firearm homicide rate, total homicide rate, and motor vehicle theft rate (placebo). Each policy is estimated by two modern staggered-adoption DiD estimators — Callaway-Sant'Anna (2021) ATT(g, t) and Cengiz et al. (2019) stacked DiD — under multiple specifications including regression adjustment and Hainmueller (2012) entropy balancing. We also report Roth-Sant'Anna (2019) honest pre-trend sensitivity bounds for the firearm-suicide outcome.
The motor vehicle theft placebo is significant in several specs across all three policies, which is a persistent identification challenge. For permitless carry the placebo failure is severe (and shows up in pre-trends too); for red-flag and UBC the stacked-DiD placebo CIs include zero, which is a meaningfully better identification position than CS21 alone suggested.
Estimates use a balanced state-year panel covering 50 U.S. states (DC excluded throughout) from 1979 through 2024 (suicide / homicide outcomes from a long-run firearm suicide / homicide v2 file end in 2023). The augmented variant of the panel adds granular FBI / OpenCrime crime components (homicide, robbery, rape, aggravated assault, burglary, larceny, motor vehicle theft), firearm and total suicide and homicide counts, the firearm-suicide-share ownership proxy, and the RAND TL-354 household firearm ownership rate (1980–2016).
The full prose-language data documentation lives in
data_appendix.md. Every variable, source, and
manipulation is documented there in plain English. The same panel powers the public choropleth
map at
jedediahpidareese-coder.github.io/firearms-regulation-map.
| Variable family | Source | Window | Notes |
|---|---|---|---|
| Firearm laws (treatments) | Tufts CTSI State Firearm Laws Database (Siegel et al.) | 1976–2024 | 72 binary indicators across 11 categories. |
| Firearm suicides / homicides (counts and per-100k rates) | Firearm-suicide / homicide v2 dataset (Kalesan-style) | 1949–2023 | 50 states; DC excluded; non-firearm suicide derived as total − firearm. |
| Total homicide rate, motor vehicle theft rate | FBI UCR / OpenCrime extraction | 1979–2024 | Same NC↔ND 2022 reassignment as the website build. |
| Macro controls | BLS LAUS unemployment, BEA per-capita personal income, Census state population | 1979–2024 | Real income deflated to 2024 USD via CPI-U. |
All inputs are public. Reproduce the panel via scripts/build_firearms_panel.py and scripts/augment_panels.py.
Every per-policy section has a table with up to 4 columns for CS21 and 3 for stacked-DiD. The columns vary along two axes: which control states the comparison uses (broad vs strict) and which estimator spec (OR vs RA; for stacked-DiD additionally EB).
Project recommended default: strict / RA when the strict pool is large enough (≥ 15 states), broad / RA otherwise. RA over OR almost always; broad over strict only if strict drops too many cohorts. The headline figure shown after each table is the broad/RA spec for CS21 and the unweighted spec for stacked-DiD; we picked these for visual consistency across policies, not because they're more identified than the others. Read the full 4-spec table.
Significance stars: * p<0.10, ** p<0.05, *** p<0.01, two-tailed, state-clustered. "% of base" next to each significant estimate expresses the ATT as a percentage of the all-state mean of that outcome over the analysis window — so a coefficient of −0.14 firearm homicide on a baseline mean of 4.5 per 100,000 reads as roughly −3% of base, which is a more interpretable size than the raw number.
Pre-trend test: the third line of each cell shows the average ATT over the pre-period (e ∈ [−5, −2]) and a "✓ / ✗" indicating whether that average is far from zero (✗ at |z| ≥ 1.96). Two equally-sized headline estimates can have very different credibility if one's pre-trend rejects and the other's doesn't — that's why we report it inline.
For each treatment cohort g (year of first 0→1 or 1→0 switch in the policy variable, depending on policy) and each calendar year t in the analysis window:
ATT(g, t) = E[Yt − Yg−1 | treated, cohort g] − E[Yt − Yg−1 | comparison group]
We use the never-treated comparison group (no states ever switch in the panel window). Two specifications:
OR = basic outcome regression, no covariates; RA = regression-adjusted
(Sant'Anna & Zhao 2020) with ln_population, unemployment_rate, and
ln_pcpi_real_2024 measured at year g−1. Two control rules: broad uses every
never-treated state; strict applies a policy-specific filter (e.g., for permitless
carry, controls must be shall-issue and permit-required throughout [g−5, g+5]).
Standard errors via state-cluster Rademacher multiplier bootstrap (B = 2,000).
Aggregations: event-study ATT(e) is a treated-state-count-weighted average of ATT(g, g+e) across cohorts; overall post-treatment ATT is the same average for e ≥ 0.
For each treatment cohort g, we build a stack: the treated state(s) plus all clean controls observed across [g−5, g+5]. We concatenate all stacks and run TWFE with stack-by-state and stack-by-event-time fixed effects:
Y = β · (treated × post) + αstack,state + δstack,event + ε
β is the average post-treatment ATT. We estimate via Frisch-Waugh-Lovell within-FE partialling. Standard errors are state-clustered (since the same state can appear in multiple stacks as a control). Three weighting specifications:
For event-study coefficients with potentially problematic pre-trends, we report Roth-Sant'Anna (2019) honest sensitivity bounds. We fit a weighted linear regression of pre-period (e ∈ [−5, −2]) ATT coefficients on event time, recover the slope b̂ and its SE, then for each post-period e ≥ 0:
ATTadj(e) = ATT(e) − M · (e + 1) · b̂
with the CI half-width inflated by M·(e+1)·SE(b̂). M is the sensitivity parameter: M = 0 corresponds to the strict parallel-trends assumption; M = 1 means "post-trend deviation is at most as large as the linear extrapolation of the observed pre-trend"; M = 2 is a conservative "I don't trust the pre-trend at all" choice. Reported M ∈ (0, 0.5, 1.0, 2.0).
For policies whose primary outcome is firearm suicide, we add non-firearm suicide rate (derived
as total_suicide_rate − firearm_suicide_rate) and total suicide rate as outcomes.
The test:
None of the three policies has a direct mechanism for affecting motor vehicle theft. A clean identification design should produce ATT ≈ 0 for it. Persistent placebo failure tells us about unobserved trend differences between treated and control states.
Treatment: permitconcealed (1 → 0 (state stops requiring a permit to carry concealed)).
Detailed write-up: CS21 methodology
and stacked-DiD comparison.
Reading the broad-pool, regression-adjusted Callaway–Sant'Anna spec (the same spec the figure beneath the CS21 table reports), the statistically significant outcomes are:
"% of base" expresses the coefficient as a fraction of the all-state mean of the outcome over the analysis window — useful for an economic-magnitude read. A pre-trend rejection means the treated and control groups were already on diverging paths before the policy took effect, which weakens the causal claim. See §3 for an explanation of the spec grid (broad/strict, OR/RA) and the full 4-spec table below for results under the other specifications.
| Cohort year | n states | States |
|---|---|---|
| 2010 | 1 | AZ |
| 2011 | 1 | WY |
| 2015 | 3 | KS,ME,MS |
| 2016 | 2 | ID,WV |
| 2017 | 3 | MO,NH,ND |
| 2019 | 3 | KY,OK,SD |
| 2021 | 6 | AR,IA,MT,TN,TX,UT |
| 2022 | 3 | GA,IN,OH |
| 2023 | 3 | AL,FL,NE |
Analysis window: 1999–2023 (state panel post-NICS; last year with v2 firearm-mortality data). Treated-cohort adoptions span 2010–2023.
Event window: [−5, +5] years around adoption (5 leads, 5 lags). This follows the modal modern DiD convention (Roth, Sant'Anna, Bilinski, Poe 2023, J Econometrics; the canonical Callaway–Sant'Anna 2021 framework defaults to symmetric leads/lags). The 5-year window is wide enough to detect dynamic treatment effects that build over time (Cheng-Hoekstra 2013 SYG; McClellan-Tekin 2017), but narrow enough that small-sample inference for the most recent cohorts remains feasible. Pre-trend test averages event-times [−5, −2] so the omitted year (−1) and the immediate post-period (+0, +1) do not contaminate the parallel-trends check (per Borusyak-Jaravel-Spiess 2024 and the Roth-SA bounds methodology).
Strict-pool window: control states must satisfy the policy's no-contamination rule for every year in [g−5, g+5] (the same window as the event study). This avoids "drifting" controls — states that are close to but not yet adopting the policy at g but adopt soon after, which would bias the comparison toward zero (Goodman-Bacon 2021, Sun-Abraham 2021).
Three tiers per outcome family — Minimal / Headline / Expanded — shown in the covariate-sensitivity sub-table below.
Lethal violence (homicide, firearm homicide, total homicide) — Headline: ln_population, ln_pcpi_real_2024, unemployment_rate, poverty_rate, share_age_15_24, share_age_25_44, share_male, share_black_nh, share_hispanic, share_bachelors_plus, imprisonment_rate, sworn_officers_per_100k, alcohol_per_capita_ethanol_gallons
Suicide (firearm, total, non-firearm) — Headline: ln_population, ln_pcpi_real_2024, unemployment_rate, poverty_rate, share_male, share_age_15_24, share_age_25_44, share_bachelors_plus, share_black_nh, share_hispanic, alcohol_per_capita_ethanol_gallons, drug_overdose_per_100k, religion_adherents_pct_2020, ownership_rand
Property / placebo (MV theft) — Headline: ln_population, ln_pcpi_real_2024, unemployment_rate, poverty_rate, share_age_15_24, share_age_25_44, share_male, share_black_nh, share_hispanic, share_bachelors_plus, imprisonment_rate, sworn_officers_per_100k, alcohol_per_capita_ethanol_gallons
| Covariate | Treated mean | Control mean | Normalized diff |
|---|---|---|---|
| ln_population | 15.032 | 15.444 | -0.417 ⚠ |
| ln_pcpi_real_2024 | 11.008 | 11.105 | -0.674 ⚠ |
| unemployment_rate | 4.941 | 6.178 | -0.562 ⚠ |
| poverty_rate | 0.136 | 0.127 | +0.284 ⚠ |
| share_age_15_24 | 0.136 | 0.134 | +0.269 ⚠ |
| share_age_25_44 | 0.255 | 0.262 | -0.504 ⚠ |
| share_male | 0.497 | 0.492 | +0.632 ⚠ |
| share_black_nh | 0.095 | 0.116 | -0.230 |
| share_hispanic | 0.100 | 0.145 | -0.451 ⚠ |
| share_bachelors_plus | 0.289 | 0.335 | -0.902 ⚠ |
| imprisonment_rate | 405.742 | 348.778 | +0.401 ⚠ |
| sworn_officers_per_100k | 194.583 | 230.718 | -0.665 ⚠ |
| alcohol_per_capita_ethanol_gallons | 2.547 | 2.522 | +0.042 |
Treated and control means pooled across cohorts at each cohort's g−1 anchor year. Normalized difference = (mean_T − mean_C) / sqrt((sd_T² + sd_C²)/2). Per Imbens & Rubin (2015), |normalized diff| > 0.25 (⚠) indicates covariate imbalance worth flagging — RA / EB reweighting is the standard remedy.
| Outcome | Broad / OR | Broad / RA | Strict / OR | Strict / RA |
|---|---|---|---|---|
| firearm suicide rate | +0.855 *** (+10.7% of base) SE 0.063, z +13.66 pre-z -3.59 ✗ | +1.005 *** (+12.5% of base) SE 0.057, z +17.73 pre-z +7.05 ✗ | +0.594 *** (+7.4% of base) SE 0.064, z +9.25 pre-z -1.43 ✓ | +0.780 *** (+9.7% of base) SE 0.069, z +11.28 pre-z +0.13 ✓ |
| nonfirearm suicide rate | +0.042 (+0.7% of base) SE 0.056, z +0.75 pre-z -2.77 ✗ | -0.060 (-1.0% of base) SE 0.068, z -0.89 pre-z -2.83 ✗ | +0.015 (+0.3% of base) SE 0.057, z +0.27 pre-z -2.31 ✗ | -0.055 (-0.9% of base) SE 0.060, z -0.91 pre-z -3.04 ✗ |
| total suicide rate | +0.897 *** (+6.5% of base) SE 0.081, z +11.14 pre-z -4.71 ✗ | +0.945 *** (+6.8% of base) SE 0.090, z +10.55 pre-z +2.11 ✗ | +0.610 *** (+4.4% of base) SE 0.083, z +7.31 pre-z -2.75 ✗ | +0.725 *** (+5.2% of base) SE 0.090, z +8.05 pre-z -1.93 ✓ |
| firearm homicide rate | +0.286 ** (+6.9% of base) SE 0.115, z +2.49 pre-z -1.36 ✓ | +1.549 *** (+37.3% of base) SE 0.125, z +12.43 pre-z -7.39 ✗ | -0.011 (-0.3% of base) SE 0.117, z -0.10 pre-z +0.89 ✓ | +0.144 (+3.5% of base) SE 0.166, z +0.87 pre-z +0.66 ✓ |
| homicide rate | -0.148 ** (-2.6% of base) SE 0.073, z -2.04 pre-z -0.37 ✓ | +1.155 *** (+20.2% of base) SE 0.136, z +8.48 pre-z -5.54 ✗ | -0.488 *** (-8.5% of base) SE 0.080, z -6.09 pre-z +1.39 ✓ | -0.411 *** (-7.2% of base) SE 0.102, z -4.05 pre-z +1.37 ✓ |
| motor vehicle theft rate | -39.424 *** (-11.8% of base) SE 4.299, z -9.17 pre-z +4.87 ✗ | +26.281 *** (+7.9% of base) SE 5.377, z +4.89 pre-z -10.15 ✗ | -63.527 *** (-19.1% of base) SE 5.082, z -12.50 pre-z +6.36 ✗ | -47.906 *** (-14.4% of base) SE 4.840, z -9.90 pre-z -1.33 ✓ |
Stars: * p<0.10, ** p<0.05, *** p<0.01 (two-tailed, state-clustered). "% of base" expresses the ATT as a percentage of the all-state mean of that outcome over the analysis window. ✓ / ✗ on the third line indicates whether the pre-trend test (avg ATT for e ∈ [-5, -2]) does NOT / DOES reject zero. Outcomes are per 100,000 residents.
| Outcome | Minimal | Headline | Expanded |
|---|---|---|---|
| firearm suicide rate | +0.630 *** (+7.9% of base) SE 0.040, z +15.60 | +1.005 *** (+12.5% of base) SE 0.057, z +17.73 | +0.952 *** (+11.9% of base) SE 0.060, z +15.97 |
| nonfirearm suicide rate | +0.022 (+0.4% of base) SE 0.043, z +0.52 | -0.060 (-1.0% of base) SE 0.068, z -0.89 | +0.144 ** (+2.5% of base) SE 0.067, z +2.15 |
| total suicide rate | +0.652 *** (+4.7% of base) SE 0.053, z +12.30 | +0.945 *** (+6.8% of base) SE 0.090, z +10.55 | +1.096 *** (+7.9% of base) SE 0.089, z +12.37 |
| firearm homicide rate | -0.102 (-2.5% of base) SE 0.062, z -1.63 | +1.549 *** (+37.3% of base) SE 0.125, z +12.43 | +0.458 *** (+11.0% of base) SE 0.164, z +2.79 |
| homicide rate | -0.491 *** (-8.6% of base) SE 0.073, z -6.74 | +1.155 *** (+20.2% of base) SE 0.136, z +8.48 | -0.022 (-0.4% of base) SE 0.093, z -0.24 |
| motor vehicle theft rate | -63.656 *** (-19.1% of base) SE 4.252, z -14.97 | +26.281 *** (+7.9% of base) SE 5.377, z +4.89 | +49.666 *** (+14.9% of base) SE 5.505, z +9.02 |
Each column uses a different literature-backed covariate set (see §3 methodology preamble for definitions). Stars: * p<0.10, ** p<0.05, *** p<0.01. A coefficient that flips sign or loses significance across tiers is sensitive to covariate choice — interpret with care, per Donohue-Aneja-Weber 2019.
| Outcome | Unweighted | Regression-adjusted | Entropy-balanced |
|---|---|---|---|
| firearm suicide rate | +0.394 *** (+4.9% of base) SE 0.139, z +2.84 | — | +0.394 *** (+4.9% of base) SE 0.139, z +2.84 |
| nonfirearm suicide rate | +0.232 * (+4.0% of base) SE 0.122, z +1.90 | — | +0.232 * (+4.0% of base) SE 0.122, z +1.90 |
| total suicide rate | +0.626 *** (+4.5% of base) SE 0.172, z +3.64 | — | +0.626 *** (+4.5% of base) SE 0.172, z +3.64 |
| firearm homicide rate | -0.143 (-3.4% of base) SE 0.302, z -0.47 | — | -0.143 (-3.4% of base) SE 0.302, z -0.47 |
| homicide rate | -0.461 * (-8.1% of base) SE 0.260, z -1.78 | — | -0.461 * (-8.1% of base) SE 0.260, z -1.78 |
| motor vehicle theft rate | -57.173 ** (-17.2% of base) SE 23.286, z -2.46 | — | -57.173 ** (-17.2% of base) SE 23.286, z -2.46 |
Stars: * p<0.10, ** p<0.05, *** p<0.01 (two-tailed, state-clustered). "% of base" expresses the ATT as a percentage of the all-state mean of that outcome. Outcomes per 100,000 residents.
| Estimator | Spec | ATT(+1) | 95% CI (M=0) | ATT(+1) trend-adj | 95% CI (M=1) | M=1 verdict |
|---|---|---|---|---|---|---|
| cs21 | broad / or | +0.567 | (+0.261, +0.873) | +0.377 | (-0.108, +0.862) | fails |
| cs21 | broad / ra | +1.096 | (+0.894, +1.298) | +0.685 | (-0.070, +1.440) | fails |
| cs21 | strict / or | +0.448 | (+0.137, +0.758) | +0.373 | (-0.110, +0.856) | fails |
| cs21 | strict / ra | +0.754 | (+0.379, +1.128) | +0.296 | (-0.495, +1.087) | fails |
| stackdd | single / eb | +0.421 | (-0.029, +0.870) | +0.357 | (-0.270, +0.984) | fails |
| stackdd | single / unweighted | +0.421 | (-0.029, +0.870) | +0.357 | (-0.270, +0.984) | fails |
Roth-Sant'Anna sensitivity bounds at event time +1. M = post-trend deviation as a multiple of the linear extrapolation of the observed pre-trend. M=1 = "post-trend looks like more of the same"; M=2 = "post-trend could be twice the pre-trend magnitude".
For small-cohort policies, the literature (Webster 2014, Crifasi 2015, McCourt 2020, Kivisto 2018, Klarevas 2019) uses SCM rather than cohort-pooled DiD because per-event-time DiD estimates are noisy when only 1-4 states adopt. SCM constructs an explicit weighted counterfactual from the donor pool that minimizes pre-period MSPE, then attributes the post-period gap to the treatment. Inference is via permutation: refit SCM on every donor as if treated, compare the actual post-period effect to the placebo distribution.
| Outcome | Post ATT (per 100k) | Placebo p-value |
|---|---|---|
| firearm suicide rate | -0.044 (-0.5% of base) | p = 1.000 placebo n = 11, sd = 0.651 |
| firearm homicide rate | -0.378 (-9.1% of base) | p = 0.455 placebo n = 11, sd = 1.215 |
| homicide rate | -0.475 (-8.3% of base) | p = 0.636 placebo n = 11, sd = 1.339 |
| motor vehicle theft rate | -261.819 *** (-78.6% of base) | p = 0.000 placebo n = 11, sd = 138.369 |
Post ATT = mean(treated − synthetic) over the post-treatment years. Placebo p-value: two-sided rank from permutation across all donor states (refitting SCM on each donor as if treated). Stars at 10% / 5% / 1% from the placebo distribution. "% of base" expresses the ATT as a fraction of the all-state mean.
| Outcome | Post ATT (per 100k) | Placebo p-value |
|---|---|---|
| firearm suicide rate | +0.470 (+5.9% of base) | p = 0.400 placebo n = 10, sd = 0.679 |
| firearm homicide rate | -0.352 (-8.5% of base) | p = 0.500 placebo n = 10, sd = 1.141 |
| homicide rate | -0.220 (-3.8% of base) | p = 0.800 placebo n = 10, sd = 2.021 |
| motor vehicle theft rate | -37.335 (-11.2% of base) | p = 0.900 placebo n = 10, sd = 149.902 |
Post ATT = mean(treated − synthetic) over the post-treatment years. Placebo p-value: two-sided rank from permutation across all donor states (refitting SCM on each donor as if treated). Stars at 10% / 5% / 1% from the placebo distribution. "% of base" expresses the ATT as a fraction of the all-state mean.
Treatment: gvro (0 → 1 (state allows civilian petition for an extreme risk protection order)).
Detailed write-up: CS21 methodology
and stacked-DiD comparison.
Reading the broad-pool, regression-adjusted Callaway–Sant'Anna spec (the same spec the figure beneath the CS21 table reports), the statistically significant outcomes are:
"% of base" expresses the coefficient as a fraction of the all-state mean of the outcome over the analysis window — useful for an economic-magnitude read. A pre-trend rejection means the treated and control groups were already on diverging paths before the policy took effect, which weakens the causal claim. See §3 for an explanation of the spec grid (broad/strict, OR/RA) and the full 4-spec table below for results under the other specifications.
| Cohort year | n states | States |
|---|---|---|
| 2016 | 2 | CA,WA |
| 2018 | 4 | DE,MA,MD,OR |
| 2019 | 4 | CO,IL,NJ,NY |
| 2020 | 2 | HI,NV |
| 2023 | 1 | VT |
Analysis window: 1999–2023 (state panel post-NICS; last year with v2 firearm-mortality data). Treated-cohort adoptions span 2016–2023.
Event window: [−5, +5] years around adoption (5 leads, 5 lags). This follows the modal modern DiD convention (Roth, Sant'Anna, Bilinski, Poe 2023, J Econometrics; the canonical Callaway–Sant'Anna 2021 framework defaults to symmetric leads/lags). The 5-year window is wide enough to detect dynamic treatment effects that build over time (Cheng-Hoekstra 2013 SYG; McClellan-Tekin 2017), but narrow enough that small-sample inference for the most recent cohorts remains feasible. Pre-trend test averages event-times [−5, −2] so the omitted year (−1) and the immediate post-period (+0, +1) do not contaminate the parallel-trends check (per Borusyak-Jaravel-Spiess 2024 and the Roth-SA bounds methodology).
Strict-pool window: control states must satisfy the policy's no-contamination rule for every year in [g−5, g+5] (the same window as the event study). This avoids "drifting" controls — states that are close to but not yet adopting the policy at g but adopt soon after, which would bias the comparison toward zero (Goodman-Bacon 2021, Sun-Abraham 2021).
Three tiers per outcome family — Minimal / Headline / Expanded — shown in the covariate-sensitivity sub-table below.
Lethal violence (homicide, firearm homicide, total homicide) — Headline: ln_population, ln_pcpi_real_2024, unemployment_rate, poverty_rate, share_age_15_24, share_age_25_44, share_male, share_black_nh, share_hispanic, share_bachelors_plus, imprisonment_rate, sworn_officers_per_100k, alcohol_per_capita_ethanol_gallons
Suicide (firearm, total, non-firearm) — Headline: ln_population, ln_pcpi_real_2024, unemployment_rate, poverty_rate, share_male, share_age_15_24, share_age_25_44, share_bachelors_plus, share_black_nh, share_hispanic, alcohol_per_capita_ethanol_gallons, drug_overdose_per_100k, religion_adherents_pct_2020, ownership_rand
Property / placebo (MV theft) — Headline: ln_population, ln_pcpi_real_2024, unemployment_rate, poverty_rate, share_age_15_24, share_age_25_44, share_male, share_black_nh, share_hispanic, share_bachelors_plus, imprisonment_rate, sworn_officers_per_100k, alcohol_per_capita_ethanol_gallons
| Covariate | Treated mean | Control mean | Normalized diff |
|---|---|---|---|
| ln_population | 15.447 | 15.117 | +0.310 ⚠ |
| ln_pcpi_real_2024 | 11.168 | 11.026 | +1.214 ⚠ |
| unemployment_rate | 4.038 | 3.913 | +0.119 |
| poverty_rate | 0.116 | 0.134 | -0.716 ⚠ |
| share_age_15_24 | 0.132 | 0.136 | -0.537 ⚠ |
| share_age_25_44 | 0.266 | 0.254 | +0.899 ⚠ |
| share_male | 0.492 | 0.495 | -0.309 ⚠ |
| share_black_nh | 0.097 | 0.105 | -0.092 |
| share_hispanic | 0.167 | 0.107 | +0.620 ⚠ |
| share_bachelors_plus | 0.364 | 0.302 | +1.242 ⚠ |
| imprisonment_rate | 323.727 | 411.953 | -0.643 ⚠ |
| sworn_officers_per_100k | 226.533 | 208.775 | +0.311 ⚠ |
| alcohol_per_capita_ethanol_gallons | 2.548 | 2.404 | +0.285 ⚠ |
Treated and control means pooled across cohorts at each cohort's g−1 anchor year. Normalized difference = (mean_T − mean_C) / sqrt((sd_T² + sd_C²)/2). Per Imbens & Rubin (2015), |normalized diff| > 0.25 (⚠) indicates covariate imbalance worth flagging — RA / EB reweighting is the standard remedy.
| Outcome | Broad / OR | Broad / RA | Strict / OR | Strict / RA |
|---|---|---|---|---|
| firearm suicide rate | -0.210 *** (-2.6% of base) SE 0.077, z -2.74 pre-z +5.08 ✗ | +0.722 *** (+9.0% of base) SE 0.139, z +5.19 pre-z +2.38 ✗ | -0.241 *** (-3.0% of base) SE 0.082, z -2.96 pre-z +5.42 ✗ | +0.006 (+0.1% of base) SE 0.211, z +0.03 pre-z -2.33 ✗ |
| nonfirearm suicide rate | +0.077 (+1.3% of base) SE 0.059, z +1.31 pre-z +0.27 ✓ | -0.358 *** (-6.1% of base) SE 0.110, z -3.26 pre-z +4.72 ✗ | +0.035 (+0.6% of base) SE 0.061, z +0.57 pre-z +0.55 ✓ | -0.530 *** (-9.0% of base) SE 0.175, z -3.02 pre-z +5.82 ✗ |
| total suicide rate | -0.133 (-1.0% of base) SE 0.101, z -1.32 pre-z +3.27 ✗ | +0.364 ** (+2.6% of base) SE 0.149, z +2.45 pre-z +4.49 ✗ | -0.206 * (-1.5% of base) SE 0.106, z -1.94 pre-z +3.77 ✗ | -0.524 ** (-3.8% of base) SE 0.246, z -2.13 pre-z +2.22 ✗ |
| firearm homicide rate | -0.574 *** (-13.8% of base) SE 0.106, z -5.42 pre-z +2.58 ✗ | -0.606 *** (-14.6% of base) SE 0.114, z -5.33 pre-z -3.58 ✗ | -0.561 *** (-13.5% of base) SE 0.109, z -5.14 pre-z +2.71 ✗ | -0.906 *** (-21.8% of base) SE 0.148, z -6.14 pre-z -2.18 ✗ |
| homicide rate | -0.369 *** (-6.4% of base) SE 0.114, z -3.23 pre-z +1.52 ✓ | -0.934 *** (-16.3% of base) SE 0.116, z -8.05 pre-z -0.10 ✓ | -0.364 *** (-6.4% of base) SE 0.116, z -3.14 pre-z +1.55 ✓ | -1.041 *** (-18.2% of base) SE 0.139, z -7.49 pre-z +0.70 ✓ |
| motor vehicle theft rate | +38.594 *** (+11.6% of base) SE 9.271, z +4.16 pre-z +0.47 ✓ | -22.040 *** (-6.6% of base) SE 6.403, z -3.44 pre-z -0.42 ✓ | +36.244 *** (+10.9% of base) SE 9.332, z +3.88 pre-z +0.52 ✓ | -25.016 *** (-7.5% of base) SE 6.856, z -3.65 pre-z +2.16 ✗ |
Stars: * p<0.10, ** p<0.05, *** p<0.01 (two-tailed, state-clustered). "% of base" expresses the ATT as a percentage of the all-state mean of that outcome over the analysis window. ✓ / ✗ on the third line indicates whether the pre-trend test (avg ATT for e ∈ [-5, -2]) does NOT / DOES reject zero. Outcomes are per 100,000 residents.
| Outcome | Minimal | Headline | Expanded |
|---|---|---|---|
| firearm suicide rate | -0.202 *** (-2.5% of base) SE 0.074, z -2.74 | +0.722 *** (+9.0% of base) SE 0.139, z +5.19 | +0.343 ** (+4.3% of base) SE 0.152, z +2.26 |
| nonfirearm suicide rate | +0.149 *** (+2.5% of base) SE 0.057, z +2.63 | -0.358 *** (-6.1% of base) SE 0.110, z -3.26 | -1.075 *** (-18.3% of base) SE 0.127, z -8.47 |
| total suicide rate | -0.053 (-0.4% of base) SE 0.091, z -0.58 | +0.364 ** (+2.6% of base) SE 0.149, z +2.45 | -0.732 *** (-5.3% of base) SE 0.174, z -4.22 |
| firearm homicide rate | +0.046 (+1.1% of base) SE 0.103, z +0.45 | -0.606 *** (-14.6% of base) SE 0.114, z -5.33 | -0.408 *** (-9.8% of base) SE 0.130, z -3.14 |
| homicide rate | -0.782 *** (-13.7% of base) SE 0.096, z -8.17 | -0.934 *** (-16.3% of base) SE 0.116, z -8.05 | -0.667 *** (-11.7% of base) SE 0.147, z -4.53 |
| motor vehicle theft rate | +22.303 *** (+6.7% of base) SE 6.785, z +3.29 | -22.040 *** (-6.6% of base) SE 6.403, z -3.44 | -21.263 ** (-6.4% of base) SE 8.454, z -2.52 |
Each column uses a different literature-backed covariate set (see §3 methodology preamble for definitions). Stars: * p<0.10, ** p<0.05, *** p<0.01. A coefficient that flips sign or loses significance across tiers is sensitive to covariate choice — interpret with care, per Donohue-Aneja-Weber 2019.
| Outcome | Unweighted | Regression-adjusted | Entropy-balanced |
|---|---|---|---|
| firearm suicide rate | -0.613 *** (-7.6% of base) SE 0.199, z -3.08 | — | -0.613 *** (-7.6% of base) SE 0.199, z -3.08 |
| nonfirearm suicide rate | -0.058 (-1.0% of base) SE 0.156, z -0.37 | — | -0.058 (-1.0% of base) SE 0.156, z -0.37 |
| total suicide rate | -0.670 ** (-4.8% of base) SE 0.266, z -2.52 | — | -0.670 ** (-4.8% of base) SE 0.266, z -2.52 |
| firearm homicide rate | -0.734 ** (-17.7% of base) SE 0.317, z -2.32 | — | -0.734 ** (-17.7% of base) SE 0.317, z -2.32 |
| homicide rate | -0.575 ** (-10.1% of base) SE 0.247, z -2.33 | — | -0.575 ** (-10.1% of base) SE 0.247, z -2.33 |
| motor vehicle theft rate | +28.044 (+8.4% of base) SE 22.824, z +1.23 | — | +28.044 (+8.4% of base) SE 22.824, z +1.23 |
Stars: * p<0.10, ** p<0.05, *** p<0.01 (two-tailed, state-clustered). "% of base" expresses the ATT as a percentage of the all-state mean of that outcome. Outcomes per 100,000 residents.
| Estimator | Spec | ATT(+1) | 95% CI (M=0) | ATT(+1) trend-adj | 95% CI (M=1) | M=1 verdict |
|---|---|---|---|---|---|---|
| cs21 | broad / or | -0.121 | (-0.453, +0.211) | +0.308 | (-0.159, +0.775) | fails |
| cs21 | broad / ra | +1.619 | (+0.873, +2.365) | +1.828 | (-0.331, +3.988) | fails |
| cs21 | strict / or | -0.138 | (-0.491, +0.215) | +0.332 | (-0.149, +0.813) | fails |
| cs21 | strict / ra | +1.955 | (+0.999, +2.910) | +2.670 | (+0.529, +4.812) | survives |
| stackdd | single / eb | -0.220 | (-0.618, +0.178) | +0.247 | (-0.272, +0.765) | fails |
| stackdd | single / unweighted | -0.220 | (-0.618, +0.178) | +0.247 | (-0.272, +0.765) | fails |
Roth-Sant'Anna sensitivity bounds at event time +1. M = post-trend deviation as a multiple of the linear extrapolation of the observed pre-trend. M=1 = "post-trend looks like more of the same"; M=2 = "post-trend could be twice the pre-trend magnitude".
Treatment: universal (0 → 1 (state requires UBC at point of purchase for all firearms)).
Detailed write-up: CS21 methodology
and stacked-DiD comparison.
Reading the broad-pool, regression-adjusted Callaway–Sant'Anna spec (the same spec the figure beneath the CS21 table reports), the statistically significant outcomes are:
"% of base" expresses the coefficient as a fraction of the all-state mean of the outcome over the analysis window — useful for an economic-magnitude read. A pre-trend rejection means the treated and control groups were already on diverging paths before the policy took effect, which weakens the causal claim. See §3 for an explanation of the spec grid (broad/strict, OR/RA) and the full 4-spec table below for results under the other specifications.
| Cohort year | n states | States |
|---|---|---|
| 2013 | 3 | CO,DE,NY |
| 2014 | 1 | WA |
| 2015 | 1 | OR |
| 2017 | 1 | NV |
| 2018 | 2 | NJ,VT |
| 2019 | 1 | NM |
| 2020 | 1 | VA |
| 2021 | 1 | MD |
Analysis window: 1999–2023 (state panel post-NICS; last year with v2 firearm-mortality data). Treated-cohort adoptions span 2013–2021.
Event window: [−5, +5] years around adoption (5 leads, 5 lags). This follows the modal modern DiD convention (Roth, Sant'Anna, Bilinski, Poe 2023, J Econometrics; the canonical Callaway–Sant'Anna 2021 framework defaults to symmetric leads/lags). The 5-year window is wide enough to detect dynamic treatment effects that build over time (Cheng-Hoekstra 2013 SYG; McClellan-Tekin 2017), but narrow enough that small-sample inference for the most recent cohorts remains feasible. Pre-trend test averages event-times [−5, −2] so the omitted year (−1) and the immediate post-period (+0, +1) do not contaminate the parallel-trends check (per Borusyak-Jaravel-Spiess 2024 and the Roth-SA bounds methodology).
Strict-pool window: control states must satisfy the policy's no-contamination rule for every year in [g−5, g+5] (the same window as the event study). This avoids "drifting" controls — states that are close to but not yet adopting the policy at g but adopt soon after, which would bias the comparison toward zero (Goodman-Bacon 2021, Sun-Abraham 2021).
Three tiers per outcome family — Minimal / Headline / Expanded — shown in the covariate-sensitivity sub-table below.
Lethal violence (homicide, firearm homicide, total homicide) — Headline: ln_population, ln_pcpi_real_2024, unemployment_rate, poverty_rate, share_age_15_24, share_age_25_44, share_male, share_black_nh, share_hispanic, share_bachelors_plus, imprisonment_rate, sworn_officers_per_100k, alcohol_per_capita_ethanol_gallons
Suicide (firearm, total, non-firearm) — Headline: ln_population, ln_pcpi_real_2024, unemployment_rate, poverty_rate, share_male, share_age_15_24, share_age_25_44, share_bachelors_plus, share_black_nh, share_hispanic, alcohol_per_capita_ethanol_gallons, drug_overdose_per_100k, religion_adherents_pct_2020, ownership_rand
Property / placebo (MV theft) — Headline: ln_population, ln_pcpi_real_2024, unemployment_rate, poverty_rate, share_age_15_24, share_age_25_44, share_male, share_black_nh, share_hispanic, share_bachelors_plus, imprisonment_rate, sworn_officers_per_100k, alcohol_per_capita_ethanol_gallons
| Covariate | Treated mean | Control mean | Normalized diff |
|---|---|---|---|
| ln_population | 15.211 | 15.183 | +0.026 |
| ln_pcpi_real_2024 | 11.074 | 11.015 | +0.407 ⚠ |
| unemployment_rate | 5.849 | 5.314 | +0.280 ⚠ |
| poverty_rate | 0.132 | 0.138 | -0.179 |
| share_age_15_24 | 0.134 | 0.137 | -0.476 ⚠ |
| share_age_25_44 | 0.262 | 0.255 | +0.508 ⚠ |
| share_male | 0.492 | 0.494 | -0.325 ⚠ |
| share_black_nh | 0.107 | 0.102 | +0.060 |
| share_hispanic | 0.175 | 0.103 | +0.678 ⚠ |
| share_bachelors_plus | 0.340 | 0.294 | +0.878 ⚠ |
| imprisonment_rate | 364.883 | 412.468 | -0.310 ⚠ |
| sworn_officers_per_100k | 230.990 | 216.597 | +0.233 |
| alcohol_per_capita_ethanol_gallons | 2.741 | 2.423 | +0.586 ⚠ |
Treated and control means pooled across cohorts at each cohort's g−1 anchor year. Normalized difference = (mean_T − mean_C) / sqrt((sd_T² + sd_C²)/2). Per Imbens & Rubin (2015), |normalized diff| > 0.25 (⚠) indicates covariate imbalance worth flagging — RA / EB reweighting is the standard remedy.
| Outcome | Broad / OR | Broad / RA | Strict / OR | Strict / RA |
|---|---|---|---|---|
| firearm suicide rate | -0.420 *** (-5.2% of base) SE 0.068, z -6.14 pre-z +1.28 ✓ | +0.309 *** (+3.9% of base) SE 0.091, z +3.38 pre-z -0.26 ✓ | -0.420 *** (-5.2% of base) SE 0.068, z -6.14 pre-z +1.28 ✓ | +0.309 *** (+3.9% of base) SE 0.091, z +3.38 pre-z -0.26 ✓ |
| nonfirearm suicide rate | -0.644 *** (-11.0% of base) SE 0.100, z -6.45 pre-z -2.22 ✗ | -0.735 *** (-12.5% of base) SE 0.076, z -9.65 pre-z -1.85 ✓ | -0.644 *** (-11.0% of base) SE 0.100, z -6.45 pre-z -2.22 ✗ | -0.735 *** (-12.5% of base) SE 0.076, z -9.65 pre-z -1.85 ✓ |
| total suicide rate | -1.064 *** (-7.7% of base) SE 0.109, z -9.80 pre-z -0.62 ✓ | -0.426 *** (-3.1% of base) SE 0.133, z -3.21 pre-z -1.50 ✓ | -1.064 *** (-7.7% of base) SE 0.109, z -9.80 pre-z -0.62 ✓ | -0.426 *** (-3.1% of base) SE 0.133, z -3.21 pre-z -1.50 ✓ |
| firearm homicide rate | -0.594 *** (-14.3% of base) SE 0.068, z -8.70 pre-z +0.44 ✓ | -0.713 *** (-17.2% of base) SE 0.090, z -7.94 pre-z -2.55 ✗ | -0.594 *** (-14.3% of base) SE 0.068, z -8.70 pre-z +0.44 ✓ | -0.713 *** (-17.2% of base) SE 0.090, z -7.94 pre-z -2.55 ✗ |
| homicide rate | -0.389 *** (-6.8% of base) SE 0.080, z -4.85 pre-z -0.48 ✓ | -0.470 *** (-8.2% of base) SE 0.078, z -6.01 pre-z -5.46 ✗ | -0.389 *** (-6.8% of base) SE 0.080, z -4.85 pre-z -0.48 ✓ | -0.470 *** (-8.2% of base) SE 0.078, z -6.01 pre-z -5.46 ✗ |
| motor vehicle theft rate | +38.637 *** (+11.6% of base) SE 8.730, z +4.43 pre-z +0.35 ✓ | +24.644 *** (+7.4% of base) SE 3.655, z +6.74 pre-z -4.88 ✗ | +38.637 *** (+11.6% of base) SE 8.730, z +4.43 pre-z +0.35 ✓ | +24.644 *** (+7.4% of base) SE 3.655, z +6.74 pre-z -4.88 ✗ |
Stars: * p<0.10, ** p<0.05, *** p<0.01 (two-tailed, state-clustered). "% of base" expresses the ATT as a percentage of the all-state mean of that outcome over the analysis window. ✓ / ✗ on the third line indicates whether the pre-trend test (avg ATT for e ∈ [-5, -2]) does NOT / DOES reject zero. Outcomes are per 100,000 residents.
| Outcome | Minimal | Headline | Expanded |
|---|---|---|---|
| firearm suicide rate | -0.365 *** (-4.5% of base) SE 0.062, z -5.84 | +0.309 *** (+3.9% of base) SE 0.091, z +3.38 | +0.276 ** (+3.4% of base) SE 0.108, z +2.55 |
| nonfirearm suicide rate | -0.358 *** (-6.1% of base) SE 0.084, z -4.25 | -0.735 *** (-12.5% of base) SE 0.076, z -9.65 | -1.071 *** (-18.3% of base) SE 0.087, z -12.26 |
| total suicide rate | -0.723 *** (-5.2% of base) SE 0.105, z -6.86 | -0.426 *** (-3.1% of base) SE 0.133, z -3.21 | -0.794 *** (-5.7% of base) SE 0.151, z -5.25 |
| firearm homicide rate | -0.267 *** (-6.4% of base) SE 0.065, z -4.09 | -0.713 *** (-17.2% of base) SE 0.090, z -7.94 | -1.426 *** (-34.4% of base) SE 0.102, z -13.98 |
| homicide rate | -0.739 *** (-12.9% of base) SE 0.065, z -11.31 | -0.470 *** (-8.2% of base) SE 0.078, z -6.01 | -0.677 *** (-11.8% of base) SE 0.096, z -7.04 |
| motor vehicle theft rate | +38.338 *** (+11.5% of base) SE 4.901, z +7.82 | +24.644 *** (+7.4% of base) SE 3.655, z +6.74 | -8.844 (-2.7% of base) SE 5.856, z -1.51 |
Each column uses a different literature-backed covariate set (see §3 methodology preamble for definitions). Stars: * p<0.10, ** p<0.05, *** p<0.01. A coefficient that flips sign or loses significance across tiers is sensitive to covariate choice — interpret with care, per Donohue-Aneja-Weber 2019.
| Outcome | Unweighted | Regression-adjusted | Entropy-balanced |
|---|---|---|---|
| firearm suicide rate | -0.353 * (-4.4% of base) SE 0.192, z -1.84 | — | -0.353 * (-4.4% of base) SE 0.192, z -1.84 |
| nonfirearm suicide rate | -0.373 * (-6.4% of base) SE 0.209, z -1.79 | — | -0.373 * (-6.4% of base) SE 0.209, z -1.79 |
| total suicide rate | -0.726 *** (-5.2% of base) SE 0.261, z -2.78 | — | -0.726 *** (-5.2% of base) SE 0.261, z -2.78 |
| firearm homicide rate | -0.389 (-9.4% of base) SE 0.378, z -1.03 | — | -0.389 (-9.4% of base) SE 0.378, z -1.03 |
| homicide rate | -0.258 (-4.5% of base) SE 0.384, z -0.67 | — | -0.258 (-4.5% of base) SE 0.384, z -0.67 |
| motor vehicle theft rate | +12.658 (+3.8% of base) SE 15.611, z +0.81 | — | +12.658 (+3.8% of base) SE 15.611, z +0.81 |
Stars: * p<0.10, ** p<0.05, *** p<0.01 (two-tailed, state-clustered). "% of base" expresses the ATT as a percentage of the all-state mean of that outcome. Outcomes per 100,000 residents.
| Estimator | Spec | ATT(+1) | 95% CI (M=0) | ATT(+1) trend-adj | 95% CI (M=1) | M=1 verdict |
|---|---|---|---|---|---|---|
| cs21 | broad / or | -0.097 | (-0.356, +0.162) | +0.098 | (-0.297, +0.492) | fails |
| cs21 | broad / ra | +0.134 | (-0.331, +0.599) | +0.402 | (-0.939, +1.742) | fails |
| stackdd | single / eb | +0.013 | (-0.365, +0.390) | +0.190 | (-0.281, +0.662) | fails |
| stackdd | single / unweighted | +0.013 | (-0.365, +0.390) | +0.190 | (-0.281, +0.662) | fails |
Roth-Sant'Anna sensitivity bounds at event time +1. M = post-trend deviation as a multiple of the linear extrapolation of the observed pre-trend. M=1 = "post-trend looks like more of the same"; M=2 = "post-trend could be twice the pre-trend magnitude".
Treatment: nosyg (1 → 0 (state adopts SYG / removes duty-to-retreat outside the home)).
Detailed write-up: CS21 methodology
and stacked-DiD comparison.
Reading the broad-pool, regression-adjusted Callaway–Sant'Anna spec (the same spec the figure beneath the CS21 table reports), the statistically significant outcomes are:
"% of base" expresses the coefficient as a fraction of the all-state mean of the outcome over the analysis window — useful for an economic-magnitude read. A pre-trend rejection means the treated and control groups were already on diverging paths before the policy took effect, which weakens the causal claim. See §3 for an explanation of the spec grid (broad/strict, OR/RA) and the full 4-spec table below for results under the other specifications.
| Cohort year | n states | States |
|---|---|---|
| 2005 | 1 | FL |
| 2006 | 11 | AL,GA,IN,KS,KY,LA,MI,MS,OK,SC,SD |
| 2007 | 2 | TN,TX |
| 2008 | 1 | WV |
| 2009 | 1 | MT |
| 2010 | 1 | AZ |
| 2011 | 4 | NC,NH,NV,PA |
| 2013 | 1 | AK |
| 2016 | 1 | MO |
| 2017 | 1 | IA |
| 2018 | 2 | ID,WY |
| 2019 | 1 | OH |
| 2021 | 2 | AR,ND |
Analysis window: 1999–2023 (state panel post-NICS; last year with v2 firearm-mortality data). Treated-cohort adoptions span 2005–2021.
Event window: [−5, +5] years around adoption (5 leads, 5 lags). This follows the modal modern DiD convention (Roth, Sant'Anna, Bilinski, Poe 2023, J Econometrics; the canonical Callaway–Sant'Anna 2021 framework defaults to symmetric leads/lags). The 5-year window is wide enough to detect dynamic treatment effects that build over time (Cheng-Hoekstra 2013 SYG; McClellan-Tekin 2017), but narrow enough that small-sample inference for the most recent cohorts remains feasible. Pre-trend test averages event-times [−5, −2] so the omitted year (−1) and the immediate post-period (+0, +1) do not contaminate the parallel-trends check (per Borusyak-Jaravel-Spiess 2024 and the Roth-SA bounds methodology).
Strict-pool window: control states must satisfy the policy's no-contamination rule for every year in [g−5, g+5] (the same window as the event study). This avoids "drifting" controls — states that are close to but not yet adopting the policy at g but adopt soon after, which would bias the comparison toward zero (Goodman-Bacon 2021, Sun-Abraham 2021).
Three tiers per outcome family — Minimal / Headline / Expanded — shown in the covariate-sensitivity sub-table below.
Lethal violence (homicide, firearm homicide, total homicide) — Headline: ln_population, ln_pcpi_real_2024, unemployment_rate, poverty_rate, share_age_15_24, share_age_25_44, share_male, share_black_nh, share_hispanic, share_bachelors_plus, imprisonment_rate, sworn_officers_per_100k, alcohol_per_capita_ethanol_gallons
Suicide (firearm, total, non-firearm) — Headline: ln_population, ln_pcpi_real_2024, unemployment_rate, poverty_rate, share_male, share_age_15_24, share_age_25_44, share_bachelors_plus, share_black_nh, share_hispanic, alcohol_per_capita_ethanol_gallons, drug_overdose_per_100k, religion_adherents_pct_2020, ownership_rand
Property / placebo (MV theft) — Headline: ln_population, ln_pcpi_real_2024, unemployment_rate, poverty_rate, share_age_15_24, share_age_25_44, share_male, share_black_nh, share_hispanic, share_bachelors_plus, imprisonment_rate, sworn_officers_per_100k, alcohol_per_capita_ethanol_gallons
| Covariate | Treated mean | Control mean | Normalized diff |
|---|---|---|---|
| ln_population | 15.112 | 15.201 | -0.088 |
| ln_pcpi_real_2024 | 10.903 | 11.069 | -1.147 ⚠ |
| unemployment_rate | 5.969 | 5.510 | +0.210 |
| poverty_rate | 0.144 | 0.116 | +1.058 ⚠ |
| share_age_15_24 | 0.142 | 0.139 | +0.329 ⚠ |
| share_age_25_44 | 0.264 | 0.266 | -0.145 |
| share_male | 0.495 | 0.492 | +0.297 ⚠ |
| share_black_nh | 0.117 | 0.081 | +0.396 ⚠ |
| share_hispanic | 0.083 | 0.137 | -0.563 ⚠ |
| share_bachelors_plus | 0.247 | 0.323 | -1.837 ⚠ |
| imprisonment_rate | 488.622 | 340.042 | +1.012 ⚠ |
| sworn_officers_per_100k | 231.329 | 232.716 | -0.023 |
| alcohol_per_capita_ethanol_gallons | 2.391 | 2.448 | -0.115 |
Treated and control means pooled across cohorts at each cohort's g−1 anchor year. Normalized difference = (mean_T − mean_C) / sqrt((sd_T² + sd_C²)/2). Per Imbens & Rubin (2015), |normalized diff| > 0.25 (⚠) indicates covariate imbalance worth flagging — RA / EB reweighting is the standard remedy.
| Outcome | Broad / OR | Broad / RA | Strict / OR | Strict / RA |
|---|---|---|---|---|
| firearm suicide rate | +0.512 *** (+6.4% of base) SE 0.052, z +9.79 pre-z -4.28 ✗ | +0.397 *** (+5.0% of base) SE 0.058, z +6.84 pre-z -0.87 ✓ | +0.554 *** (+6.9% of base) SE 0.053, z +10.50 pre-z -4.53 ✗ | +0.384 *** (+4.8% of base) SE 0.060, z +6.36 pre-z -1.62 ✓ |
| nonfirearm suicide rate | -0.341 *** (-5.8% of base) SE 0.044, z -7.69 pre-z -3.63 ✗ | -0.488 *** (-8.3% of base) SE 0.062, z -7.87 pre-z -4.49 ✗ | -0.303 *** (-5.2% of base) SE 0.044, z -6.85 pre-z -3.42 ✗ | -0.334 *** (-5.7% of base) SE 0.062, z -5.39 pre-z -2.64 ✗ |
| total suicide rate | +0.171 *** (+1.2% of base) SE 0.065, z +2.62 pre-z -5.96 ✗ | -0.090 (-0.7% of base) SE 0.073, z -1.23 pre-z -3.50 ✗ | +0.251 *** (+1.8% of base) SE 0.065, z +3.86 pre-z -6.02 ✗ | +0.050 (+0.4% of base) SE 0.073, z +0.68 pre-z -2.97 ✗ |
| firearm homicide rate | +0.839 *** (+20.2% of base) SE 0.064, z +13.07 pre-z +2.30 ✗ | -0.435 *** (-10.5% of base) SE 0.087, z -4.97 pre-z -3.82 ✗ | +0.833 *** (+20.1% of base) SE 0.065, z +12.90 pre-z +2.39 ✗ | -0.775 *** (-18.7% of base) SE 0.112, z -6.89 pre-z -6.46 ✗ |
| homicide rate | +0.507 *** (+8.9% of base) SE 0.054, z +9.44 pre-z +1.59 ✓ | -0.718 *** (-12.6% of base) SE 0.074, z -9.76 pre-z -3.03 ✗ | +0.507 *** (+8.9% of base) SE 0.055, z +9.30 pre-z +1.63 ✓ | -0.800 *** (-14.0% of base) SE 0.088, z -9.07 pre-z -7.00 ✗ |
| motor vehicle theft rate | +20.269 *** (+6.1% of base) SE 4.311, z +4.70 pre-z +2.82 ✗ | -69.901 *** (-21.0% of base) SE 6.298, z -11.10 pre-z +1.47 ✓ | +21.569 *** (+6.5% of base) SE 4.371, z +4.93 pre-z +2.64 ✗ | -60.481 *** (-18.1% of base) SE 8.893, z -6.80 pre-z -0.92 ✓ |
Stars: * p<0.10, ** p<0.05, *** p<0.01 (two-tailed, state-clustered). "% of base" expresses the ATT as a percentage of the all-state mean of that outcome over the analysis window. ✓ / ✗ on the third line indicates whether the pre-trend test (avg ATT for e ∈ [-5, -2]) does NOT / DOES reject zero. Outcomes are per 100,000 residents.
| Outcome | Minimal | Headline | Expanded |
|---|---|---|---|
| firearm suicide rate | +0.002 (+0.0% of base) SE 0.036, z +0.07 | +0.397 *** (+5.0% of base) SE 0.058, z +6.84 | +0.202 *** (+2.5% of base) SE 0.063, z +3.22 |
| nonfirearm suicide rate | -0.388 *** (-6.6% of base) SE 0.037, z -10.49 | -0.488 *** (-8.3% of base) SE 0.062, z -7.87 | -0.649 *** (-11.1% of base) SE 0.055, z -11.79 |
| total suicide rate | -0.386 *** (-2.8% of base) SE 0.044, z -8.73 | -0.090 (-0.7% of base) SE 0.073, z -1.23 | -0.447 *** (-3.2% of base) SE 0.074, z -6.06 |
| firearm homicide rate | -0.041 (-1.0% of base) SE 0.064, z -0.65 | -0.435 *** (-10.5% of base) SE 0.087, z -4.97 | +0.818 *** (+19.7% of base) SE 0.072, z +11.37 |
| homicide rate | -0.289 *** (-5.1% of base) SE 0.060, z -4.86 | -0.718 *** (-12.6% of base) SE 0.074, z -9.76 | +0.485 *** (+8.5% of base) SE 0.059, z +8.26 |
| motor vehicle theft rate | -28.300 *** (-8.5% of base) SE 6.163, z -4.59 | -69.901 *** (-21.0% of base) SE 6.298, z -11.10 | -58.389 *** (-17.5% of base) SE 10.198, z -5.73 |
Each column uses a different literature-backed covariate set (see §3 methodology preamble for definitions). Stars: * p<0.10, ** p<0.05, *** p<0.01. A coefficient that flips sign or loses significance across tiers is sensitive to covariate choice — interpret with care, per Donohue-Aneja-Weber 2019.
| Outcome | Unweighted | Regression-adjusted | Entropy-balanced |
|---|---|---|---|
| firearm suicide rate | +0.531 *** (+6.6% of base) SE 0.196, z +2.71 | — | +0.531 *** (+6.6% of base) SE 0.196, z +2.71 |
| nonfirearm suicide rate | -0.079 (-1.4% of base) SE 0.118, z -0.68 | — | -0.079 (-1.4% of base) SE 0.118, z -0.68 |
| total suicide rate | +0.451 * (+3.3% of base) SE 0.240, z +1.88 | — | +0.451 * (+3.3% of base) SE 0.240, z +1.88 |
| firearm homicide rate | +0.183 (+4.4% of base) SE 0.174, z +1.05 | — | +0.183 (+4.4% of base) SE 0.174, z +1.05 |
| homicide rate | +0.108 (+1.9% of base) SE 0.217, z +0.50 | — | +0.108 (+1.9% of base) SE 0.217, z +0.50 |
| motor vehicle theft rate | +0.910 (+0.3% of base) SE 21.849, z +0.04 | — | +0.910 (+0.3% of base) SE 21.849, z +0.04 |
Stars: * p<0.10, ** p<0.05, *** p<0.01 (two-tailed, state-clustered). "% of base" expresses the ATT as a percentage of the all-state mean of that outcome. Outcomes per 100,000 residents.
| Estimator | Spec | ATT(+1) | 95% CI (M=0) | ATT(+1) trend-adj | 95% CI (M=1) | M=1 verdict |
|---|---|---|---|---|---|---|
| cs21 | broad / or | +0.053 | (-0.359, +0.464) | -0.023 | (-0.498, +0.453) | fails |
| cs21 | broad / ra | -0.085 | (-0.425, +0.254) | -0.487 | (-1.126, +0.151) | fails |
| cs21 | strict / or | +0.050 | (-0.357, +0.456) | -0.021 | (-0.494, +0.452) | fails |
| cs21 | strict / ra | -0.233 | (-0.591, +0.125) | -0.595 | (-1.196, +0.007) | fails |
| stackdd | single / eb | +0.068 | (-0.264, +0.399) | +0.016 | (-0.392, +0.423) | fails |
| stackdd | single / unweighted | +0.068 | (-0.264, +0.399) | +0.016 | (-0.392, +0.423) | fails |
Roth-Sant'Anna sensitivity bounds at event time +1. M = post-trend deviation as a multiple of the linear extrapolation of the observed pre-trend. M=1 = "post-trend looks like more of the same"; M=2 = "post-trend could be twice the pre-trend magnitude".
Treatment: magazine (0 → 1 (state prohibits magazines above 10 or 15 rounds)).
Detailed write-up: CS21 methodology
and stacked-DiD comparison.
Reading the broad-pool, regression-adjusted Callaway–Sant'Anna spec (the same spec the figure beneath the CS21 table reports), the statistically significant outcomes are:
"% of base" expresses the coefficient as a fraction of the all-state mean of the outcome over the analysis window — useful for an economic-magnitude read. A pre-trend rejection means the treated and control groups were already on diverging paths before the policy took effect, which weakens the causal claim. See §3 for an explanation of the spec grid (broad/strict, OR/RA) and the full 4-spec table below for results under the other specifications.
| Cohort year | n states | States |
|---|---|---|
| 2013 | 2 | CO,CT |
| 2018 | 1 | VT |
| 2022 | 3 | DE,RI,WA |
| 2023 | 1 | IL |
Analysis window: 1999–2023 (state panel post-NICS; last year with v2 firearm-mortality data). Treated-cohort adoptions span 2013–2023.
Event window: [−5, +5] years around adoption (5 leads, 5 lags). This follows the modal modern DiD convention (Roth, Sant'Anna, Bilinski, Poe 2023, J Econometrics; the canonical Callaway–Sant'Anna 2021 framework defaults to symmetric leads/lags). The 5-year window is wide enough to detect dynamic treatment effects that build over time (Cheng-Hoekstra 2013 SYG; McClellan-Tekin 2017), but narrow enough that small-sample inference for the most recent cohorts remains feasible. Pre-trend test averages event-times [−5, −2] so the omitted year (−1) and the immediate post-period (+0, +1) do not contaminate the parallel-trends check (per Borusyak-Jaravel-Spiess 2024 and the Roth-SA bounds methodology).
Strict-pool window: control states must satisfy the policy's no-contamination rule for every year in [g−5, g+5] (the same window as the event study). This avoids "drifting" controls — states that are close to but not yet adopting the policy at g but adopt soon after, which would bias the comparison toward zero (Goodman-Bacon 2021, Sun-Abraham 2021).
Three tiers per outcome family — Minimal / Headline / Expanded — shown in the covariate-sensitivity sub-table below.
Lethal violence (homicide, firearm homicide, total homicide) — Headline: ln_population, ln_pcpi_real_2024, unemployment_rate, poverty_rate, share_age_15_24, share_age_25_44, share_male, share_black_nh, share_hispanic, share_bachelors_plus, imprisonment_rate, sworn_officers_per_100k, alcohol_per_capita_ethanol_gallons
Suicide (firearm, total, non-firearm) — Headline: ln_population, ln_pcpi_real_2024, unemployment_rate, poverty_rate, share_male, share_age_15_24, share_age_25_44, share_bachelors_plus, share_black_nh, share_hispanic, alcohol_per_capita_ethanol_gallons, drug_overdose_per_100k, religion_adherents_pct_2020, ownership_rand
Property / placebo (MV theft) — Headline: ln_population, ln_pcpi_real_2024, unemployment_rate, poverty_rate, share_age_15_24, share_age_25_44, share_male, share_black_nh, share_hispanic, share_bachelors_plus, imprisonment_rate, sworn_officers_per_100k, alcohol_per_capita_ethanol_gallons
| Covariate | Treated mean | Control mean | Normalized diff |
|---|---|---|---|
| ln_population | 14.835 | 15.171 | -0.323 ⚠ |
| ln_pcpi_real_2024 | 11.196 | 11.053 | +1.018 ⚠ |
| unemployment_rate | 5.731 | 4.750 | +0.523 ⚠ |
| poverty_rate | 0.115 | 0.135 | -0.850 ⚠ |
| share_age_15_24 | 0.131 | 0.135 | -0.476 ⚠ |
| share_age_25_44 | 0.262 | 0.259 | +0.205 |
| share_male | 0.493 | 0.496 | -0.317 ⚠ |
| share_black_nh | 0.087 | 0.107 | -0.227 |
| share_hispanic | 0.140 | 0.112 | +0.344 ⚠ |
| share_bachelors_plus | 0.374 | 0.310 | +1.622 ⚠ |
| imprisonment_rate | 317.564 | 385.218 | -0.476 ⚠ |
| sworn_officers_per_100k | 202.523 | 213.668 | -0.239 |
| alcohol_per_capita_ethanol_gallons | 2.743 | 2.440 | +0.650 ⚠ |
Treated and control means pooled across cohorts at each cohort's g−1 anchor year. Normalized difference = (mean_T − mean_C) / sqrt((sd_T² + sd_C²)/2). Per Imbens & Rubin (2015), |normalized diff| > 0.25 (⚠) indicates covariate imbalance worth flagging — RA / EB reweighting is the standard remedy.
| Outcome | Broad / OR | Broad / RA | Strict / OR | Strict / RA |
|---|---|---|---|---|
| firearm suicide rate | -0.323 *** (-4.0% of base) SE 0.095, z -3.41 pre-z +0.23 ✓ | -0.169 * (-2.1% of base) SE 0.101, z -1.68 pre-z -1.35 ✓ | -0.385 *** (-4.8% of base) SE 0.094, z -4.09 pre-z +0.51 ✓ | +0.544 *** (+6.8% of base) SE 0.204, z +2.67 pre-z +1.02 ✓ |
| nonfirearm suicide rate | +0.189 ** (+3.2% of base) SE 0.080, z +2.35 pre-z +0.40 ✓ | +0.494 *** (+8.4% of base) SE 0.111, z +4.44 pre-z +2.14 ✗ | +0.182 ** (+3.1% of base) SE 0.081, z +2.24 pre-z +0.71 ✓ | +1.123 *** (+19.2% of base) SE 0.198, z +5.67 pre-z +1.85 ✓ |
| total suicide rate | -0.134 (-1.0% of base) SE 0.113, z -1.19 pre-z +0.35 ✓ | +0.325 * (+2.3% of base) SE 0.175, z +1.85 pre-z -0.26 ✓ | -0.204 * (-1.5% of base) SE 0.112, z -1.81 pre-z +0.71 ✓ | +1.666 *** (+12.0% of base) SE 0.320, z +5.20 pre-z +1.66 ✓ |
| firearm homicide rate | -0.999 *** (-24.1% of base) SE 0.201, z -4.97 pre-z +0.17 ✓ | -1.073 (-25.9% of base) SE 0.000, z +nan pre-z +nan ✗ | -1.037 *** (-25.0% of base) SE 0.201, z -5.15 pre-z +0.55 ✓ | -1.414 (-34.1% of base) SE 0.000, z +nan pre-z +nan ✗ |
| homicide rate | -0.726 *** (-12.7% of base) SE 0.207, z -3.50 pre-z -1.99 ✗ | -1.829 (-32.0% of base) SE 0.000, z +nan pre-z +nan ✗ | -0.763 *** (-13.3% of base) SE 0.206, z -3.70 pre-z -1.85 ✓ | -2.881 (-50.4% of base) SE 0.000, z +nan pre-z +nan ✗ |
| motor vehicle theft rate | +72.281 *** (+21.7% of base) SE 18.448, z +3.92 pre-z -4.21 ✗ | +48.735 (+14.6% of base) SE 0.000, z +nan pre-z +nan ✗ | +70.477 *** (+21.1% of base) SE 18.325, z +3.85 pre-z -4.02 ✗ | +33.327 (+10.0% of base) SE 0.000, z +nan pre-z +nan ✗ |
Stars: * p<0.10, ** p<0.05, *** p<0.01 (two-tailed, state-clustered). "% of base" expresses the ATT as a percentage of the all-state mean of that outcome over the analysis window. ✓ / ✗ on the third line indicates whether the pre-trend test (avg ATT for e ∈ [-5, -2]) does NOT / DOES reject zero. Outcomes are per 100,000 residents.
| Outcome | Minimal | Headline | Expanded |
|---|---|---|---|
| firearm suicide rate | +0.132 ** (+1.7% of base) SE 0.064, z +2.08 | -0.169 * (-2.1% of base) SE 0.101, z -1.68 | -0.233 ** (-2.9% of base) SE 0.105, z -2.21 |
| nonfirearm suicide rate | +0.557 *** (+9.5% of base) SE 0.071, z +7.81 | +0.494 *** (+8.4% of base) SE 0.111, z +4.44 | +0.328 *** (+5.6% of base) SE 0.103, z +3.19 |
| total suicide rate | +0.689 *** (+5.0% of base) SE 0.096, z +7.21 | +0.325 * (+2.3% of base) SE 0.175, z +1.85 | +0.095 (+0.7% of base) SE 0.168, z +0.57 |
| firearm homicide rate | -0.678 *** (-16.3% of base) SE 0.092, z -7.39 | -1.073 (-25.9% of base) SE 0.000, z +nan | -0.986 (-23.8% of base) SE 0.000, z +nan |
| homicide rate | -0.609 *** (-10.7% of base) SE 0.105, z -5.81 | -1.829 (-32.0% of base) SE 0.000, z +nan | -1.542 (-27.0% of base) SE 0.000, z +nan |
| motor vehicle theft rate | +73.380 *** (+22.0% of base) SE 7.398, z +9.92 | +48.735 (+14.6% of base) SE 0.000, z +nan | +54.675 (+16.4% of base) SE 0.000, z +nan |
Each column uses a different literature-backed covariate set (see §3 methodology preamble for definitions). Stars: * p<0.10, ** p<0.05, *** p<0.01. A coefficient that flips sign or loses significance across tiers is sensitive to covariate choice — interpret with care, per Donohue-Aneja-Weber 2019.
| Outcome | Unweighted | Regression-adjusted | Entropy-balanced |
|---|---|---|---|
| firearm suicide rate | -0.195 (-2.4% of base) SE 0.260, z -0.75 | — | -0.195 (-2.4% of base) SE 0.260, z -0.75 |
| nonfirearm suicide rate | +0.152 (+2.6% of base) SE 0.115, z +1.31 | — | +0.152 (+2.6% of base) SE 0.115, z +1.31 |
| total suicide rate | -0.044 (-0.3% of base) SE 0.284, z -0.15 | — | -0.044 (-0.3% of base) SE 0.284, z -0.15 |
| firearm homicide rate | -0.839 ** (-20.2% of base) SE 0.340, z -2.47 | — | -0.839 ** (-20.2% of base) SE 0.340, z -2.47 |
| homicide rate | -0.766 ** (-13.4% of base) SE 0.330, z -2.32 | — | -0.766 ** (-13.4% of base) SE 0.330, z -2.32 |
| motor vehicle theft rate | +48.272 (+14.5% of base) SE 30.214, z +1.60 | — | +48.272 (+14.5% of base) SE 30.214, z +1.60 |
Stars: * p<0.10, ** p<0.05, *** p<0.01 (two-tailed, state-clustered). "% of base" expresses the ATT as a percentage of the all-state mean of that outcome. Outcomes per 100,000 residents.
| Estimator | Spec | ATT(+1) | 95% CI (M=0) | ATT(+1) trend-adj | 95% CI (M=1) | M=1 verdict |
|---|---|---|---|---|---|---|
| cs21 | broad / or | +0.164 | (-0.189, +0.517) | +0.119 | (-0.264, +0.501) | fails |
| cs21 | broad / ra | +0.287 | (-0.745, +1.319) | -0.033 | (-1.973, +1.907) | fails |
| cs21 | strict / or | +0.163 | (-0.208, +0.533) | +0.145 | (-0.251, +0.541) | fails |
| cs21 | strict / ra | +0.445 | (-1.106, +1.996) | -0.025 | (-2.140, +2.090) | fails |
| stackdd | single / eb | +0.167 | (-0.261, +0.595) | +0.165 | (-0.306, +0.637) | fails |
| stackdd | single / unweighted | +0.167 | (-0.261, +0.595) | +0.165 | (-0.306, +0.637) | fails |
Roth-Sant'Anna sensitivity bounds at event time +1. M = post-trend deviation as a multiple of the linear extrapolation of the observed pre-trend. M=1 = "post-trend looks like more of the same"; M=2 = "post-trend could be twice the pre-trend magnitude".
For small-cohort policies, the literature (Webster 2014, Crifasi 2015, McCourt 2020, Kivisto 2018, Klarevas 2019) uses SCM rather than cohort-pooled DiD because per-event-time DiD estimates are noisy when only 1-4 states adopt. SCM constructs an explicit weighted counterfactual from the donor pool that minimizes pre-period MSPE, then attributes the post-period gap to the treatment. Inference is via permutation: refit SCM on every donor as if treated, compare the actual post-period effect to the placebo distribution.
| Outcome | Post ATT (per 100k) | Placebo p-value |
|---|---|---|
| firearm suicide rate | +0.130 (+1.6% of base) | p = 0.842 placebo n = 38, sd = 0.915, pre RMSE = 0.342 |
| firearm homicide rate | +0.137 (+3.3% of base) | p = 0.838 placebo n = 37, sd = 0.886, pre RMSE = 0.142 |
| homicide rate | +0.400 (+7.0% of base) | p = 0.553 placebo n = 38, sd = 1.162, pre RMSE = 0.255 |
| motor vehicle theft rate | +159.768 * (+47.9% of base) | p = 0.053 placebo n = 38, sd = 83.445, pre RMSE = 24.5 |
Post ATT = mean(treated − synthetic) over the post-treatment years. Placebo p-value: two-sided rank from permutation across all donor states (refitting SCM on each donor as if treated). Stars at 10% / 5% / 1% from the placebo distribution. "% of base" expresses the ATT as a fraction of the all-state mean.
| Outcome | Post ATT (per 100k) | Placebo p-value |
|---|---|---|
| firearm suicide rate | -0.309 (-3.9% of base) | p = 0.658 placebo n = 38, sd = 0.915, pre RMSE = 0.378 |
| firearm homicide rate | -1.190 (-28.7% of base) | p = 0.189 placebo n = 37, sd = 0.886, pre RMSE = 0.271 |
| homicide rate | -0.581 (-10.2% of base) | p = 0.342 placebo n = 38, sd = 1.162, pre RMSE = 0.24 |
| motor vehicle theft rate | -0.734 (-0.2% of base) | p = 1.000 placebo n = 38, sd = 83.445, pre RMSE = 1.69 |
Post ATT = mean(treated − synthetic) over the post-treatment years. Placebo p-value: two-sided rank from permutation across all donor states (refitting SCM on each donor as if treated). Stars at 10% / 5% / 1% from the placebo distribution. "% of base" expresses the ATT as a fraction of the all-state mean.
| Outcome | Post ATT (per 100k) | Placebo p-value |
|---|---|---|
| firearm suicide rate | -0.400 (-5.0% of base) | p = 0.632 placebo n = 38, sd = 1.039, pre RMSE = 0.903 |
| homicide rate | -0.182 (-3.2% of base) | p = 0.789 placebo n = 38, sd = 1.235, pre RMSE = 0.283 |
| motor vehicle theft rate | -191.005 *** (-57.3% of base) | p = 0.000 placebo n = 38, sd = 84.922, pre RMSE = 167 |
Post ATT = mean(treated − synthetic) over the post-treatment years. Placebo p-value: two-sided rank from permutation across all donor states (refitting SCM on each donor as if treated). Stars at 10% / 5% / 1% from the placebo distribution. "% of base" expresses the ATT as a fraction of the all-state mean.
Treatment: age21handgunsale (0 → 1 (state raises minimum handgun-purchase age above the federal 18 floor)).
Detailed write-up: CS21 methodology
and stacked-DiD comparison.
Reading the broad-pool, regression-adjusted Callaway–Sant'Anna spec (the same spec the figure beneath the CS21 table reports), the statistically significant outcomes are:
"% of base" expresses the coefficient as a fraction of the all-state mean of the outcome over the analysis window — useful for an economic-magnitude read. A pre-trend rejection means the treated and control groups were already on diverging paths before the policy took effect, which weakens the causal claim. See §3 for an explanation of the spec grid (broad/strict, OR/RA) and the full 4-spec table below for results under the other specifications.
| Cohort year | n states | States |
|---|---|---|
| 2010 | 2 | WV,WY |
| 2018 | 2 | FL,VT |
| 2019 | 1 | WA |
| 2023 | 1 | CO |
Analysis window: 1999–2023 (state panel post-NICS; last year with v2 firearm-mortality data). Treated-cohort adoptions span 2010–2023.
Event window: [−5, +5] years around adoption (5 leads, 5 lags). This follows the modal modern DiD convention (Roth, Sant'Anna, Bilinski, Poe 2023, J Econometrics; the canonical Callaway–Sant'Anna 2021 framework defaults to symmetric leads/lags). The 5-year window is wide enough to detect dynamic treatment effects that build over time (Cheng-Hoekstra 2013 SYG; McClellan-Tekin 2017), but narrow enough that small-sample inference for the most recent cohorts remains feasible. Pre-trend test averages event-times [−5, −2] so the omitted year (−1) and the immediate post-period (+0, +1) do not contaminate the parallel-trends check (per Borusyak-Jaravel-Spiess 2024 and the Roth-SA bounds methodology).
Strict-pool window: control states must satisfy the policy's no-contamination rule for every year in [g−5, g+5] (the same window as the event study). This avoids "drifting" controls — states that are close to but not yet adopting the policy at g but adopt soon after, which would bias the comparison toward zero (Goodman-Bacon 2021, Sun-Abraham 2021).
Three tiers per outcome family — Minimal / Headline / Expanded — shown in the covariate-sensitivity sub-table below.
Lethal violence (homicide, firearm homicide, total homicide) — Headline: ln_population, ln_pcpi_real_2024, unemployment_rate, poverty_rate, share_age_15_24, share_age_25_44, share_male, share_black_nh, share_hispanic, share_bachelors_plus, imprisonment_rate, sworn_officers_per_100k, alcohol_per_capita_ethanol_gallons
Suicide (firearm, total, non-firearm) — Headline: ln_population, ln_pcpi_real_2024, unemployment_rate, poverty_rate, share_male, share_age_15_24, share_age_25_44, share_bachelors_plus, share_black_nh, share_hispanic, alcohol_per_capita_ethanol_gallons, drug_overdose_per_100k, religion_adherents_pct_2020, ownership_rand
Property / placebo (MV theft) — Headline: ln_population, ln_pcpi_real_2024, unemployment_rate, poverty_rate, share_age_15_24, share_age_25_44, share_male, share_black_nh, share_hispanic, share_bachelors_plus, imprisonment_rate, sworn_officers_per_100k, alcohol_per_capita_ethanol_gallons
| Covariate | Treated mean | Control mean | Normalized diff |
|---|---|---|---|
| ln_population | 14.881 | 15.182 | -0.246 |
| ln_pcpi_real_2024 | 11.077 | 11.023 | +0.309 ⚠ |
| unemployment_rate | 4.826 | 4.910 | -0.038 |
| poverty_rate | 0.121 | 0.131 | -0.328 ⚠ |
| share_age_15_24 | 0.131 | 0.137 | -0.689 ⚠ |
| share_age_25_44 | 0.261 | 0.259 | +0.085 |
| share_male | 0.498 | 0.494 | +0.465 ⚠ |
| share_black_nh | 0.047 | 0.110 | -0.800 ⚠ |
| share_hispanic | 0.122 | 0.116 | +0.062 |
| share_bachelors_plus | 0.319 | 0.307 | +0.154 |
| imprisonment_rate | 330.797 | 405.634 | -0.601 ⚠ |
| sworn_officers_per_100k | 208.702 | 215.661 | -0.142 |
| alcohol_per_capita_ethanol_gallons | 2.488 | 2.450 | +0.072 |
Treated and control means pooled across cohorts at each cohort's g−1 anchor year. Normalized difference = (mean_T − mean_C) / sqrt((sd_T² + sd_C²)/2). Per Imbens & Rubin (2015), |normalized diff| > 0.25 (⚠) indicates covariate imbalance worth flagging — RA / EB reweighting is the standard remedy.
| Outcome | Broad / OR | Broad / RA | Strict / OR | Strict / RA |
|---|---|---|---|---|
| firearm suicide rate | +0.690 *** (+8.6% of base) SE 0.168, z +4.10 pre-z +1.09 ✓ | -0.972 *** (-12.1% of base) SE 0.158, z -6.14 pre-z -4.70 ✗ | +0.582 *** (+7.3% of base) SE 0.169, z +3.44 pre-z +1.59 ✓ | -0.554 *** (-6.9% of base) SE 0.150, z -3.70 pre-z -2.84 ✗ |
| nonfirearm suicide rate | +1.475 *** (+25.2% of base) SE 0.130, z +11.39 pre-z +8.45 ✗ | +1.236 *** (+21.1% of base) SE 0.141, z +8.75 pre-z +2.82 ✗ | +1.423 *** (+24.3% of base) SE 0.130, z +10.94 pre-z +8.03 ✗ | +1.430 *** (+24.4% of base) SE 0.187, z +7.66 pre-z +2.56 ✗ |
| total suicide rate | +2.165 *** (+15.6% of base) SE 0.211, z +10.24 pre-z +6.67 ✗ | +0.263 (+1.9% of base) SE 0.213, z +1.24 pre-z -2.49 ✗ | +2.006 *** (+14.5% of base) SE 0.212, z +9.44 pre-z +6.93 ✗ | +0.876 *** (+6.3% of base) SE 0.219, z +4.01 pre-z +0.44 ✓ |
| firearm homicide rate | -0.620 *** (-15.0% of base) SE 0.068, z -9.08 pre-z -3.16 ✗ | -0.367 *** (-8.8% of base) SE 0.090, z -4.06 pre-z -2.39 ✗ | -0.731 *** (-17.6% of base) SE 0.073, z -9.95 pre-z -1.21 ✓ | -0.263 *** (-6.3% of base) SE 0.089, z -2.94 pre-z -3.18 ✗ |
| homicide rate | -0.319 *** (-5.6% of base) SE 0.076, z -4.19 pre-z -2.29 ✗ | +0.021 (+0.4% of base) SE 0.090, z +0.24 pre-z -1.85 ✓ | -0.374 *** (-6.5% of base) SE 0.081, z -4.64 pre-z -1.60 ✓ | +0.037 (+0.6% of base) SE 0.097, z +0.38 pre-z -2.57 ✗ |
| motor vehicle theft rate | -8.312 * (-2.5% of base) SE 4.984, z -1.67 pre-z -12.60 ✗ | -46.018 *** (-13.8% of base) SE 6.667, z -6.90 pre-z -5.07 ✗ | -10.684 ** (-3.2% of base) SE 5.155, z -2.07 pre-z -10.12 ✗ | -49.160 *** (-14.7% of base) SE 6.413, z -7.67 pre-z -4.23 ✗ |
Stars: * p<0.10, ** p<0.05, *** p<0.01 (two-tailed, state-clustered). "% of base" expresses the ATT as a percentage of the all-state mean of that outcome over the analysis window. ✓ / ✗ on the third line indicates whether the pre-trend test (avg ATT for e ∈ [-5, -2]) does NOT / DOES reject zero. Outcomes are per 100,000 residents.
| Outcome | Minimal | Headline | Expanded |
|---|---|---|---|
| firearm suicide rate | +0.190 * (+2.4% of base) SE 0.101, z +1.88 | -0.972 *** (-12.1% of base) SE 0.158, z -6.14 | -0.816 *** (-10.2% of base) SE 0.161, z -5.07 |
| nonfirearm suicide rate | +1.208 *** (+20.6% of base) SE 0.080, z +15.17 | +1.236 *** (+21.1% of base) SE 0.141, z +8.75 | +0.791 *** (+13.5% of base) SE 0.144, z +5.48 |
| total suicide rate | +1.398 *** (+10.1% of base) SE 0.119, z +11.75 | +0.263 (+1.9% of base) SE 0.213, z +1.24 | -0.025 (-0.2% of base) SE 0.217, z -0.12 |
| firearm homicide rate | -0.544 *** (-13.1% of base) SE 0.053, z -10.17 | -0.367 *** (-8.8% of base) SE 0.090, z -4.06 | -0.792 *** (-19.1% of base) SE 0.097, z -8.17 |
| homicide rate | -0.429 *** (-7.5% of base) SE 0.061, z -7.03 | +0.021 (+0.4% of base) SE 0.090, z +0.24 | -0.199 ** (-3.5% of base) SE 0.098, z -2.02 |
| motor vehicle theft rate | -53.411 *** (-16.0% of base) SE 5.208, z -10.26 | -46.018 *** (-13.8% of base) SE 6.667, z -6.90 | -54.266 *** (-16.3% of base) SE 6.798, z -7.98 |
Each column uses a different literature-backed covariate set (see §3 methodology preamble for definitions). Stars: * p<0.10, ** p<0.05, *** p<0.01. A coefficient that flips sign or loses significance across tiers is sensitive to covariate choice — interpret with care, per Donohue-Aneja-Weber 2019.
| Outcome | Unweighted | Regression-adjusted | Entropy-balanced |
|---|---|---|---|
| firearm suicide rate | -0.050 (-0.6% of base) SE 0.150, z -0.34 | — | -0.050 (-0.6% of base) SE 0.150, z -0.34 |
| nonfirearm suicide rate | +0.202 (+3.5% of base) SE 0.280, z +0.72 | — | +0.202 (+3.5% of base) SE 0.280, z +0.72 |
| total suicide rate | +0.152 (+1.1% of base) SE 0.413, z +0.37 | — | +0.152 (+1.1% of base) SE 0.413, z +0.37 |
| firearm homicide rate | -0.419 (-10.1% of base) SE 0.323, z -1.30 | — | -0.419 (-10.1% of base) SE 0.323, z -1.30 |
| homicide rate | -0.265 (-4.6% of base) SE 0.313, z -0.85 | — | -0.265 (-4.6% of base) SE 0.313, z -0.85 |
| motor vehicle theft rate | +14.589 (+4.4% of base) SE 22.486, z +0.65 | — | +14.589 (+4.4% of base) SE 22.486, z +0.65 |
Stars: * p<0.10, ** p<0.05, *** p<0.01 (two-tailed, state-clustered). "% of base" expresses the ATT as a percentage of the all-state mean of that outcome. Outcomes per 100,000 residents.
| Estimator | Spec | ATT(+1) | 95% CI (M=0) | ATT(+1) trend-adj | 95% CI (M=1) | M=1 verdict |
|---|---|---|---|---|---|---|
| cs21 | broad / or | +0.003 | (-0.435, +0.441) | -0.505 | (-1.042, +0.032) | fails |
| cs21 | broad / ra | -1.201 | (-1.616, -0.786) | -0.534 | (-1.712, +0.644) | fails |
| cs21 | strict / or | +0.042 | (-0.406, +0.490) | -0.372 | (-0.927, +0.184) | fails |
| cs21 | strict / ra | -1.121 | (-1.594, -0.649) | -0.423 | (-1.888, +1.043) | fails |
| stackdd | single / eb | -0.137 | (-0.465, +0.191) | -0.420 | (-1.095, +0.254) | fails |
| stackdd | single / unweighted | -0.137 | (-0.465, +0.191) | -0.420 | (-1.095, +0.254) | fails |
Roth-Sant'Anna sensitivity bounds at event time +1. M = post-trend deviation as a multiple of the linear extrapolation of the observed pre-trend. M=1 = "post-trend looks like more of the same"; M=2 = "post-trend could be twice the pre-trend magnitude".
For small-cohort policies, the literature (Webster 2014, Crifasi 2015, McCourt 2020, Kivisto 2018, Klarevas 2019) uses SCM rather than cohort-pooled DiD because per-event-time DiD estimates are noisy when only 1-4 states adopt. SCM constructs an explicit weighted counterfactual from the donor pool that minimizes pre-period MSPE, then attributes the post-period gap to the treatment. Inference is via permutation: refit SCM on every donor as if treated, compare the actual post-period effect to the placebo distribution.
| Outcome | Post ATT (per 100k) | Placebo p-value |
|---|---|---|
| firearm suicide rate | -0.489 (-6.1% of base) | p = 0.467 placebo n = 30, sd = 0.723, pre RMSE = 0.173 |
| firearm homicide rate | -1.300 (-31.3% of base) | p = 0.103 placebo n = 29, sd = 1.024, pre RMSE = 0.164 |
| homicide rate | -0.969 (-16.9% of base) | p = 0.267 placebo n = 30, sd = 1.407, pre RMSE = 0.111 |
| motor vehicle theft rate | -86.367 (-25.9% of base) | p = 0.300 placebo n = 30, sd = 86.317, pre RMSE = 7.27 |
Post ATT = mean(treated − synthetic) over the post-treatment years. Placebo p-value: two-sided rank from permutation across all donor states (refitting SCM on each donor as if treated). Stars at 10% / 5% / 1% from the placebo distribution. "% of base" expresses the ATT as a fraction of the all-state mean.
| Outcome | Post ATT (per 100k) | Placebo p-value |
|---|---|---|
| firearm suicide rate | -0.544 (-6.8% of base) | p = 0.433 placebo n = 30, sd = 0.723, pre RMSE = 0.913 |
| homicide rate | -0.130 (-2.3% of base) | p = 0.900 placebo n = 30, sd = 1.407, pre RMSE = 0.404 |
| motor vehicle theft rate | -157.296 * (-47.2% of base) | p = 0.100 placebo n = 30, sd = 86.317, pre RMSE = 144 |
Post ATT = mean(treated − synthetic) over the post-treatment years. Placebo p-value: two-sided rank from permutation across all donor states (refitting SCM on each donor as if treated). Stars at 10% / 5% / 1% from the placebo distribution. "% of base" expresses the ATT as a fraction of the all-state mean.
| Outcome | Post ATT (per 100k) | Placebo p-value |
|---|---|---|
| firearm suicide rate | -0.536 (-6.7% of base) | p = 0.452 placebo n = 31, sd = 0.679, pre RMSE = 0.25 |
| firearm homicide rate | +0.234 (+5.6% of base) | p = 0.767 placebo n = 30, sd = 1.069, pre RMSE = 0.105 |
| homicide rate | +0.307 (+5.4% of base) | p = 0.774 placebo n = 31, sd = 1.423, pre RMSE = 0.154 |
| motor vehicle theft rate | +76.614 (+23.0% of base) | p = 0.323 placebo n = 31, sd = 82.126, pre RMSE = 52.6 |
Post ATT = mean(treated − synthetic) over the post-treatment years. Placebo p-value: two-sided rank from permutation across all donor states (refitting SCM on each donor as if treated). Stars at 10% / 5% / 1% from the placebo distribution. "% of base" expresses the ATT as a fraction of the all-state mean.
| Outcome | Post ATT (per 100k) | Placebo p-value |
|---|---|---|
| firearm suicide rate | -0.372 (-4.6% of base) | p = 0.600 placebo n = 30, sd = 1.031, pre RMSE = 0.513 |
| firearm homicide rate | -0.324 (-7.8% of base) | p = 0.690 placebo n = 29, sd = 0.800, pre RMSE = 0.308 |
| homicide rate | +0.663 (+11.6% of base) | p = 0.300 placebo n = 30, sd = 1.139, pre RMSE = 0.512 |
| motor vehicle theft rate | -84.041 (-25.2% of base) | p = 0.233 placebo n = 30, sd = 77.416, pre RMSE = 74.2 |
Post ATT = mean(treated − synthetic) over the post-treatment years. Placebo p-value: two-sided rank from permutation across all donor states (refitting SCM on each donor as if treated). Stars at 10% / 5% / 1% from the placebo distribution. "% of base" expresses the ATT as a fraction of the all-state mean.
| Outcome | Post ATT (per 100k) | Placebo p-value |
|---|---|---|
| firearm suicide rate | +1.459 (+18.2% of base) | p = 0.133 placebo n = 30, sd = 1.031, pre RMSE = 2.37 |
| firearm homicide rate | -0.122 (-2.9% of base) | p = 0.931 placebo n = 29, sd = 0.800, pre RMSE = 0.328 |
| homicide rate | -0.167 (-2.9% of base) | p = 0.733 placebo n = 30, sd = 1.139, pre RMSE = 0.354 |
| motor vehicle theft rate | -74.037 (-22.2% of base) | p = 0.300 placebo n = 30, sd = 77.416, pre RMSE = 126 |
Post ATT = mean(treated − synthetic) over the post-treatment years. Placebo p-value: two-sided rank from permutation across all donor states (refitting SCM on each donor as if treated). Stars at 10% / 5% / 1% from the placebo distribution. "% of base" expresses the ATT as a fraction of the all-state mean.
Treatment: assault (0 → 1 (state prohibits long-gun assault weapons; HI-style pistols-only bans excluded per Tufts coding)).
Detailed write-up: CS21 methodology
and stacked-DiD comparison.
Reading the broad-pool, regression-adjusted Callaway–Sant'Anna spec (the same spec the figure beneath the CS21 table reports), the statistically significant outcomes are:
"% of base" expresses the coefficient as a fraction of the all-state mean of the outcome over the analysis window — useful for an economic-magnitude read. A pre-trend rejection means the treated and control groups were already on diverging paths before the policy took effect, which weakens the causal claim. See §3 for an explanation of the spec grid (broad/strict, OR/RA) and the full 4-spec table below for results under the other specifications.
| Cohort year | n states | States |
|---|---|---|
| 2013 | 1 | MD |
| 2022 | 1 | DE |
| 2023 | 2 | IL,WA |
Analysis window: 1999–2023 (state panel post-NICS; last year with v2 firearm-mortality data). Treated-cohort adoptions span 2013–2023.
Event window: [−5, +5] years around adoption (5 leads, 5 lags). This follows the modal modern DiD convention (Roth, Sant'Anna, Bilinski, Poe 2023, J Econometrics; the canonical Callaway–Sant'Anna 2021 framework defaults to symmetric leads/lags). The 5-year window is wide enough to detect dynamic treatment effects that build over time (Cheng-Hoekstra 2013 SYG; McClellan-Tekin 2017), but narrow enough that small-sample inference for the most recent cohorts remains feasible. Pre-trend test averages event-times [−5, −2] so the omitted year (−1) and the immediate post-period (+0, +1) do not contaminate the parallel-trends check (per Borusyak-Jaravel-Spiess 2024 and the Roth-SA bounds methodology).
Strict-pool window: control states must satisfy the policy's no-contamination rule for every year in [g−5, g+5] (the same window as the event study). This avoids "drifting" controls — states that are close to but not yet adopting the policy at g but adopt soon after, which would bias the comparison toward zero (Goodman-Bacon 2021, Sun-Abraham 2021).
Three tiers per outcome family — Minimal / Headline / Expanded — shown in the covariate-sensitivity sub-table below.
Lethal violence (homicide, firearm homicide, total homicide) — Headline: ln_population, ln_pcpi_real_2024, unemployment_rate, poverty_rate, share_age_15_24, share_age_25_44, share_male, share_black_nh, share_hispanic, share_bachelors_plus, imprisonment_rate, sworn_officers_per_100k, alcohol_per_capita_ethanol_gallons
Suicide (firearm, total, non-firearm) — Headline: ln_population, ln_pcpi_real_2024, unemployment_rate, poverty_rate, share_male, share_age_15_24, share_age_25_44, share_bachelors_plus, share_black_nh, share_hispanic, alcohol_per_capita_ethanol_gallons, drug_overdose_per_100k, religion_adherents_pct_2020, ownership_rand
Property / placebo (MV theft) — Headline: ln_population, ln_pcpi_real_2024, unemployment_rate, poverty_rate, share_age_15_24, share_age_25_44, share_male, share_black_nh, share_hispanic, share_bachelors_plus, imprisonment_rate, sworn_officers_per_100k, alcohol_per_capita_ethanol_gallons
| Covariate | Treated mean | Control mean | Normalized diff |
|---|---|---|---|
| ln_population | 15.407 | 15.152 | +0.242 |
| ln_pcpi_real_2024 | 11.207 | 11.082 | +1.013 ⚠ |
| unemployment_rate | 5.244 | 5.057 | +0.108 |
| poverty_rate | 0.109 | 0.135 | -1.081 ⚠ |
| share_age_15_24 | 0.128 | 0.135 | -0.835 ⚠ |
| share_age_25_44 | 0.270 | 0.260 | +0.580 ⚠ |
| share_male | 0.492 | 0.497 | -0.568 ⚠ |
| share_black_nh | 0.174 | 0.097 | +0.764 ⚠ |
| share_hispanic | 0.132 | 0.121 | +0.131 |
| share_bachelors_plus | 0.374 | 0.319 | +1.278 ⚠ |
| imprisonment_rate | 313.980 | 367.896 | -0.378 ⚠ |
| sworn_officers_per_100k | 221.798 | 205.700 | +0.272 ⚠ |
| alcohol_per_capita_ethanol_gallons | 2.210 | 2.461 | -0.668 ⚠ |
Treated and control means pooled across cohorts at each cohort's g−1 anchor year. Normalized difference = (mean_T − mean_C) / sqrt((sd_T² + sd_C²)/2). Per Imbens & Rubin (2015), |normalized diff| > 0.25 (⚠) indicates covariate imbalance worth flagging — RA / EB reweighting is the standard remedy.
| Outcome | Broad / OR | Broad / RA | Strict / OR | Strict / RA |
|---|---|---|---|---|
| firearm suicide rate | -0.946 *** (-11.8% of base) SE 0.020, z -47.51 pre-z -4.71 ✗ | -0.769 (-9.6% of base) SE 0.000, z +nan pre-z +nan ✗ | -1.020 *** (-12.7% of base) SE 0.022, z -46.46 pre-z -3.85 ✗ | -0.420 (-5.2% of base) SE 0.000, z +nan pre-z +nan ✗ |
| nonfirearm suicide rate | -0.148 *** (-2.5% of base) SE 0.015, z -10.22 pre-z +1.95 ✓ | +0.839 (+14.3% of base) SE 0.000, z +nan pre-z +nan ✗ | -0.159 *** (-2.7% of base) SE 0.016, z -10.21 pre-z +2.31 ✗ | +0.890 (+15.2% of base) SE 0.000, z +nan pre-z +nan ✗ |
| total suicide rate | -1.094 *** (-7.9% of base) SE 0.023, z -48.27 pre-z -1.58 ✓ | +0.070 (+0.5% of base) SE 0.000, z +nan pre-z +nan ✗ | -1.179 *** (-8.5% of base) SE 0.025, z -47.23 pre-z -0.89 ✓ | +0.470 (+3.4% of base) SE 0.000, z +nan pre-z +nan ✗ |
| firearm homicide rate | +0.422 *** (+10.2% of base) SE 0.051, z +8.26 pre-z -1.55 ✓ | +0.620 (+14.9% of base) SE 0.000, z +nan pre-z +nan ✗ | +0.327 *** (+7.9% of base) SE 0.051, z +6.36 pre-z -1.25 ✓ | +0.548 (+13.2% of base) SE 0.000, z +nan pre-z +nan ✗ |
| homicide rate | +0.344 *** (+6.0% of base) SE 0.049, z +7.02 pre-z -3.07 ✗ | +1.443 (+25.2% of base) SE 0.000, z +nan pre-z +nan ✗ | +0.266 *** (+4.7% of base) SE 0.050, z +5.30 pre-z -2.85 ✗ | +0.852 (+14.9% of base) SE 0.000, z +nan pre-z +nan ✗ |
| motor vehicle theft rate | -22.366 *** (-6.7% of base) SE 1.482, z -15.09 pre-z -4.79 ✗ | +40.959 (+12.3% of base) SE 0.000, z +nan pre-z +nan ✗ | -25.118 *** (-7.5% of base) SE 1.607, z -15.64 pre-z -4.81 ✗ | +41.336 (+12.4% of base) SE 0.000, z +nan pre-z +nan ✗ |
Stars: * p<0.10, ** p<0.05, *** p<0.01 (two-tailed, state-clustered). "% of base" expresses the ATT as a percentage of the all-state mean of that outcome over the analysis window. ✓ / ✗ on the third line indicates whether the pre-trend test (avg ATT for e ∈ [-5, -2]) does NOT / DOES reject zero. Outcomes are per 100,000 residents.
| Outcome | Minimal | Headline | Expanded |
|---|---|---|---|
| firearm suicide rate | -0.118 *** (-1.5% of base) SE 0.016, z -7.45 | -0.769 (-9.6% of base) SE 0.000, z +nan | -0.716 (-8.9% of base) SE 0.000, z +nan |
| nonfirearm suicide rate | -0.141 *** (-2.4% of base) SE 0.015, z -9.42 | +0.839 (+14.3% of base) SE 0.000, z +nan | +0.984 (+16.8% of base) SE 0.000, z +nan |
| total suicide rate | -0.259 *** (-1.9% of base) SE 0.019, z -13.59 | +0.070 (+0.5% of base) SE 0.000, z +nan | +0.268 (+1.9% of base) SE 0.000, z +nan |
| firearm homicide rate | -0.043 * (-1.0% of base) SE 0.023, z -1.91 | +0.620 (+14.9% of base) SE 0.000, z +nan | +0.013 (+0.3% of base) SE 0.000, z +nan |
| homicide rate | +0.173 *** (+3.0% of base) SE 0.029, z +5.86 | +1.443 (+25.2% of base) SE 0.000, z +nan | +0.204 (+3.6% of base) SE 0.000, z +nan |
| motor vehicle theft rate | -4.764 * (-1.4% of base) SE 2.533, z -1.88 | +40.959 (+12.3% of base) SE 0.000, z +nan | +31.186 (+9.4% of base) SE 0.000, z +nan |
Each column uses a different literature-backed covariate set (see §3 methodology preamble for definitions). Stars: * p<0.10, ** p<0.05, *** p<0.01. A coefficient that flips sign or loses significance across tiers is sensitive to covariate choice — interpret with care, per Donohue-Aneja-Weber 2019.
| Outcome | Unweighted | Regression-adjusted | Entropy-balanced |
|---|---|---|---|
| firearm suicide rate | -0.261 (-3.3% of base) SE 0.517, z -0.51 | — | -0.261 (-3.3% of base) SE 0.517, z -0.51 |
| nonfirearm suicide rate | -0.085 (-1.4% of base) SE 0.186, z -0.46 | — | -0.085 (-1.4% of base) SE 0.186, z -0.46 |
| total suicide rate | -0.346 (-2.5% of base) SE 0.675, z -0.51 | — | -0.346 (-2.5% of base) SE 0.675, z -0.51 |
| firearm homicide rate | -0.383 (-9.2% of base) SE 0.645, z -0.59 | — | -0.383 (-9.2% of base) SE 0.645, z -0.59 |
| homicide rate | -0.583 (-10.2% of base) SE 0.640, z -0.91 | — | -0.583 (-10.2% of base) SE 0.640, z -0.91 |
| motor vehicle theft rate | +4.871 (+1.5% of base) SE 62.135, z +0.08 | — | +4.871 (+1.5% of base) SE 62.135, z +0.08 |
Stars: * p<0.10, ** p<0.05, *** p<0.01 (two-tailed, state-clustered). "% of base" expresses the ATT as a percentage of the all-state mean of that outcome. Outcomes per 100,000 residents.
| Estimator | Spec | ATT(+1) | 95% CI (M=0) | ATT(+1) trend-adj | 95% CI (M=1) | M=1 verdict |
|---|---|---|---|---|---|---|
| cs21 | broad / or | -0.095 | (-0.095, -0.095) | +0.211 | (-0.142, +0.564) | fails |
| cs21 | broad / ra | -0.452 | (-0.452, -0.452) | +0.649 | (-0.550, +1.848) | fails |
| cs21 | strict / or | -0.086 | (-0.086, -0.086) | +0.263 | (-0.095, +0.620) | fails |
| cs21 | strict / ra | +0.243 | (+0.243, +0.243) | +1.300 | (+0.623, +1.976) | survives |
| stackdd | single / eb | +0.549 | (+0.228, +0.871) | +1.154 | (+0.377, +1.930) | survives |
| stackdd | single / unweighted | +0.549 | (+0.228, +0.871) | +1.154 | (+0.377, +1.930) | survives |
Roth-Sant'Anna sensitivity bounds at event time +1. M = post-trend deviation as a multiple of the linear extrapolation of the observed pre-trend. M=1 = "post-trend looks like more of the same"; M=2 = "post-trend could be twice the pre-trend magnitude".
For small-cohort policies, the literature (Webster 2014, Crifasi 2015, McCourt 2020, Kivisto 2018, Klarevas 2019) uses SCM rather than cohort-pooled DiD because per-event-time DiD estimates are noisy when only 1-4 states adopt. SCM constructs an explicit weighted counterfactual from the donor pool that minimizes pre-period MSPE, then attributes the post-period gap to the treatment. Inference is via permutation: refit SCM on every donor as if treated, compare the actual post-period effect to the placebo distribution.
| Outcome | Post ATT (per 100k) | Placebo p-value |
|---|---|---|
| firearm homicide rate | +0.012 (+0.3% of base) | p = 1.000 placebo n = 39, sd = 0.872, pre RMSE = 0.343 |
| homicide rate | -0.047 (-0.8% of base) | p = 0.976 placebo n = 41, sd = 1.130, pre RMSE = 0.425 |
| motor vehicle theft rate | -38.126 (-11.4% of base) | p = 0.683 placebo n = 41, sd = 93.026, pre RMSE = 13.9 |
Post ATT = mean(treated − synthetic) over the post-treatment years. Placebo p-value: two-sided rank from permutation across all donor states (refitting SCM on each donor as if treated). Stars at 10% / 5% / 1% from the placebo distribution. "% of base" expresses the ATT as a fraction of the all-state mean.
Border-county pair design adapted from Dube, Lester & Reich (2010, RESTAT) to firearm policy. County FE + state-pair × year FE; iterative within-FE Frisch-Waugh-Lovell. Identifying variation comes from differential outcomes between adjacent counties on opposite sides of a state border. Bandwidth = 100 km (centroid distance to nearest other-state population centroid; geometry layer documented in §2.12 of data_appendix.md). Per-policy estimator detail and the 10-spec robustness battery: see outputs/border_rdd/methodology.md.
Outcomes are stratified into primary (true county-level Kaplan UCR rates: violent crime, murder, property crime, burglary, motor vehicle theft) and secondary (state-joined-down mortality — no within-state variation by construction; reported only as a sanity check against the existing CS21 results restricted to the border subsample).
| Outcome | Stratum | β (per 100k) [SE, z] | n | state pairs |
|---|---|---|---|---|
| county_violent_crime_rate | primary | -1.307 (-0.6% of base) SE 6.476, z -0.20 | 31248 | 101 |
| county_murder_rate | primary | -1.183 ** (-33.7% of base) SE 0.547, z -2.16 | 31248 | 101 |
| county_property_crime_rate | primary | +46.630 * (+3.0% of base) SE 23.922, z +1.95 | 31248 | 101 |
| county_burglary_rate | primary | +11.907 * (+3.3% of base) SE 6.250, z +1.91 | 31248 | 101 |
| county_motor_vehicle_theft_rate | primary | +1.640 (+1.4% of base) SE 3.518, z +0.47 | 31248 | 101 |
| state_firearm_suicide_rate | secondary | +0.362 *** (+4.5% of base) SE 0.110, z +3.29 | 29295 | 101 |
| state_total_suicide_rate | secondary | +0.541 *** (+3.9% of base) SE 0.167, z +3.24 | 29295 | 101 |
| state_nonfirearm_suicide_rate | secondary | +0.179 * (+3.1% of base) SE 0.100, z +1.79 | 29295 | 101 |
| state_firearm_homicide_rate | secondary | +0.284 ** (+6.8% of base) SE 0.133, z +2.13 | 29271 | 101 |
| Outcome | Stratum | β (per 100k) [SE, z] | n | state pairs |
|---|---|---|---|---|
| county_violent_crime_rate | primary | -23.807 * (-10.0% of base) SE 13.520, z -1.76 | 31248 | 101 |
| county_murder_rate | primary | -2.184 * (-62.3% of base) SE 1.143, z -1.91 | 31248 | 101 |
| county_property_crime_rate | primary | -16.144 (-1.0% of base) SE 33.813, z -0.48 | 31248 | 101 |
| county_burglary_rate | primary | +12.827 (+3.6% of base) SE 9.664, z +1.33 | 31248 | 101 |
| county_motor_vehicle_theft_rate | primary | -3.135 (-2.8% of base) SE 5.790, z -0.54 | 31248 | 101 |
| state_firearm_suicide_rate | secondary | -0.704 *** (-8.8% of base) SE 0.063, z -11.10 | 29295 | 101 |
| state_total_suicide_rate | secondary | -0.547 *** (-3.9% of base) SE 0.106, z -5.15 | 29295 | 101 |
| state_nonfirearm_suicide_rate | secondary | +0.157 * (+2.7% of base) SE 0.085, z +1.84 | 29295 | 101 |
| state_firearm_homicide_rate | secondary | +0.194 (+4.7% of base) SE 0.207, z +0.94 | 29271 | 101 |
| Outcome | Stratum | β (per 100k) [SE, z] | n | state pairs |
|---|---|---|---|---|
| county_violent_crime_rate | primary | +19.038 ** (+8.0% of base) SE 8.992, z +2.12 | 31248 | 101 |
| county_murder_rate | primary | -0.598 *** (-17.0% of base) SE 0.154, z -3.89 | 31248 | 101 |
| county_property_crime_rate | primary | +95.908 ** (+6.2% of base) SE 47.950, z +2.00 | 31248 | 101 |
| county_burglary_rate | primary | +42.441 * (+11.8% of base) SE 22.583, z +1.88 | 31248 | 101 |
| county_motor_vehicle_theft_rate | primary | -2.726 (-2.4% of base) SE 9.467, z -0.29 | 31248 | 101 |
| state_firearm_suicide_rate | secondary | -0.259 ** (-3.2% of base) SE 0.118, z -2.19 | 29295 | 101 |
| state_total_suicide_rate | secondary | -0.440 *** (-3.2% of base) SE 0.131, z -3.35 | 29295 | 101 |
| state_nonfirearm_suicide_rate | secondary | -0.181 * (-3.1% of base) SE 0.096, z -1.87 | 29295 | 101 |
| state_firearm_homicide_rate | secondary | +0.057 (+1.4% of base) SE 0.249, z +0.23 | 29271 | 101 |
| Outcome | Stratum | β (per 100k) [SE, z] | n | state pairs |
|---|---|---|---|---|
| county_violent_crime_rate | primary | +27.017 *** (+11.4% of base) SE 8.844, z +3.06 | 31248 | 101 |
| county_murder_rate | primary | -0.954 (-27.2% of base) SE 0.721, z -1.32 | 31248 | 101 |
| county_property_crime_rate | primary | +38.732 (+2.5% of base) SE 29.577, z +1.31 | 31248 | 101 |
| county_burglary_rate | primary | -6.520 (-1.8% of base) SE 10.032, z -0.65 | 31248 | 101 |
| county_motor_vehicle_theft_rate | primary | +8.784 * (+7.7% of base) SE 4.970, z +1.77 | 31248 | 101 |
| state_firearm_suicide_rate | secondary | +0.594 *** (+7.4% of base) SE 0.130, z +4.59 | 29295 | 101 |
| state_total_suicide_rate | secondary | +0.479 *** (+3.5% of base) SE 0.157, z +3.05 | 29295 | 101 |
| state_nonfirearm_suicide_rate | secondary | -0.115 (-2.0% of base) SE 0.103, z -1.12 | 29295 | 101 |
| state_firearm_homicide_rate | secondary | +0.203 (+4.9% of base) SE 0.174, z +1.17 | 29271 | 101 |
| Outcome | Stratum | β (per 100k) [SE, z] | n | state pairs |
|---|---|---|---|---|
| county_violent_crime_rate | primary | +9.074 (+3.8% of base) SE 12.882, z +0.70 | 31248 | 101 |
| county_murder_rate | primary | -1.315 (-37.5% of base) SE 0.867, z -1.52 | 31248 | 101 |
| county_property_crime_rate | primary | +93.362 ** (+6.0% of base) SE 46.375, z +2.01 | 31248 | 101 |
| county_burglary_rate | primary | +14.299 (+4.0% of base) SE 22.276, z +0.64 | 31248 | 101 |
| county_motor_vehicle_theft_rate | primary | +10.347 ** (+9.1% of base) SE 5.033, z +2.06 | 31248 | 101 |
| state_firearm_suicide_rate | secondary | -0.165 (-2.1% of base) SE 0.150, z -1.10 | 29295 | 101 |
| state_total_suicide_rate | secondary | +0.171 (+1.2% of base) SE 0.263, z +0.65 | 29295 | 101 |
| state_nonfirearm_suicide_rate | secondary | +0.336 (+5.7% of base) SE 0.207, z +1.63 | 29295 | 101 |
| state_firearm_homicide_rate | secondary | +0.229 ** (+5.5% of base) SE 0.107, z +2.14 | 29271 | 101 |
| Outcome | Stratum | β (per 100k) [SE, z] | n | state pairs |
|---|---|---|---|---|
| county_violent_crime_rate | primary | -31.284 (-13.2% of base) SE 30.205, z -1.04 | 31248 | 101 |
| county_murder_rate | primary | -0.464 (-13.2% of base) SE 0.343, z -1.35 | 31248 | 101 |
| county_property_crime_rate | primary | -269.022 *** (-17.4% of base) SE 75.955, z -3.54 | 31248 | 101 |
| county_burglary_rate | primary | -56.515 *** (-15.7% of base) SE 12.827, z -4.41 | 31248 | 101 |
| county_motor_vehicle_theft_rate | primary | -23.558 *** (-20.8% of base) SE 5.909, z -3.99 | 31248 | 101 |
| state_firearm_suicide_rate | secondary | -0.189 (-2.4% of base) SE 0.236, z -0.80 | 29295 | 101 |
| state_total_suicide_rate | secondary | -0.011 (-0.1% of base) SE 0.590, z -0.02 | 29295 | 101 |
| state_nonfirearm_suicide_rate | secondary | +0.178 (+3.0% of base) SE 0.365, z +0.49 | 29295 | 101 |
| state_firearm_homicide_rate | secondary | -0.820 * (-19.8% of base) SE 0.421, z -1.95 | 29271 | 101 |
| Outcome | Stratum | β (per 100k) [SE, z] | n | state pairs |
|---|---|---|---|---|
| county_violent_crime_rate | primary | -15.629 (-6.6% of base) SE 10.746, z -1.45 | 31248 | 101 |
| county_murder_rate | primary | -2.190 ** (-62.4% of base) SE 0.961, z -2.28 | 31248 | 101 |
| county_property_crime_rate | primary | +7.473 (+0.5% of base) SE 74.992, z +0.10 | 31248 | 101 |
| county_burglary_rate | primary | +21.806 (+6.1% of base) SE 26.778, z +0.81 | 31248 | 101 |
| county_motor_vehicle_theft_rate | primary | +11.118 * (+9.8% of base) SE 6.195, z +1.79 | 31248 | 101 |
| state_firearm_suicide_rate | secondary | -0.661 *** (-8.2% of base) SE 0.137, z -4.82 | 29295 | 101 |
| state_total_suicide_rate | secondary | -0.474 (-3.4% of base) SE 0.352, z -1.35 | 29295 | 101 |
| state_nonfirearm_suicide_rate | secondary | +0.187 (+3.2% of base) SE 0.244, z +0.76 | 29295 | 101 |
| state_firearm_homicide_rate | secondary | +0.544 *** (+13.1% of base) SE 0.185, z +2.94 | 29271 | 101 |
A county-grain adaptation of the existing state-level Callaway-Sant'Anna
pipeline. Unit of observation is county_fips; cohorts are
constructed by state (since treatment is state-level law adoption); the
cluster-bootstrap clusters at state because counties within a
state share the policy assignment. Many counties per cohort = much tighter
SEs than the state-level pipeline. Outcomes are the true county-level
Kaplan UCR rates plus the state-joined-down mortality variables (the
latter, again, identified at state grain — included only for cross-method
consistency). Estimator: scripts/lib_cs_county.py.
| Outcome | ATT post (per 100k) [SE, z] | Pre-trend avg (z) | n post cells |
|---|---|---|---|
| county_burglary_rate | -4.012 (-1.1% of base) SE 2.865, z -1.40 | +4.563 (z=+1.59) | 43 |
| county_motor_vehicle_theft_rate | -6.967 *** (-6.1% of base) SE 1.760, z -3.96 | -7.113 (z=-2.80) | 43 |
| county_murder_rate | -0.287 ** (-8.2% of base) SE 0.114, z -2.51 | -0.674 (z=-2.23) | 43 |
| county_property_crime_rate | +6.846 (+0.4% of base) SE 8.941, z +0.77 | +22.956 (z=+1.89) | 43 |
| county_violent_crime_rate | -10.826 *** (-4.6% of base) SE 2.031, z -5.33 | -2.542 (z=-0.89) | 43 |
| state_firearm_homicide_rate | +0.132 ** (+3.2% of base) SE 0.067, z +1.97 | -0.180 (z=-4.25) | 35 |
| state_firearm_suicide_rate | +0.503 *** (+6.3% of base) SE 0.037, z +13.49 | -0.123 (z=-2.92) | 35 |
| state_total_suicide_rate | +0.418 *** (+3.0% of base) SE 0.051, z +8.16 | -0.299 (z=-5.50) | 35 |
| Outcome | ATT post (per 100k) [SE, z] | Pre-trend avg (z) | n post cells |
|---|---|---|---|
| county_burglary_rate | +18.557 *** (+5.2% of base) SE 3.778, z +4.91 | -18.558 (z=-9.64) | 30 |
| county_motor_vehicle_theft_rate | +0.828 (+0.7% of base) SE 2.898, z +0.29 | -1.927 (z=-1.11) | 30 |
| county_murder_rate | -0.587 *** (-16.7% of base) SE 0.065, z -9.06 | +1.505 (z=+2.83) | 30 |
| county_property_crime_rate | +64.431 *** (+4.2% of base) SE 18.625, z +3.46 | -57.723 (z=-5.36) | 30 |
| county_violent_crime_rate | -11.739 *** (-4.9% of base) SE 3.176, z -3.70 | -4.047 (z=-1.66) | 30 |
| state_firearm_homicide_rate | -0.572 *** (-13.8% of base) SE 0.066, z -8.63 | +0.290 (z=+5.71) | 24 |
| state_firearm_suicide_rate | -0.226 *** (-2.8% of base) SE 0.034, z -6.66 | +0.306 (z=+8.35) | 24 |
| state_total_suicide_rate | -0.140 *** (-1.0% of base) SE 0.046, z -3.05 | +0.239 (z=+4.83) | 24 |
| Outcome | ATT post (per 100k) [SE, z] | Pre-trend avg (z) | n post cells |
|---|---|---|---|
| county_burglary_rate | -5.807 *** (-1.6% of base) SE 1.261, z -4.61 | -35.416 (z=-18.45) | 51 |
| county_motor_vehicle_theft_rate | +11.461 *** (+10.1% of base) SE 0.697, z +16.44 | +26.614 (z=+45.91) | 51 |
| county_murder_rate | -1.037 *** (-29.6% of base) SE 0.062, z -16.64 | -0.706 (z=-8.96) | 51 |
| county_property_crime_rate | +39.852 *** (+2.6% of base) SE 5.400, z +7.38 | -78.174 (z=-13.20) | 51 |
| county_violent_crime_rate | -12.095 *** (-5.1% of base) SE 1.221, z -9.91 | -23.021 (z=-15.50) | 51 |
| state_firearm_homicide_rate | -0.401 *** (-9.7% of base) SE 0.024, z -16.92 | -0.075 (z=-5.10) | 44 |
| state_firearm_suicide_rate | -0.236 *** (-3.0% of base) SE 0.017, z -13.80 | +0.070 (z=+3.45) | 44 |
| state_total_suicide_rate | -0.449 *** (-3.2% of base) SE 0.032, z -14.17 | +0.070 (z=+2.20) | 44 |
Cross-method check: the county-grain CS21 should produce point estimates that broadly agree with the state-level CS21 once weighted to comparable population. Where signs disagree, that is informative — it suggests the effect is concentrated in particular counties rather than uniform across the adopting state.
Across three policies × two estimators × multiple specifications, two findings are robust enough to be the lede of a paper:
The other six "headline" cells (red-flag suicide, UBC suicide, UBC homicide, permitless-carry homicide, all of which were significant in some specifications) do not survive the joint set of robustness checks documented in this report. That is itself a finding — most published single-estimator results on these questions probably overstate what the data identify.
| Component | Script | Output |
|---|---|---|
| Shared CS21 machinery | scripts/cs_lib.py | — |
| Shared stacked-DiD machinery | scripts/lib_stacked_dd.py | — |
| Permitless carry: CS21 | scripts/run_cs_permitless_carry.py | outputs/permitless_carry_cs/ |
| Permitless carry: stacked DiD | scripts/run_stacked_dd.py | outputs/permitless_carry_stackdd/ |
| Red-flag: CS21 | scripts/run_cs_red_flag.py | outputs/red_flag_cs/ |
| Red-flag: stacked DiD | scripts/run_stacked_dd.py | outputs/red_flag_stackdd/ |
| UBC: CS21 | scripts/run_cs_ubc.py | outputs/ubc_cs/ |
| UBC: stacked DiD | scripts/run_stacked_dd.py | outputs/ubc_stackdd/ |
| Synthetic control (TX 2021, FL 2023) | scripts/run_scm_permitless_carry.py | outputs/permitless_carry_scm/ |
| Roth-Sant'Anna bounds | scripts/run_roth_sa_bounds.py | outputs/roth_sa_bounds/ |
| This report | scripts/build_research_report.py | outputs/research_report/index.html |
To reproduce the entire research portion of the project from scratch:
# Build state panels first (see data_appendix.md and the README for upstream # raw-input requirements): python scripts/build_firearms_panel.py python scripts/audit_panels.py python scripts/augment_panels.py # Run all three CS21 analyses: python scripts/run_cs_permitless_carry.py python scripts/run_cs_red_flag.py python scripts/run_cs_ubc.py # Run the synthetic-control case studies: python scripts/run_scm_permitless_carry.py # Run the parallel stacked-DiD implementation across all three policies: python scripts/run_stacked_dd.py # Run Roth-Sant'Anna pre-trend bounds for both estimators: python scripts/run_roth_sa_bounds.py # Build this report: python scripts/build_research_report.py
Print this page to PDF: in any modern browser, File → Print → Save as PDF. The print stylesheet at the top of this document handles page breaks and font sizing appropriately for letter-paper output.