# MA hedis national rates

`medicare_silver.hedis_national_rates` · Medicare Advantage, Part D, Medicaid · status live

CMS-published national weighted-average rate per (measure_code, indicator_key) per year. ~70-85 rows per year. The denominator for computing relative contract performance (Stars Ratings inputs).

**Grain.** One row per HEDIS indicator per CMS report year. The minimal verified key is (indicator_key, report_year): 471 distinct = 471 total rows. measure_code does NOT extend or shrink the key (it is a label that drifts year-to-year), and contracts_count / effective_period_start / observed_period that the profiler bundled in are not needed — they are a value and report_year-derived dates respectively. There is no plan/contract/state/county dimension: this is the national aggregate only (one number summarizing all MA contracts).

**How to use it.** Trend a quality measure nationally over time, joining on the stable indicator_key (not measure_code). Example: SELECT report_year, weighted_rate, contracts_count, eligible_population FROM hedis_national_rates WHERE indicator_key='200700_20' ORDER BY report_year; -> returns the enrollment-weighted national Controlling-High-Blood-Pressure rate for MA each available year (2019 ~74.5%, ... through 2025), answering 'how has MA plan performance on blood-pressure control changed nationally?'. To list one year's full scorecard: SELECT measure_code, measure_name, weighted_rate FROM hedis_national_rates WHERE report_year=2024 ORDER BY weighted_rate DESC (remembering some measures are lower-is-better).

**Traps.**
- NOT a cost/price table despite 'national_rates' and 'weighted_rate' — these are HEDIS clinical QUALITY rates (percent of eligible members meeting a quality measure), at the NATIONAL level only. There is no contract/plan/state/county/NPI dimension; you cannot get a per-plan or per-region rate from this table.
- measure_code and measure_name are point-in-time LABELS that drift across years, not stable keys. The same clinical indicator is recoded by CMS/NCQA over time (e.g. HbA1c Control <8% = indicator_key 200707_20 shows as measure_code CDC in 2019-2022, HBD in 2023-2024, GSD in 2025; some indicators carry up to 4 different measure_names). ALWAYS join/trend on indicator_key, never on measure_code, or you will break time series and double-count.
- weighted_rate polarity is mixed: for most measures higher=better, but for overuse/avoidance measures (UOP multiple prescribers, HDO/UOD high-dose opioids, PSA non-recommended screening) LOWER is better. Ranking measures by raw weighted_rate or averaging across measures without normalizing polarity gives nonsense.
- Year 2020 is MISSING entirely (no 2020 MA HEDIS PUF due to COVID reporting relief) — the 6 periods are 2019, 2021, 2022, 2023, 2024, 2025, so any year-over-year delta logic must skip the 2019->2021 gap.
- Unbalanced panel: only 57 of 95 indicators appear in all 6 years; 4 appear in just 1 year (e.g. ABA / 200005_20 only in 2019, then retired). Do not assume every indicator exists every year — a missing (indicator_key, year) means the measure wasn't reported that year, not a value of 0.
- The grain is exactly (indicator_key, report_year) — 471 rows. The profiler reported a 5-column superset that included contracts_count (a measured value) and the report_year-derived dates; those are NOT part of the key. is_current does not exist and is unnecessary: one immutable sha256 per year, single asserted_at (2026-05-15), no duplicate snapshots.
- contracts_count and eligible_population are NATIONAL denominators rolled across all reporting contracts (eligible_population reaches ~32.5M; counts grow year over year with MA enrollment). They are not per-contract figures, and low contracts_count (down to 47) flags thinly-reported indicators whose national rate is less robust.

| column | type | meaning |
|---|---|---|
| measure_code | string | Short HEDIS measure abbreviation, e.g. ABA (Adult BMI Assessment), CBP (Controlling High Blood Pressure), BCS/BCS-E (Breast Cancer Screening), CDC/HBD/GSD (diabetes care). 35 distinct values. CAUTION: this is a point-in-time label, not a stable id — for the SAME indicator_key the code drifts across years as NCQA recodes measures (e.g. indicator 200707_20 = HbA1c Control <8% appears as CDC in 2019-2022, HBD in 2023-2024, GSD in 2025). Do not use it as the cross-year join key; use indicator_key. |
| measure_name | string | Human-readable label for the specific indicator/sub-stratum, e.g. 'Controlling High Blood Pressure', or a bare sub-label like '(Total)', '(51-75)', '30 days (Total)', 'HbA1c Control (<8%)'. Also point-in-time and drifts: one indicator_key can carry up to 4 different names across the 6 years (CMS rewords labels). Often it is just the stratum qualifier, not the full measure title. |
| indicator_key | string | The stable CMS PUF indicator identifier, formatted '<numeric_id>_<suffix>' where suffix is '10' or '20'. THE durable cross-year join key (95 distinct ids; one indicator_key tracks the same clinical indicator over time even when measure_code/measure_name change). The numeric prefix is the CMS indicator number; the _10/_20 suffix is a fixed PUF coding qualifier (248 rows _10, 223 rows _20). NOT unique on its own (recurs every year) — must be paired with report_year. |
| weighted_rate | double | Enrollment-weighted national average performance rate for the indicator, as a percent 0-100 (observed min 0.58, max 98.38; all 471 rows in [0,100], zero nulls). It is the contract-level rates weighted by each MA contract's eligible population, rolled to one national number. POLARITY VARIES: for most measures higher is better (e.g. TRC ~90%, statin therapy ~88%), but for 'overuse'/avoidance measures lower is better (e.g. UOP opioid multiple-prescribers 0.79%, HDO/UOD high-dose opioids, PSA non-recommended screening). Do not assume higher = better. |
| contracts_count | int | Number of MA contracts that reported this indicator and were rolled into the national rate (observed 47-630, no nulls). A measured denominator/coverage figure that grows over the years as MA enrollment expands — NOT a key column (the profiler mistakenly included it). Low counts (e.g. 47) flag thinly-reported indicators where the national rate is less robust. |
| eligible_population | int | Total national eligible-member count (the measure denominator) summed across reporting contracts (observed ~3.2M to ~32.5M, no nulls). This is the national denominator, not per-contract; it climbs year over year with MA growth. Used as the weight behind weighted_rate. |
| report_year | int | CMS HEDIS PUF report year (int): 2019, 2021, 2022, 2023, 2024, 2025. NOTE 2020 is absent — no 2020 MA HEDIS PUF (COVID reporting suspension). Half of the (indicator_key, report_year) grain. Rows per year: 2019=68, 2021=64, 2022=85, 2023=82, 2024=88, 2025=84. |
| observed_period | date | Date = January 1 of report_year (derived, redundant with report_year; aligned 471/471). Represents the measurement/reporting period anchor, not a sub-annual period. |
| asserted_at | date | Date this record was asserted/loaded into the silver layer. Constant 2026-05-15 for every row (single ingestion event). Effectively a load-batch stamp, not a business date. |
| effective_period_start | date | Date = January 1 of report_year (derived; aligned 471/471). Start of the year the rate is effective for. Functionally equal to report_year — the profiler used it as the time column. |
| effective_period_end | date | Date = December 31 of report_year (derived; aligned 471/471). End of the effective year. Together with effective_period_start it just bounds the report_year calendar window. |
| cms_vintage_sequence | int | Integer revision-sequence of the CMS source vintage. Constant = 1 across all rows (only the first/original vintage of each year's PUF has been loaded; no restatements ingested yet). A versioning hook for future CMS file re-releases. |
| parse_revision | int | Internal parser revision number for the extraction. Constant = 1 (single parser version used for the whole load). Provenance/reproducibility field. |
| parser_artifact_hash | string | SHA256 of the parser artifact that produced the row (provenance). 6 distinct values — one per source file/year — so it co-varies with the year's source ZIP, identifying which parser run emitted each year's rows. |
| source_url | string | CMS download URL of the origin HEDIS MA PUF ZIP, e.g. https://www.cms.gov/files/zip/ma-hedis-pufs-2024.zip. Exactly 6 distinct values, one per report_year (1:1 file-to-year). Note URL naming differs by year (hedis-ma-puf-2019.zip vs ma-hedis-pufs-2021.zip). |
| sha256_content_hash | string | SHA256 of the source file's content (provenance/integrity). 6 distinct values, one per year. Confirms a single immutable snapshot per year — total rows 471 = distinct (sha256_content_hash, indicator_key), so there is no duplicate-snapshot fan-out and no dedup is required. |

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