SUPPLEMENTARY FILES
Finer partitions, weaker evidence: marginal fairness hides intersectional harm
across five Sub-Saharan African low-and-middle-income countries
Ojediran Alaba Bolaji, Macaulay O.B., Ojediran Bolanle Omowumi
Package assembled: 11 September 2026

This archive contains exactly the reproducible analysis code described in the
manuscript's Appendix ("Reproducible analysis code"), plus the six figures as
delivered in the current revision (Intersectional_Fairness_Short_Paper_
REVISED_11092026.docx). It does not contain the underlying DHS survey
microdata, consistent with DHS Program Terms of Use (see "What is NOT
included" below).

CONTENTS
--------

code/nigeria/
    prepare_data.py            builds the Nigeria DHS 2024 analysis frame
    cfpr_cfnr_estimator.py     the cFPR/cFNR estimator (Wastvedt, Huling &
                                Wolfson, 2024); identical copy in every
                                country folder, no per-country variants
    run_nigeria.py              primary-analysis driver (Table 1, overall rates)
    marginal_comparison.py      wealth-alone vs. zone-alone vs. intersection
                                (Table 2)
    extensions.py                baseline AUC-ROC/sensitivity/specificity/F1
                                (Table S1); propensity overlap, balance, and
                                stabilised-weight checks (Table S2); the
                                small-subgroup borrowed-strength estimator
                                using genuine external DHS Individual Recode
                                data (Table S3)
    prepare_external_ir.py      builds the external Individual Recode (IR)
                                analysis frame used by extensions.py's
                                borrowed-strength estimator
    run_extensions.py            per-country driver that runs all three
                                extensions.py checks in sequence

code/ghana/, code/drc/, code/liberia/, code/ethiopia/
    Same seven-file structure as code/nigeria/, with each country's own
    prepare_data_<country>.py, run_<country>.py, and
    marginal_comparison_<country>.py. cfpr_cfnr_estimator.py, extensions.py,
    prepare_external_ir.py, and run_extensions.py are byte-identical across
    all five country folders (no separate implementation exists per
    country); they are duplicated per folder only so each folder is
    self-contained and runnable on its own.

code/figures/
    make_flowchart.py           Figure 2 (analysis pipeline overview)
    make_causal_diagram.py      Figure 1 (A, X, D, Y, Y0, S relationships)
    make_heatmap.py             Figure 3 (wealth x region/zone/province
                                cFPR/cFNR heatmaps, all five countries)
    make_bar_chart.py           Figure 4 (Delta_MAX by grouping, all
                                five countries)
    make_scatter.py             Figure 5 (raw Delta_MAX vs. permutation
                                u-value)
    make_instability_plot.py    Figure 6 (Table S3 instability: cell size
                                vs. borrowed-strength estimate)
    collect_table4_data.py      consolidates each country's wealth-alone,
                                region/zone/province-alone, and
                                intersectional Delta_MAX/Delta_AVG/u-values
                                into table4_master.csv, the shared data
                                source for Figures 4 and 5
    table4_master.csv           the consolidated table Figures 4 and 5 are
                                drawn from

figures/
    Figure1_causal_diagram.png
    Figure2_pipeline_flowchart.png
    Figure3_heatmap.png
    Figure4_bar_chart.png
    Figure5_scatter.png
    Figure6_instability.png
    The six figures exactly as embedded in the current manuscript revision
    (Intersectional_Fairness_Short_Paper_REVISED_11092026.docx), each at
    high resolution (450 dpi, ~3800-6700 px on the long edge), re-rendered
    directly from the matplotlib source above rather than upscaled.

HOW THE PIECES FIT TOGETHER
----------------------------
For any one country, the intended run order is:

  1. prepare_data*.py            -> builds that country's analysis sample
                                     from its own DHS Children's Recode
                                     (.DTA file; not included, see below)
  2. run_<country>.py              -> fits the risk score, propensity model,
                                     and cFPR/cFNR (imports
                                     cfpr_cfnr_estimator.py from the same
                                     folder)
  3. marginal_comparison*.py      -> the wealth-alone / zone-alone /
                                     intersection comparison
  4. prepare_external_ir.py       -> builds that country's external
                                     Individual Recode analysis frame (from
                                     its own DHS Individual Recode .DTA
                                     file; also not included)
  5. run_extensions.py            -> runs extensions.py's three checks
                                     (baseline performance, propensity
                                     diagnostics, borrowed-strength
                                     estimator), using the frame prepare_
                                     external_ir.py built

Each run_*.py and prepare_data*.py imports the local cfpr_cfnr_estimator.py
by relative import, so each country's folder must be used as its own
working directory; scripts are not meant to be run from a shared top-level
folder without adjusting import paths.

WHAT IS NOT INCLUDED
---------------------
The DHS Children's Recode and Individual (Women's) Recode microdata for all
five countries (Nigeria DHS 2024, Ghana DHS 2022, DR Congo Standard DHS
2023-24, Liberia Standard DHS 2019-20, Ethiopia Standard DHS 2024-25) are
not redistributed in this package, consistent with the DHS Program's Terms
of Use. Re-running any of the code above requires the corresponding
country's own DHS Program download (registration at dhsprogram.com).

Per-country intermediate CSV outputs (analysis samples, group rates,
confidence intervals, u-values) are likewise not included here; they are
regenerated by the scripts above once the source DHS files are supplied,
and the manuscript's own Tables S1-S3 and 1-4 report the resulting values
in full.

SOFTWARE NOTES
---------------
All analysis was conducted in Python 3, using pandas and scikit-learn. The
DHS .DTA files were read with pyreadstat in the original analysis (pip
install pyreadstat); pandas' built-in Stata reader (pandas.read_stata) is
a documented, verified-equivalent substitute if pyreadstat is unavailable
in a given environment, reproducing identical sample sizes, prevalences,
and cell counts in all five countries.

CORRESPONDENCE
----------------
Ojediran Alaba Bolaji, alaba.ojediran@fummsa.edu.ng
ORCID 0009-0009-0931-0084
