A random ancestral DNA sequence evolves down a randomly generated binary tree under the Jukes–Cantor (JC69) substitution model: on a branch of length t, each site independently changes with probability
p = 3/4 · (1 − e^(−4/3 · μt))
swapping to one of the other 3 bases uniformly. Only the leaf sequences are "observed" — the tree topology and branch lengths are hidden, exactly like real sequencing data.
Reconstruction works backward from the observed sequences:
- Compute the raw fraction of differing sites (p-distance) for every pair of taxa.
- Apply the JC69 correction
d = −3/4·ln(1 − 4/3·p) to estimate true evolutionary distance, undoing multiple hits at the same site.
- Feed the corrected distance matrix to Neighbor-Joining (Saitou & Nei, 1987): repeatedly pick the pair (i,j) minimizing
Q(i,j) = (n−2)d(i,j) − r(i) − r(j), join them under a new internal node with branch lengths solved from the Q-matrix, and update the distance matrix — until two nodes remain.
Split recovery accuracy compares every internal edge (bipartition of taxa) in the true tree against the NJ tree and reports the fraction correctly recovered — this is a simplified Robinson–Foulds comparison, the standard way tree-building methods are benchmarked.
- μ, sequence length — more sites and a moderate substitution rate give distances more signal; too high a rate causes multiple substitutions per site ("saturation"), which even the JC correction can't fully undo — watch accuracy degrade.
- Taxa count — more taxa mean more splits to get right, and shorter internal branches that are easy to misplace.
Real-world relevance: this exact pipeline — sequence → distance matrix → Neighbor-Joining — is run daily to trace pathogen outbreaks (e.g. building SARS-CoV-2 or influenza lineage trees from surveillance genomes), choose vaccine strains, and map antibiotic-resistance spread in biotech and public-health labs.