What's Actually Inside a GAR Number

2026-08-01 · analytics · methodology · GAR · RAPM

GAR compresses a season into one figure - so the parts underneath had better add up. What our GAR is actually made of, why it is anchored on counting stats rather than built purely from RAPM (measured: pure RAPM drops standings R-squared from 0.75 to 0.51), and the bug that left our own component breakdown failing to sum to the number above it.

TL;DR

What a GAR number contains

Our headline value is the RAPM total GAR. It is a sum of the following, all in goals above a replacement-level player:

ComponentWhat it measuresSource
EV OffenseEven-strength goal creationCounting stats
EV DefenseEven-strength goal suppressionRegression (SPM/RAPM) + team residual
Power PlayOffense with the man advantageCounting stats
Penalty KillShorthanded goal suppressionExpected goals against on PK shifts
FinishingGoals scored above expectedCounting stats, regressed 50% toward xG
PenaltiesDrawn minus takenCounting stats
FaceoffsDraw wins above averageCounting stats

Finishing is deliberately halved. Shooting above expected is mostly luck — it repeats year-over-year at roughly r = 0.43, the weakest of any component we track — so keeping all of it would make GAR a worse measure of skill. Keeping half is a compromise between describing what happened and predicting what comes next.

Why not use regression for everything?

The obvious simplification is to drop the counting-stat anchor and build GAR entirely from RAPM (Regularized Adjusted Plus-Minus) coefficients — one term each for even-strength offense, even-strength defense, power play, and penalty kill. It is cleaner, and it is what several public models do.

We tested it across four seasons. It is substantially worse:

ModelYoY repeatabilityStandings R²
Current (counting-anchored)0.7660.754
Pure RAPM sum0.7410.508
Pure counting stats0.6190.823

A pure-RAPM model loses a third of its ability to explain why teams win, and it is not more repeatable either. The reason is what RAPM measures: on-ice expected-goal rates at even strength, on the power play, and on the penalty kill. That is all. It cannot see whether a player buried his chances, won a defensive-zone draw, or drew a penalty in the third period. Those are real, repeatable sources of value, and a model built only on shot-rate coefficients is blind to every one of them.

There is a second, subtler problem. RAPM coefficients are estimated relative to teammates and opponents. That is exactly what you want when isolating an individual — and exactly what you do not want when adding players up to explain a team's season, because the relative framing has already divided out the team-level signal that standings depend on.

Counting stats have the mirror problem: the best standings fit of the three, and the worst repeatability, because they keep every bounce. So we anchor on counting stats and substitute regression for the one component counting stats genuinely cannot measure — even-strength defense, where a defenseman's job is to prevent events that then do not appear in any box score.

What we got wrong

Our player pages show a component breakdown beneath the headline GAR. It was drawing from a set of internal RAPM columns that are stored for analysis but are not part of the total — two of them, even-strength offense and power play, are explicitly documented in our own code as “stored, not used in total.”

The result was a breakdown that did not reconcile with the number above it. Across most seasons the component sum correlated about 0.61 with the displayed GAR. It should have been 1.00.

A second bug made 2025-26 far worse. Our RAPM job writes its results after the aggregation that composes GAR, and it was overwriting four component columns with raw, unadjusted coefficients. For 2025-26, 551 of 611 stored even-strength-defense values were exactly the raw coefficient rather than the processed one. The component sum's correlation with the headline number fell to 0.026 — essentially random. Alex Ovechkin's stored defensive value read -13.1 where the correct figure was 0.26.

Both are fixed. The aggregation is now the sole writer of those columns, the breakdown reads the components that are genuinely inside the total, and we added an automated check that fails if the parts ever stop summing to the whole. Across all 19 seasons with RAPM data, the components now sum to the headline number exactly — maximum error 0.000000.

The caveat we are not going to hide

The sum was exact, but the attribution was not. The even-strength defense figure was computed as a residual — the headline number minus every other component — which makes the arithmetic airtight but means the EV Defense bar quietly absorbed everything that was not one of the named parts: the half of finishing we regress away, a small play-driving credit, and the replacement-level adjustment.

When this post first went up we estimated that leakage at “a few tenths of a goal, two or three at worst.” That was wrong, and materially so. The estimate accounted for the finishing and play-driving pieces but omitted the replacement-level adjustment, which turns out to dominate. Measured properly, the EV Defense bar was overstated by an average of 4.0 goals for defensemen and 3.0 for forwards, and by as much as 8.8. Moritz Seider's 2025-26 bar read +7.9 when his actual even-strength defense was −0.9.

We have since split the residual into named parts, so each is now shown on its own instead of being folded into defense:

BucketWhat it is
EV DefenseEven-strength goal suppression, and nothing else
Play-drivingShot-share credit for defensemen who move play up the ice
Finishing adj.The half of shooting luck we regress away
ReplacementThe baseline every player is measured against, scaled by ice time

The parts still sum to the headline number exactly. The difference is that a defenseman's defensive rating is now his defensive rating, rather than his defensive rating plus a time-on-ice bonus. We would rather correct this in public than leave a tidy chart standing that implied more precision than the method supported.

Why this matters

A value model that cannot explain itself is a black box asking for trust it has not earned. If we tell you Macklin Celebrini was worth 27.3 goals above replacement, you should be able to open that number, see 18.2 from even-strength offense and 4.4 from the power play, and add it back up. When the parts do not reconcile with the whole, either the breakdown is wrong or the headline is — and you have no way to tell which.

Frequently Asked Questions

What is GAR made of?

Seven components, all in goals above replacement: even-strength offense, even-strength defense, power play, penalty kill, finishing, penalties drawn minus taken, and faceoffs. All are counting-stat based except even-strength defense, which uses a regression estimate, and finishing, which is regressed halfway toward expected goals.

Why isn't GAR built entirely from RAPM?

Because RAPM only measures on-ice expected-goal rates. It cannot see finishing, faceoffs, or penalties drawn. Measured across four seasons, a pure-RAPM model drops standings R-squared from 0.75 to 0.51 and is no more repeatable year over year, so Hockey Alchemy anchors GAR on counting stats and substitutes regression only for even-strength defense.

Why is finishing only counted at half weight?

Shooting above expected is mostly luck. It repeats year over year at about r = 0.43, the weakest of any GAR component, so counting all of it would make GAR a worse measure of durable skill. Half is a compromise between describing what happened and predicting what comes next.

More from The Lab

Why Public Hockey Analytics Is Imperfect

An honest accounting of where public hockey analytics hits a wall — the data ceiling (the feed records no passes, tracking drifts, private camera models see more) and the bigger problem now: a discourse that shares cards without meaning, rewards certainty over nuance, and stopped teaching. With the Zach Hyman case as the tell.

Distance and Angle Aren't Enough: Why Our xG Model Splits the Ice Into Zones

A pure distance-and-angle expected-goals model looks reasonable — and quietly misprices the whole ice. We map exactly where it goes wrong, then show how zone, rush, and prior-event features lift out-of-sample AUC from 0.70 to 0.84.

How Our Expected Goals (xG) Model Works

A transparent look inside Hockey Alchemy's xG model: situation-specific XGBoost models, 53 features, 16 seasons and 1.6M shots — and how it stacks up against MoneyPuck on a matched-shot test.