Lab 3: Beyond Cognacy
A tree without a single cognate judgement · Naxos Summer School 2026
This page runs Python inside your browser. Edit any cell and press Run Code.
The bottleneck
Lab 1 ended on an uncomfortable number: recall 0.70. LexStat found only seven in ten of the cognates the experts had found, and it was not going to do much better, since two and zwei are cognate and no longer look alike.
Lab 2 then built an entire Bayesian phylogeny on top of those judgements. The whole edifice rests on the cognate matrix.
That matrix is expensive. Expert cognate coding is the reason global-scale phylogenetics has been stuck: there are some 7,000 languages, and specialists have hand-coded cognates for a few dozen families. The annotation is thus the bottleneck, not the inference.
The question this lab asks is therefore the following.
The answer is yes, and the trick is to stop asking the question. Instead of the character “does language L have a reflex of cognate set c?”, which requires a specialist to answer, we use the character
“does language L have sound s at aligned position i of the word for concept c?”
Nobody has to adjudicate anything. All that is needed is an alignment. This is the approach behind Jäger (2026), which builds a tree of 3,397 languages this way. We shall do it on our 13.
Setup
1. Multiple sequence alignment, with T-Coffee
In Lab 1 we aligned words pairwise. Now we align all the words for one concept at once, into a single multiple sequence alignment.
The obvious way of doing so is progressive: align the closest pair, then add the next-closest, and so on. It is also the wrong way, and it is wrong for a reason that a historical linguist will recognise immediately. An early mistake is frozen in forever: two words that look unalike are aligned badly, and every later step inherits the error.
T-Coffee (Notredame, Higgins & Heringa 2000) corrects this, and its correction is essentially the comparative method. The code below is a port of the implementation used in Jäger (2026), and the whole of it can be read at tcoffee.py.
The consistency transformation
This is the one idea worth taking away, so it is given here in full.
A pairwise alignment is a greedy guess made in isolation, and it is often wrong. Before aligning anything, T-Coffee therefore asks a different question about every pair of positions:
Does the rest of the wordlist agree that these two sounds correspond?
For words \(w_1\) and \(w_2\), it re-scores the pairing of position \(i\) with position \(j\) by routing it through every other word \(w_3\):
\[\text{ext}[w_1,w_2][i,j] \;=\; \sum_{w_3} \min\!\big(\text{sim}(w_1,w_3),\, \text{sim}(w_3,w_2)\big)\;\cdot\;\big(A(w_1,w_3)\, A(w_3,w_2)\big)[i,j]\]
\(A(w_1,w_3)\) is a binary matrix, with a 1 wherever position \(i\) of \(w_1\) aligned to position \(k\) of \(w_3\). The matrix product counts the positions \(k\) in \(w_3\) that carry \(i\) through to \(j\). Each route is weighted by the weaker of its two links, so that a path through a bad alignment counts for little.
This is the two / zwei problem from Lab 1, solved.
Aligned directly, English /t/ and German /ts/ are a poor match, and a greedy aligner will get them wrong. Route them, however, through Latin duo, Greek dúo and Sanskrit dvá, each of which aligns cleanly to both, and the correspondence lights up.
The consistency transformation is thus the algorithmic form of “look at more languages before you decide”. It is the comparative method, written as a matrix product.
Cells are coloured by sound class, not by segment. This is deliberate: a sound correspondence then shows up as a column of one colour, even when the actual segments differ.
Read the columns. For three, the algorithm has found two sound correspondences without being told anything.
Column 1 holds the reflexes of PIE *t: t in Latin, Greek, Swedish and Romance, t̪ in Indic, d in Dutch and German. Different segments, one sound class, one colour: that is Grimm’s Law, sitting in a column, discovered by a matrix product. Polish is the exception that breaks the colour, and it is a real one: trzy has affricated to ʈʂ. Column 2 holds the rhotics: r, ʁ, ɾ, ɾʲ — though Polish contributes a sibilant ʂ here, and Hindi has no rhotic in this word at all.
Now change CONCEPT and look again. Sometimes the columns are this clean, sometimes they are mush. Both are informative, and, crucially, the method never has to decide which is which.
2. Binarising the alignment
Now we turn the alignment into characters. The recipe is exactly one sentence:
For every column of the alignment, and every distinct sound occurring in that column, make one binary character: 1 if the language has that sound in that column, 0 if it has something else.
Languages that lack the word entirely get ? (missing), not 0. This matters, and it is the kind of detail that lives in a methods section and quietly decides the results.
Look down the column headed d. It is 1 for Dutch and German and 0 for everyone else: a shared innovation, expressed as ones and zeros. Look at ʈʂ and you have Polish on its own. Those are characters, and Lecture 3’s CTMC will happily run on them. It neither knows nor cares that no linguist ever certified a cognate set.
(Try CONCEPT = "hand" in §1 and re-run both cells: there the columns headed h and m are the Germanic/Romance split, though that one is lexical replacement rather than a sound correspondence.)
3. Do it for all 170 concepts
Compare this with Lab 2. The cognate matrix had 1,030 characters and required a team of specialists. This one has roughly 7,000 and required nobody.
That is the trade the method makes. The characters are individually much noisier, since a shared sound in a shared column is far weaker evidence than a shared cognate set, and a good many of the columns are junk. There are, however, seven times as many of them, and they are free.
4. The tree
MrBayes has been run on this matrix under exactly the same settings as in Lab 2: the same birth-death clock, and the same three tip calibrations. The two trees are therefore directly comparable, and both are rooted and dated.
Compare the axes, not merely the shapes. The topologies are close. The dates are not: the right-hand tree is systematically and dramatically older. Section 4.2 below is about precisely that.
Does it recover the branches we are sure about?
That table should be read twice, because it says two opposite things.
The topology works. All five branches, Germanic, Romance, Slavic, Hellenic and Indic, are recovered by a method that never once asked whether two words were cognate. The Robinson-Foulds distance is 6 out of a possible 20, and the disagreements are confined to the deep structure that nobody is confident about in any case. On the question of the shape of the tree, the cognate-free method holds its own.
The timescale does not. Every single date is inflated, and the shallower the clade, the worse it gets: Proto-Indo-European goes from 6,045 to 9,019 BP, which is half again; but Germanic goes from 1,355 to 3,425, which is two and a half times, and Slavic from 710 to 2,903, which is over four. The tree is not simply stretched. It is stretched most where there was least to go on.
Why the dates blow up
This is not a bug. It is the method’s cost, and it is worth understanding exactly.
The MSA characters are noisy. Two languages can share a sound in an aligned column by pure chance, which is homoplasy, and there is a great deal of it among 7,475 weak characters. The model cannot distinguish chance resemblance from inherited resemblance, and so it explains the extra mismatches in the only way available to it: more change must have happened. More change means longer branches, and longer branches mean older dates.
The noise does not average out here. It pushes in one direction, and that direction is older.
The MSA interval is not merely shifted older. It is more than twice as wide, and it reaches almost 15,000 BP. As a date for Proto-Indo-European, that is not a result. It is a shrug.
See it, rather than read it
Two DensiTrees, side by side, with every posterior tree overlaid one faintly on top of another. Where the trees agree the ink piles up dark; where they disagree it spreads into a haze.
Note that both panels share the same axis. The difference is now not a number in a table, but something that can be pointed at.
The cognate posterior on the left is a tree: a spine, with a little fuzz at the deep nodes. The MSA posterior on the right is a cloud. The languages, the model and the clock are the same in both, yet the uncertainty is visibly and dramatically larger, spreading right across the panel.
Both give us the same five branches. Only one of them gives us a timescale that could be defended.
Use the method for topology, and not for dates, at least not without the further machinery (homoplasy correction, ascertainment modelling) that a real study would bring to bear.
This is exactly what Jäger (2026) does. The claim there is about tree shape: 96.4% quartet agreement with the Glottolog expert classification, across 3,397 languages. It is not a claim about dating the world’s languages, and the reason for that is now clear.
Note, furthermore, that none of this could have been discovered from the point estimates alone. It took the posteriors.
One caveat, honestly reported. In the MSA run, clockrate is the worst-mixing parameter in the whole analysis: ESS 229, which clears the 200 we insisted on in Lab 2, but only just. The topology is solid (all PSRF 1.000–1.004, ASDSF 0.006), so the dates rest on the one parameter that is estimated least well. This is a further reason to treat the MSA timescale with caution. It is also the sort of line that belongs in a methods section and usually is not there.
5. So what is this for?
On 13 well-studied Indo-European languages, this is a curiosity. We already had the cognate judgements, and they are better.
The point is what happens where we do not have them. Jäger (2026) runs exactly this pipeline on 3,397 languages, a scale at which expert cognate coding does not exist and is not going to, and obtains a tree that agrees with the Glottolog expert classification on 96.4% of quartets.
That is the real claim, and it is now clear precisely what it rests on:
- phonetic transcriptions, which are available at scale (Lexibank, ASJP);
- an alignment algorithm, which requires no linguistic judgement;
- a binarisation rule that fits into one sentence;
- the same CTMC from Lecture 3, run on the result.
Nowhere in that chain does a human decide what is cognate with what. That is how one gets past the bottleneck, and, as always, the next question to ask is what it costs.
Exercises
Try several concepts in §1, and find one for which the columns are a mess. What went wrong? Are the words genuinely unrelated, so that there is nothing to align, or are they related but mis-placed by the alignment? Which of those two failures does the binarisation punish more heavily?
In §2, a language lacking the word gets ?, not 0. Change it to 0 and rebuild the matrix. What does that change claim, in linguistic terms? A 0 asserts that this language does not have sound s here. Is that something we know? And does the tree change?
The cognate matrix had 1,030 strong characters; this one has roughly 7,000 weak ones. Both recover the same five branches, yet the weak ones inflate every date, and inflate the shallow clades far more than the deep ones (Slavic ×4.1, Germanic ×2.5, PIE ×1.5).
Why does noise push the dates up, rather than scattering them in both directions? Consider what a chance sound-match looks like to a model that assumes all resemblance to be inherited. And would the same bias affect the topology, or only the branch lengths? The answer explains why Jäger (2026) reports quartet agreement rather than dates.
On 13 well-studied Indo-European languages the expert cognates are better, and we already had them, so the sound-alignment method is a curiosity here.
Name the situation in which it is not a curiosity but the only option, and say what you would have to check before believing its output there. Lecture 5’s time-depth ceiling is relevant, and it cuts both ways.