Medicare Advantage, Part D, Medicaid
MA Star Ratings — methodology dimension
Rows
N/A
Columns
13
History
2015 (rating_year) to 2027 (rating_year; 2027 is a not-yet-finalized projection with is_current=FALSE — latest FINALIZED year is 2026)
Card
yesgrain, traps, filters
Typed tools
0
What it is
- 1A small reference dimension that documents, for each Medicare Advantage / Part D Star Ratings rating year (2015-2027), which CMS Star Ratings methodology was in force — the version, the named "era," which scoring mechanics were active (CAI, Tukey outlier deletion, expanded hold-harmless), the reward-factor formula variant, and a link + hash to the official CMS Technical Notes PDF.
- 2It is the metadata/version-control spine an agent uses to interpret and correctly reproduce Stars cut points, reward factors, and QBP-driven payment for a given year.
Grain
| Key | Grain |
|---|---|
rating_year |
|
How to read it
- 1To interpret or reproduce a given year's Star Ratings, look up its methodology row, e.g.
- 2SELECT rating_year, methodology_version, era, cai_active, tukey_active, hold_harmless_expanded, reward_factor_formula, tech_notes_pdf_url, notes FROM medicare_silver.dim_stars_methodology WHERE rating_year = 2024.
- 3This answers 'what methodology produced the 2024 Star Ratings?' — returns ry2024_v2_post_scan_elevance_restated, era tukey_era_restated, CAI+Tukey both active, and a notes field explaining the SCAN/Elevance litigation restatement and the June-13-2024 baseline rule required to recompute the post-restatement cut points.
- 4Join to the actual ratings/QBP fact tables on rating_year (or payment_year, which equals it) to attach methodology context to per-contract numbers.
Traps
- 1rating_year is the real and minimal primary key — 13 rows, 13 distinct, zero duplicates. The auto-profiler FAILED to find the grain and wrongly reported tukey_active as the lone candidate key (only 2 distinct values, FALSE pre-2024 / TRUE 2024+). Never join or dedup on tukey_active.
- 2payment_year and performance_year are NOT independent keys: payment_year == rating_year in every row, and performance_year == rating_year - 2 in every row (fixed 2-yr lag). All three are 1:1 — use rating_year as the canonical key, the others are derived.
- 3is_current=FALSE on the 2027 row means 'not yet finalized / forward-looking projection,' NOT 'stale/superseded.' To get the latest FINALIZED year use MAX(rating_year) WHERE is_current = TRUE => 2026, not 2027.
- 4Null tech_notes_pdf_url (2016/2021/2022/2023/2027) does NOT mean undocumented — methodology is fully captured in methodology_version + era + flags + the always-populated notes column, and sha256 is present for all finalized years even when the URL is missing (sha is null only for 2027).
- 5The '_v2_' in methodology_version is the restatement signal: RY2024 and RY2025 were recalculated AFTER publication due to litigation (SCAN/Elevance) and a court-ordered UHC/Centene recalc. To reproduce those years use the restated rule (e.g. the June-13-2024 baseline rule in the 2024 notes), not original v1 cut points.
- 6This is a year-level METHODOLOGY dimension, not a fact table: NO contract_id/plan_id/measure_id/star value. It explains HOW a year was scored so you can interpret/recompute the actual Stars + QBP facts in sibling tables; join on rating_year (== payment_year).
Columns (13)
| Column | Type | Meaning |
|---|---|---|
rating_year | int | Star Ratings rating year (year the ratings are published/labeled, e.g. '2025 Star Ratings'). Integer 2015-2027, all 13 distinct. PRIMARY KEY — verified unique (13 rows / 13 distinct, no duplicates). |
performance_year | int | Measurement/data-collection year that produced the rating. Always rating_year - 2 in every row (2-yr HEDIS/CAHPS/admin lag; RY2025 measures CY2023). 1:1 with rating_year, redundant. |
payment_year | int | Quality Bonus Payment (QBP) plan year these ratings drive. Equals rating_year in EVERY row (diff=0 for all 13). 1:1 synonym column, not an independent axis. |
methodology_version | string | Version slug for the methodology in force, pattern ry<year>_v<n>_<event> (e.g. ry2024_v2_post_scan_elevance_restated, ry2027_v1_hei_reversed). '_v2_' = year was RESTATED/recalculated after publication (litigation); '_v1_' = original. 1:1 with rating_year, never null. |
era | string | Coarse named epoch label, one distinct value per year (13 distinct), tracing methodology evolution: i_factor_introduced(2015)->r_factor_renamed(2016)->cai_introduced(2017)->cai_with_letter_facs(2018)->statins_axis(2019)->fac_integer_flip_hurricane_HH(2020)->covid_freeze(2021)->covid_universal_HH(2022)->weight_doubling_cbp_intro(2023)->tukey_era_restated(2024)->modern_post_litigation(2025)->modern_60pct_fema_removed(2026)->modern_historical_reward_retained(2027). Never null. |
cai_active | boolean | Boolean: whether the Categorical Adjustment Index (LIS/DE/disability case-mix adjustment) was applied. FALSE 2015-2016, TRUE 2017-2027 (transition RY2017). 0 nulls. |
tukey_active | boolean | Boolean: whether Tukey outer-fence outlier deletion was used in cut-point clustering. FALSE 2015-2023, TRUE 2024-2027 (transition RY2024). Only 2 distinct values — NOT a key despite the profiler flagging it. |
hold_harmless_expanded | boolean | Boolean: whether an expanded/broadened hold-harmless protection was in effect. TRUE only for 2021, 2022 (COVID years) and 2027 (projected); FALSE otherwise. Non-nullable. |
reward_factor_formula | string | Reward-factor formula variant: i_factor_2_row(2015), r_factor_2_row(2016), historical(2017,2018,2020,2021,2024,2025,2026), historical_with_statins_axis(2019), historical_with_mpf_axis(2022), historical_with_cbp_axis(2023), historical_retained_2027(2027). '_axis' suffix = variance dimension added that year. Never null. |
tech_notes_pdf_url | string | Canonical CMS Technical Notes PDF URL. NULLABLE; null for 5 years (2016,2021,2022,2023,2027) = URL not captured/not yet published, NOT that methodology is unknown (notes + sha still cover those years). |
tech_notes_pdf_sha256 | string | SHA-256 integrity hash of the captured Technical Notes PDF (provenance/tamper-evidence). Present for all 12 finalized years even when URL is null; null ONLY for 2027 (no published tech notes yet). Nullable. |
notes | string | Rich free-text analyst annotation per year (never null), the densest column: documents restatements, court cases (SCAN v. HHS, Elevance v. Becerra, UHC/Centene recalc), QBP/$ impact, measure add/remove, weight changes, improvement/CTM/MCLP measure IDs, and the exact rules to REPRODUCE that year's ratings. |
is_current | boolean | Boolean finalization flag. TRUE for 12 rows (2015-2026 = finalized/published). FALSE for exactly 1 row, 2027 (forward-looking/projected, no tech notes URL/sha). Does NOT mark 'most recent'; separates finalized history from the single projected future year. |
Query it
describe_data_source(source_fqn="medicare_silver.dim_stars_methodology") # the card, live query_substrate(sql="SELECT * FROM medicare_silver.dim_stars_methodology WHERE rating_year = '<value>' LIMIT 100")
| Item | Value |
|---|---|
| Typed tools that read it | none; raw SQL |
| Identity key | rating_year |
| Join | how_to_join(source_fqn="medicare_silver.dim_stars_methodology") |
| Raw door | Athena (read-only via query_substrate): medicare_silver.dim_stars_methodology (filter is_current = true) |
| Note | Grain-governed (medicare_ma_stars). |
This page as markdown: /docs-md/data/medicare_silver_dim_stars_methodology.md · every page in one file: /llms-full.txt