Main Regression Analysis
Model Specification
Our baseline model building strategy:
| Model | Specification | Purpose |
|---|---|---|
| 1 | Individual controls only | Baseline effects |
| 2 | Add Run Risk (liquidity) | Test liquidity channel |
| 3 | Add Insured Deposit Coverage Ratio (insolvency) | Test insolvency channel |
| 4 | Add Valuation Subsidy | Test BTFP incentive |
| 5 | Add Interaction: Insolvency × Subsidy | Key test of hypothesis |
| 6 | Full model with all controls | Robustness |
################################################################################
# SECTION 8: MAIN REGRESSION ANALYSIS
################################################################################
cat("\n=== ESTIMATING MAIN MODELS ===\n\n")
#>
#> === ESTIMATING MAIN MODELS ===
# Set up variable dictionary for nice labels
setFixest_dict(c(
# Key variables
pct_uninsured_z = "% Uninsured (z)",
pct_mtm_loss_z = "% MTM Loss (z)",
run_risk_z = "Run Risk (z)",
insured_coverage_z = "Insured Coverage (z)",
valuation_subsidy_z = "Valuation Subsidy (z)",
omo_eligible_z = "OMO-Eligible Ratio (z)",
# Interactions
"insured_coverage_z:valuation_subsidy_z" = "Insolvency × Subsidy",
"run_risk_z:valuation_subsidy_z" = "Run Risk × Subsidy",
"run_risk_z:omo_eligible_z" = "Run Risk × OMO-Eligible",
"mtm_insolventTRUE" = "MTM Insolvent",
"mtm_insolventTRUE:valuation_subsidy_z" = "Insolvent × Subsidy",
# Controls
fhlb_ratio_z = "FHLB Ratio (z)",
fhlb_st_ratio_z = "FHLB Short-term (z)",
wholesale_ratio_z = "Wholesale Funding (z)",
cash_ratio_z = "Cash Ratio (z)",
book_equity_ratio_z = "Book Equity Ratio (z)",
log_assets_z = "Log Assets (z)",
"has_omo_eligibleTRUE" = "Has OMO-Eligible"
))
Extensive Margin Models (Logit)
Model Set 1: BTFP Usage
################################################################################
# MODEL SET 1: BTFP USAGE (LOGIT) - PROGRESSIVE BUILDING
################################################################################
# Restrict to banks with OMO-eligible assets (treatment pool)
analysis_omo <- analysis_clean %>% filter(has_omo_eligible)
cat("Analysis sample (OMO-eligible banks):", nrow(analysis_omo), "\n")
#> Analysis sample (OMO-eligible banks): 4275
cat("BTFP users in sample:", sum(analysis_omo$btfp_user), "\n\n")
#> BTFP users in sample: 458
# Model 1: Individual effects only
m1_btfp <- feglm(
btfp_user ~ pct_uninsured_z + pct_mtm_loss_z +
log_assets_z,
data = analysis_omo,
family = binomial("logit"),
vcov = "hetero"
)
# Model 2: Add Run Risk (liquidity channel)
m2_btfp <- feglm(
btfp_user ~ run_risk_z +
log_assets_z,
data = analysis_omo,
family = binomial("logit"),
vcov = "hetero"
)
# Model 3: Add Insured Coverage (insolvency channel)
m3_btfp <- feglm(
btfp_user ~ run_risk_z + insured_coverage_z +
log_assets_z,
data = analysis_omo,
family = binomial("logit"),
vcov = "hetero"
)
# Model 4: Add Valuation Subsidy
m4_btfp <- feglm(
btfp_user ~ run_risk_z + insured_coverage_z + valuation_subsidy_z +
log_assets_z,
data = analysis_omo,
family = binomial("logit"),
vcov = "hetero"
)
# Model 5: KEY - Interaction of Insolvency × Subsidy
m5_btfp <- feglm(
btfp_user ~ run_risk_z + insured_coverage_z * valuation_subsidy_z +
log_assets_z,
data = analysis_omo,
family = binomial("logit"),
vcov = "hetero"
)
# Model 6: Full model with all controls
m6_btfp <- feglm(
btfp_user ~ run_risk_z + insured_coverage_z * valuation_subsidy_z +
fhlb_ratio_z + wholesale_ratio_z + cash_ratio_z + book_equity_ratio_z +
log_assets_z,
data = analysis_omo,
family = binomial("logit"),
vcov = "hetero"
)
cat("✓ BTFP logit models estimated\n")
#> ✓ BTFP logit models estimated
# Display results
etable(m1_btfp, m2_btfp, m3_btfp, m4_btfp, m5_btfp, m6_btfp,
title = "Table 5: BTFP Usage - Logit Models (OMO-Eligible Banks Only)",
headers = c("(1) Base", "(2) +Run Risk", "(3) +Coverage",
"(4) +Subsidy", "(5) +Interaction", "(6) Full"),
notes = "Heteroskedasticity-robust standard errors. Sample restricted to banks with OMO-eligible assets.",
fitstat = ~ n + pr2)
#> m1_btfp m2_btfp m3_btfp
#> (1) Base (2) +Run Risk (3) +Coverage
#> Dependent Var.: btfp_user btfp_user btfp_user
#>
#> Constant -2.345*** (0.0568) -2.330*** (0.0559) -2.337*** (0.0560)
#> % Uninsured (z) 0.2053*** (0.0566)
#> % MTM Loss (z) 0.4095*** (0.0514)
#> Log Assets (z) 0.4959*** (0.0499) 0.4386*** (0.0460) 0.4535*** (0.0471)
#> Run Risk (z) 0.3805*** (0.0492) 0.1395 (0.0860)
#> Insured Coverage (z) -0.2915*** (0.0859)
#> Valuation Subsidy (z)
#> Insolvency × Subsidy
#> FHLB Ratio (z)
#> Wholesale Funding (z)
#> Cash Ratio (z)
#> Book Equity Ratio (z)
#> _____________________ __________________ __________________ ___________________
#> S.E. type Heteroskedas.-rob. Heteroskedas.-rob. Heteroskedast.-rob.
#> Observations 4,275 4,275 4,275
#> Pseudo R2 0.07243 0.06987 0.07312
#>
#> m4_btfp m5_btfp m6_btfp
#> (4) +Subsidy (5) +Interaction (6) Full
#> Dependent Var.: btfp_user btfp_user btfp_user
#>
#> Constant -2.347*** (0.0561) -2.344*** (0.0566) -2.575*** (0.0773)
#> % Uninsured (z)
#> % MTM Loss (z)
#> Log Assets (z) 0.4369*** (0.0479) 0.4424*** (0.0479) 0.4141*** (0.0556)
#> Run Risk (z) 0.1435. (0.0868) 0.1489. (0.0870) -0.0189 (0.1122)
#> Insured Coverage (z) -0.2641** (0.0878) -0.2642** (0.0879) -0.2195* (0.1089)
#> Valuation Subsidy (z) 0.1191* (0.0482) 0.1498** (0.0539) 0.1041. (0.0587)
#> Insolvency × Subsidy 0.0526 (0.0474) 0.0383 (0.0502)
#> FHLB Ratio (z) 0.2080*** (0.0539)
#> Wholesale Funding (z) 0.1441** (0.0462)
#> Cash Ratio (z) -0.5452*** (0.1463)
#> Book Equity Ratio (z) -0.3349*** (0.0735)
#> _____________________ __________________ __________________ ___________________
#> S.E. type Heteroskedas.-rob. Heteroskedas.-rob. Heteroskedast.-rob.
#> Observations 4,275 4,275 4,270
#> Pseudo R2 0.07514 0.07551 0.10978
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Model Set 2: DW Usage (Comparison)
################################################################################
# MODEL SET 2: DW USAGE (LOGIT) - FOR COMPARISON
################################################################################
# Model 5 equivalent for DW
m5_dw <- feglm(
dw_user ~ run_risk_z + insured_coverage_z * valuation_subsidy_z +
log_assets_z,
data = analysis_omo,
family = binomial("logit"),
vcov = "hetero"
)
# Full model for DW
m6_dw <- feglm(
dw_user ~ run_risk_z + insured_coverage_z * valuation_subsidy_z +
fhlb_ratio_z + wholesale_ratio_z + cash_ratio_z + book_equity_ratio_z +
log_assets_z,
data = analysis_omo,
family = binomial("logit"),
vcov = "hetero"
)
cat("✓ DW logit models estimated\n")
#> ✓ DW logit models estimated
# Compare BTFP vs DW
etable(m5_btfp, m6_btfp, m5_dw, m6_dw,
title = "Table 6: BTFP vs DW Usage - Logit Models",
headers = c("BTFP (5)", "BTFP (6)", "DW (5)", "DW (6)"),
notes = "Heteroskedasticity-robust standard errors.",
fitstat = ~ n + pr2)
#> m5_btfp m6_btfp m5_dw
#> BTFP (5) BTFP (6) DW (5)
#> Dependent Var.: btfp_user btfp_user dw_user
#>
#> Constant -2.344*** (0.0566) -2.575*** (0.0773) -2.553*** (0.0623)
#> Run Risk (z) 0.1489. (0.0870) -0.0189 (0.1122) 0.2413* (0.1004)
#> Insured Coverage (z) -0.2642** (0.0879) -0.2195* (0.1089) -0.0448 (0.1038)
#> Valuation Subsidy (z) 0.1498** (0.0539) 0.1041. (0.0587) 0.0083 (0.0655)
#> Log Assets (z) 0.4424*** (0.0479) 0.4141*** (0.0556) 0.6088*** (0.0492)
#> Insolvency × Subsidy 0.0526 (0.0474) 0.0383 (0.0502) 0.0667 (0.0579)
#> FHLB Ratio (z) 0.2080*** (0.0539)
#> Wholesale Funding (z) 0.1441** (0.0462)
#> Cash Ratio (z) -0.5452*** (0.1463)
#> Book Equity Ratio (z) -0.3349*** (0.0735)
#> _____________________ __________________ ___________________ __________________
#> S.E. type Heteroskedas.-rob. Heteroskedast.-rob. Heteroskedas.-rob.
#> Observations 4,275 4,270 4,275
#> Pseudo R2 0.07551 0.10978 0.08741
#>
#> m6_dw
#> DW (6)
#> Dependent Var.: dw_user
#>
#> Constant -2.602*** (0.0675)
#> Run Risk (z) 0.1926. (0.1159)
#> Insured Coverage (z) -0.0138 (0.1130)
#> Valuation Subsidy (z) -0.0169 (0.0685)
#> Log Assets (z) 0.5882*** (0.0529)
#> Insolvency × Subsidy 0.0612 (0.0589)
#> FHLB Ratio (z) 0.0701 (0.0570)
#> Wholesale Funding (z) 0.1373** (0.0485)
#> Cash Ratio (z) -0.1612 (0.1019)
#> Book Equity Ratio (z) -0.0908 (0.0715)
#> _____________________ __________________
#> S.E. type Heteroskedas.-rob.
#> Observations 4,270
#> Pseudo R2 0.09342
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Model Set 3: Alternative Insolvency Measure (MTM Insolvent Indicator)
################################################################################
# MODEL SET 3: MTM INSOLVENCY INDICATOR
################################################################################
# Model with binary insolvency indicator
m_btfp_insolvent <- feglm(
btfp_user ~ run_risk_z + mtm_insolvent * valuation_subsidy_z +
fhlb_ratio_z + wholesale_ratio_z + cash_ratio_z + book_equity_ratio_z +
log_assets_z,
data = analysis_omo,
family = binomial("logit"),
vcov = "hetero"
)
m_dw_insolvent <- feglm(
dw_user ~ run_risk_z + mtm_insolvent * valuation_subsidy_z +
fhlb_ratio_z + wholesale_ratio_z + cash_ratio_z + book_equity_ratio_z +
log_assets_z,
data = analysis_omo,
family = binomial("logit"),
vcov = "hetero"
)
cat("✓ MTM Insolvency indicator models estimated\n")
#> ✓ MTM Insolvency indicator models estimated
etable(m_btfp_insolvent, m_dw_insolvent,
title = "Table 7: Facility Usage with MTM Insolvency Indicator",
headers = c("BTFP", "DW"),
notes = "mtm_insolvent = 1 if MV Equity < 0.",
fitstat = ~ n + pr2)
#> m_btfp_insolvent m_dw_insolvent
#> BTFP DW
#> Dependent Var.: btfp_user dw_user
#>
#> Constant -2.580*** (0.0782) -2.563*** (0.0725)
#> Run Risk (z) 0.1569* (0.0640) 0.2306*** (0.0687)
#> MTM Insolvent 0.0578 (0.1635) -0.2800 (0.1847)
#> Valuation Subsidy (z) 0.0958 (0.0621) -0.0408 (0.0694)
#> FHLB Ratio (z) 0.2442*** (0.0505) 0.0751 (0.0548)
#> Wholesale Funding (z) 0.1527*** (0.0457) 0.1349** (0.0483)
#> Cash Ratio (z) -0.5132*** (0.1401) -0.1513 (0.1027)
#> Book Equity Ratio (z) -0.3194*** (0.0860) -0.1588. (0.0846)
#> Log Assets (z) 0.3972*** (0.0562) 0.5655*** (0.0539)
#> Insolvent × Subsidy -0.0022 (0.1014) -0.0008 (0.1250)
#> _____________________ ___________________ __________________
#> S.E. type Heteroskedast.-rob. Heteroskedas.-rob.
#> Observations 4,270 4,270
#> Pseudo R2 0.10830 0.09398
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Linear Probability Models (LPM) for Robustness
################################################################################
# MODEL SET 4: LINEAR PROBABILITY MODELS (ROBUSTNESS)
################################################################################
# LPM version of key model
m_btfp_lpm <- feols(
btfp_user ~ run_risk_z + insured_coverage_z * valuation_subsidy_z +
fhlb_ratio_z + wholesale_ratio_z + cash_ratio_z + book_equity_ratio_z +
log_assets_z,
data = analysis_omo,
vcov = "hetero"
)
m_dw_lpm <- feols(
dw_user ~ run_risk_z + insured_coverage_z * valuation_subsidy_z +
fhlb_ratio_z + wholesale_ratio_z + cash_ratio_z + book_equity_ratio_z +
log_assets_z,
data = analysis_omo,
vcov = "hetero"
)
cat("✓ LPM models estimated\n")
#> ✓ LPM models estimated
etable(m_btfp_lpm, m_dw_lpm, m6_btfp, m6_dw,
title = "Table 8: LPM vs Logit Comparison",
headers = c("BTFP LPM", "DW LPM", "BTFP Logit", "DW Logit"),
notes = "LPM coefficients are directly interpretable as probability changes.",
fitstat = ~ n + r2 + pr2)
#> m_btfp_lpm m_dw_lpm
#> BTFP LPM DW LPM
#> Dependent Var.: btfp_user dw_user
#>
#> Constant 0.1009*** (0.0046) 0.0883*** (0.0043)
#> Run Risk (z) 0.0117 (0.0096) 0.0189* (0.0084)
#> Insured Coverage (z) -0.0132 (0.0083) 0.0007 (0.0073)
#> Valuation Subsidy (z) 0.0120* (0.0048) 0.0026 (0.0045)
#> FHLB Ratio (z) 0.0253*** (0.0058) 0.0073 (0.0050)
#> Wholesale Funding (z) 0.0169** (0.0053) 0.0127** (0.0048)
#> Cash Ratio (z) -0.0079. (0.0045) 0.0047 (0.0045)
#> Book Equity Ratio (z) -0.0200*** (0.0047) -0.0029 (0.0045)
#> Log Assets (z) 0.0425*** (0.0062) 0.0603*** (0.0061)
#> Insolvency × Subsidy -0.0057 (0.0053) 0.0028 (0.0049)
#> _____________________ ___________________ __________________
#> Family OLS OLS
#> S.E. type Heteroskedast.-rob. Heteroskedas.-rob.
#> Observations 4,270 4,270
#> R2 0.07048 0.06243
#> Pseudo R2 0.14917 0.18602
#>
#> m6_btfp m6_dw
#> BTFP Logit DW Logit
#> Dependent Var.: btfp_user dw_user
#>
#> Constant -2.575*** (0.0773) -2.602*** (0.0675)
#> Run Risk (z) -0.0189 (0.1122) 0.1926. (0.1159)
#> Insured Coverage (z) -0.2195* (0.1089) -0.0138 (0.1130)
#> Valuation Subsidy (z) 0.1041. (0.0587) -0.0169 (0.0685)
#> FHLB Ratio (z) 0.2080*** (0.0539) 0.0701 (0.0570)
#> Wholesale Funding (z) 0.1441** (0.0462) 0.1373** (0.0485)
#> Cash Ratio (z) -0.5452*** (0.1463) -0.1612 (0.1019)
#> Book Equity Ratio (z) -0.3349*** (0.0735) -0.0908 (0.0715)
#> Log Assets (z) 0.4141*** (0.0556) 0.5882*** (0.0529)
#> Insolvency × Subsidy 0.0383 (0.0502) 0.0612 (0.0589)
#> _____________________ ___________________ __________________
#> Family Logit Logit
#> S.E. type Heteroskedast.-rob. Heteroskedas.-rob.
#> Observations 4,270 4,270
#> R2 -- --
#> Pseudo R2 0.10978 0.09342
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Intensive Margin Models
################################################################################
# MODEL SET 5: INTENSIVE MARGIN (AMOUNT BORROWED)
################################################################################
# BTFP amount (users only)
btfp_users <- analysis_omo %>% filter(btfp_user == 1)
if (nrow(btfp_users) >= 30) {
m_btfp_intensive <- feols(
btfp_amt_log ~ run_risk_z + insured_coverage_z * valuation_subsidy_z +
fhlb_ratio_z + wholesale_ratio_z + cash_ratio_z + book_equity_ratio_z +
log_assets_z,
data = btfp_users,
vcov = "hetero"
)
cat("✓ BTFP intensive margin model estimated (n =", nrow(btfp_users), ")\n")
etable(m_btfp_intensive,
title = "Table 9: BTFP Intensive Margin (Users Only)",
notes = "Dependent variable: log(1 + BTFP Amount / Assets)",
fitstat = ~ n + r2)
} else {
cat("⚠ Insufficient BTFP users for intensive margin analysis\n")
}
#> ✓ BTFP intensive margin model estimated (n = 458 )
#> m_btfp_intensive
#> Dependent Var.: btfp_amt_log
#>
#> Constant 9.642*** (0.2279)
#> Run Risk (z) -0.3990 (0.2458)
#> Insured Coverage (z) -0.5207* (0.2584)
#> Valuation Subsidy (z) 0.0335 (0.1301)
#> FHLB Ratio (z) 0.3728** (0.1279)
#> Wholesale Funding (z) 0.3132*** (0.0837)
#> Cash Ratio (z) -0.6327 (0.3850)
#> Book Equity Ratio (z) -0.2278 (0.1643)
#> Log Assets (z) -0.9522*** (0.1637)
#> Insolvency × Subsidy -0.0669 (0.1340)
#> _____________________ ___________________
#> S.E. type Heteroskedast.-rob.
#> Observations 457
#> R2 0.19765
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Conditional Choice Model (BTFP vs DW)
################################################################################
# MODEL SET 6: CONDITIONAL CHOICE (BTFP vs DW among single-facility users)
################################################################################
# Sample: Banks that used exactly one facility
choice_sample <- analysis_omo %>%
filter(used_only_btfp | used_only_dw)
cat("Conditional choice sample size:", nrow(choice_sample), "\n")
#> Conditional choice sample size: 663
cat(" Chose BTFP:", sum(choice_sample$chose_btfp, na.rm = TRUE), "\n")
#> Chose BTFP: 366
cat(" Chose DW:", sum(choice_sample$chose_btfp == 0, na.rm = TRUE), "\n\n")
#> Chose DW: 297
if (nrow(choice_sample) >= 50) {
m_choice_logit <- feglm(
chose_btfp ~ run_risk_z + insured_coverage_z * valuation_subsidy_z +
fhlb_ratio_z + wholesale_ratio_z + cash_ratio_z + book_equity_ratio_z +
log_assets_z,
data = choice_sample,
family = binomial("logit"),
vcov = "hetero"
)
m_choice_lpm <- feols(
chose_btfp ~ run_risk_z + insured_coverage_z * valuation_subsidy_z +
fhlb_ratio_z + wholesale_ratio_z + cash_ratio_z + book_equity_ratio_z +
log_assets_z,
data = choice_sample,
vcov = "hetero"
)
cat("✓ Conditional choice models estimated\n")
etable(m_choice_logit, m_choice_lpm,
title = "Table 10: Conditional Choice - BTFP vs DW",
headers = c("Logit", "LPM"),
notes = "Sample: Banks that used exactly one facility. Dependent variable: chose_btfp = 1 if used only BTFP.",
fitstat = ~ n + pr2 + r2)
} else {
cat("⚠ Insufficient observations for conditional choice analysis\n")
}
#> ✓ Conditional choice models estimated
#> m_choice_logit m_choice_lpm
#> Logit LPM
#> Dependent Var.: chose_btfp chose_btfp
#>
#> Constant 0.0653 (0.1096) 0.5173*** (0.0254)
#> Run Risk (z) -0.2175 (0.1857) -0.0505 (0.0424)
#> Insured Coverage (z) -0.2115 (0.1798) -0.0492 (0.0411)
#> Valuation Subsidy (z) 0.0954 (0.1017) 0.0220 (0.0236)
#> FHLB Ratio (z) 0.1646. (0.0872) 0.0385. (0.0198)
#> Wholesale Funding (z) 0.0064 (0.0723) 0.0017 (0.0168)
#> Cash Ratio (z) -0.3382. (0.1768) -0.0768* (0.0380)
#> Book Equity Ratio (z) -0.2698* (0.1059) -0.0637** (0.0246)
#> Log Assets (z) -0.2129* (0.0970) -0.0491* (0.0218)
#> Insolvency × Subsidy -0.0540 (0.0910) -0.0120 (0.0206)
#> _____________________ _________________ __________________
#> Family Logit OLS
#> S.E. type Heteroskeda.-rob. Heteroskedas.-rob.
#> Observations 662 662
#> Pseudo R2 0.03708 0.03523
#> R2 -- 0.04950
#> ---
#> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1