WP28: README, LIMITATIONS_AND_CLAIMS, phase status 1-6
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
34 changed files +19,951 −20
added
LIMITATIONS_AND_CLAIMS.md
+33 −0
@@ -0,0 +1,33 @@ | |||||
| 1 | +# LIMITATIONS_AND_CLAIMS — what WP28 claims, under what conditions, and what it does not claim | ||||
| 2 | + | ||||
| 3 | +## Proved (with explicit assumptions) | ||||
| 4 | +1. **Theorem 1 (order–round frontier).** Under A1 (uniform stochastic expansion with a common influence function and E‖R_S‖² ≤ C|S|⁻² on the sub-sample family), A2(r) (bias expansion of order r) and A3 (local Newton regularity), fixed p, m → ∞: if K = o(N^{1−1/(2^{q+1}r)}) then √N(θ^{(q)}_r − θ̂_N) → 0 and √N(θ^{(q)}_r − θ0) ⇒ N(0, Σ_ψ). The centered random remainder (order (m√K)⁻¹) is tracked explicitly. Constants depend on p; nothing is claimed for growing p. | ||||
| 5 | +2. **Theorem 2 (exponential model).** Exact moments, exact biases for any pattern, exact Var J₂, exact Newton identities and basin (0, 2θ̂_N), boundary limits −θ0(β_r c^r)^{2^q} (q ≥ 1) and β_rθ0c^r (q = 0), divergence beyond the frontier. Sharpness is for *this construction in this model*, not a lower bound over procedures (the pooled sufficient statistic is exact). | ||||
| 6 | +3. **Theorem 3 (inexact curvature).** Perturbation bound O_p(‖e‖² + δ_N‖e‖ + ‖δ_g‖); exponents 1−1/(2(r+q)) (stale averaged local Hessians; needs A4), 1−1/(2r+q) (single-machine Hessian), bit requirement b ≥ (½ − r(1−α)) log₂N for relative quantization. Known special cases recovered: JLY 2/3, CEASE (t+1)/(t+2), Zhu–Li–Wang 3/4. | ||||
| 7 | +4. **Proposition 4.** Size-weighted aggregation preserves the frontier with m replaced by m_eff; equal weights with unequal sizes fail at q = 0 and are repaired by one Newton step; misspecification handled with the sandwich. These are extensions of known results, not contributions. | ||||
| 8 | +5. **Corollary (inference).** Wald intervals with a consistent covariance estimator are asymptotically valid *inside* the frontier only. | ||||
| 9 | + | ||||
| 10 | +## Numerically supported observations (not theorems) | ||||
| 11 | +- Finite-sample ranking: order-3 pilots have larger RMSE than order-2 pilots for moderate m despite smaller bias; the one-step versions inherit part of this; the analytic Cox–Snell + Newton baseline attains the order-2 exponent with one local fit when the bias formula is exact for the model. | ||||
| 12 | +- The finite-m prediction (exact bias + variance of the local remainder) tracks the boundary Monte Carlo means to three digits; convergence of the mean gap to the asymptotic limit is slow because m ≍ N^{1/(2^{q+1}r)}. | ||||
| 13 | +- Coverage: nominal inside the frontier; under-coverage of the plain average and of the one-step estimator at small m; Fisher-based intervals under-cover under misspecification while sandwich intervals do not. | ||||
| 14 | +- Quantization: the Monte Carlo ablation shows the number of mantissa bits at which the quantized step becomes indistinguishable from the exact step at finite N (paper Table 6). | ||||
| 15 | +- Benchmarks: wall-clock of local and derivative phases, latency percentiles, bytes per phase on the MacLustr LAN for the designs run (paper Section 10). These calibrate the cost model; they do not establish a general speed advantage. | ||||
| 16 | + | ||||
| 17 | +## Heuristics and conditional statements | ||||
| 18 | +- Proposition 5 (cost model and exchange rate) is a tautology given the cost model (eq. 12 of the paper); its content is the calibration on one cluster. | ||||
| 19 | +- Communication accounting (Table 2 of the paper) counts numbers/bytes/rounds/messages; it is bookkeeping, not a theorem; headers and serialization are measured, not derived. | ||||
| 20 | + | ||||
| 21 | +## Open / not attempted | ||||
| 22 | +- Adaptive choice of r (or of (r, q)) from the data with a theorem: open; no adaptive estimator is reported. | ||||
| 23 | +- Growing dimension p_N; dependent or non-identically distributed blocks (heterogeneous pseudo-true values); asynchronous updates; worker drop-out theory; energy and monetary cost; minimax or communication lower bounds. | ||||
| 24 | +- Lean/Coq formalization: not attempted (no proof assistant installed). | ||||
| 25 | + | ||||
| 26 | +## Explicit non-claims | ||||
| 27 | +- Not a new estimator: the components (generalized jackknife; distributed one-step Newton) are known and cited. | ||||
| 28 | +- Not a wall-clock or energy advantage in general; not a byte-count optimality. | ||||
| 29 | +- Not valid for p growing with N, nor for a fixed data set with "the maximal number of machines". | ||||
| 30 | +- The "GPT-6.1" co-author designation is provenance of the prior draft at the researcher's request, not a legally accountable author; see the disclosure in the paper. | ||||
| 31 | + | ||||
| 32 | +## Replication-count statement | ||||
| 33 | +Prior draft: 500 replications × 3 designs (exact-Gamma, N = 2^20). This paper: exponential grid 2000 replications per cell (40 cells), logistic/Poisson 1000 (500 for p = 20 and the ill-conditioned/small-m designs), boundary study 2000/1000/400 by N, ablations 1000 (exponential) and 400 (logistic), skewed partitions 1000/300, benchmarks 3 repeats per design. Actual counts are recorded per cell in `experiments/EXPERIMENT_MANIFEST.csv` and in every table note. | ||||
modified
PHASE_STATUS.md
+41 −0
@@ -15,3 +15,44 @@ Unproved statements or unresolved citations: all theorems of the prior draft are | |||||
| 15 | references are being verified in Phase 1. | 15 | references are being verified in Phase 1. | ||
| 16 | Decision and justification: keep identifier WP28 (free in the series; collision note recorded). Proceed to Phase 1. | 16 | Decision and justification: keep identifier WP28 (free in the series; collision note recorded). Proceed to Phase 1. | ||
| 17 | Next phase action: literature/priority audit (four parallel verification tasks launched 18:47). | 17 | Next phase action: literature/priority audit (four parallel verification tasks launched 18:47). | ||
| 18 | + | ||||
| 19 | +Phase: 1 — Exhaustive state-of-the-art / priority investigation | ||||
| 20 | +Start/finish timestamp: 2026-10-28 18:47 → 19:12 | ||||
| 21 | +What was actually done: four parallel verification tasks read 24 papers in full text (arXiv/accepted manuscripts where publisher pages were bot-blocked) and verified 56 bibliographic records via Crossref; theorem-level comparisons recorded in literature/audit_A..D.md; PRIOR_ART_MATRIX.csv (56 rows); PRIORITY_AND_GAP.md with claim-by-claim map, candidates A/B/C and GO/REVISE/DROP decisions; two wrong DOIs in the brief corrected. | ||||
| 22 | +Artifacts created: literature/audit_A_*.md, audit_B_*.md, audit_C_*.md, audit_D_*.md, PRIOR_ART_MATRIX.csv, PRIORITY_AND_GAP.md. | ||||
| 23 | +Tests passed: n/a. Tests failed: n/a. | ||||
| 24 | +Unproved statements or unresolved citations: texts behind paywalls (Quenouille 1949/1956, Schucany et al. 1971, Sharot 1976, Rilstone et al. 1996, Le Cam 1956, Bickel 1975 technical content, Cordeiro–McCullagh original notation, published JASA numbering of JLY/CEASE/FONE, Springer text of Huang–Huo, Yin's 2022 thesis) — flagged in PRIORITY_AND_GAP.md §5. | ||||
| 25 | +Decision and justification: GO for the joint (r,q) frontier, sharpness, inexact-curvature/quantization theorem; DROP novelty claims on the components; REVISE unequal sizes/misspecification to extensions; cost model as conditional proposition. | ||||
| 26 | +Next phase action: mathematical specification (Phase 2). | ||||
| 27 | + | ||||
| 28 | +Phase: 2 — Mathematical specification and attack on the assumptions | ||||
| 29 | +Start/finish timestamp: 2026-10-28 18:55 → 19:40 | ||||
| 30 | +What was actually done: assumptions A1–A5 written (theory/ASSUMPTIONS.md); every identity of the prior draft re-derived symbolically (theory/symbolic_checks.py S1–S8: weights, Gamma moments, exact biases, Newton identity, q-fold identity and boundary constants, exact Var(J2) via the Beta decomposition, Newton basin, amplification constants, exponent table); sign error found and fixed in the analytic Cox–Snell correction implementation (b1 = +½ I^{-1} T; checked b1 = θ0 in the exponential model). | ||||
| 31 | +Artifacts created: theory/ASSUMPTIONS.md, theory/THEOREM_AUDIT.md (proof ledger), theory/symbolic_checks.py. | ||||
| 32 | +Tests passed: all symbolic checks; 29 unit tests. Tests failed: none. | ||||
| 33 | +Unproved statements: adaptive order selection (H1) left open by design. | ||||
| 34 | +Decision: proceed with the general r-th order family and the (r,q) theorem. | ||||
| 35 | + | ||||
| 36 | +Phase: 3 — General high-order bias-correction family | ||||
| 37 | +Start/finish timestamp: 2026-10-28 19:00 → 19:45 | ||||
| 38 | +What was actually done: Vandermonde weights for arbitrary patterns computed in exact rational arithmetic (src/pamle/jackknife.py), constants β_r and A_r derived, Lemmas 1–5 proved (paper App. A), conditioning analysis of 11 patterns (results/tables/weights_analysis.csv: κ(V) from 6.9 for (1,2) to 4.8e5 for (1,2,4,8,16); A_r = 4, 8, 80/7 for the doubling pattern; (1,2,3) has smaller |β_3| = 6 but larger A_3 = 12). | ||||
| 39 | +Artifacts: src/pamle/jackknife.py, experiments/run_weights_analysis.py, results/tables/weights_analysis.csv, paper/sections/construction.tex. | ||||
| 40 | +Tests passed: tests/test_jackknife_weights.py. Decision: order selection from the data stated as open (no theorem). | ||||
| 41 | + | ||||
| 42 | +Phase: 4 — Statistical–synchronization frontier | ||||
| 43 | +Start/finish timestamp: 2026-10-28 19:30 → 20:30 | ||||
| 44 | +What was actually done: Theorem 1 (joint (r,q) frontier) proved with the stochastic remainder tracked (App. A); Theorem 3 (inexact curvature: stale averaged local Hessians ⇒ 1−1/(2(r+q)); single-machine ⇒ 1−1/(2r+q), recovering CEASE's (t+1)/(t+2) and JLY's 2/3; relative quantization ⇒ bit requirement (½ − r(1−α)) log2 N) proved; Proposition 4 (unequal sizes with weights m_k/N, equal-weight counterexample; misspecification) proved; Proposition 5 (cost model) stated as conditional. | ||||
| 45 | +Artifacts: paper/sections/results.tex, inexact.tex, costmodel.tex, robustness.tex, appendices/proofs.tex. | ||||
| 46 | +Tests: exponent formulas tested (tests/test_communication_accounting.py). Unresolved: Theorem 3(a) needs the fourth-moment block condition (A4) — stated explicitly. | ||||
| 47 | + | ||||
| 48 | +Phase: 5 — Exact analytic models and counterexamples | ||||
| 49 | +Start/finish timestamp: 2026-10-28 19:00 → 20:40 | ||||
| 50 | +What was actually done: Theorem 2 (exact exponential identities (i)–(iv), boundary limit (v) for all (r,q), necessity (vi)) proved (App. B) and checked symbolically and numerically; failure gallery (Newton basin (0, 2θ̂_N), negative pilots, sign alternation β_2 < 0 < β_3); logistic and Poisson likelihoods implemented with batched Newton, separation safeguard, finite-difference-checked derivatives, analytic Cox–Snell baseline; boundary study run (results/processed/boundary_summary*.csv; finite-m prediction matches Monte Carlo means to 3 digits; the (3,1) boundary regime m ≍ N^{1/24} is unreachable). | ||||
| 51 | +Artifacts: paper/sections/exactmodel.tex, appendices/exponential.tex, experiments/run_boundary.py, experiments/boundary_pred.py. | ||||
| 52 | +Tests passed: tests/test_math_identities.py (6 tests). Decision: exponential model used as a laboratory only; no computational lower-bound claim. | ||||
| 53 | + | ||||
| 54 | +Phase: 6 — Research-grade benchmark library | ||||
| 55 | +Start/finish timestamp: 2026-10-28 18:58 → 21:00 | ||||
| 56 | +What was actually done: package src/pamle (jackknife, partitioning, likelihoods, algorithms incl. CSL/AEE/Cox–Snell/stale/single/quantized Newton, communication accounting, diagnostics, TCP protocol + worker); 30 tests incl. reproduction of the prior draft's Monte Carlo summary to 1e-9 relative and an end-to-end protocol test with worker subprocesses; np.linalg.inv is used only for the diagnostic Cox–Snell bias (p×p), never in a Newton step. | ||||
| 57 | +Tests passed: 30/30 (laptop, Python 3.14); 29/29 on a Python 3.9 node (the 30th needs the frozen references directory). | ||||
| 58 | +Decision: Gate 6 passed; large experiments launched. | ||||
added
README.md
+135 −0
@@ -0,0 +1,135 @@ | |||||
| 1 | +<!-- Author: Simon-Pierre Boucher — simon-pierre.boucher@uqo.ca --> | ||||
| 2 | +# 🧮 Beyond One-Step Distributed Maximum Likelihood | ||||
| 3 | + | ||||
| 4 | +**UQO Working Paper No. 28** — *Local bias cancellation, global synchronization, and the price of inexact curvature: a joint order–round frontier, its sharpness in an exact model, and measured communication costs* | ||||
| 5 | + | ||||
| 6 | +[](paper/main.pdf) | ||||
| 7 | +[](requirements.txt) | ||||
| 8 | +[](results/) | ||||
| 9 | +[](experiments/) | ||||
| 10 | +[](https://uqo.ca) | ||||
| 11 | +[](mailto:simon-pierre.boucher@uqo.ca) | ||||
| 12 | + | ||||
| 13 | +> **TL;DR** — Each of $K$ workers debiases its local MLE by an order-$r$ split-sample extrapolation over nested sub-blocks; the coordinator averages and applies $q$ aggregated Newton steps. For fixed-dimensional regular likelihoods the result is first-order equivalent to the centralized MLE whenever $K = o(N^{1-1/(2^{q+1}r)})$ (half-block jackknife + one step: $K = o(N^{7/8})$ against the $K = O(N^{1/2})$ stated for the plain-average one-step estimator). The exponent is sharp for the construction in the exponential model (boundary shift $-\theta_0(\beta_r c^r)^{2^q}$, e.g. $-4\theta_0c^4$), and a perturbation theorem gives the exponent for stale, single-machine and $b$-bit quantized Hessians. Monte Carlo (exponential, logistic, Poisson; paired replications; $N$ up to $2^{22}$), an exact boundary study, ablations, and timed coordinator–worker benchmarks on the MacLustr cluster quantify the finite-sample costs. Components are known (Quenouille/Dhaene–Jochmans jackknife; Huang–Huo one-step); the joint frontier, its sharpness and the bit-precision result are new. No communication lower bound is claimed. | ||||
| 14 | + | ||||
| 15 | +--- | ||||
| 16 | + | ||||
| 17 | +## 📌 Status | ||||
| 18 | + | ||||
| 19 | +| Item | Value | | ||||
| 20 | +|---|---| | ||||
| 21 | +| Version | 1.0 (October 2026) — working draft under internal review; see `FINAL_REVIEW.md` | | ||||
| 22 | +| SSRN | not yet submitted | | ||||
| 23 | +| Journal | — (candidates: Journal of Econometrics, Econometric Theory, JASA T&M, JCGS) | | ||||
| 24 | +| Code & data | fully reproducible from `experiments/` (synthetic data only); raw Monte Carlo outputs committed in `results/raw/` with manifests | | ||||
| 25 | +| Provenance | develops the exploratory note "Local Bias Correction versus Global Synchronization in Distributed Maximum Likelihood" (Boucher & "GPT-6.1", 2026-10-28), frozen in `references/initial_pamle/`; see `SOURCE_PROVENANCE.md` and the disclosure on page 3 of the paper | | ||||
| 26 | + | ||||
| 27 | +## 🎯 What this paper does | ||||
| 28 | + | ||||
| 29 | +Distributed MLE with $N$ observations on $K$ workers of $m = N/K$ observations: averaging local MLEs keeps the $O(1/m)$ local bias, so plain averaging is equivalent to the centralized MLE only for $K = o(N^{1/2})$. Two known remedies — local debiasing and global Newton corrections — are analysed **jointly**. The local correction is the generalized (split-sample) jackknife with Vandermonde weights over nested sub-blocks of sizes $m/s_j$, | ||||
| 30 | + | ||||
| 31 | +``` | ||||
| 32 | +J_{r,k} = Σ_j w_j T_{s_j,k}, Σ_j w_j = 1, Σ_j w_j s_j^a = 0 (a = 1..r-1) | ||||
| 33 | +θ^(0) = K^{-1} Σ_k J_{r,k}; θ ← θ − H_N(θ)^{-1} g_N(θ) (q times, aggregated score and Hessian) | ||||
| 34 | +``` | ||||
| 35 | + | ||||
| 36 | +Main results: Theorem 1 (frontier $K = o(N^{1-1/(2^{q+1}r)})$ with the centered random remainder of order $(m\sqrt K)^{-1}$ kept), Theorem 2 (exact exponential identities, boundary limits for every $(r,q)$, Newton basin $(0, 2\hat\theta_N)$, necessity), Theorem 3 (inexact curvature: stale averaged local Hessians $\Rightarrow 1-1/(2(r+q))$; single-machine Hessian $\Rightarrow 1-1/(2r+q)$, recovering CEASE's $(t+1)/(t+2)$ and CSL's $2/3$; quantization to $b \ge (\tfrac12 - r(1-\alpha))\log_2 N$ bits), Proposition 4 (unequal sizes, misspecification), Proposition 5 (cost model and exchange rate between a local level and a round). | ||||
| 37 | + | ||||
| 38 | +## 🏆 Headline results | ||||
| 39 | + | ||||
| 40 | +| Object | Result | | ||||
| 41 | +|---|---| | ||||
| 42 | +| Sufficient exponent, half-block jackknife + 1 Newton step | $K = o(N^{7/8})$ (plain average + 1 step: $3/4$; quarter-block + 1 step: $11/12$) | | ||||
| 43 | +| Exponent structure | depends on $(r,q)$ only through $D = 2^q r$: one round ⇔ doubling the local order | | ||||
| 44 | +| Sharpness (exponential model) | $\sqrt N(\theta^{(1)}_2 - \hat\theta_N) \to -4\theta_0c^4$ when $K \sim cN^{7/8}$; divergence beyond | | ||||
| 45 | +| Inexact curvature | stale: $1-1/(2(r+q))$; single machine: $1-1/(2r+q)$; bits for quantized derivatives: $(\tfrac12 - r(1-\alpha))\log_2 N$ | | ||||
| 46 | +| Exact variance cost of the half-block correction | $\mathrm{Var}\,J_2 = \theta_0^2 m^2(m^2-6m+17)/((m-4)(m-2)^2(m-1)^2) = \theta_0^2(m^{-1}+4m^{-2}+O(m^{-3}))$, same first two terms as the raw MLE | | ||||
| 47 | +| Monte Carlo and benchmarks | see `paper/tables/` (generated), `results/processed/summary.csv`, `results/processed/benchmarks_summary.csv` | | ||||
| 48 | + | ||||
| 49 | +## 🗂 Repository layout | ||||
| 50 | + | ||||
| 51 | +``` | ||||
| 52 | +distributed-mle-synchronization/ | ||||
| 53 | +├── CLAUDE.md # the research mandate (verbatim) | ||||
| 54 | +├── PROJECT_MAP.md · SOURCE_PROVENANCE.md · PHASE_STATUS.md · research_log.md | ||||
| 55 | +├── LIMITATIONS_AND_CLAIMS.md · FINAL_REVIEW.md · FINAL_DELIVERY.md | ||||
| 56 | +├── references/initial_pamle/ # frozen prior draft + archive + SHA256SUMS.txt (read-only) | ||||
| 57 | +├── literature/ # audits A–D, PRIOR_ART_MATRIX.csv (56 rows), PRIORITY_AND_GAP.md | ||||
| 58 | +├── theory/ # ASSUMPTIONS.md, THEOREM_AUDIT.md (proof ledger), symbolic_checks.py (SymPy) | ||||
| 59 | +├── src/pamle/ # library: jackknife, partitioning, likelihoods, algorithms, communication, diagnostics, protocol, worker | ||||
| 60 | +├── experiments/ # run_monte_carlo.py (+configs/), scatter_cluster.py, run_boundary.py, run_ablations.py, run_skewed.py, | ||||
| 61 | +│ # run_benchmarks.py, process_results.py, make_tables.py, EXPERIMENT_MANIFEST.csv | ||||
| 62 | +├── tests/ # pytest suite (weights, exact identities, derivatives, estimators, accounting, reproducibility, protocol) | ||||
| 63 | +├── results/{raw,processed,tables,figures,resource_profiles} | ||||
| 64 | +├── paper/ # main.tex, sections/, appendices/, tables/ (generated), figures/, references.bib → main.pdf | ||||
| 65 | +├── scripts/ # compile_paper.sh, validate_pdf.sh, reproduce_all.sh | ||||
| 66 | +└── docs/ # cluster inventory, misc | ||||
| 67 | +``` | ||||
| 68 | + | ||||
| 69 | +## 🚀 Quick start | ||||
| 70 | + | ||||
| 71 | +```bash | ||||
| 72 | +python3 -m pip install -r requirements.txt | ||||
| 73 | +pytest -q # 30 tests (≈ 10 s) | ||||
| 74 | +python3 theory/symbolic_checks.py # SymPy verification of every identity (≈ 1 min) | ||||
| 75 | +python3 experiments/run_monte_carlo.py --config experiments/configs/main_exponential.yaml # laptop, ≈ 2 h | ||||
| 76 | +python3 experiments/run_boundary.py; python3 experiments/run_ablations.py --model logistic; python3 experiments/run_skewed.py | ||||
| 77 | +python3 experiments/scatter_cluster.py --configs experiments/configs/main_logistic.yaml experiments/configs/main_poisson.yaml experiments/configs/robustness.yaml --launch # cluster | ||||
| 78 | +python3 experiments/run_benchmarks.py --config experiments/configs/benchmarks.yaml --out results/raw/benchmarks.jsonl # cluster | ||||
| 79 | +python3 experiments/process_results.py --figures && python3 experiments/make_tables.py | ||||
| 80 | +bash scripts/compile_paper.sh && bash scripts/validate_pdf.sh | ||||
| 81 | +``` | ||||
| 82 | + | ||||
| 83 | +Runtime: the exponential Monte Carlo (40 cells × 2000 replications) takes about two hours on an Apple M5 Max laptop; the logistic/Poisson/robustness grids (136 cells) were spread over 18 MacLustr nodes (several hours); the benchmarks need the cluster. | ||||
| 84 | + | ||||
| 85 | +## 🗃 Data | ||||
| 86 | + | ||||
| 87 | +All data are synthetic and seeded (`seed_base = 20261028` plus a hash of the cell description); nothing proprietary. Raw per-replication outputs (`results/raw/*.csv`) carry a JSON manifest (git commit, Python/NumPy versions, host, wall time, SHA-256); `experiments/EXPERIMENT_MANIFEST.csv` collects them. | ||||
| 88 | + | ||||
| 89 | +## 🔬 Methodology | ||||
| 90 | + | ||||
| 91 | +1. Local split fits on nested sub-blocks, batched Newton with step halving and status codes — `src/pamle/likelihoods.py`, `algorithms.local_split_fits`. | ||||
| 92 | +2. Vandermonde weights, pilot — `jackknife.py`, `algorithms.worker_corrected_estimates`, `pilot_estimator`. | ||||
| 93 | +3. Global corrections (exact / stale / single-machine / quantized curvature), CSL, AEE, analytic Cox–Snell — `algorithms.global_newton`, `csl`, `aee_lin_xi`, `analytic_bias_correction`. | ||||
| 94 | +4. Communication accounting — `communication.py`; real protocol — `protocol.py`, `worker.py`. | ||||
| 95 | +5. Experiments and processing — `experiments/` (every table/figure regenerated from `results/`). | ||||
| 96 | + | ||||
| 97 | +## 🖼 Figures & tables inventory | ||||
| 98 | + | ||||
| 99 | +| Figure | Content | | ||||
| 100 | +|---|---| | ||||
| 101 | +| `fig_rms_gap_vs_m_<design>` | RMS scaled gap to the centralized MLE vs $m$ for all estimators | | ||||
| 102 | +| `fig_rmse_theta0_vs_m_<design>` | scaled RMSE vs $\theta_0$: bias–variance trade-off across orders | | ||||
| 103 | +| `fig_gap_collapse_<design>` | gaps against $K/N^{\alpha(r,q)}$ for several $N$ (collapse predicted by Theorem 1) | | ||||
| 104 | +| `fig_coverage95_<design>` | empirical 95 % coverage vs $m$ | | ||||
| 105 | +| `fig_boundary_exponential` | boundary study: gap / asymptotic limit vs $m$ with finite-$m$ prediction | | ||||
| 106 | + | ||||
| 107 | +Tables (`paper/tables/*.tex`, generated by `experiments/make_tables.py`): `mc_<design>.tex`, `mc_rates.tex`, `boundary.tex`, `abl_exponential.tex`, `abl_logistic.tex`, `skew.tex`, `bench.tex`, `numbers.tex`. | ||||
| 108 | + | ||||
| 109 | +## ⚠️ Limitations | ||||
| 110 | + | ||||
| 111 | +See `LIMITATIONS_AND_CLAIMS.md`. Fixed $p$ and i.i.d. data only; sufficient exponents, sharp only for the construction in the exponential model; the boundary regime $m \asymp N^{1/(2^{q+1}r)}$ is reached only at very large $N$; higher orders inflate variance and can fail at small $m$; benchmarks are specific to one cluster and one Python/TCP implementation; no energy or cost measurements; no lower bounds. | ||||
| 112 | + | ||||
| 113 | +## 📝 Citation | ||||
| 114 | + | ||||
| 115 | +```bibtex | ||||
| 116 | +@techreport{boucher2026distributedmle, | ||||
| 117 | + author = {Boucher, Simon-Pierre}, | ||||
| 118 | + title = {Beyond One-Step Distributed Maximum Likelihood: Local Bias Cancellation, Global Synchronization, and the Price of Inexact Curvature}, | ||||
| 119 | + institution = {Universit\'e du Qu\'ebec en Outaouais, D\'epartement des sciences administratives}, | ||||
| 120 | + type = {Working Paper}, | ||||
| 121 | + number = {28}, | ||||
| 122 | + year = {2026}, | ||||
| 123 | + month = {October} | ||||
| 124 | +} | ||||
| 125 | +``` | ||||
| 126 | + | ||||
| 127 | +## 👤 Author & contact | ||||
| 128 | + | ||||
| 129 | +**Simon-Pierre Boucher** — Département des sciences administratives, Université du Québec en Outaouais (UQO), Gatineau, QC. 📧 [simon-pierre.boucher@uqo.ca](mailto:simon-pierre.boucher@uqo.ca) | ||||
| 130 | + | ||||
| 131 | +## 🗒 Notes | ||||
| 132 | + | ||||
| 133 | +- Numbering: No. 28 is the next free number of the UQO series (`Recherche-UQO/README.md` stops at 27). The SPID database paper in `finance/russell3000-strategic-project-database` carries FIRC series No. 0001, not 28; see `SOURCE_PROVENANCE.md`. | ||||
| 134 | +- Authorship: the title page lists Simon-Pierre Boucher and preserves the "GPT-6.1" AI co-author designation of the prior draft, with a disclosure paragraph; for a journal submission the designation should move to the disclosure (flagged, not silently changed). | ||||
| 135 | +- Deviation from the template: `paper/main.tex` adds amsthm, algorithmic and TikZ packages; `sections/titlepage.tex` is the exact template copy. | ||||
modified
experiments/process_results.py
+18 −20
@@ -119,8 +119,9 @@ def fig_rmse_vs_m(s, label, p, N, metric="rms_gap", ests=("r1_q0", "r1_q1", "r1_ | |||||
| 119 | col, mk, ls, lab = STYLE[e] | 119 | col, mk, ls, lab = STYLE[e] | ||
| 120 | ax.plot(dd["m"], dd[metric].clip(lower=1e-12), marker=mk, ls=ls, color=PAL[col], label=lab, markerfacecolor="white", markeredgewidth=1.2) | 120 | ax.plot(dd["m"], dd[metric].clip(lower=1e-12), marker=mk, ls=ls, color=PAL[col], label=lab, markerfacecolor="white", markeredgewidth=1.2) | ||
| 121 | ax.set_xscale("log", base=2); ax.set_yscale("log"); ax.set_xlabel("local sample size m (N fixed)"); ax.set_ylabel(ylabel or metric) | 121 | ax.set_xscale("log", base=2); ax.set_yscale("log"); ax.set_xlabel("local sample size m (N fixed)"); ax.set_ylabel(ylabel or metric) | ||
| 122 | + ax.set_ylim(bottom=max(ax.get_ylim()[0], 1e-8)) | ||||
| 122 | ax.set_title(f"{label}, p = {p}, N = {N:,}", loc="left", fontsize=9, color=INK) | 123 | ax.set_title(f"{label}, p = {p}, N = {N:,}", loc="left", fontsize=9, color=INK) | ||
| 123 | − ax.legend(ncol=1, loc="best"); FIG.mkdir(parents=True, exist_ok=True) | 124 | + ax.legend(ncol=2, loc="upper center", bbox_to_anchor=(0.5, -0.22), fontsize=7); FIG.mkdir(parents=True, exist_ok=True) | ||
| 124 | fig.savefig(FIG / (fname or f"fig_{metric}_vs_m_{label}_p{p}_N{N}.pdf")); plt.close(fig) | 125 | fig.savefig(FIG / (fname or f"fig_{metric}_vs_m_{label}_p{p}_N{N}.pdf")); plt.close(fig) | ||
| 125 | 126 | ||||
| 126 | 127 | ||||
@@ -159,29 +160,25 @@ def fig_coverage(s, label, p, N, ests=("r1_q0", "r1_q1", "r2_q0", "r2_q1", "r3_q | |||||
| 159 | 160 | ||||
| 160 | 161 | ||||
| 161 | def fig_boundary(fname="fig_boundary_exponential.pdf"): | 162 | def fig_boundary(fname="fig_boundary_exponential.pdf"): | ||
| 162 | − f = PROC / "boundary_summary.csv" | 163 | + """Ratio of the Monte Carlo mean scaled gap to the asymptotic limit, against m, per (r,q) and c; hollow markers = finite-m prediction.""" | ||
| 163 | − if not f.exists(): | 164 | + fp = PROC / "boundary_summary_with_prediction.csv"; f = PROC / "boundary_summary.csv" | ||
| 165 | + if not (fp.exists() or f.exists()): | ||||
| 164 | return | 166 | return | ||
| 165 | − b = pd.read_csv(f) | 167 | + b = pd.read_csv(fp if fp.exists() else f) | ||
| 166 | − fp = PROC / "boundary_summary_with_prediction.csv" | 168 | + cases = [(1, 1), (2, 0), (2, 1), (1, 2)] | ||
| 167 | − if fp.exists(): | 169 | + fig, axes = plt.subplots(1, len(cases), figsize=(2.45 * len(cases) + 0.6, 2.9), sharey=True) | ||
| 168 | − b = pd.read_csv(fp) | 170 | + cols = ["blue", "orange", "aqua"]; mks = ["o", "s", "^"] | ||
| 169 | − cases = [(2, 1), (1, 2), (3, 1), (2, 0)] | ||||
| 170 | − fig, axes = plt.subplots(1, len(cases), figsize=(2.5 * len(cases) + 0.5, 2.9)) | ||||
| 171 | − cols = ["blue", "orange", "aqua"] | ||||
| 172 | for ax, (r, q) in zip(axes, cases): | 171 | for ax, (r, q) in zip(axes, cases): | ||
| 173 | d = b[(b.r == r) & (b.q == q)] | 172 | d = b[(b.r == r) & (b.q == q)] | ||
| 174 | for i, c in enumerate(sorted(d.c.unique())): | 173 | for i, c in enumerate(sorted(d.c.unique())): | ||
| 175 | − dd = d[d.c == c].sort_values("N") | 174 | + dd = d[d.c == c].sort_values("m") | ||
| 176 | − ax.errorbar(dd["N"], dd["mean_gap"], yerr=1.96 * dd["se"], marker="o", ms=3.5, color=PAL[cols[i]], label=f"c = {c:g}", capsize=2, lw=1.2) | 175 | + ratio = dd["mean_gap"] / dd["limit_c_eff"]; err = 1.96 * dd["se"] / dd["limit_c_eff"].abs() | ||
| 177 | − ax.plot(dd["N"], dd["limit_c_eff"], ls="--", color=PAL[cols[i]], lw=1.0) | 176 | + ax.errorbar(dd["m"], ratio, yerr=err, marker=mks[i], ms=4, color=PAL[cols[i]], label=f"c = {c:g}", capsize=2, lw=1.2, ls="-") | ||
| 178 | if "pred_finite_m" in dd: | 177 | if "pred_finite_m" in dd: | ||
| 179 | − ax.plot(dd["N"], dd["pred_finite_m"], ls=":", color=PAL[cols[i]], lw=1.0) | 178 | + ax.plot(dd["m"], dd["pred_finite_m"] / dd["limit_c_eff"], marker=mks[i], ms=6, markerfacecolor="white", color=PAL[cols[i]], lw=0, markeredgewidth=1.1) | ||
| 180 | − ax.set_xscale("log", base=2); ax.set_xlabel("N"); ax.set_title(f"(r, q) = ({r}, {q}), α = {1-1/(2**(q+1)*r):.4g}", fontsize=8, loc="left") | 179 | + ax.axhline(1.0, color=INK2, lw=0.8); ax.set_xscale("log", base=2); ax.set_xlabel("local sample size m") | ||
| 181 | − axes[0].set_ylabel("mean of √N (θ̃ − θ̂_N)"); axes[0].legend(fontsize=7) | 180 | + ax.set_title(f"(r, q) = ({r}, {q}), α = {1-1/(2**(q+1)*r):.4g}", fontsize=8, loc="left") | ||
| 182 | − axes[-1].text(0.02, 0.02, "solid: Monte Carlo ±1.96 s.e.; dashed: limit; dotted: finite-m prediction", transform=axes[-1].transAxes, fontsize=6, color=INK2) | 181 | + axes[0].set_ylabel("mean gap / asymptotic limit"); axes[0].legend(fontsize=7, loc="upper right") | ||
| 183 | − for ax in axes: | ||||
| 184 | − ax.set_yscale("symlog", linthresh=1.0) | ||||
| 185 | fig.savefig(FIG / fname); plt.close(fig) | 182 | fig.savefig(FIG / fname); plt.close(fig) | ||
| 186 | 183 | ||||
| 187 | 184 | ||||
@@ -191,7 +188,8 @@ def main(): | |||||
| 191 | if a.figures: | 188 | if a.figures: | ||
| 192 | for (label, p), d in s.groupby(["label", "p"]): | 189 | for (label, p), d in s.groupby(["label", "p"]): | ||
| 193 | Nmax = d.N.max() | 190 | Nmax = d.N.max() | ||
| 194 | − fig_rmse_vs_m(s, label, p, Nmax, "rms_gap", ylabel="RMS of √N (θ̃ − θ̂_N)") | 191 | + ests = ("r1_q0", "r1_q1", "r1_q2", "r2_q0", "r2_q1", "r3_q0", "r3_q1", "cs_q1") + (() if label.startswith("exp") else ("csl1",)) | ||
| 192 | + fig_rmse_vs_m(s, label, p, Nmax, "rms_gap", ests=ests, ylabel="RMS of √N (θ̃ − θ̂_N)") | ||||
| 195 | fig_rmse_vs_m(s, label, p, Nmax, "rmse", ests=("r1_q0", "r2_q0", "r3_q0", "r1_q1", "r2_q1", "cs_q0"), ylabel="RMSE of √N (θ̃ − θ0)", fname=f"fig_rmse_theta0_vs_m_{label}_p{p}_N{Nmax}.pdf") | 193 | fig_rmse_vs_m(s, label, p, Nmax, "rmse", ests=("r1_q0", "r2_q0", "r3_q0", "r1_q1", "r2_q1", "cs_q0"), ylabel="RMSE of √N (θ̃ − θ0)", fname=f"fig_rmse_theta0_vs_m_{label}_p{p}_N{Nmax}.pdf") | ||
| 196 | fig_gap_collapse(s, label, p); fig_coverage(s, label, p, Nmax) | 194 | fig_gap_collapse(s, label, p); fig_coverage(s, label, p, Nmax) | ||
| 197 | fig_boundary() | 195 | fig_boundary() | ||
modified
results/figures/fig_boundary_exponential.pdf
+0 −0
Binary file not shown.
modified
results/figures/fig_coverage95_exp_contam_p1_N1048576.pdf
+0 −0
Binary file not shown.
modified
results/figures/fig_coverage95_exp_p1_N262144.pdf
+0 −0
Binary file not shown.
modified
results/figures/fig_coverage95_logit_misspec_p3_N262144.pdf
+0 −0
Binary file not shown.
modified
results/figures/fig_coverage95_logit_p3_N262144.pdf
+0 −0
Binary file not shown.
modified
results/figures/fig_coverage95_logit_p8_N16384.pdf
+0 −0
Binary file not shown.
modified
results/figures/fig_coverage95_pois_p3_N65536.pdf
+0 −0
Binary file not shown.
modified
results/figures/fig_coverage95_pois_p8_N262144.pdf
+0 −0
Binary file not shown.
modified
results/figures/fig_gap_collapse_exp_contam_p1.pdf
+0 −0
Binary file not shown.
modified
results/figures/fig_gap_collapse_exp_p1.pdf
+0 −0
Binary file not shown.
modified
results/figures/fig_gap_collapse_logit_misspec_p3.pdf
+0 −0
Binary file not shown.
modified
results/figures/fig_gap_collapse_logit_p3.pdf
+0 −0
Binary file not shown.
modified
results/figures/fig_gap_collapse_logit_p8.pdf
+0 −0
Binary file not shown.
modified
results/figures/fig_gap_collapse_pois_p3.pdf
+0 −0
Binary file not shown.
modified
results/figures/fig_gap_collapse_pois_p8.pdf
+0 −0
Binary file not shown.
modified
results/figures/fig_rms_gap_vs_m_exp_contam_p1_N1048576.pdf
+0 −0
Binary file not shown.
modified
results/figures/fig_rms_gap_vs_m_exp_p1_N262144.pdf
+0 −0
Binary file not shown.
modified
results/figures/fig_rms_gap_vs_m_logit_misspec_p3_N262144.pdf
+0 −0
Binary file not shown.
modified
results/figures/fig_rms_gap_vs_m_logit_p3_N262144.pdf
+0 −0
Binary file not shown.
modified
results/figures/fig_rms_gap_vs_m_logit_p8_N16384.pdf
+0 −0
Binary file not shown.
modified
results/figures/fig_rms_gap_vs_m_pois_p3_N65536.pdf
+0 −0
Binary file not shown.
modified
results/figures/fig_rms_gap_vs_m_pois_p8_N262144.pdf
+0 −0
Binary file not shown.
modified
results/figures/fig_rmse_theta0_vs_m_exp_contam_p1_N1048576.pdf
+0 −0
Binary file not shown.
modified
results/figures/fig_rmse_theta0_vs_m_exp_p1_N262144.pdf
+0 −0
Binary file not shown.
modified
results/figures/fig_rmse_theta0_vs_m_logit_misspec_p3_N262144.pdf
+0 −0
Binary file not shown.
modified
results/figures/fig_rmse_theta0_vs_m_logit_p3_N262144.pdf
+0 −0
Binary file not shown.
modified
results/figures/fig_rmse_theta0_vs_m_logit_p8_N16384.pdf
+0 −0
Binary file not shown.
modified
results/figures/fig_rmse_theta0_vs_m_pois_p3_N65536.pdf
+0 −0
Binary file not shown.
modified
results/figures/fig_rmse_theta0_vs_m_pois_p8_N262144.pdf
+0 −0
Binary file not shown.
modified
results/raw/ablation_exponential_N1572864_m96.csv
+19724 −0
Large diff (19,727 lines) is not loaded by default to keep the page fast.Load diff
Diff truncated — file too large.