---
title: "qpGraph explained: admixture graphs, find_graphs, and the many-graphs problem"
description: "qpAdm's bigger sibling models whole population histories as trees with admixture edges. How qpGraph works, what find_graphs automates, and the 2023 finding that reshaped how graph results should be read."
canonical: https://www.ancestrify.io/blog/qpgraph-explained
date: 2026-09-01T09:16:00+00:00
updated: 2026-09-24
author: "Andi Thomaj"
---

# qpGraph explained: admixture graphs, find_graphs, and the many-graphs problem

qpAdm answers a deliberately small question: can this one population be written as a mix of these
sources, and in what proportions? Its sibling **qpGraph** asks the large one: what is the *whole
history* — splits, drifts, admixtures — relating a dozen populations at once? Large questions
carry large caveats, and qpGraph's were measured precisely in 2023. This is the method, the
automation that changed how people use it, and the honest way to read any admixture graph you
meet — including the ones behind [the models we run](/blog/understanding-qpadm).

## From identities to topologies

Everything rests on the same currency qpAdm spends:
[f-statistics](/blog/f4-statistics-explained). An **admixture graph** is a directed graph of
populations — leaves are your samples, internal nodes are ancestors, plain edges carry drift,
and admixture nodes join two parents in stated proportions. Any such graph *predicts* every f2,
f3 and f4 among its leaves; qpGraph fits the edge lengths and mixture weights to minimise the
gap between predicted and observed, then reports the fit and the **worst residual** — the single
statistic the graph explains worst, in standard errors. The working convention: a graph whose
worst residual sits under about |Z| = 3 is compatible with the data. One that fails does not fit
as drawn: a missing admixture event is one explanation, and continuous gene flow that no small
graph captures is another.

The relationship to qpAdm is exact, not analogical: a qpAdm model is what an admixture-graph
neighbourhood looks like when you collapse everything except one target, its sources and the
outgroups — the [original 2015 supplement](/blog/how-qpadm-changed-ancient-dna) introduced it in
precisely those terms. qpAdm trades the panorama for the ability to *not specify* most of
history; qpGraph pays the full specification cost for the full picture.

## What find_graphs changed

Classic qpGraph evaluated one hand-drawn topology at a time — the analyst proposed, the residuals
disposed, and the search through graph space happened in a human's patience.
[ADMIXTOOLS 2](/blog/admixtools2-f2-extraction-parameters#matching-classic-admixtools) automated it: **find_graphs** explores
topology space from random starts, scoring candidates and keeping the best fits for a given
number of admixture events. Suddenly anyone could search millions of topologies — which is
exactly what produced the finding that now governs the method.

## The many-graphs problem

Maier and colleagues, having built the search tool, pointed it at the literature: for **19 of 22
published admixture graphs**, the automated search found alternative topologies fitting the same
data as well or better — often *many* alternatives, frequently with historically incompatible
structures. Different sources for the same population, admixture edges reversed, ghosts appearing
and dissolving, all inside the data's tolerance.

Read that finding the way [the qpAdm audits should be read](/blog/is-qpadm-still-reliable): not
"the method is broken" but "single-winner claims were never licensed". An f-statistic fit is a
consistency check, and consistency is a set property — the honest output of a graph analysis is
the *family* of well-fitting, temporally plausible graphs, with conclusions restricted to the
features **shared by the whole family**. The paper's own recommendations: search exhaustively,
constrain with external knowledge (dates, archaeology, known impossibilities), and claim only
what every survivor agrees on. The same epistemics as
[reporting the family of passing qpAdm models](/blog/qpadm-best-practices), one floor up.

## When to reach for which

qpGraph earns its cost when relationships among *many* populations are the question — where a
deep lineage attaches, whether a ghost population is required at all, which of two branching
orders the data tolerates. For "what is this one population made of, in what proportions, with
what uncertainty", [qpAdm remains the sharper instrument](/qpadm):
its weights come with standard errors, its rejections are
[specific and diagnostic](/blog/why-qpadm-models-get-rejected), and its blind spots are
[measured](/blog/qpadm-distal-vs-proximal). In practice the two collaborate — graphs (published
ones, and the field's accumulated topology) tell you which qpAdm sources are even coherent to
propose; qpAdm prices the proportions. That division of labour is how the published literature
uses them, and how we do.

Terms used here are defined in the [glossary](/glossary).

## References

- Patterson, N. et al. (2012). Ancient admixture in human history. *Genetics*, 192(3),
  1065–1093. (qpGraph's introduction.)
- Maier, R. et al. (2023). On the limits of fitting complex models of population history to
  f-statistics. *eLife*, 12, e85492. (find_graphs and the 19-of-22 finding.)
- Haak, W. et al. (2015). Massive migration from the steppe was a source for Indo-European
  languages in Europe. *Nature*, 522, 207–211. (qpAdm as graph neighbourhood.)
- Lipson, M. (2020). Applying f4-statistics and admixture graphs: theory and examples.
  *Molecular Ecology Resources*, 20(6), 1453–1464.
