SPB Git

spb/wp29_uqo

Public

# F1-conf-03 — Leverage and next-year default (information-respecting)

# Question

How is a firm's leverage at the end of year t associated with default in year t+1, using only information available at the end of year t? Estimand: coefficient b1 on leverage in the OLS linear-probability model default_next = a + b1·leverage + b2·cash_ratio + b3·log_sales + e. The model is fit on firm-years with an observed outcome, with standard errors clustered by firm. Data are simulated (synthetic panel).

# Data and exclusions

Input: data/firm_panel.csv, 2140 data rows (n_input_rows). Exclusion ledger (out/exclusions.csv):

  • Column rating_2025 dropped (no rows removed). It is a 2025 final-vintage field built from realised defaults through 2022 and sample-average leverage, so it was not known at the end of t (variables_excluded). Diagnostic: the observed default rate is 0 for ratings A/B/C and about 0.227 for D, so the rating effectively encodes the outcome (default_rate_by_rating_2025_diagnostic).
  • 40 exact duplicate rows removed (identical on every column, no conflicting values). That leaves 2100 rows = 300 firms × 7 years (data_issues).
  • 300 firm-years with empty default_next removed, all with origin year 2022 (the outcome year 2023 lies after the data cut). No outcomes were imputed (data_issues).
  • No rows had missing predictors. Estimation sample: n_analysed = 1800 firm-years, n_firms = 300, origin years 2016–2021. It is written to out/analytic.csv with columns firm_id, year, leverage, cash_ratio, log_sales, default_next.

# Method

Baseline: the unconditional default rate in the estimation sample (default_rate). Main model: OLS with an intercept and predictors_used = leverage, cash_ratio, log_sales (statsmodels). Standard errors are cluster-robust by firm_id (300 clusters, n_clusters), using the standard CR1 small-sample correction. An independent numpy recomputation matched the coefficient, SE and R² to within 1e-15 (out/state/checks.md). The analysis uses no randomness (random_seed = null).

# Results

  • Baseline: the default rate is 0.121 (default_rate).
  • beta_leverage = 0.264: holding cash ratio and log sales fixed, one unit more leverage (debt/assets going from 0 to 1) goes with a 26.4 percentage-point higher probability of default the next year. A one-SD change in leverage (≈0.21, from the audit) therefore corresponds to about 5.5 pp, which is large next to the 12.1% base rate.
  • Other coefficients: beta_cash_ratio = −0.002 with SE 0.065, so not distinguishable from zero. beta_log_sales = 0.012 with SE 0.009. intercept = −0.04 (numbers rounded from results.json).
  • r2 = 0.035: the three predictors explain little of the variation in individual defaults.

# Uncertainty

se_leverage_cluster = 0.041 (clustered by firm). The 95% CI is [0.184, 0.344] (ci95_leverage_cluster), with p ≈ 1e-10 (pvalue_leverage_cluster). These rely on large-cluster asymptotics; 300 clusters is ample.

# Limitations and open issues

  • This is an association in a linear-probability model, not a causal effect. LPM fitted values may fall outside [0,1].
  • The data are synthetic. Results describe this simulated panel only.
  • Firms keep appearing after a default year, and some default in several years (up to 4). The codebook defines default per year and gives no exit rule, so all firm-years were kept as provided.
  • I kept the first copy of each duplicate. Because the copies are identical, the choice does not affect the results.
  • I did not test alternatives such as logit/probit or year fixed effects, because the task specifies the model.
Files · main
Menu

Theme