---
title: "How to read qpAdm results: p-value, Z-score and SE"
description: "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."
canonical: https://www.ancestrify.io/blog/how-to-read-qpadm-p-value-z-score-standard-error
date: 2026-08-28
updated: 2026-10-19
author: "Andi Thomaj"
---

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

A qpAdm result is a short table: one p-value for the model, and for every source a weight, a
standard error and a Z-score. People read the weights and skip the rest, which is exactly backwards.
The weights are the claim; the other three numbers are what decide whether the claim is worth
anything.

This guide reads the table in the right order. If you want the method itself — what qpAdm computes
and why outgroups matter — start with [Understanding qpAdm](/blog/understanding-qpadm); if you are
deciding whether to buy a test at all, start with
[whether qpAdm is worth it](/blog/qpadm-vs-admixture-software#is-qpadm-worth-it).

## The table you are reading

```
p-value: 0.231   chi-square: 12.09   dof: 10   f4 rank: 2
min SNPs per f4: 118,402   merged SNPs: 214,910   jackknife blocks: 706
Anatolian_Neolithic_Farmer   0.541   SE 0.028   Z 19.3   95% CI 0.486 to 0.596
Western_Steppe_Herder        0.312   SE 0.031   Z 10.1   95% CI 0.251 to 0.373
Western_Hunter_Gatherer      0.147   SE 0.024   Z  6.1   95% CI 0.100 to 0.194
right set: 14 populations (shown in full, with sample counts)
```

Four kinds of number, read in this order: p-value first, then standard errors, then Z-scores, then
— only then — the weights. The rest of the header (chi-square, degrees of freedom, rank, SNP counts,
blocks) and the confidence intervals are the record behind those four; they are read in
[The model record explained](/blog/qpadm-model-record-explained).

## 1. The p-value: is this model admissible?

The p-value answers one question: *is the pattern of shared drift in the data compatible with the
mixture I proposed?* It comes from a test of the f4-statistics between the target, the sources and
the outgroups; a high value means the data do not contradict the model, a low value means they do.

Three things it is not:

- **Not the probability the model is true.** It is a compatibility test on one specific proposal.
- **Not a measure of how much ancestry came from anywhere.** That is the weights' job.
- **Not comparable across models with different right sets.** A p-value is only meaningful against
  the outgroups it was computed with, which is why the right set must be published beside it.

The conventional threshold is p > 0.05. Below it, the model is rejected and the weights are not
worth reading. Above it, the model is *not refuted* — which is a much weaker statement than
"confirmed", because several mutually incompatible models can all clear the same bar.

⚠️ A very high p-value is not automatically better. A thin or poorly chosen right set makes almost
everything pass; p = 0.9 against six outgroups says less than p = 0.2 against fourteen distant ones.

## 2. The standard error: how well is each weight pinned down?

Every weight carries a standard error, estimated by block jackknife across the genome. Read a weight
as a range, not a point: 0.312 ± 0.031 means "roughly 25–37% at two standard errors", and that range
is the finding.

What sets the standard error is mostly **coverage** — how many markers survive the merge between
your genotypes and the reference panel — and how distinct the sources are from one another. Two
consequences follow that are widely misunderstood:

- **Analyst effort cannot shrink a standard error.** If a sparse file fixes SE at 0.12, a longer
  search will find different models, not tighter ones.
- **Similar sources inflate each other's errors.** Asking the model to split ancestry between two
  closely related populations produces two large SEs even on a dense file, because the data cannot
  tell them apart.

A useful private rule: if a weight is smaller than twice its own standard error, do not repeat it as
a percentage.

## 3. The Z-score: is this source distinguishable from zero?

The Z-score is the weight divided by its standard error. It tells you how many standard errors the
weight sits from nothing at all. A source at Z = 1.2 is not measurably contributing, whatever its
headline weight; a source at Z = 10 unambiguously is.

This is the number that catches the most common over-reading. Consider:

```
p-value: 0.088
Neolithic_Farmer     0.907   SE 0.094   Z 9.6
Steppe_Herder        0.093   SE 0.094   Z 1.0
```

The p-value clears 0.05 and a careless reader reports a 91/9 mixture. But the second weight equals
its own standard error: it is statistically indistinguishable from zero. The honest reading is a
one-source model, and the correct next step is to test it as one — if the single-source version also
passes, the extra source was never earning its place.

## 4. The weights, at last

With the p-value admissible, every SE small and every Z large, the weights can be read as
proportions of ancestry — from the *proxy* populations named, measured against the *outgroups*
listed, for the *target* as merged. Each of those qualifiers does work. Change the outgroups and the
weights move; substitute a closer proxy for one source and they move again. A weight is a property
of a model, not of a person.

## The bar we publish against

Because "good fit" is vague, our published models are graded against explicit thresholds, the same
at every tier of [Ancient Ancestry](/qpadm), our qpAdm analysis: **p > 0.05**, and for every source in every era
**|Z| > 3** and **SE < 0.10**. Nothing about the bar moves with the price. Three things that bar deliberately does *not* do: it does not
prefer a higher p-value once admissible, it does not reward more sources, and it does not let a
model through because its story is appealing.

## Reading a rejection

A rejected model (p below 0.05) is a result, not a malfunction. It says the proposed ancestry story
is incompatible with the data given those outgroups. The productive responses, in order: check the
right set for outgroups too close to a source; check chronology, since a source that postdates the
target cannot be its ancestor; try a simpler model; and accept that some questions cannot be
resolved at your file's coverage. What is not legitimate is rotating sources and outgroups until
something passes: run enough models and one will clear any threshold by chance, which is why
Harney and colleagues (2021) warn against exactly that practice. An automated search can propose
candidate models, but it cannot publish one: a person reviews the candidates and approves every
published model. The audit literature's lesson is that a search's error rate depends mostly on how
plausible its candidates were before testing, not on whether a script or a person ran it, so the
candidate sources are chosen for your declared origins before any model runs.

## Three worked misreadings

**"My steppe ancestry went up in the refined version."** The refined version found a different
model, with a better proxy or a cleaner outgroup set, and the weights moved. Neither figure is "your steppe
ancestry"; each is a model's estimate against its own right set.

**"p = 0.62 must be a stronger result than p = 0.14."** Only if the right sets are the same. Check
their size and composition before comparing.

**"Four sources fit better than three, so the four-source model is right."** Adding a source tends to
improve fit mechanically. If the three-source nested model also passes, and the fourth source's Z is
small, the three-source model is the one to report.

## Checking a result yourself

Every number above is printed in our reports, with the right set in full, so anyone who understands
the method can re-run it — and the report's Your model view adds the model record (chi-square, degrees
of freedom, every panel label, sample count and confidence interval), so the whole model can be
handed to another analyst. Two free routes: the [AdmixTools 2 Lab](/lab/admixtools) runs real
qpAdm over the public AADR panel in the browser, and the [Ancestry Workbench](/workbench) lets you
run models on your own merged sample, see
[Run your own qpAdm models](/blog/run-your-own-qpadm-model-lab). The vocabulary used here is
defined in the [glossary](/glossary), and the comparison with coordinate methods, which have none of
these three numbers, is in [qpAdm vs Global25](/blog/qpadm-vs-global25).

## References

- Patterson, N. et al. (2012). Ancient admixture in human history. *Genetics*, 192(3), 1065–1093.
- Haak, W. et al. (2015). Massive migration from the steppe was a source for Indo-European
  languages in Europe. *Nature*, 522, 207–211 (Supplementary Information 10 introduces qpAdm).
- 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. et al. (2023). On the limits of fitting complex models of population history to
  f-statistics. *eLife*, 12, e85492.
- 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.
