---
title: "G25 source selection: how good models overfit and honest panels are built"
description: "Adding sources always lowers a G25 fit distance and routinely worsens the model — a worked demonstration where the fit improved from 0.0110 to 0.0068 while the story collapsed. The rules that keep a panel honest."
canonical: https://www.ancestrify.io/blog/g25-source-selection-overfitting
date: 2026-08-31T09:32:00+00:00
updated: 2026-10-10
author: "Andi Thomaj"
---

# G25 source selection: how good models overfit and honest panels are built

The most consequential decision in any Global25 admixture run is made before the solver starts:
**which sources you offer it**. The arithmetic then does exactly what it is told — finds the
closest mixture of those sources — and prints percentages with the same confidence whether the
panel was wise or absurd. Everything that separates a meaningful G25 model from numerology lives
in panel construction, so this post is about that: the overfitting trap, the collinearity trap,
and the working rules our analyst applies when
[building the calculator for every Ancestry Map](/blog/personalized-g25-calculator).

Prerequisites: [what a fit is](/blog/nmonte-explained) and
[what the fit distance means](/blog/g25-fit-distance-explained).

## The iron law: more sources always fit better

Adding a source can never worsen the optimal fit — the solver can always assign it zero — and
almost always improves it, because a bigger panel spans more of the space. Improvement of the fit
is therefore **not evidence** the added source belongs in the story. Taken to the limit, the law
is obvious: add the target's own population average and the "model" fits at nearly zero distance
while explaining nothing.

Here is the law in action, from our calibration work on an Albanian population average:

| Panel | Fit distance | The story |
|---|---|---|
| Curated 5-source era calculator | 0.0110 | Clean: Illyrian-related component ~56%, coherent minor sources |
| 12 sources (five Balkan calculators merged) | 0.0081 | Distorted: the Illyrian-related share collapses to ~14%, scattered across near-substitutes |
| All 27 era-tagged averages | 0.0068 | Noise: thirteen components, no readable history |

Monotonically "better" fit, monotonically worse model. Any tool that lets you stack sources —
Vahaduo, [nMonte](/blog/nmonte-explained), [ours](/lab/admixture) — will walk you down this
staircase smiling. The discipline has to come from the panel.

## The subtler trap: collinearity

Two sources that sit close in the space — or worse, one source expressible as a *combination* of
others — split their shared signal arbitrarily. The split lands wherever the random descent
happens to settle, so the percentages become seed-dependent while the fit barely moves. Our
production incident that proved the point: a Balkan panel contained a source reconstructable to
within 2% as 75% of one neighbour plus 24% of another; the solver handed the entire share to the
neighbour by a 0.19-point margin — pure noise at the sample sizes involved — and an Albanian
target read *zero* on the component that actually described them.

The two audits that catch it, runnable in any tool: **reconstruction** — solve each source *as
the target* against the rest of the panel; a residual under ~0.010 means the panel can build that
source out of the others, so one side has to go. And **pairwise cross-fit** — two sources fitting
each other under ~0.015 are one axis wearing two names; keep the better-sampled,
more era-appropriate one.

## The working rules of an honest panel

The full bar we publish under is longer, but its load-bearing rules travel to any tool:

- **3–8 sources.** Below three you are asserting the answer; beyond eight you are
  [fitting noise](/blog/how-accurate-is-g25). Our solver hard-caps at eight.
- **One era at a time.** Sources from one dated window
  ([era coherence](/blog/ancient-vs-modern-admixture-calculators)), at most one later-era proxy,
  named as such. A panel mixing Bronze Age and medieval sources answers no question in particular.
- **Every source earns its place.** It takes ≥ 2% weight, and removing it worsens the fit by a
  stated margin (we use 0.002). A source that costs nothing to drop was decoration.
- **Averages, properly built.** A "population" of one individual is one person's noise wearing a
  population's name — source averages need members (we require ≥ 2, prefer ≥ 4;
  [build your own correctly](/lab/average-g25)).
- **Stability check.** Re-run the fit several times unseeded. Components swinging more than a few
  points between runs mean collinearity or oversize — fix the panel, never cherry-pick the run
  you liked.
- **The neighbourhood must be explainable.** The target's
  [closest populations](/blog/g25-closest-populations-explained) should make sense under the
  model. A panel that fits beautifully while the distance list points somewhere else entirely is
  answering the wrong question well.

## Why the fit distance cannot police any of this

The fit measures the *gap*, and every trap above works by shrinking the gap. That is the deep
reason [lower is not better past a point](/blog/g25-fit-distance-explained), why our publish bar
bounds fit from both sides (a fit band above, an anti-underfit floor below — the proposed panel
must land within 0.010 of the full era pool's fit while accounting for every component that pool
assigns ≥ 5%), and why a defensible model states its panel, its era and its rationale rather than
its distance. A coordinate fit [can never reject itself](/blog/qpadm-vs-global25); when a source
question needs an actual test — is this component *required*? — that is
[qpAdm's job](/qpadm), with p-values and per-source z-scores.

The free [calculators](/lab/admixture) ship with panels already curated under these rules, which
is the honest advantage of curation over freedom; the
[calculator our analyst builds for every Ancestry Map](/blog/personalized-g25-calculator) is the
same discipline applied around one customer's coordinates.

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