Refine theoretical justification for alpha estimation.

Document limitations of various $\alpha$-estimation methods, clarifying that tree-based methods require a tree for accurate heterogeneity estimation and that `PartitionDispersion` avoids violating identifiability requirements.
This commit is contained in:
Eric Coissac
2026-09-12 07:44:51 +02:00
parent 020b391636
commit be838da256
+207
View File
@@ -2467,6 +2467,213 @@ mechanical substitution but weren't independently checked against an
`ape`-equivalent reference for those three specifically — flagged here, not
silently assumed correct.
### α-estimation literature survey and design discussion (2026-09-11)
Follow-up discussion after implementing `PartitionDispersion::estimate_alpha`
(previous section), triggered by the user pointing out that the literature
conflates two distinct problems: *estimating α from an alignment* versus
*using a given α in a Jin-Nei-style corrected distance*. Jin & Nei (1990)
itself is squarely in the second camp — α is a user-supplied parameter
there, not something their paper estimates (confirmed by reading the paper
directly, see previous section). This section catalogs the actual
α-estimation literature and records which approaches were considered and
why each was or wasn't adopted.
**Bibliography** (methodological papers, not exhaustive users of ``):
| Method | Reference | Needs a tree? | Estimates "true" α or a task-specific one? | Cost |
|---|---|---|---|---|
| ML, continuous Γ (foundational) | **Gu, Fu & Li (1995)**, MBE 12:546–557 — read in full | yes, topology fixed a priori | true α (+ θ jointly, invariant+Γ) | very high, ≤5–6 taxa in practice |
| ML, discrete Γ | Yang (1993/94), MBE 10:1396; JME 39:306 | yes | true α | high |
| Parsimony-based ML on inferred changes | Yang & Kumar (1996), MBE 13:650 | yes, equal branch lengths assumed | true α, biased when branches unequal | low |
| Corrected substitutions/site → NB fit | **Gu & Zhang (1997)**, MBE 14:1106 — read in full | yes, + ancestral reconstruction | true α, close to ML accuracy | low (given a tree) |
| Topology-optimizing grid search | **Guindon & Gascuel (2002)**, MBE 19:534 — read in full | yes, but built *from* the candidate distances themselves (BIONJ) | **not** true α — deliberately biased *upward* for topological accuracy | low–moderate (grid × tree build) |
| Free (non-parametric) rate distribution | Susko et al. (2003), Syst. Biol. 52:594 | yes | tests the Γ assumption itself | high |
| Parsimony counts/site → NB fit | **Wakeley (1993)**, JME 37:613 — read in full | yes, NJ tree + Fitch parsimony ancestral reconstruction | true α, biased *upward* by parsimony (conservative) | low (given a tree) |
| Poisson-Gamma/negative-binomial, foundational | Uzzell & Corbin (1971), Science 172:1089 — **not read**, only seen via citations | unknown — likely also count-per-site/tree-based, unverified | true α (indirect, via NB overdispersion) | unknown |
| Bayesian posterior over α | BPP/MrBayes/BEAST2/RevBayes | yes | posterior, not point estimate | very high |
**Correction (2026-09-11, after reading Wakeley in full):** an earlier
revision of this table filed Wakeley (1993) under "no tree needed" —
wrong. Wakeley's method: build a tree (neighbor-joining, Saitou & Nei
1987, on the real mtDNA data; coalescent-simulated for the simulation
study), reconstruct ancestral states at internal nodes by Fitch (1971)
parsimony, count the *minimum* number of changes per site this implies,
then fit either a two-rate Poisson mixture or a gamma-distributed-rates
model (⟹ negative binomial, parameters by the methods of Cohen 1965 and
Johnson & Kotz 1969) to the resulting per-site count distribution — the
same general "tree + ancestral reconstruction + per-site counts + NB fit"
shape as Gu & Zhang (1997), just using raw parsimony counts directly
rather than Gu & Zhang's multiple-hit-corrected ``. Confirmed by
simulation (Wakeley's own Fig. 1) that parsimony underestimates both the
mean *and* (more severely) the variance of per-site change counts, which
biases `α` **upward** (toward apparent uniformity) — consistent with Gu &
Zhang's own citation of Wakeley for exactly this bias, and with the
general "parsimony overestimates α" pattern noted throughout this
literature. Real hypervariable-region-1 mtDNA data gave `α̂ ≈ 0.44–0.60`
per data set, `0.47` combined — despite the conservative bias, still
solidly in the "strong heterogeneity" range, which is the paper's own
point: the method is biased but usefully conservative, not useless.
**Where `PartitionDispersion::estimate_alpha` actually sits**: nowhere in
this table's tree-dependent rows. It shares only the *abstract
mathematical identity* (Poisson-Gamma mixture ⟹ negative binomial
over-dispersion) with Wakeley/Uzzell-Corbin/Gu&Zhang, applied via a
genuinely different, tree-free and ancestral-reconstruction-free route:
pairwise genome-to-genome substitution counts pooled by *partition*
instead of per-site counts pooled across an alignment's columns after
ancestral state reconstruction. As far as this survey has established
(Uzzell & Corbin not read, so not fully ruled out), **no tree and no
ancestral reconstruction of any kind** appears to be a genuinely
distinguishing property of `PartitionDispersion`, not something it
inherits from prior art — consistent with it being an independent
derivation rather than a literature implementation (see previous
section's caveat, now on firmer footing).
**Why a tree-free estimate is even valid — the identifiability question.**
Raised directly by the user after reading Gu, Fu & Li (1995), which states
explicitly: *"one cannot estimate the rate heterogeneity when the number
of sequences is <3."* This is a real non-identifiability result, not a
practical inconvenience: with only 2 sequences, a site's history is
summarized by one binary observation (differ / don't differ), collapsed
across all sites into two aggregate numbers (transition and transversion
proportions) — divergence time and among-site rate variance are
confounded in that pair of numbers, with no way to separate them. Every
method surveyed above (Gu,Fu&Li, Yang, Wakeley, Gu&Zhang) needs ≥3
sequences *sharing one evolutionary history* (a tree) specifically to get
multiple independent looks at the *same* site's rate across different
lineages, which is what identifies its variance.
`PartitionDispersion` doesn't violate this, because it isn't estimating
the same quantity. The literature above estimates rate variation **across
sites, within one shared tree**. `PartitionDispersion` estimates rate
variation **across partitions, pooled over every genome pair in the
index** — each genome pair stands in for one independent draw of a
partition's relative rate, the same identifying role multiple lineages
play in the tree-based methods, just substituting "genome pair" for
"lineage" and "partition" for "site." With `P` genome pairs (potentially
in the hundreds here) all contributing to every partition's pooled count,
the ≥3-samples identifiability requirement is met by the pair count, not
by tree depth — closer in spirit to Jin & Nei's own original motivating
scenario (comparing several genomic *regions* across one fixed panel of
taxa) than to single-tree site-rate estimation.
This substitution carries its own assumption, which must be named rather
than left implicit: that a partition's *relative* rate (fast/slow) is
reasonably stable **across genome pairs**, not just across sites within
one pair — the direct analogue of the "no lineage-specific rate variation,
only site-specific" assumption every tree-based `` method already makes,
just moved from lineage→pair and site→partition. If this breaks — e.g. an
index mixing very closely related and very divergent genome pairs, where a
partition's saturation behavior differs qualitatively between the two —
the estimate could be misled in a way a tree-based method would at least
have the topology to detect and a tree-free, pool-everything method
cannot. Not yet tested against real data with strongly heterogeneous
pairwise divergence; worth keeping in mind as the main open validity
question for `--gamma-shape auto`, not the citation question (now settled)
this whole discussion started from.
**Gu, Fu & Li (1995), read in full — the foundational ML method, not a
candidate to implement.** Models rate variation as invariant+Γ (`θ` =
proportion of invariant sites, `α` = gamma shape among the variable sites),
and derives the exact joint likelihood over nucleotide *configurations*
across all `n` sequences on a **fixed, a-priori-known tree topology** —
for 3 sequences this is closed-form (Jukes-Cantor), for `n` sequences it's
a sum over `4^n` configurations weighted by coefficients tied to the
specific topology's branching structure (their eq. 32–34), with branch
lengths, `α`, and `θ` jointly optimized by Newton-Raphson (Hessian over all
free parameters). The site-rate integral has the same closed form
`E = θ + (1-θ)(1+D/α)^{-α}` that underlies `` distance corrections
generally (the same mechanism as `corrected_log`, not a coincidence — Jin &
Nei's own formula is the `θ=0` special case applied to a pairwise `D`
rather than a whole-tree one). Explicitly stated by the authors as
infeasible beyond about 5–6 taxa (their own simulations stop at 5); not a
candidate for obikmer's typical genome counts. Notable contribution worth
keeping in mind regardless: `ρ = (1+θα)/(1+α)` is shown to be a more robust
summary of rate heterogeneity than `α` alone whenever `θ` isn't negligible
— `α` and `θ` are confounded (nearly-invariant sites can come from either a
small `α`'s left tail or from a nonzero `θ`), so `α` alone can be very
unstable while `ρ` stays well-behaved. `PartitionDispersion` has no `θ`
term at all (no invariant-site component), so this confound doesn't arise
for it the same way, but it's worth remembering if an invariant+Γ variant
is ever considered.
**Gu & Zhang (1997), read in full — rejected for now.** Their procedure:
(1) a tree with least-squares branch lengths must already exist; (2)
ancestral states are reconstructed at every internal node (they use Zhang &
Nei 1997's likelihood method, but note plain parsimony would work, just
less accurately); (3) per site, branches are split into "changed"/"unchanged"
given the ancestral reconstruction, and the *expected* substitution count
`` (corrected for multiple hits) is obtained by solving their eq. (7)
(or eq. 12 for the generalized model) numerically — a root-find per site,
not a closed form; (4) the site-level `` values (real-valued, not
integers) are fit to a negative binomial (Uzzell & Corbin 1971) by ML to
get α — again no closed form, numerical optimization. This is a real
per-site pipeline requiring a tree *before* distances/α can be computed —
the reverse of obikmer's current dependency order (`snp_distance` computes
distances, which `--nj`/`--upgma` only turn into a tree *afterward*). Their
own answer to this chicken-and-egg problem is an iterative
distance→tree→α→distance loop, which they themselves flag as expensive.
Adopting this would mean a new ancestral-reconstruction subsystem (even a
parsimony/Fitch-only version) plus a per-family nonlinear solve plus an NB
ML fit — a much bigger addition than `PartitionDispersion`, not something
to build without a concrete need beyond "closer to Gu&Zhang's own
simulated accuracy than our moment estimator."
**Guindon & Gascuel (2002), read in full — plausible future addition, not implemented.**
Their **Q criterion**: for a candidate α, build a tree (they use BIONJ) from
the α-corrected distance matrix; for every internal branch, group taxa into
the 4 subtrees it separates (A, B, C, D), compute mean inter-subtree
distances \(\bar\delta_{AB}\), \(\bar\delta_{CD}\), etc., and let `S ≤ M ≤ L`
be the three pairings' sums (`{AB,CD}`, `{AC,BD}`, `{AD,BC}`); the branch's
reliability score is `Q_branch = L − M` (zero when the four points are
perfectly tree-additive). The whole-tree `Q` is the mean over internal
branches (negative/zero branches excluded). `α* = argmin_α Q(α)` over a
grid (their run: ~60–100 points, 0.1 to 5000, finer spacing where
sensitivity is highest). Complexity: `O(n²l)` once for the base
frequencies, then `O(n²r)` for the `r` candidate distance matrices, then
`O(n³r)` worst case for building `r` trees and evaluating `Q` on each
(same order as the tree-building step itself, so "free" relative to it).
Central finding, **the opposite direction from an initial misreading in
this discussion**: `α_opt` (Guindon-Gascuel's topology-optimal value) is
**always ≥ the true α**, not the reverse — underestimating rate
heterogeneity (i.e., picking a larger α than reality) reduces the variance
of distance estimates and thereby improves NJ/BIONJ topological accuracy,
especially when the molecular clock roughly holds (where `α_opt → ∞`, i.e.
no correction at all is topologically best). This is an *empirical
regularity* observed across their tested conditions (η ∈ {0.5, 2.0}, true
α ∈ {0.1, 0.7}, 20-taxon trees) — not a theorem — so treating it as a hard
guarantee would be another unverified-claim mistake of the kind this whole
discussion has been correcting.
**Proposed integration (not yet implemented)**: since `α_true ≤ α_opt`
empirically, `PartitionDispersion::estimate_alpha()`'s output could seed
the *lower bound* of Guindon-Gascuel's grid (search `[α̂, ∞)` instead of
`[0.1, 5000]`), narrowing the grid substantially and reusing the existing
estimator rather than needing an independent "true α" source — this also
sidesteps Gu & Zhang's tree-first dependency problem entirely, since
Guindon-Gascuel's own grid already builds a tree per candidate. Still
requires: (a) a **BIONJ** implementation (see below), (b) the Q-criterion
subtree-grouping logic, (c) a grid-search driver. Not started.
**BIONJ availability in the Rust ecosystem — checked 2026-09-11, none found.**
Searched crates.io directly (API query for "bionj": 0 results) and read the
docs.rs pages of the most plausible candidates: `phylotree` (builds/reads/
manipulates trees but has no distance-matrix reconstruction — no NJ, no
BIONJ, no UPGMA despite web-search summaries claiming otherwise, corrected
after checking the actual docs), `speedytree` (NJ only — Canonical/RapidNJ/
Hybrid variants, explicitly no BIONJ), `nj` (plain NJ only), `phylo` (no
distance-based reconstruction at all). `obikphylo::neighbor_joining`
(`tree.rs`) is plain NJ, not BIONJ — BIONJ (Gascuel 1997) differs only in
how branch lengths are weighted during agglomeration (accounts for
distance-estimate variance, not just the sum), a modest delta over an
existing NJ implementation rather than a rewrite, but would need to be
written in-house if the Guindon-Gascuel integration above is ever pursued
(their own paper notes other tree-building methods gave similar results in
their simulations, so plain NJ may be an acceptable substitute if BIONJ
proper is judged not worth the effort).
### Output format: PHYLIP-relaxed by default for the distance matrix
**Implemented.** The primary distance-matrix output