Skip to content

qpGraph and admixture graphs, explained

An admixture graph is a population tree with mixture edges. How qpGraph fits one, how to read the worst Z-score, and why many graphs can fit.

Updated 2 min read

An admixture graph is a model of population history: a tree of population splits, with extra edges where populations mixed. qpGraph fits such a graph to all the f-statistics between the populations in it, and reports how well it fits.

qpGraph is part of ADMIXTOOLS (Patterson et al. 2012). ADMIXTOOLS 2 (Maier et al. 2023) added a fast reimplementation and an automatic graph search.

What a graph contains

  • Nodes: the populations you sampled (leaves) and their unsampled ancestors (internal nodes).
  • Drift edges: branches whose length is an amount of genetic drift.
  • Admixture edges: two edges that join at one node, each with a weight. The weights sum to 1, as in qpAdm.

How qpGraph fits a graph

Every f2, f3 and f4 statistic between the graph's populations can be written as a sum of branch lengths. qpGraph chooses the branch lengths and admixture weights that best predict the observed statistics. It then compares each predicted statistic with the observed one.

Reading the fit

  • Worst Z-score: the largest difference between an observed and a predicted f-statistic, in standard errors. A worst |Z| below 3 is the usual criterion for a graph that fits.
  • Score: a weighted sum of the squared differences over all statistics. Lower is better. Use it to compare graphs on the same populations.
  • Admixture weights and branch lengths: read them only for a graph that fits.

Many graphs fit

Maier et al. 2023 showed that, for realistic numbers of populations, many graphs with different topologies fit the data about equally well. A graph that fits is one possible history, not the history.

To make a graph claim robust:

  1. Search the graph space automatically, for example with ADMIXTOOLS 2's find_graphs, and collect every graph that fits.
  2. Report the features the fitting graphs share, such as "Population X always receives an admixture edge from a lineage related to Y".
  3. Compare a graph with and without a disputed edge, using the score difference and a bootstrap.

When to use qpGraph or qpAdm

  • Use qpAdm when you want ancestry proportions for a target and have a few candidate sources.
  • Use qpGraph when you want a joint model of several populations, including the relations between sources.
  • Use both: a graph that fits should give admixture weights that agree with qpAdm models of the same target.

Running qpGraph

ADMIXTOOLS runs qpGraph from a graph file, and ADMIXTOOLS 2 with qpgraph and find_graphs in R. Nexju fits qpGraph admixture graphs on the Pro plan, and searches and compares graphs on the Max plan.

References

QQuestions

Frequently asked questions

Short answers to the questions people ask most about this topic.

What is a good worst Z-score in qpGraph?

A graph is usually said to fit when the largest difference between an observed and a predicted f-statistic is below 3 standard errors in absolute value. Above that, at least one statistic is not explained.

Why do several admixture graphs fit my data equally well?

f-statistics constrain a graph less than its drawing suggests. With more than a few populations, many topologies predict almost the same statistics. Report the features that every fitting graph shares, rather than one graph.

What is the difference between qpGraph and qpAdm?

qpAdm models one target as a mixture of sources and does not model how the sources relate to each other. qpGraph models the whole history of all its populations together, so it makes stronger assumptions and is harder to fit.

Every help article

Allow analytics cookies? They help us see how the site is used so we can improve it. Your DNA and results are never included. Details