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.
- GAR is anchored on counting stats, with the even-strength defense term replaced by a regression-based estimate. It is not a pure RAPM model, on purpose.
- We measured the pure-RAPM alternative: it drops standings R² from 0.75 to 0.51 and is not more repeatable. RAPM cannot see finishing, faceoffs, or penalties.
- The breakdown we displayed was built from columns that were never part of the total. Their sum correlated 0.61 with the headline number at best — and 0.026 in 2025-26 after a separate bug. Both are fixed; the components now sum exactly.
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:
| Component | What it measures | Source |
|---|---|---|
| EV Offense | Even-strength goal creation | Counting stats |
| EV Defense | Even-strength goal suppression | Regression (SPM/RAPM) + team residual |
| Power Play | Offense with the man advantage | Counting stats |
| Penalty Kill | Shorthanded goal suppression | Expected goals against on PK shifts |
| Finishing | Goals scored above expected | Counting stats, regressed 50% toward xG |
| Penalties | Drawn minus taken | Counting stats |
| Faceoffs | Draw wins above average | Counting 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:
| Model | YoY repeatability | Standings R² |
|---|---|---|
| Current (counting-anchored) | 0.766 | 0.754 |
| Pure RAPM sum | 0.741 | 0.508 |
| Pure counting stats | 0.619 | 0.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:
| Bucket | What it is |
|---|---|
| EV Defense | Even-strength goal suppression, and nothing else |
| Play-driving | Shot-share credit for defensemen who move play up the ice |
| Finishing adj. | The half of shooting luck we regress away |
| Replacement | The 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.