Replication package: backward-integration capability and supplier innovation in critical-component supply chains
Description
Data and code behind the empirical section, appendices and figures of "The price of a credible threat: backward-integration capability and supplier innovation in critical-component supply chains" (Wang, Ma, Lim and Ghadimi). Two datasets. (1) A firm-year panel of 195 accounting figures for the Chinese electric-vehicle battery chain, 2021-2025, each row carrying the report title, disclosure date, page reference and permanent filing URL of the audited statement it came from. (2) A hand-collected cross-section of in-house battery-cell programmes across 44 global vehicle manufacturers, measured at fiscal 2025, coded for announced cell capacity, ownership form and new-energy volume, with an independent blind second coding of every row (Cohen's kappa 0.90). The code reproduces both tables, all four figures, the sorting test (exact permutation test, single-covariate logit, Youden threshold with a stratified bootstrap interval) and the numerical verification of the analytical results. It requires only Python with pandas, numpy, scipy and matplotlib; the estimators are implemented directly rather than called from a modelling package. The annual reports themselves are third-party copyrighted documents and are not redistributed here. They are identified by permanent exchange URL in the two filing-index files, so every value can be retrieved and checked at source. See README.md for the data dictionary, the reproduction commands and expected output, and a statement of what is deliberately excluded.
Files
Steps to reproduce
Unzip replication-package.zip and run everything from the resulting folder. Python 3.11 or later with pandas, numpy, scipy and matplotlib; no other dependency, and the estimators are implemented directly rather than called from a modelling package. Table 1 and Table 2 python tools/build_section9_tables.py Sorting test, primary coding python tools/cross_section_analysis.py --data data/integration_cross_section.csv Sorting test, independent second coder python tools/cross_section_analysis.py --data data/integration_cross_section_second_coder.csv Figures 1 to 4 python figures/make_figures.py Numerical verification of the analytical results python tools/verify_wedge_identity.py python tools/verify_interior_band.py python tools/verify_prop7_condition.py python tools/find_gamma_above_one.py The analysis script prints three blocks. CODING 2, which counts joint ventures and minority cell positions alongside wholly owned plants, is the paper's primary specification: exact permutation p = 0.0034, logit slope 0.928 (se 0.365), threshold 112 thousand units with a bootstrap interval of [20, 735], AUC 0.761. On the second coder's labels the same block gives p = 0.0064, AUC 0.739 and the same 112 thousand threshold. CODING 1, the narrow ownership indicator, is the null contrast reported alongside it, not a result the paper builds on. Read the exact permutation p rather than the Wilcoxon one, which uses a normal approximation unreliable at N = 33 with this much tying. Two scripts cannot be re-executed: tools/coder_reliability.py and tools/recode_sensitivity.py consume a JSONL journal from the blind second coding that was not retained. Their outputs are deposited, and the robustness claim resting on them is reproduced by the second-coder command above. See README.md.
Institutions
- Beijing University of TechnologyBeijing, Beijing