Hierarchical Bayesian lexical dating — when did these languages diverge, and how sure can we be?
Given which languages share cognates for each concept, plus a tree and some age calibrations, it estimates the age of every node with a posterior distribution — a range, not a number. The pairwise model does the same for two languages without a tree.
It does not infer the tree, judge whether your cognate coding is right, or turn a weak signal into a confident date. A wide interval is the answer, not a failure. Deep-time estimates depend heavily on the rate prior, and the defaults here are shortened for responsiveness — a result you intend to publish belongs on the CLI.
Two languages, no tree: the hierarchical constant-rate pairwise model (P1). It runs in well under a second, so it updates as you change things.
A forms table in Clepsydra's TSV format: columns
language_id, concept_id, cognate_id,
and optionally primary_weight. It is read in this tab and
goes nowhere else.
The whole distribution, not just its middle. The shaded band is the central 90%; the dashed line is the median.
A whole chronology: the strict novel-state tree likelihood (T1) sampled by MCMC over every node age. This one takes a while — it runs off the main thread, and you can stop it.
Three files: a Newick tree, a forms table
(language_id, concept_id,
cognate_id), and a calibrations table
(target_id, type, p1…). The tip
names in the tree must match the language_ids. Nothing is
uploaded — the files are read in this tab.
Time runs right to left: the present is at the right edge, so a node's horizontal position is its age. Ancient tips stand at their own attested ages rather than level with the living languages.
Loosening a window does not make the estimate worse — it shows how
much of the estimate was the calibration talking rather than the
cognate data. A node that barely moves is carried by the data; one
that moves a long way is carried by an assumption you supplied. For
the stronger test — withholding each calibration entirely and asking
whether the model recovers it — use clepsydra
calib-sensitivity --mode loco on the command line.
The same two languages under five different assumptions about how vocabulary is lost. These are competing models to compare, not settings to choose from: they disagree, and which one is right is decided by held-out prediction on your data, never by preference.
Each curve is a full posterior over the divergence time; the tick under the axis marks its median. All five searched the same 100–8,000 BP range.
Nothing on this tab runs a model. It is the evidence that the models on the other tabs deserve any trust, and the places where they do not.
Two different claims get confused constantly, so they are kept apart here. Validity is evidence that the implementation computes what the model says — brute-force agreement on small trees, simulation-based calibration, seeded reproducibility. Adequacy is evidence that the model describes the data at hand, which no amount of correct arithmetic can establish. A model can be perfectly implemented and wrong about your languages.
The hardest test the project runs: take a language whose age is historically attested, hide that age from the model, re-date it, and ask whether the withheld date lands inside the credible interval. Nine ancient tips across Indo-European, Sino-Tibetan and Romance.
Every validity claim above names a test that runs in the project's test suite; every adequacy claim is a posterior-predictive or held-out check with its limits stated. Passing simulation-based calibration is never presented as adequacy — it only shows the sampler recovers what the model itself generates.