Medicare Advantage, Part D, Medicaid

MA hedis hos pao

medicare_silver.hedis_hos_pao·live·silver·annual·Medicare Advantage HEDIS Quality
Rows
N/A
Columns
14
History
2019 (report_year; effective_period_start 2019-01-01) to 2025 (report_year; effective_period_start 2025-01-01)
Card
yesgrain, traps, filters
Typed tools
1

What it is

  1. 1Medicare Advantage HEDIS Health Outcomes Survey (HOS) results for the "Physical Activity in Older Adults" (PAO) measure, published by CMS in the annual MA HEDIS Public Use Files.
  2. 2Each row is one MA contract's two PAO survey rates for one reporting year — a clinical-quality / patient-experience measure that feeds CMS Star Ratings.
  3. 3(Quality data, not a dollar/cost table; it sits in the medicare_silver Star-ratings family as a quality benchmark.)

Grain

KeyGrain
contract_idreport_year
  1. 1One row per Medicare Advantage contract per HEDIS report year.
  2. 2Verified: contract_id x report_year yields exactly 3,207 distinct combos = the 3,207 total rows, and within every single report_year the count of rows equals the count of distinct contract_id (0 duplicate excess in 2019/2021/2022/2023/2024/2025).
  3. 3The pipeline that builds this table declares pk_columns=["contract_id","report_year"] and asserts that uniqueness.
  4. 4The profiler's 4-column key (adding plan_name_raw + effective_period_start + observed_period) is a SUPERSET — those extra columns are functionally determined by contract_id+report_year and are not needed to make the row unique.

How to read it

  1. 1Trend a single plan's preventive-care quality, or rank plans within a year.
  2. 2Example: SELECT report_year, rate1 AS discussing_pa, rate2 AS advising_pa FROM medicare_silver.hedis_hos_pao WHERE contract_id='H0104' AND rate1 IS NOT NULL ORDER BY report_year; -- shows Blue Cross Blue Shield of Alabama's Physical-Activity-in-Older-Adults discussion/advice rates over time.
  3. 3For a peer benchmark in one year: SELECT contract_id, plan_name_raw, rate1, rate2 FROM medicare_silver.hedis_hos_pao WHERE report_year=2025 AND rate1 IS NOT NULL ORDER BY rate1 DESC.
  4. 4Join to other medicare_silver Star/HEDIS tables on contract_id (+ report_year) to assemble a contract's full quality profile.

Traps

  1. 1NOT a cost/dollar table. 'rate1'/'rate2' are SURVEY PERCENTAGES (0-100 scale, observed 26-79), not prices, dollars, or fee-schedule rates. This is a clinical-quality / Star-ratings input. Do not interpret rate1/rate2 as money or as a commercial-vs-Medicare ratio.
  2. 2The minimal grain is contract_id + report_year (the build pipeline asserts this PK). The auto-generated catalog card says grain='one row per contract_id', which is WRONG across years (contract_id alone has only 735 distinct vs 3,207 rows because most contracts appear in multiple years). The profiler's reported key (contract_id + plan_name_raw + effective_period_start + observed_period) is a redundant SUPERSET — plan_name_raw, observed_period, and effective_period_start are all functionally determined by contract_id+report_year.
  3. 32020 is MISSING from report_year (sequence is 2019 then jumps to 2021) — HOS reporting was waived for the COVID year. Any year-over-year trend across 2019->2021 spans a 2-year gap; do not assume continuous annual coverage.
  4. 4NULL rate1/rate2 means the measure was suppressed / not reported for that contract-year (small denominator or non-reporting plans like AIDS Healthcare Foundation and niche SNPs), NOT zero performance. 63 rate1 nulls and 58 rate2 nulls; exclude nulls from averages rather than coalescing to 0.
  5. 5plan_name_raw is verbatim and un-normalized: one contract_id can carry up to 4 different name spellings across years (rebrands / vendor changes). Join and aggregate on contract_id, never on plan_name_raw.
  6. 6This is the HOS Physical Activity in Older Adults (PAO) measure ONLY. It has sibling tables in medicare_silver (hedis_hos_frm = Falls Risk Management, hedis_hos_mui = Urinary Incontinence, hedis_hos_oto, hedis_measures = headline HEDIS measures). The two rate columns mean different things in each sibling, so do not pool rate1/rate2 across the hedis_hos_* tables. Single snapshot only (one asserted_at, vintage=1, revision=1) — there is no is_current flag and no superseding versions to dedup.

Columns (14)

ColumnTypeMeaning
contract_idstringCMS Medicare Advantage contract identifier (the H/R-number), e.g. 'H0028'. 735 distinct values. All values begin with 'H' (707 contracts, MA/MA-PD) or 'R' (28 contracts, regional PPO); no 'S' (PDP) since HOS surveys MA enrollees. Combined with report_year this is the row key. A single contract_id can appear under multiple plan_name_raw strings across years (vendor name changes / rebrands).
plan_name_rawstringMarketing/legal name of the contracting organization as printed in the CMS PUF, e.g. 'BLUE CROSS AND BLUE SHIELD OF ALABAMA', 'WELLCARE OF GEORGIA, INC.' (635 distinct). 'raw' = verbatim, un-normalized. NOT part of the grain — it is an attribute of contract_id and can drift year to year (one contract_id maps to up to 4 different name strings).
rate1doubleFirst PAO sub-measure rate, a survey-based percentage (double). Range observed 33.33-79.40, mean ~55.9, median ~55.8, never exceeds 100. For HOS Physical Activity in Older Adults this is the 'Discussing Physical Activity' rate — % of older enrollees who reported their doctor discussed/talked with them about physical activity. 63 NULLs = measure not reported/suppressed for that contract-year (null means no-data, NOT zero). CMS publishes the column literally headered 'rate1'; the two-rate meaning lives in the PUF documentation, not the data.
rate2doubleSecond PAO sub-measure rate, survey-based percentage (double). Range 26.00-76.44, mean ~49.9, median ~50.2, never >100. For HOS PAO this is the 'Advising Physical Activity' rate — % who received advice to start/maintain/increase physical activity. Consistently lower than rate1 on average (advising is a stricter step than discussing). 58 NULLs (suppressed/no-data). 58 rows are both-null; only 5 rows have rate1 null while rate2 is present, so partial reporting is rare but exists.
report_yearintInteger HEDIS reporting year and the temporal half of the grain. Six values present: 2019, 2021, 2022, 2023, 2024, 2025. 2020 is ABSENT (HOS reporting was waived during COVID). Row counts grow over time: 417 (2019) -> 475 -> 522 -> 579 -> 605 -> 609 (2025) as MA contract count grows.
observed_perioddateDate = Jan 1 of report_year (the period the survey data describes). 6 distinct values. 100% equal to effective_period_start (redundant with it). Part of the profiler's superset key but not needed for uniqueness.
asserted_atdateProvenance: the date Vlada ingested/asserted this snapshot into the silver table. Single value for the entire table: 2026-05-15. Use to know data freshness, not as a row dimension.
effective_period_startdateStart of the measurement period = Jan 1 of report_year (e.g. 2025-01-01). This is the profiler's temporal column; earliest 2019-01-01, latest 2025-01-01. Equals observed_period for every row.
effective_period_enddateEnd of the measurement period = Dec 31 of report_year (e.g. 2025-12-31). Together with effective_period_start it brackets the calendar reporting year; fully determined by report_year.
cms_vintage_sequenceintProvenance/versioning integer for which CMS release vintage of a given period this is. Constant = 1 for all rows (only the first/initial PUF vintage per year has been loaded; no restated/re-released vintages present). A higher number would indicate a CMS re-release of the same year.
parse_revisionintInternal parser revision number for the row. Constant = 1 across the whole table (single parse generation; would bump if the file were re-parsed with new logic).
parser_artifact_hashstringSHA-256 of the parser artifact/run that produced the row (code+config provenance). 6 distinct values = one per (year) parse run / source file. Lets you trace exactly which parser build emitted a row.
source_urlstringCMS download URL of the originating ZIP, one per report_year, e.g. 'https://www.cms.gov/files/zip/ma-hedis-pufs-2025.zip' (2019 uses the older 'hedis-ma-puf-2019.zip' naming). The PAO numbers come from the 'hedishos_pao' sheet inside that MA HEDIS PUF zip.
sha256_content_hashstringSHA-256 content hash of the exact source file the row was parsed from (byte-level provenance / dedup key). 6 distinct values = one per yearly source ZIP. All rows of a given report_year share one hash.

Query it

describe_data_source(source_fqn="medicare_silver.hedis_hos_pao")     # the card, live
query_substrate(sql="SELECT * FROM medicare_silver.hedis_hos_pao WHERE contract_id = '<value>' AND report_year = '<value>' LIMIT 100")
ItemValue
Typed tools that read itget_hos
Identity keycontract_id
Joinhow_to_join(source_fqn="medicare_silver.hedis_hos_pao")
Raw doorAthena (read-only via query_substrate): medicare_silver.hedis_hos_pao
NoteGrain-governed; live in Glue / query_substrate. Source family ma_hedis_annual.

This page as markdown: /docs-md/data/medicare_silver_hedis_hos_pao.md · every page in one file: /llms-full.txt