Before you can ask which populations contributed to a genome, there is a prior question almost everyone skips: how many contributions does the data even require? That is qpWave's question. It shares nearly all of its machinery with qpAdm — same f4-statistics, same jackknife, same left-and-right structure — but instead of estimating proportions of named sources, it counts the independent streams of ancestry a set of populations carries relative to the outgroups. Small question, outsized consequences: most bad qpAdm models die at a question qpWave would have answered first.
The idea: rank#
Take your left populations and your right set, and
build the matrix of f4-statistics contrasting every left-vs-left pair against every right-vs-right
pair. If all the left populations descend from n ancestral streams (relative to the rights),
that matrix has rank n − 1 — the allele-frequency vectors are linearly dependent beyond that.
qpWave tests successive ranks and reports, for each, whether the matrix is consistent with it:
the number of waves is the lowest rank the data cannot reject. (The same computation appears
inside every qpAdm run as the rank test — the f4rank rows in the
model record. qpAdm is qpWave plus the assertion that the
target sits inside the span of the named sources.)
Degrees of freedom come from the same arithmetic as qpAdm's — which is why the right set must outnumber the streams being tested, and why a rank test against a symmetric right set is a test of nothing.
The two jobs it does#
Counting streams. Run qpWave on a set of related populations — say, the Bronze Age groups of one region — and it answers whether they can all be explained as mixes of two streams, or need three. That number is a hard constraint on every model downstream: a three-source qpAdm model of a target whose region needs only two is fitting noise with the third; a two-source model where three streams flow is structurally under-specified and will fail — informatively.
Testing cladality. With exactly two left populations, qpWave asks whether the matrix is consistent with rank zero — whether the pair forms a clade relative to the rights, no differential relatedness at all. This is the tool for the question that decides source lists: are these two candidate sources distinguishable, or are they the same stream wearing two labels? A cladal pair should never both sit in one source list (their weights would trade arbitrarily); the auditors' resolution floor makes the same point quantitatively — sources separated by FST under roughly 0.002 cannot be told apart by any right set (Williams et al. 2024).
Where it sits in a real workflow#
The auditors' recommended sequence — "testing all possible models with the lowest rank … before proceeding to test models with higher rank" (Harney et al. 2021) — is a qpWave-first discipline:
- One stream? Test whether the target is cladal with any single candidate source. If yes, the story is resemblance, not admixture, and no mixture model is justified.
- Two? Only after every one-stream explanation fails do two-source models earn their hearing; the rank test inside each qpAdm run is the referee.
- Three? Only when every two-way model over the pool is rejected — and the third stream must be one the chronology permits.
That ladder is exactly how models are searched here — the worked example climbs it on a real customer file, and the nested-model table in every published record shows the simpler models being given first refusal. The same machinery is also yours to run: the free AdmixTools 2 Lab exposes qpWave and the rank tests against a curated ancient panel, and the Model Lab runs the full ladder on your own merged genome. Counting before naming is the cheapest rigour in the entire toolkit — and the habit that separates models built on the data from stories decorated with it.
Terms used here are defined in the glossary.
References#
- Reich, D. et al. (2012). Reconstructing Native American population history. Nature, 488, 370–374. (qpWave's rank-test lineage.)
- Haak, W. et al. (2015). Massive migration from the steppe was a source for Indo-European languages in Europe. Nature, 522, 207–211. (SI 10: qpWave/qpAdm as published methods.)
- Harney, É., Patterson, N., Reich, D. & Wakeley, J. (2021). Assessing the performance of qpAdm. Genetics, 217(4), iyaa045.
- Williams, M. P. et al. (2024). Testing times. Genetics, 228(1), iyae110.



