---
title: "Every number in your qpAdm report: the model record explained, with a worked example"
description: "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."
canonical: https://www.ancestrify.io/blog/qpadm-model-record-explained
date: 2026-08-29
updated: 2026-10-19
author: "Andi Thomaj"
---

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

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](/blog/how-to-read-qpadm-p-value-z-score-standard-error) 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](/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](#what-the-analyst-checked-before-publishing)), 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](/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](#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](/blog/how-to-read-qpadm-p-value-z-score-standard-error) 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](/blog/upload-whole-genome-vcf-ancestry).

**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.

| # | Source | Panel label | n | Share | Weight | SE | Z | 95% CI |
|---|---|---|---|---|---|---|---|---|
| 01 | Gandharan Swat | Pakistan_Barikot_H.AG | 4 | 44.0% | 0.4398 | 0.0627 | 7.02 | 0.317 to 0.563 |
| 02 | Arabian Peninsula | BedouinB.DG | 21 | 18.3% | 0.1834 | 0.0393 | 4.67 | 0.106 to 0.260 |
| 03 | Peninsular South Indian | Irula.SG | 10 | 37.7% | 0.3768 | 0.0367 | 10.26 | 0.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](/ancestry); the dataset is explained in
[the AADR explainer](/blog/aadr-allen-ancient-dna-resource-explained) and the suffixes in
[AADR sample labels explained](/blog/aadr-sample-labels-sg-dg-ho-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](/blog/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:

| # | Source | Panel label | n | Share | Weight | SE | Z | 95% CI |
|---|---|---|---|---|---|---|---|---|
| 01 | Anatolian Neolithic Farmer | Anatolia_N | 24 | 48.7% | 0.4870 | 0.028 | 17.39 | 0.432 to 0.542 |
| 02 | Western Steppe Herder | Yamnaya_Samara | 10 | 33.4% | 0.3340 | 0.031 | 10.77 | 0.273 to 0.395 |
| 03 | Western Hunter-Gatherer | WHG | 8 | 17.9% | 0.1790 | 0.024 | 7.46 | 0.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 population | n |
|---|---|---|
| 1 | Mbuti.DG | 4 |
| 2 | Ust_Ishim.DG | 1 |
| 3 | Kostenki14 | 1 |
| 4 | MA1 | 1 |
| 5 | Han.DG | 4 |
| 6 | Papuan.DG | 14 |
| 7 | Onge.DG | 2 |
| 8 | Karitiana.DG | 3 |
| 9 | Iran_N | 5 |
| 10 | Levant_N | 12 |
| 11 | EHG | 3 |

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](/blog/how-to-choose-qpadm-sources-and-outgroups#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 removed | Anatolia_N | Yamnaya_Samara | WHG | p-value | Feasible |
|---|---|---|---|---|---|
| none (the published model) | 0.487 | 0.334 | 0.179 | 0.164 | yes |
| WHG | 0.612 | 0.388 | dropped | 0.0004 | yes |
| Yamnaya_Samara | 0.803 | dropped | 0.197 | 1.1e-19 | yes |
| Anatolia_N | dropped | 0.417 | 0.583 | 6.3e-22 | yes |

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:

| Rank | Chi-square | dof | p-value |
|---|---|---|---|
| 2 | 11.72 | 8 | 0.164 |
| 1 | 208.4 | 18 | 2.1e-34 |
| 0 | 2911.0 | 30 | 0 |

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](/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:

```r
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](/blog/run-your-own-qpadm-model-lab) and the R route in
[Running qpAdm in R with ADMIXTOOLS 2](/blog/run-qpadm-in-r-admixtools2). Before buying anything,
the free [AdmixTools 2 Lab](/lab/admixtools) 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](/blog/where-to-buy-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](/qpadm), 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](/blog/where-to-buy-qpadm-analysis#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.

## References

- Flegontova, O. et al. (2025). [Performance of qpAdm-based screens for genetic admixture on graph-shaped histories and stepping stone landscapes](https://doi.org/10.1093/genetics/iyaf047). *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.
