# HCC risk-model coefficients (reference)

`medicare_silver.dim_hcc_coefficients` · Medicare Advantage, Part D, Medicaid · status live · 8,805 rows

CMS risk-adjustment COEFFICIENT tables (Part C HCC + Part D RxHCC). Each row is one numeric risk weight a CMS scoring engine multiplies against a member's 0/1 flag for a demographic cell or condition category, for a given payment year, model version, and population segment. A reference lookup, not contract data.

**Grain.** One row per (rate_year, model_version, variable, segment) = one risk-model coefficient. Verified unique: COUNT(DISTINCT (rate_year, model_version, variable, segment)) = 8805 = the full row_count, and a GROUP BY ... HAVING COUNT(*)>1 dup-check returns 0. All four columns are required — dropping any one breaks uniqueness (rate_year+model_version+variable = 2822 distinct; variable+segment = 4888; model_version+variable+segment = 5827; rate_year+variable+segment = 7359).

**How to use it.** Score a Medicare Advantage member or look up a single weight. Example: SELECT variable, label, coefficient_value FROM medicare_silver.dim_hcc_coefficients WHERE rate_year=2027 AND model_version='V28' AND segment='COMMUNITY_NA' AND variable IN ('F70_74','HCC1') — returns the age/sex demographic weight plus the HIV/AIDS condition weight for a 70-74 community, non-dual, aged-female member under the 2027 V28 model; summing the applicable variable weights for a member yields their raw risk score (which drives the capitated payment). Always pin all of rate_year + model_version + segment.

**Traps.**
- No is_current / effective-date column. The snapshot key is rate_year, which maps 1:1:1 to bronze_publication_id and source_url; each grain key appears under exactly one publication (0 keys span both years), so there is no in-table version churn to dedup — but if more years/republications land later, you must filter by rate_year (and watch that the 2026 source is the MIDYEAR-FINAL ZIP while 2027 is the INITIAL ZIP, i.e. not the same release stage).
- model_version is load-bearing for the VALUE, not just the grain. The same variable (e.g. HCC1='HIV/AIDS') exists in multiple models with different coefficients (V22 INSTITUTIONAL=1.747 vs V28=1.322). Never read a coefficient by variable+segment alone — always pin model_version. Also, each model has its OWN disjoint segment vocabulary (V22/V28: COMMUNITY_*/INSTITUTIONAL/NE_*; V21/V24: DIAL/GRAFT_*; RxHCC_V08: CE_*/NE_NE_*), so a segment value implies its model.
- NULL label is meaningful and label is not authoritative. 864 NULL labels are concentrated entirely in V22 and V28 (432 each) on the new-enrollee Medicaid-interaction demographic terms (MCAID_*/NMCAID_NE*). Separately, the same variable carries cosmetically different label TEXT across models ('Female 0-34' vs 'Female, Age 0 - 34'), so join/dedup on variable, never on label.
- coefficient_value zeros and negatives are real, not missing data (0 NULLs). 320 exact 0.0 values mean the condition is structurally not scored in that segment (e.g. renal HCCs in GRAFT/DIAL), and 6 negatives are legitimate Originally-ESRD adjusters in V21/V24 DIAL. The large tail up to 59.861 (RxHCC high-cost-drug categories like Cystic Fibrosis, Hemophilia) is genuine — do not clip it as outliers.
- Coefficients are recalibrated year over year, so this is NOT a static dimension despite the dim_ name. Of the (model_version, variable, segment) combos, 2978 appear in BOTH 2026 and 2027 (many with changed values, e.g. RXHCC16 CE_LTI 4.514 -> 5.84) and 2849 appear in only one year. Always carry rate_year through any join to a member/score table.
- asserted_at and parser_artifact_hash are pipeline lineage, not CMS dates. Both years were loaded on 2026-05-18 by the same parser build ('e10d366596d1c801'); asserted_at is the silver write time, so use rate_year as the effective/payment period.

| column | type | meaning |
|---|---|---|
| rate_year | int | Medicare Advantage / Part D PAYMENT YEAR the coefficient applies to (int). Only 2 values present: 2026 and 2027. It is also the snapshot/version key: each rate_year maps 1:1:1 to exactly one bronze_publication_id and one source_url ZIP (2026 -> 2026-midyear-final; 2027 -> 2027-initial). Part of the grain. |
| model_version | string | CMS risk-adjustment model that owns the coefficient (string). 5 values: V21, V22, V24, V28 (Part C / medical HCC models) and RxHCC_V08 (Part D / prescription-drug RxHCC model). Essential to the grain and to value: the SAME disease variable carries a DIFFERENT coefficient per model (e.g. HCC1 INSTITUTIONAL 2027 = 1.747 under V22 vs 1.322 under V28). Each model also has its own disjoint segment set (see segment). |
| variable | string | The model term / risk factor name (string), 936 distinct. Four families by prefix: disease condition categories HCC* (184 distinct, e.g. HCC1='HIV/AIDS') and RXHCC* (82 distinct, e.g. RXHCC98='Hereditary Angioedema'); demographic age-sex cells M*/F* (e.g. F0_34='Female 0-34', D* disabled, ORIGDIS); and interaction / new-enrollee terms (MCAID_*, NMCAID_*, ESRD_*, NESRD_*, NONAGED_HCC*, etc). This is the row a CMS scoring engine multiplies by a 0/1 flag. Part of the grain but NOT unique on its own (same variable repeats across models, segments, years). |
| segment | string | The model SEGMENT / risk-score component the coefficient lives in (string), 38 distinct values, partitioned by model_version (not shared across models). Encodes enrollee population + entitlement: e.g. V22/V28 use COMMUNITY_{FBA,FBD,NA,ND,PBA,PBD} (Full/Partial/Non Medicaid-dual, Aged/Disabled), INSTITUTIONAL, and NE_* new-enrollee segments; V21/V24 use DIAL (dialysis), GRAFT_* (post-transplant), NE_DIAL/NE_GRAFT (ESRD models); RxHCC_V08 uses CE_* (continuing-enrollee Low/NonLow x Aged/NonAged x LTI) and NE_NE_* new-enrollee. REQUIRED to reach the grain (ry+mv+variable alone = 2822, not unique). |
| coefficient_value | float | The numeric risk weight (float, 0 nulls). Range -0.078 to 59.861, mean ~0.97. 6 negative values (all Originally_ESRD_Female/Male DIAL adjusters in V21/V24). 320 exact zeros = a disease that is structurally not scored in that segment (e.g. renal HCCs zeroed in GRAFT/DIAL segments). The huge tail (e.g. RXHCC98=59.861, RXHCC225 Cystic Fibrosis ~56, HCC111 Hemophilia ~32) are real Part D high-cost-drug weights, not errors. Coefficients are recalibrated year over year for many terms. |
| label | string | Human-readable description of the variable (string), e.g. 'HIV/AIDS', 'Female 0-34'. NULLABLE and meaning-bearing: 864 NULLs, all in V22 (432) and V28 (432), specifically the new-enrollee Medicaid-interaction demographic cells (MCAID_NORIGDIS_NE*, NMCAID_*). Also NOT authoritative/joinable: the same variable carries cosmetically different label text across model versions ('Female 0-34' vs 'Female, Age 0 - 34'), so dedup on variable, not on label. |
| source_url | string | Provenance: the exact CMS model-software ZIP the coefficients were parsed from (string). 2 values, 1:1 with rate_year: 2026 -> https://www.cms.gov/files/zip/2026-midyear-final-model-software-python.zip ; 2027 -> https://www.cms.gov/files/zip/2027-initial-model-software-python.zip . Note 2026 is the MIDYEAR FINAL release while 2027 is the INITIAL release. |
| sha256_content_hash | string | SHA-256 content hash of the ingested source artifact (string) — provenance/dedup fingerprint of the bronze file, identical for all rows from the same publication. |
| bronze_publication_id | string | Identifier of the bronze ingestion publication this row came from (string). Only 2 values: hcc_all_2026_66d75bf7, hcc_all_2027_f3b3955d. Maps 1:1 to rate_year/source_url. Serves as the de-facto snapshot key (each grain key appears under exactly ONE publication — 0 keys span both). |
| asserted_at | timestamp | Pipeline load/assertion timestamp in UTC (timestamp) — when the silver row was written, NOT a CMS publication date. Both publications loaded 2026-05-18 (2026 batch ~18:54, 2027 batch ~18:58); only ~13-14 distinct micro-timestamps per publication (batched write). Use rate_year, not this, for the effective period. |
| parser_artifact_hash | string | Hash identifying the parser code/artifact version that produced these rows (string). Single value 'e10d366596d1c801' across all 8805 rows — both years parsed by the same parser build. Lineage/reproducibility field. |

Query it: `query_substrate` with `SELECT ... FROM medicare_silver.dim_hcc_coefficients WHERE ... LIMIT 100`; read `describe_data_source("medicare_silver.dim_hcc_coefficients")` first.
