Skip to content
Ancestrify
All stories

qpAdm

By Andi Thomaj
18 min read

Every number in your qpAdm report: the model record explained, with a worked example

What every number in the model record of an Ancestrify qpAdm report means, from chi-square, degrees of freedom and f4 rank to 95% confidence intervals, what the analyst checked before publishing, and a worked example read line by line, with the R code to rerun it.

qpAdmMethodologyAdmixturePopulation geneticsGuides

  1. Where the record lives
  2. The fit block
  3. The sources ledger
  4. Right (outgroup) populations
  5. What the analyst checked before publishing
  6. A worked example
  7. The record
  8. Check the arithmetic
  9. The two checks behind it
  10. Putting it into words
  11. Rerunning the model
  12. Why publish all of this
  13. Questions
  14. References

A qpAdm result is usually shown as four numbers: a p-value, and a weight, standard error and z-score per source. Those four decide whether a model is worth reading, and how to read them is its own guide. But the software computes a great deal more than four numbers, and every one of the others is something a second analyst would ask for before accepting the model. Since August 2026 every Ancient Ancestry report (our qpAdm analysis) publishes them on screen, at no extra cost. This guide reads that record from top to bottom on a real published model, then works through an illustrative one line by line: the arithmetic you can check with a calculator, the two checks the analyst ran before publishing, and the R code that reruns the model.

Where the record lives#

Open an Ancient Ancestry report, and the Ancestry tab has two views: Atlas, the map, with a description of each source population, and Your model. The Your model view, headed Reading your model, holds the model record for the era on screen, under For specialists (closed until you open it). Its header names the era, the version of the report and the reference panel, and the record has three parts: seven fit figures under a verdict, a Sources table, and the right (outgroup) populations with their sample counts. Each era shows one model, the one a person chose from the candidates and approved. Under the record, the owner of the report also finds an Ancestry Workbench row that opens that exact model in the Ancestry Workbench, ready to run on their own kit.

That is all the Your model view shows. The two checks the analyst ran before publishing are not printed (they are described further down), the report carries no written note from the analyst, and the record itself does not download: there is no PDF and no text export.

The same record is on the live demo with example data, so you can see the shape of it before buying anything. What follows is the record, section by section, with the figures from a real published two-era model, with every identifying detail removed, and then a worked example, read line by line.

The fit block#

Seven tiles sit at the top of the record, under a verdict. The verdict says where the era stands against our publish bar: "Clears Ancestrify's bar" means the p-value, every Z-score and every standard error meet it (p of 0.05 or above, every Z of 3 or above, every standard error of 0.10 or below), and "Below Ancestrify's bar" means one of them does not. It is a pass or a fail, not a grade among passing models. Read the tiles in this order.

p-value. The one number everyone knows. It tests whether the pattern of shared drift in your genome is compatible with the proposed mixture of sources, measured against the outgroups; above 0.05 the model is admissible, below it the model is rejected and the weights should not be read. The example model sits at p = 0.211. It is not the probability the model is true, and a higher value past the bar is not stronger evidence: the reading guide covers the misreadings.

Chi-square and degrees of freedom. The p-value is derived from these two. qpAdm fits a matrix of f4 statistics between the sources and the outgroups and asks how far the observed matrix sits from the closest matrix of the required rank; that distance is the chi-square, here 9.618. The degrees of freedom count how many independent contrasts the model had to fit, and depend on how many sources and outgroups there are. With the target plus k sources on the left and n populations on the right, qpAdm tests a k × (n − 1) matrix of f4 statistics at rank r, and the degrees of freedom are (k − r) × (n − 1 − r). Three sources fitted at rank 2 against ten outgroups gives (3 − 2) × (9 − 2) = 7 degrees of freedom, which is what the example prints; more outgroups mean more degrees of freedom and a harder test. A chi-square of 9.6 on 7 degrees of freedom is close to what chance alone would produce, which is what p = 0.21 says in one number.

f4 rank. For a mixture of k sources, the f4 matrix must have rank k − 1: three sources, rank 2, meaning three ancestry components relative to the right set, which is not the same as three migrations. The record prints the rank the published model was fitted at. Before a model is proposed it is also fitted at every lower rank, the rank test described further down; had rank 1 passed, two streams of ancestry would have been enough, and the third source would not be there.

Min SNPs per f4. qpAdm computes each f4 statistic on the markers available for that particular quartet of populations, which differ because ancient samples have gaps in different places. The record reports the smallest of those counts, here 96,302, because that is the contrast with the least data behind it and therefore the honest figure. A record that reported the average, or the size of the merged file, would be flattering itself.

Merged SNPs. How many of your markers survived the merge with the ancient panel: 176,468 for this 23andMe kit. This is the coverage that sets the floor on every standard error in the table. It is a property of the file, not of the analyst: a whole-genome kit merges to far more positions and returns visibly tighter intervals, which is the whole argument of uploading a whole-genome VCF.

Jackknife blocks. Standard errors in qpAdm come from a block jackknife: the genome is cut into blocks (by default about 5 centimorgans each), the model is refitted leaving each block out in turn, and the spread of those refits is the error. The record prints how many blocks the genome was cut into, typically about 700. It is there so that a reader can see the errors were computed the standard way, on the standard scale.

The sources ledger#

One row per source, and this is where the four familiar numbers gain some company.

#SourcePanel labelnShareWeightSEZ95% CI
01Gandharan SwatPakistan_Barikot_H.AG444.0%0.43980.06277.020.317 to 0.563
02Arabian PeninsulaBedouinB.DG2118.3%0.18340.03934.670.106 to 0.260
03Peninsular South IndianIrula.SG1037.7%0.37680.036710.260.305 to 0.449

Source and panel label. The catalog name is ours; the panel label is the exact population in the reference panel the model was computed with, suffix and all: the Allen Ancient DNA Resource v66 plus our own supplement, as the Your model view's header names it. The two are printed side by side so the model can be reproduced by anyone with the same panel, and so that a curated name never hides which group of genomes was actually used, including a present-day stand-in such as the Bedouin genomes (BedouinB.DG) behind the Arabian Peninsula source. Every catalog population has a page in the ancestry directory; the dataset is explained in the AADR explainer and the suffixes in AADR sample labels explained.

What a label does not mean. This matters more than it sounds. A model that assigns 18% of someone's ancestry to a source called Arabian Peninsula is not saying an ancestor came from Arabia. It is saying that of the reference populations in the panel, that one explains that part of the genome best. The method cannot place ancestry within a region, and the label alone invites exactly the wrong reading. A source label names the closest reference population in the panel, a group the model tests against, never a statement about where a particular person lived.

n. How many individuals the source population contains. A source of four samples is a thinner reference than one of twenty-one, and the record says so rather than leaving it to be inferred.

Share and weight. The same number twice: the weight is the raw proportion the model estimated, and the share is that weight as a rounded percentage. They are printed together because a headline percentage should always be traceable to the raw figure it was rounded from.

SE and Z. The standard error of the weight and the weight divided by it. A source at |Z| of 7 sits seven standard errors from zero; the reading guide covers why a source at |Z| of 1 is indistinguishable from nothing whatever its percentage says.

95% CI. The weight plus or minus 1.96 standard errors, the range within which the true proportion would plausibly sit. Read it before the percentage. "44%" invites a precision the data do not have; "between 32% and 56%" is what the model actually established. An interval that reaches down to zero is a source the model cannot distinguish from nothing, and our publish bar (|Z| above 3 for every source, a house convention rather than a validated criterion) is designed so that no published interval does.

Right (outgroup) populations#

The right set is listed in the order the model used it, each with its sample count, because the first right population is the base every f4 statistic is taken against and the count of each one decides how much power it has to reject a wrong source. A passing model means something only against a right set that can tell the sources apart: populations related to them unequally, and sampled well enough to show it. Understanding qpAdm explains the choice. The example used ten: Mbuti, Han, Karitiana, Tianyuan, Kostenki14, Neolithic Anatolia, Yamnaya, Bronze Age Shahr-i-Sokhta, Bronze Age Gonur and Bronze Age Israel.

What the analyst checked before publishing#

Two more tables come out of every run. The report does not print them, because they are the analyst's working rather than the result, but no model is proposed until both have been read.

The first is the nested-model table: every simpler model obtained by removing sources from the published one, each refitted with its own p-value and a check that its weights stayed feasible (inside zero and one). A source earns its place only when every model without it is rejected; when a simpler model passes, the simpler model is the one that gets published. In the example model every simpler alternative was rejected by an enormous margin, and one of them could only fit by pushing a weight past 100%, which is the method's way of saying that, against this right set, the remaining sources could not stand in for the removed one.

The second is the rank test: the chi-square, degrees of freedom and p-value of the f4 matrix at every rank from the published one down to zero. Rank 2 is the published three-source model. Rank 1 would mean two streams of ancestry were enough for the target and all three sources together, and in the example it fails at p = 10⁻⁹⁰; rank 0, a single stream, is off the scale. Testing the lowest rank first is statistical parsimony, and what it shows is that, relative to this right set and this candidate pool, the simpler models do not fit. It does not prove that three historical populations mixed: on a genetic landscape, a fitting model can be a useful summary of where a genome sits between sampled groups without those groups ever having mixed.

ADMIXTOOLS 2 also prints its own diagnostics, and they are read with the run; the report does not print them either. The one present on almost every model is that SNP counts vary across f4 contrasts and the reported count is the minimum, which is the point explained under "Min SNPs per f4" above. Together with the publish bar every model has to clear (p above 0.05, every source at |Z| above 3 with a standard error below 0.10), these checks are what stands behind a record before it reaches you.

A worked example#

Everything above, applied to one era from top to bottom. This record is illustrative: every figure is invented to be internally consistent and to clear the publish bar, and it is not a customer's result. Its labels are the shorthand the literature uses, so it reads without a panel lookup; a real record prints the exact panel label, suffix and all, as in the record above. The era is Hunter-Gatherer and Neolithic Farmer, and the target is a living person whose raw file merged to about 214,000 markers against AADR v66.

The record#

The verdict comes first:

Clears Ancestrify's bar
p-value              0.164
chi-square           11.720
degrees of freedom   8
f4 rank              2
min SNPs per f4      121,880
merged SNPs          214,306
jackknife blocks     711

p = 0.164 is above 0.05, so the model is admissible: the data do not contradict it, which is not the same as confirming it, and the label says no more than that. Three sources fitted at rank 2 against eleven right populations give 8 degrees of freedom, and a chi-square of 11.7 on 8 is about what chance alone produces. The thinnest f4 contrast still rests on 121,880 markers, more than half of the 214,306 that merged, and 711 is the usual jackknife count at about 5 centimorgans a block.

Then the sources:

#SourcePanel labelnShareWeightSEZ95% CI
01Anatolian Neolithic FarmerAnatolia_N2448.7%0.48700.02817.390.432 to 0.542
02Western Steppe HerderYamnaya_Samara1033.4%0.33400.03110.770.273 to 0.395
03Western Hunter-GathererWHG817.9%0.17900.0247.460.132 to 0.226

Read it right to left, because the right-hand columns decide whether the left-hand ones mean anything. No interval reaches zero. The smallest Z, WHG at 7.46, sits seven and a half standard errors from nothing, and every SE is below 0.10. Only then the shares, and as ranges: the steppe source is not "33%" but somewhere between 27% and 40%. The numbering is the order the sources were listed in the model, not a ranking, and the n column says plainly that eight WHG individuals are a thinner reference than 24 Anatolian farmers.

Then the right set, in run order:

#Right populationn
1Mbuti.DG4
2Ust_Ishim.DG1
3Kostenki141
4MA11
5Han.DG4
6Papuan.DG14
7Onge.DG2
8Karitiana.DG3
9Iran_N5
10Levant_N12
11EHG3

The first eight come from the deep outgroup set of Haak et al. (2015); the last three are era contrasts that let the test tell a source with Iranian-related, Levantine-related or eastern hunter-gatherer ancestry from one without. Mbuti.DG is first because it is the base of every f4 statistic. This list is what makes the p-value checkable, since a p-value means something only against the outgroups it was computed with; where sets like this one come from is in the standard right sets.

Check the arithmetic#

Without running anything:

  • Do the weights sum to 1? 0.4870 + 0.3340 + 0.1790 = 1.0000, as qpAdm constrains them to.
  • Is each Z the weight over its SE? 0.4870 / 0.028 = 17.39; 0.3340 / 0.031 = 10.77; 0.1790 / 0.024 = 7.46.
  • Is each CI the weight plus or minus 1.96 SE? 0.4870 − 1.96 × 0.028 = 0.432, and 0.4870 + 1.96 × 0.028 = 0.542.
  • Do the degrees of freedom match the counts? (3 − 2) × (11 − 1 − 2) = 8.
  • Does every source clear the bar? p above 0.05, every |Z| above 3, every SE below 0.10: yes, yes and yes.
  • Is any right population closely related to a source? EHG is on the right, and Yamnaya_Samara, on the left, carries EHG-related ancestry. That is not an error in itself (a right population has to relate to the sources unequally for the test to have any power), but it is the kind of choice worth asking about, and the full right set is what lets you see it. In the Workbench you could rerun the model without EHG and see whether the weights move.

The same checks work on the real record above, give or take the last digit: 0.4398 / 0.0627 comes to 7.01 against a printed 7.02, because the tool divides the unrounded figures.

The two checks behind it#

Neither of these tables is in your report. They are the analyst's two checks from the section above, as they would look for this example, and they are what popdrop and rankdrop print if you rerun the model yourself. First the nested models:

Sources removedAnatolia_NYamnaya_SamaraWHGp-valueFeasible
none (the published model)0.4870.3340.1790.164yes
WHG0.6120.388dropped0.0004yes
Yamnaya_Samara0.803dropped0.1971.1e-19yes
Anatolia_Ndropped0.4170.5836.3e-22yes

Every simpler model fails, so relative to this right set and these candidate sources each source earns its place: drop WHG and the model fails at p = 0.0004, drop either of the others and it fails by an enormous margin. Had any row passed, that simpler model is the one that would have been published. Then the rank test:

RankChi-squaredofp-value
211.7280.164
1208.4182.1e-34
02911.0300

It says the same from the other side. Rank 1, two streams of ancestry for the target and all three sources, fails at p = 2.1e-34, and rank 0 is off the scale. The model needs three ancestry components relative to this right set, which is parsimony, not a head count of the migrations in anyone's history.

Putting it into words#

The report does not write this paragraph for you, so here it is for this example. The era resolves into three sources: a Neolithic farmer population sampled in Anatolia around 6500 BC, an early Bronze Age herder population from the Samara steppe, and a Mesolithic hunter-gatherer population of western Europe. About half of the model is the farmer source, a third the steppe source and the rest the hunter-gatherer source, the three-way structure seen across most of Europe today, in proportions that vary from place to place. The model without the hunter-gatherer source was rejected, so relative to this right set and these candidates the model needs that share. That is a statement about the model, not a dated event, and each label stands in for an ancestral population that was never sampled directly, not for a place where anyone in the family lived.

Rerunning the model#

Two routes. From the Your model view, the owner opens the model in the Ancestry Workbench, a prepaid balance from 9.99 EUR that never expires, and reruns it on their own merged sample, attached from the report for free and paid per completed run. That is a fresh run on the Workbench's own settings, so its fit can differ slightly from the record. Every Ready kit also includes the EIGENSTRAT bundle (.geno, .snp, .ind) your report was computed from, for ADMIXTOOLS 2 on your own machine:

library(admixtools)
 
prefix <- "path/to/bundle/prefix"
target <- "YOUR_SAMPLE"
left   <- c("Anatolia_N", "Yamnaya_Samara", "WHG")
right  <- c("Mbuti.DG", "Ust_Ishim.DG", "Kostenki14", "MA1", "Han.DG", "Papuan.DG",
            "Onge.DG", "Karitiana.DG", "Iran_N", "Levant_N", "EHG")
 
res <- qpadm(prefix, left, right, target = target, allsnps = TRUE)
res$weights
res$rankdrop
res$popdrop

Set target to your sample's label in the bundle's .ind file, and replace the example's shorthand with the panel labels your own record prints, in the order it prints them. Running directly on the genotype files with allsnps = TRUE is how the report was computed; precomputed f2 blocks, at their default, keep only the sites every population shares and give different numbers. weights is the Sources table, rankdrop and popdrop are the two checks, and the figures should come out close to the record. The Workbench route is walked through in Run your own qpAdm models and the R route in Running qpAdm in R with ADMIXTOOLS 2. Before buying anything, the free AdmixTools 2 Lab runs the same function over the public panel.

Why publish all of this#

Because a number you cannot check is a claim, not a result. The four headline figures let a reader judge a model; the full record lets a reader rerun it, or argue with it, without asking us for anything. A refined re-analysis, offered only when a better model is found for a published report, carries its own record, so the two versions can be compared line by line; the original stays as published. When you compare qpAdm products, where to buy a qpAdm analysis sets out what each service shows; the short version is that a qpAdm product which cannot show you this table has not run the method it is named after. Ours is Ancient Ancestry, and every model it publishes is reviewed and approved by a person.

Questions#

Is the model record an extra charge? No. Every tier gets the same report, with the same model record and the same publish bar (what it costs). The Ancestry Workbench, where you run models of your own and download the merged dataset, is a separate prepaid balance from 9.99 EUR.

What is the 95% confidence interval? The weight plus or minus 1.96 standard errors: the range the true proportion would plausibly fall in. A weight of 0.44 with a standard error of 0.063 reads as roughly 32% to 56%. Read it before the percentage.

Are the nested-model table and the rank test in my report? No. They are what the analyst checked before the model was proposed; the report shows the record of the model that passed them. Rerun the model in ADMIXTOOLS 2 and popdrop and rankdrop print both.

Can I download the record? No. It is on screen in the Your model view, with no PDF and no text export. The data behind it does download: the merged EIGENSTRAT bundle comes with the Ancestry Workbench, and it is what rerunning the model needs.

Does the Your model view change my percentages? No. It is the same model, with the numbers behind it. The Atlas view and the videos are unchanged.

From €29.99 · one-time
The tested version of this question
A qpAdm model tested against AADR v66 and approved by a person, published with its p-value, every source's standard error and z-score, and the full right set, so the result can be argued with.
See Ancient Ancestry

References#

  • Flegontova, O. et al. (2025). Performance of qpAdm-based screens for genetic admixture on graph-shaped histories and stepping stone landscapes. Genetics, 230(1), iyaf047.
  • Haak, W. et al. (2015). Massive migration from the steppe was a source for Indo-European languages in Europe. Nature, 522, 207 to 211. (Supplementary Information 10: the qpAdm method.)
  • Harney, É., Patterson, N., Reich, D. & Wakeley, J. (2021). Assessing the performance of qpAdm: a statistical tool for studying population admixture. Genetics, 217(4), iyaa045.
  • Maier, R., Flegontov, P., Flegontova, O., Işıldak, U., Changmai, P. & Reich, D. (2023). On the limits of fitting complex models of population history to f-statistics. eLife, 12, e85492.
  • Mallick, S. et al. (2024). The Allen Ancient DNA Resource (AADR): a curated compendium of ancient human genomes. Scientific Data, 11, 182.
  • Patterson, N. et al. (2012). Ancient admixture in human history. Genetics, 192(3), 1065 to 1093.

Related posts

How to read qpAdm results: p-value, Z-score and SE
How to read qpAdm results: p-value, Z-score and SE

A plain reading guide to the three numbers in every qpAdm result — what the p-value tests, what a standard error bounds, what a Z-score rules out — with worked examples and the mistakes that make a passing model wrong.

4 min read
qpAdm vs ADMIXTURE and admixture calculators: what each measures, and when qpAdm is worth it
qpAdm vs ADMIXTURE and admixture calculators: what each measures, and when qpAdm is worth it

ADMIXTURE and admixture calculators describe structure and always return percentages; qpAdm tests an explicit model and can reject it. What each estimates, why papers run both, and when qpAdm is worth paying for.

12 min read
What is an admixture calculator? How ancestry percentages are actually computed
What is an admixture calculator? How ancestry percentages are actually computed

Every admixture calculator — GEDmatch's classics, Global25 fits, testing-company estimates — is an optimiser that cannot say no. How the three families work, what the percentages mean, and the questions a calculator can and cannot answer.

5 min read
Back to all stories
Ancestrify

Combining cutting-edge genomic science with rich historical records to map your ancestry across generations and continents.


© 2026 Ancestrify. All rights reserved. · Ancestrify is a trading name of Andi Thomaj, a sole trader registered in Tiranë, Albania · NUIS M61725001N
Card payments processed by POK Payments (RPay Ltd)VISAMASTERCARD