PARKING PHASE 4 — FROZEN EXPLORATORY ANALYSIS, 10 OCTOBER 2026 Read the design before interpreting the results. This is an authority-level retrospective association and spatial-transfer exercise, not a causal estimate of garage use, an LSOA collision rate, or a future prediction test. QUICK REPRODUCTION FROM PREPARED INPUTS 1. Download download-parking-phase4.py from this directory. 2. With Python 3.10+ and curl available: python download-parking-phase4.py /path/to/new-empty-directory The downloader preserves project-relative paths, fetches the frozen files, verifies the main design hash and every model-input hash, and refuses to overwrite a nonempty directory. It does not install packages or run models. 3. In that directory, create your preferred Python environment and install: python -m pip install numpy==2.3.5 scipy==1.17.0 4. Run, keeping the frozen scripts and inputs unchanged: OPENBLAS_NUM_THREADS=1 python scripts/model-parking-phase4.py run OPENBLAS_NUM_THREADS=1 python scripts/parking-phase4-control-tests.py run Computation can take several minutes. Outputs replace analysis.json and control-tests.json and regenerate the CSV/gzip results. Floating-point rounding can differ by platform; compare substantive values, not output hashes. Main design SHA256: 3e8711a0fa9938b3965bd3e628473dda6bffcbc0a1c3551cf59e0fac2d7c0c27 Model script SHA256: 2347bd8fc21103156b4b8fe7b325294a85368f247b5c1072dfc25abad206626d The 'prepare' command is for a NEW protocol. Do not run it over design.json. The run command rejects changes to the frozen model script or input files. The control-design file separately freezes predictor-block tests before fitting. The tiny fixed ridge is numerical stabilisation; it was not tuned on these folds. DATA AND MODEL UNITS - One row is authority x year; 137 authorities x five years = 685 main rows. - Years: 2021–2025. Three incomplete-control authorities are explicitly excluded from the 140-authority Phase 3 cohort; no data are imputed. - Counts are injury collisions, not casualties or damage-only insurance claims. - motorMiles and nonTrunkMiles are vehicle miles, not millions of miles. Published DfT TRA8902/8903 million-mile figures are multiplied by 1,000,000 and rounded to integral miles to avoid floating-point unit-conversion residue. - The NB2 offset is log(motorMiles / 100,000), with variance mu + alpha*mu^2. - Parking and urbanShare are proportions, not percentages. Parking comes from Phase 3 authority-decile-membership.csv's sharePct divided by 100. The displayed rate ratio is scaled to 10 percentage points. It can exceed actual local support. - The interaction is parking*(urbanShare-0.5). Its unlabelled archived coefficient contrast refers to 50% urban; displayed contrasts refer to 40%, 70% and 95%. - densitySquared is the square of logDensity, generated in the frozen design. - Household shares use each Census table's own denominator; disclosure-induced differences between the housing and ownership table totals are retained. - Income deprivation is an area score. Age, education and rurality describe residents, not necessarily drivers or road users involved in collisions. - The all-road injury count includes events with no motor vehicle involved; the denominator is motor traffic. This is an area exposure-normalised rate. FOLDS AND INFERENCE All years of one authority stay together. Hold out each of nine English regions once; standardisation uses training rows only. A never-seen region receives the training-authority-weighted mean regional effect. Reference-housing held-out predictions are published as CSV; all 27 variants can be rerun using the script. Positive 'gainPct' means a reduction in held-out Poisson deviance against the specified same-sample baseline. Negative means worse prediction. Extremely poor regional transfer remains in the score. These models are not operationally validated; neither the parking assumptions nor controls are selected to maximise this score. Annual tables regroup the same geographic holdouts, not future years. Coefficient intervals use an authority-cluster sandwich with joint NB dispersion uncertainty. Geographic gain intervals resample nine region loss blocks 2,000 times (seed 20261010); these are descriptive instability intervals. They do not resolve measurement error, unmeasured confounding, model selection or spatial correlation between authorities. Correlated controls can substitute for each other: block-ablation gains are conditional predictive comparisons, not causes. CURVES AND SENSITIVITIES Deciles rank the complete cohort by parking share, with ties retained. Adjusted rate = observed / fitted expected (full baseline WITHOUT parking) x pooled rate. This is in-sample indirect standardisation. Quintile curves within rurality bands use their own pooled rate. Their vertical scales therefore do not provide a common standard for comparing bands. Conditional Poisson bars treat fitted expected counts as fixed. Rural-majority coverage is four authorities, so only its pooled rate is shown. Rural bands are analyst-defined, not official authority classes: urban >=80%, mixed 50–<80%, rural <50% of residents in urban OAs. The non-trunk sensitivity uses 136 authorities. Gloucestershire is excluded for one collision with unknown trunk classification in 2025. Every sensitivity is compared with an all-road fit on exactly those same 136 authorities. The retained road/traffic covariates describe authority-wide context; the exposure and outcome are non-trunk-specific. Non-trunk is not synonymous with residential road. Parked involvement is recorded from vehicle_manoeuvre==2; any recorded parked vehicle makes the collision 'parked'. Otherwise an unresolved manoeuvre makes it 'unknown'; only fully resolved nonparked records enter 'other'. Unknown cases are not silently nonparked. Separate upper sensitivities assign all unknown cases to parked or to other; those two bounds are not a partition. Involvement does not establish contact with a parked vehicle, responsibility or cause. FULL SOURCE PREPARATION (SEPARATE FROM QUICK REPRODUCTION) prepare-parking-phase4.py documents the joins. It requires the existing project Census/STATS19/traffic evidence tree and geo_ods.py, plus openpyxl 3.1.5, pyshp 3.1.6, Shapely 2.2.0 and pyproj 3.8.0. Run in a fresh analysis workspace with no frozen design. Provide a raw directory containing ruc2021.xlsx, oa21-lsoa21.csv, tra8902.ods, tra8903.ods, authority-boundaries.geojson, boundary-url.txt, os-open-roads.zip and os-downloads.json. Source URLs, original hashes and archived bytes are in source-register.json, input-manifest.json and inputs/network-source.json. The downloader above supplies prepared model inputs, not the full upstream STATS19/Census source tree required to rebuild every source join. Rurality uses Table 1A of ONS RUC2021 (March 2026 release), exact OA populations from Census TS001, and official OA->LSOA->UTLA lookups. It does not infer urban share from the majority class of each LSOA. OA-population-rurality.csv.gz exposes every English OA join used. Larger and smaller rural shares are preserved. OS Open Roads: April 2026 GB shapefiles, EPSG:27700. The 606 MB raw OS ZIP is not republished here; its verified SHA/MD5 and original download URL are retained. Reproduction of model fits does not need that ZIP. Upstream download URLs may move to newer releases; an exact raw-source rerun needs the stated April archive. Assigned-junctions.csv.gz preserves all 1,717,344 assigned English junction and roundabout nodes. Seven identical tile-edge duplicates were removed; 5,579 ambiguous boundary matches were omitted. Unmatched/outside-England nodes were not reassigned to a nearest authority. Density uses the full ONS BGC authority boundaries, not the display map. Because the network postdates outcomes, junction density is explicitly a retrospective sensitivity, never an as-of predictor. OUTPUTS analysis.json: effect sizes, conditional curves, spatial scores, sensitivities. control-tests.json: same-cohort block ablations and network addition. analysis-panel.csv: compact row-level controls/counts/exposure; design.json has the full frozen rows, including non-trunk outcome splits and densitySquared. held-out-predictions.csv: reference housing; two bases x nine assumptions x three outcomes x 685 rows. 'baseline', 'parking', 'interaction' are predicted COUNTS. 'observed' is the selected count and 'miles' its all-road exposure. scenario-effects.csv: both bases x 27 variants x three outcomes x two stages. fits.json.gz: full-sample coefficients, covariance, transformations, diagnostics and fold diagnostics. Coefficients use the archived scaled design; the final parameter is log(alpha), after all named mean-model coefficients. control-fits.json.gz: corresponding reduced/control-network model diagnostics. Fitted coefficients for same-sample all-road non-trunk comparators can be regenerated by the script; their summary comparisons are in analysis.json. All public source licences remain in force, including the Open Government Licence. No observed local parking validation or LSOA road-mileage input has been added by Phase 4. The analysis does not establish that increasing garaging would reduce accidents.