How is RAF score calculated? Follow one real V28 member from diagnoses to a 2.491 raw score and 2.172 payment score, coefficient by coefficient.
How is a RAF score calculated? Most explanations stop at "demographics plus HCCs." That's true, but it doesn't help a coder see why one documentation choice moves a score by 0.3 and another moves it by nothing.
This article works through one Medicare Advantage member under the 2024 CMS-HCC model (V28), from ICD-10-CM codes to a payment-ready risk adjustment factor (RAF) score, using CMS's published coefficients. The result matches the output of CMS's own V28 model software for the same member. Then it changes one thing at a time to show which coding decisions actually matter.
The formula in one line
A member's raw RAF score is a sum of relative factors. Each factor is a coefficient CMS estimated from Original Medicare cost data.
Raw score = demographic factor + HCC factors (after hierarchies) + interaction factors + payment HCC count factor
Two population-level adjustments then turn the raw score into the score used for payment:
Payment score = (raw score ÷ normalization factor) × (1 − MA coding pattern adjustment)
Each piece depends on which segment the member falls into, so that's where the calculation starts.
Step 1: Place the member in a segment
V28 isn't one set of coefficients. It's several, and every coefficient in the calculation comes from the member's segment.
| Segment | Code | Who it covers |
|---|---|---|
| Community, non-dual, aged | CNA | Living in the community, not Medicaid eligible, entitled by age |
| Community, non-dual, disabled | CND | Community, not Medicaid eligible, entitled by disability |
| Community, full dual, aged | CFA | Full Medicaid benefits, entitled by age |
| Community, full dual, disabled | CFD | Full Medicaid benefits, entitled by disability |
| Community, partial dual, aged | CPA | Partial Medicaid benefits, entitled by age |
| Community, partial dual, disabled | CPD | Partial Medicaid benefits, entitled by disability |
| Institutional | INS | Long-term institutional residents |
| New enrollee | NE | Too little diagnosis history; scored on demographics only |
Age is calculated as of February 1 of the payment year. The member's original reason for entitlement also matters: a member who first qualified through disability and is now over 65 can pick up an additional "originally disabled" factor.
Our member: female, born January 1, 1950, so age 76 for payment year 2026. Living in the community, no Medicaid, entitled by age. Segment: CNA.
Step 2: Map diagnoses to HCCs and apply hierarchies
The member's diagnoses from qualifying encounters in the data collection year:
| ICD-10-CM | Condition | V28 payment HCC |
|---|---|---|
| E11.22 | Type 2 diabetes with diabetic chronic kidney disease | HCC 37, Diabetes with chronic complications |
| I50.9 | Heart failure, unspecified | HCC 226, Heart failure, except end-stage and acute |
| J44.9 | Chronic obstructive pulmonary disease, unspecified | HCC 280, Chronic obstructive pulmonary disease, interstitial lung disorders and other chronic lung disorders |
| N18.5 | Chronic kidney disease, stage 5 | HCC 326, Chronic kidney disease, stage 5 |
Hierarchies come next. When a member has two HCCs in the same family, only the most severe one counts. If this member also had N18.4 (stage 4, HCC 327) coded during the year, HCC 326 would override it and the score wouldn't change. None of the four HCCs here sit in the same family, so all four count.
Step 3: Add coefficients, interactions and the count factor
V28 adds extra weight for specific combinations of conditions, because those members cost more than the sum of each condition alone. Three apply here:
- DIABETES_HF_V28: any diabetes HCC (35 to 38) plus any heart failure HCC (221 to 226)
- HF_CHR_LUNG_V28: heart failure plus any chronic lung HCC (276 to 280)
- HF_KIDNEY_V28: heart failure plus any chronic kidney HCC (326 to 329)
The payment HCC count variable adds weight once a member has five or more payment HCCs. Our member has four, so the D4 factor applies, and in the V28 community non-dual aged segment it's zero.
The worked calculation
| Component | Variable | V28 CNA coefficient |
|---|---|---|
| Female, age 75 to 79 | F75_79 | 0.465 |
| Diabetes with chronic complications | HCC 37 | 0.166 |
| Heart failure | HCC 226 | 0.360 |
| COPD and chronic lung disorders | HCC 280 | 0.319 |
| CKD stage 5 | HCC 326 | 0.815 |
| Diabetes × heart failure | DIABETES_HF_V28 | 0.112 |
| Heart failure × chronic lung | HF_CHR_LUNG_V28 | 0.078 |
| Heart failure × kidney | HF_KIDNEY_V28 | 0.176 |
| Four payment HCCs | D4 | 0.000 |
| Raw community score | 2.491 |
That's the same 2.491 CMS's 2026 V28 Python software returns for this member. Note how much of it comes from interactions: 0.366, more than the diabetes and lung HCCs combined.
What moves the score, and what doesn't
Change one documentation fact at a time and recalculate. Every figure below uses the same V28 CNA coefficients.
| Scenario | What changed | Raw score | Change |
|---|---|---|---|
| A. Base case | As above | 2.491 | 0.000 |
| B. Diabetes coded as E11.9, without complications | HCC 37 becomes HCC 38 | 2.491 | 0.000 |
| C. CKD documented as stage 4, not stage 5 | HCC 326 (0.815) becomes HCC 327 (0.514) | 2.190 | -0.301 |
| D. COPD not documented this year | HCC 280 and HF_CHR_LUNG_V28 drop out | 2.094 | -0.397 |
| E. Morbid obesity also documented and supported | HCC 48 (0.186) added; count moves to D5 (0.050) | 2.727 | +0.236 |
Each row teaches a different mechanic.
Scenario B is the V28 diabetes constraint. HCCs 36, 37 and 38 all carry 0.166 in this segment. Coding complications still matters for clinical accuracy and audit consistency. It no longer changes payment. The kidney disease still counts, because N18.5 is coded on its own.
Scenario C is severity within a family. CKD stages map to different HCCs with very different weights. Stage is a clinical fact that has to be documented, not inferred from lab values by the coder. This is also exactly the kind of difference a Risk Adjustment Data Validation (RADV) reviewer checks.
Scenario D is annual recapture. The model resets every year. A COPD diagnosis that isn't documented at a qualifying encounter costs both its own coefficient and the interaction it triggered. For more on what that documentation has to show, see MEAT documentation for chronic conditions.
Scenario E is the count variable. A fifth payment HCC adds its own coefficient plus the jump from D4 to D5. It only belongs on the claim if the record supports it.
The same member in other segments
The coefficients change by segment, so identical diagnoses produce different scores:
| Segment | Raw score |
|---|---|
| Community, non-dual, aged (CNA) | 2.491 |
| Community, partial dual, aged (CPA) | 2.692 |
| Community, full dual, aged (CFA) | 3.049 |
| Institutional (INS) | 3.086 |
Dual eligibility and institutional status carry real weight. Getting segment flags right is a data problem, not a coding problem, but an error there distorts every HCC that follows.
From raw score to payment score
The raw score isn't what gets paid. Two adjustments come first.
Normalization. CMS divides by a normalization factor so that the average Original Medicare beneficiary scores 1.0 in the payment year. For 2027, the V28 normalization factor is 1.079.
MA coding pattern adjustment. CMS reduces MA scores to offset higher coding intensity in Medicare Advantage than in Original Medicare. For 2027, it's 5.90 percent, the statutory minimum.
For our member:
2.491 ÷ 1.079 = 2.309 2.309 × (1 − 0.059) = 2.172
A payment score of 2.172 means this member is expected to cost about 2.17 times the average beneficiary. The plan's payment for the member scales with that number.
Why you can't compare raw scores across models
Under the old V24 model, the same member's raw community score would be 2.146, using V24's own HCCs and interaction terms. That looks lower than 2.491, but the two can't be compared directly: each model has its own denominator year and normalization factor. Model-to-model comparisons only mean something after normalization, and across a whole population, which is how the impact figures in V28 at full weight: what changed and who lost RAF are built.
The same caution applies to the recalibration CMS proposed for 2027 and then deferred. Under the proposed coefficients, this member's raw score would have been 2.265, with lower weights on heart failure and every interaction term, and a higher weight on CKD stage 5. When that recalibration returns, raw scores for the same diagnoses will move again.
How to check any RAF number you're shown
Vendor dashboards, plan reports and internal analytics all quote RAF scores, and they rarely say which kind. Before you act on one, ask five questions.
- Raw, normalized or coding-adjusted? In our example the same member is 2.491, 2.309 or 2.172 depending on which step the number stopped at. A 7 to 13 percent difference can come from labeling alone.
- Which segment? The same diagnoses scored 2.491 to 3.086 across four segments. A report that assumes every member is community non-dual will understate duals and institutional members.
- Which model and year? A score built on V24 coefficients, a blend, or the deferred 2027 proposal isn't the score CMS pays on today.
- Were hierarchies and interactions applied? Adding up HCC coefficients without the hierarchy overstates the score; leaving out interactions understates it.
- Is the member in a different model entirely? Members with end-stage renal disease are scored with the ESRD CMS-HCC models, and new enrollees with demographic-only factors. A standard V28 calculation doesn't apply to them.
The most reliable check is to run a sample of members through CMS's own model software, which CMS publishes each year with its test cases, and compare. That's how the example in this article was validated.
What coders should take from the math
Specificity pays where severity tiers have different weights. CKD stage, heart failure type and acuity, and other families with distinct coefficients reward precise documentation. Diabetes complication tiers don't, under V28.
Interactions multiply documentation gaps. Missing one condition can remove an interaction too. In scenario D, a single undocumented diagnosis cost 0.397, not 0.319.
Hierarchies make duplicate coding pointless. Coding both CKD stage 4 and stage 5 in a year doesn't add anything. The less severe HCC drops out.
The score is only as good as its weakest diagnosis. Every factor in the 2.491 has to survive audit on its own. If the CKD stage isn't supported, the error isn't 0.815; it's whatever the supported stage would have been worth, and the extrapolation risk across a sample.
FAQ
How is a RAF score calculated?
A raw RAF score adds a demographic factor, one coefficient for each payment HCC after hierarchies, any interaction terms, and a payment HCC count factor, all from the member's segment. CMS then divides by a normalization factor and applies the MA coding pattern adjustment to get the payment score.
What is a good RAF score?
There's no good or bad score. A RAF score of 1.0 means expected cost equal to the average Medicare beneficiary after normalization. Higher scores mean higher expected cost. The only right score is the one the medical record supports.
Why didn't coding diabetes with complications raise the score?
Under V28, the three diabetes HCCs (36, 37 and 38) carry the same coefficient within each segment. Diabetes with chronic complications and diabetes without complications contribute the same amount. Complications documented as separate conditions, such as chronic kidney disease, still count on their own.
What are interaction terms in risk adjustment?
Interaction terms add weight when a member has specific combinations of conditions that cost more together than separately. Under V28 they include diabetes with heart failure, heart failure with chronic lung disease, and heart failure with chronic kidney disease.
Does the RAF score reset every year?
Yes. Each year's score uses diagnoses from the prior calendar year's qualifying encounters. A chronic condition that isn't documented during the year contributes nothing to the next year's score.
This article is general education on risk adjustment. It isn't a coding determination for any specific patient or encounter.