qpAdm fails in informative ways — that is its virtue — but the information arrives as cryptic numbers: a weight of −0.31, an SE of 9.994, a p-value of exactly 0, a popdrop table where nothing is feasible. This is the failure gallery: symptom, meaning, fix. It assumes the basics (the method, the three numbers) and complements why models get rejected, which covers the good failures. These are the other kind.
Negative weights#
Symptom: a source at −0.31, the others inflated to compensate.
Meaning: the least-squares solution lives outside the simplex — no non-negative mixture of
these sources reproduces the target's f4 pattern. Usually the
source pool brackets the target wrongly (both sources sit on the same side of it along some
axis), or a needed stream is missing entirely.
Fix: treat the sign as a diagnosis, not a rounding error. Rethink the pool — the negative
source is often related to the right answer without being it. And do not reach for the
constrained = TRUE option to make the minus sign go away: a constrained fit hides exactly the
information the sign carried. Diagnose unconstrained; publish only models that are feasible
without being forced.
SE = 9.994, or errors wider than the weight#
Symptom: a weight of 0.4 ± 10.
Meaning: the information budget collapsed. Either the SNP intersection is tiny — the
coverage arithmetic — or allsnps is off while the data
are sparse (the audit's measured example: SE 9.994 at 90% missingness without allsnps, 0.035
with), or two sources are near-cladal and the model cannot apportion their shared stream.
Fix: in order — check per-f4 SNP counts in the output; enable allsnps = TRUE (in
ADMIXTOOLS 2 that requires genotype-prefix input, not
precomputed f2 blocks — the classic silent trap); qpWave the source pair
for cladality and drop one if they merge.
Every model is rejected#
Symptom: p < 0.05 across the board, including the historically obvious candidates. Meaning: three suspects, in frequency order. The right set contains a population entangled with the left (gene flow into target or sources after separation — the prohibition list); the right set is too large (the measured onset: ~30 added references begin rejecting true models); or the target genuinely needs a stream nothing in the pool provides. Fix: audit the rights before mourning the model — remove the entangled reference, or rebuild on a standard spine. If rejection survives a clean right set, the pool is missing a stream: that is a finding, and the rank test will say how many streams you are short.
Every model passes#
Symptom: four different stories, all p > 0.3. Meaning: the test has no power — right set too small (degrees of freedom = outgroups − sources; near zero at the floor), or symmetric to the sources, so nothing constrains the fit. Passing everything is not generosity; it is silence. Fix: add outgroups that are differentially related to the competing sources — the published example added one Neolithic Anatolian reference and cut SEs threefold. Distinguishing between passing models is then margin work, never p-ranking: the best p-value identifies the true model only 48% of the time.
Popdrop rows all infeasible, or the nested model embarrasses the full one#
Symptom: the sub-model table shows every reduced model infeasible — or worse, a simpler model
passing comfortably.
Meaning: if all sub-models fail and the full model passes with every source significant,
that is the good outcome: every source is earning its place. If a simpler model passes, the extra
source was decoration — the p_nested column is the referee, and the discipline is
lowest rank first.
Fix: publish the simplest model the data cannot reject. Nobody defends a
weight of 0.06 ± 0.05 in an argument.
p = 0 exactly, or p = NA#
Symptom: a p-value of 0.000000, or nothing at all. Meaning: p = 0 to machine precision is an enormous chi-square — usually a left/right entanglement or a data-processing fault (build mismatch, strand flips, a merge gone wrong), not a merely wrong model. NA means degrees of freedom hit zero or the covariance matrix could not be inverted (too few blocks, too few usable SNPs). Fix: verify the merge itself (population labels, reference build, per-population SNP counts) before touching model composition. For consumer files, the pre-flight is free: file check.
The meta-fix#
Half of this gallery is one lesson wearing six costumes: the model is a machine with two inputs, and most breakage is input breakage. Sources decide what can be estimated; rights decide what can be tested; coverage decides how sharply. Our paid analysis exists because walking a real file through this gallery to a defensible model is hours of hand work — every published model ships with its full record precisely so the diagnostics above are visible rather than trusted. And if you want to hit these errors yourself, instructively, on your own merged genome: the Model Lab will oblige — rejection included, as a feature.
Terms used here are defined in the glossary.
References#
- Harney, É., Patterson, N., Reich, D. & Wakeley, J. (2021). Assessing the performance of qpAdm. Genetics, 217(4), iyaa045.
- Flegontova, O. et al. (2025). Performance of qpAdm-based screens for genetic admixture. Genetics, 230(1), iyaf047.
- ADMIXTOOLS 2 documentation: qpadm() reference (weights, rankdrop, popdrop tables).



