---
title: "Understanding qpAdm: how to read a formal admixture model"
description: "The method, for readers who want the maths: what qpAdm computes, what the p-value, standard error and z-score each mean, why outgroup choice decides whether a model is worth anything, and how to read a rejection — with a worked example."
canonical: https://dev.ancestrify.io/blog/understanding-qpadm
date: 2026-03-12
updated: 2026-08-30
author: "Andi Thomaj"
---

# Understanding qpAdm: how to read a formal admixture model

qpAdm is the method most published ancient-DNA admixture claims rest on, and it is routinely
misread — usually by treating it as a percentage generator that happens to print extra numbers.
Those extra numbers are the method.

This is a practical guide to reading a qpAdm result: what it computes, what each figure licenses you
to say, and what to do when a model fails.

## What qpAdm is

qpAdm models a **target** population as a mixture of chosen **source** populations, using
allele-frequency statistics rather than coordinate distances. It was developed in the Reich lab as
part of ADMIXTOOLS, and it is implemented today in ADMIXTOOLS 2.

You give it three things:

- a **target** — the genome or population being modelled;
- a **left set** — the candidate sources you propose it descends from;
- a **right set** — outgroups, used as reference points, never as candidate ancestors.

It returns a weight per source, an uncertainty on each weight, and a single p-value for the model.

The critical property, and the one that separates it from every coordinate-fitting method: **qpAdm
can reject a model.** A method that always returns an answer cannot tell you that you asked a bad
question. This one can.

## The three numbers

### p-value — is this model admissible at all?

The p-value asks whether the observed pattern of shared drift is compatible with the mixture you
proposed. High is good: the data do not contradict the model. Low means the model is incompatible
with the data and should be discarded.

⚠️ It is **not** the probability that the model is true, and it is **not** a measure of how much
ancestry came from anywhere. It is a compatibility test on one specific proposal. Several mutually
contradictory models can all pass — passing means "not refuted", never "confirmed".

### Standard error — how well is this weight pinned down?

Each source's weight carries a standard error. A weight of 40% ± 3% is a finding. The same 40% ± 18%
is barely distinguishable from anything.

⚠️ SE depends far more on **coverage** — how many markers survive the merge between your genotypes
and the reference panel — than on how long anyone searched for the model. This is the single most
misunderstood point in consumer qpAdm: analyst effort cannot shrink a standard error that a sparse
file has already fixed.

### Z-score — is this source distinguishable from zero?

The z-score is the weight divided by its standard error: how many standard errors it sits from
nothing at all. A source with a low |Z| is not measurably contributing, whatever its headline
percentage says. A "12% contribution" with |Z| of 1.2 is not a 12% contribution; it is an
unresolvable one.

## Left and right sets — where models are actually won or lost

Most bad qpAdm results are bad because of the **right set**, not the left.

Outgroups give the method its power to discriminate. They are what allow it to tell two candidate
sources apart. It follows that:

- **A right set that is too small accepts almost anything.** With too few outgroups the test has
  little power, so models pass that should not. A high p-value from a thin right set is not evidence.
- **A right set too closely related to your sources also accepts too much.** If the outgroups share
  the drift you are trying to detect, there is nothing left to discriminate on.
- **The right set must be reported.** A weight without the outgroup list it was computed against
  cannot be evaluated by anyone. This is why we publish the complete right set alongside every
  model.

Temporal sanity matters too: a source that postdates the target cannot be its ancestor, and it is
easy to assemble a model that is arithmetically fine and chronologically impossible.

## A worked example

Suppose you are modelling a Bronze Age population from the Balkans and you propose two sources: a
local Neolithic farmer population and a steppe pastoralist population. You run it against a right set
of a dozen deliberately distant outgroups and get:

```
p-value: 0.412
Farmer_Neolithic   0.612 ± 0.031   Z = 19.7
Steppe_Pastoralist 0.388 ± 0.031   Z = 12.5
```

Read it in this order:

1. **p = 0.412.** Comfortably admissible. The data do not contradict a two-source mixture of these
   populations.
2. **Both standard errors are 0.031.** Tight. This file has the coverage to resolve the split.
3. **Both z-scores are large.** Each source is unambiguously distinguishable from zero, so this is a
   genuine two-way mixture rather than one source plus noise.

Now suppose instead you had seen:

```
p-value: 0.088
Farmer_Neolithic   0.907 ± 0.094   Z = 9.6
Steppe_Pastoralist 0.093 ± 0.094   Z = 1.0
```

The p-value still clears the conventional 0.05 bar, so a careless reader calls this a 91/9 mixture.
It is not. The second source's weight is smaller than its own standard error — |Z| of 1.0 means it is
statistically indistinguishable from zero. The honest reading is that this is a **one-source model**,
and the correct next step is to test it as one.

That test has a name.

## Nested models: is the extra source earning its place?

A **nested model** is a simpler model contained inside a more complex one — most often the same model
with one source removed. If the simpler version also passes, the extra source is not doing work, and
the simpler model is the one to report.

This is where most over-complicated ancestry stories collapse. Adding sources tends to improve fit
mechanically. The discipline is to keep only the components that survive removal.

Our reports publish this test rather than just performing it: the Reading view of every qpAdm
report carries the **nested-model table** (every simpler model with its refitted weights, p-value
and feasibility) and the **rank test**, alongside the chi-square, degrees of freedom and each
source's 95% confidence interval, downloadable as plain text. The table is walked through in
[The model record explained](/blog/qpadm-model-record-explained).

## Reading a rejection

**A rejected model is a result, not a malfunction.** Most models anyone can think of will fail, and
the failure is informative: it says the proposed ancestry story is not compatible with the data given
those outgroups.

When a model fails, the productive moves are, in order:

1. **Check the right set.** Wrong or too-close outgroups reject good models as readily as they accept
   bad ones.
2. **Check chronology.** A source that postdates the target invalidates the model regardless of fit.
3. **Reconsider composition, not just place.** Sources are populations with a genetic makeup, not
   pins on a map. The right proxy is often a group from elsewhere with the right ancestry profile.
4. **Try a simpler model.** If a three-way model fails, a two-way one may not.
5. **Accept that some questions are unanswerable with this file.** Coverage bounds what can be
   resolved.

⚠️ What is *not* a legitimate move is rotating sources and outgroups automatically until something
passes. Automated rotation has a high false-discovery rate: run enough models and some will clear any
threshold by chance. Rotation here is a screening step that cannot publish: every model we publish
is confirmed with a direct fit and checked by hand, which is a slower process and a defensible one.

## The conditions a publishable model should meet

1. Sources well defined and representative of the ancestral groups being modelled.
2. Enough marker coverage on the target for the estimates to mean anything.
3. An appropriate, genuinely distant right set — reported alongside the result, with each
   outgroup's sample count.
4. A p-value indicating admissible fit.
5. Standard errors small enough that the weights are informative.
6. Z-scores high enough that each source is distinguishable from zero.
7. Nested alternatives tested — and the table of them published — so no source is carried that
   does not earn its place.
8. Chronological and archaeological plausibility.

Our own published models are graded against one explicit bar rather than a vague "good fit": the
p-value, every source's |Z| and every source's standard error must all clear it, in every era. The
four depth tiers of our [qpAdm analysis](/qpadm) share that bar and differ **only** in how far the
analyst searches past the first model that clears it — the analyst hours spent finding the best one.
The report's content, including the full model record and the analyst's explanation, is identical
at every tier. Because SE is bound by coverage, a sparse file limits how tight the intervals can be,
which is why we say so before purchase rather than after.

## Trying it yourself

You can run real ADMIXTOOLS 2 — f2, f3, f4 and D statistics
([the arithmetic explained](/blog/f4-statistics-explained)), [qpWave](/blog/qpwave-explained),
qpAdm and admixture-graph fitting — against a reference panel in the browser, free, in the
[AdmixTools 2 Lab](/lab/admixtools). No R installation, no genotype panel to source (the R route,
for those who want it, is [its own tutorial](/blog/run-qpadm-in-r-admixtools2)). Expect
rejections; that is the method working.

If you are weighing this against coordinate methods, the comparison is set out in
[qpAdm vs Global25](/blog/qpadm-vs-global25), and the vocabulary is defined in the
[glossary](/glossary).

## Further reading

- [Learn qpAdm: the complete guide](/blog/learn-qpadm-complete-guide) — every article on the
  method, ordered into a learning path
- [qpAdm best practices](/blog/qpadm-best-practices) — the current checklist, with the measured
  numbers behind every rule
- [A qpAdm analysis tutorial with a worked example](/blog/qpadm-analysis-tutorial-worked-example)
- [How to choose qpAdm sources and outgroups](/blog/how-to-choose-qpadm-sources-and-outgroups)
- [Why qpAdm models get rejected](/blog/why-qpadm-models-get-rejected)
- [A qpAdm report walkthrough](/blog/qpadm-report-walkthrough-example)
- Ready to order? The [buying page](/buy-qpadm-analysis) lists the tiers and what each includes.

## qpAdm in practice

For worked examples showing what these conditions look like applied to real populations, see our
studies of [Albanian DNA and ancient origins](/blog/albanian-dna-ancient-origins),
[Roman and Slavic-period Balkan ancestry](/blog/ancient-balkan-dna-roman-slavic-migrations), the
[diverse army at ancient Himera](/blog/ancient-greek-army-dna-himera), the
[Picenes of Iron Age Italy](/blog/picenes-genetic-ancestry),
[present-day Balkan populations](/blog/neolithic-balkan-ancestry),
[modern Anatolian Turks](/blog/anatolian-turks-genetic-making), and the
[Deep Maniots of southern Greece](/blog/deep-maniots-southern-greece).
