Skip to contents

PARBx

PARBxx, or Percentage of Accounts Receivable Beyond xx Days, is exactly what it sounds like: monitoring the percentage of your AR balances as they age, in what are commonly referred to as aging “buckets” or “bins.” This idea, in and of itself, is not revolutionary, other than his suggestion to use PARBxx to resolve Days in AR’s inability to highlight the overall behavior of Accounts Receivable. The innovation comes in the form of using the PARBxx data to create an index that tracks a payer’s performance month-to-month and annually:

PARBxx data can then be used to calculate a BPI, or Billing Performance Index. BPI is a key billing performance characteristic because it’s an indicator of claims that are never paid. Obviously, the lower the index, the better the billing performance. But this statistic is meaningful only when considered in the context of the relative performance of other payers. Lirov (2009)

PARBx resolves the sensitivity issues of the DAR metric. It offers a simple billing process metric that’s not dependent on the charge. Its graphic representation has a skewed bell shape. Its steepness represents billing process quality; a steep curve and thin tail mean a healthy billing process, while a flat bell and fat tail also mean billing problems.

Billing Performance Index (BPI)

Lirov’s Billing Performance Index was inspired by a Wall Street benchmarking technique called a payment performance index. He emphasizes the advantage of a “context-driven, rule-based approach to relative benchmarking”:

The advantage of rule-driven indexing is that participation is dynamically determined at a point in time, reflecting the dynamic nature of the entire market. Today’s top 10 list of index performers may not include the same names next week…A financial instrument’s specific performance is recomputed every time the index itself is computed, reflecting the dynamic nature of performance relative to the market itself. Lirov (2009)

Applying this indexing method to payers allows providers to track the ease/difficulty of the reimbursement process with each payer. Inclusion in the monthly index indicates that the percentage of AR older than 120 days belonging to a payer ranks among the lowest in a provider’s payer mix.

This results in a provider being able to focus his or her AR management resources on more problematic payers. Lirov does suggest several criteria that should be considered before a payer is elligible for inclusion such as a minimum threshold of claims submitted and total gross charges processed.

Monthly BPI Ranking

For this example, I’ve put the mock data provided by Dr. Lirov into a data frame. The data ranks (or indexes) the payers with the top 10 lowest PARBx percentages by the most recent month’s (December) figures, including November’s figures as well. December’s rankings appear alongside a Rank Change column indicating the number of places each payer rose or fell from November to December. Using {reactable} and {reactablefmtr} I can create an interactive table of the data:

parbx_rank <- dplyr::tibble(
  payer = c(
    "Medicare Illinois",
    "BCBS Illinois",
    "Cigna",
    "Horizon BCBS NJ",
    "Aetna",
    "UnitedHealthcare",
    "Medicare NJ",
    "GEICO",
    "BCBS Pennsylvania",
    "BCBS Georgia"
  ),
  parbx_nov = c(5.8, 7.9, 15.7, 20.7, 20, 15, 19.4, 36.2, 30.5, 39.9) / 100,
  parbx_dec = c(6.8, 8.1, 10.7, 13.9, 14.8, 21.2, 18.8, 35.2, 43.4, 43.3) / 100
) |> 
  dplyr::mutate(
    rank_nov = dplyr::min_rank(parbx_nov),
    rank_dec = dplyr::min_rank(parbx_dec),
    rank_change = rank_nov - rank_dec) |> 
  dplyr::arrange(rank_dec)

parbx_rank
#> # A tibble: 10 × 6
#>    payer             parbx_nov parbx_dec rank_nov rank_dec rank_change
#>    <chr>                 <dbl>     <dbl>    <int>    <int>       <int>
#>  1 Medicare Illinois     0.058     0.068        1        1           0
#>  2 BCBS Illinois         0.079     0.081        2        2           0
#>  3 Cigna                 0.157     0.107        4        3           1
#>  4 Horizon BCBS NJ       0.207     0.139        7        4           3
#>  5 Aetna                 0.2       0.148        6        5           1
#>  6 Medicare NJ           0.194     0.188        5        6          -1
#>  7 UnitedHealthcare      0.15      0.212        3        7          -4
#>  8 GEICO                 0.362     0.352        9        8           1
#>  9 BCBS Georgia          0.399     0.433       10        9           1
#> 10 BCBS Pennsylvania     0.305     0.434        8       10          -2
parbx_rank |>
  arrange(rank_dec) |> 
  mutate(dir = case_when(
    rank_change == 0 ~ "code-commit",
    rank_change > 0 ~ "arrow-up",
    rank_change < 0 ~ "arrow-down"
  )
) |> 
  gt(rowname_col = "payer") |>
  cols_add(change_abs = abs(rank_change)) |>
  fmt_icon(
    columns = dir,
    fill_color = c("arrow-up" = "#15607A", "arrow-down" = "#FA8C00", "code-commit" = "grey90")) |> 
  fmt_percent(columns = starts_with("parbx_"),
              drop_trailing_zeros = TRUE) |>
  fmt_integer(columns = ends_with("_change"), force_sign = TRUE) |>
  cols_hide(columns = c(rank_change)) |> 
  cols_move_to_start(columns = c(dir, change_abs, rank_nov, parbx_nov, rank_dec, parbx_dec)) |>
  cols_align(align = "center", columns = c(dir, rank_change, rank_nov, parbx_nov, rank_dec, parbx_dec)) |> 
  # cols_merge(columns = c(change_abs, dir), pattern = "{1} {2}") |> 
  cols_label(
    change_abs = "Change",
    rank_nov = "Rank",
    parbx_nov = md("PARB<b><i><sub>x</sub></i></b>"),
    rank_dec = "Rank",
    parbx_dec = md("PARB<b><i><sub>x</sub></i></b>"),
    dir = ""
  ) |>
  data_color(columns = starts_with("parbx_"),
             palette = c("#15607A", "#FFFFFF", "#FA8C00")) |>
  opt_table_font(font = gt::google_font(name = "Atkinson Hyperlegible")) |> 
  tab_header(title = md("**Billing Performance Index**"),
             subtitle = "Top 10 Payers with the Lowest Percentage of AR Beyond 120 Days") |> 
  tab_spanner(label = md("**November**"), columns = c(rank_nov, parbx_nov)) |> 
  tab_spanner(label = md("**December**"), columns = c(rank_dec, parbx_dec)) |> 
  opt_stylize(color = "cyan", add_row_striping = FALSE) |>
  tab_options(
    quarto.disable_processing = TRUE,
    table.font.size = gt::px(18),
    table.width = gt::pct(100),
    heading.align = "left",
    heading.title.font.size = gt::px(24),
    heading.subtitle.font.size = gt::px(21))
Billing Performance Index
Top 10 Payers with the Lowest Percentage of AR Beyond 120 Days
Change November December
Rank PARBx Rank PARBx
Medicare Illinois Code Commit 0 1 5.8% 1 6.8%
BCBS Illinois Code Commit 0 2 7.9% 2 8.1%
Cigna Arrow Up 1 4 15.7% 3 10.7%
Horizon BCBS NJ Arrow Up 3 7 20.7% 4 13.9%
Aetna Arrow Up 1 6 20% 5 14.8%
Medicare NJ Arrow Down 1 5 19.4% 6 18.8%
UnitedHealthcare Arrow Down 4 3 15% 7 21.2%
GEICO Arrow Up 1 9 36.2% 8 35.2%
BCBS Georgia Arrow Up 1 10 39.9% 9 43.3%
BCBS Pennsylvania Arrow Down 2 8 30.5% 10 43.4%
parbx_rank |> 
  select(payer, parbx_nov, parbx_dec) |> 
  mutate(
    parbx_nov = parbx_nov * wakefield::probs(n()),
    parbx_dec = parbx_dec * wakefield::probs(n()),
    rank_nov = dplyr::min_rank(parbx_nov),
    rank_dec = dplyr::min_rank(parbx_dec),
    rank_change = rank_nov - rank_dec
  ) |>
  arrange(rank_dec) |> 
  gt(rowname_col = "payer") |>
  fmt_percent(columns = starts_with("parbx_"), drop_trailing_zeros = TRUE) |>
  fmt_integer(columns = ends_with("_change"), force_sign = TRUE) |>
  cols_move_to_start(columns = c(rank_change, rank_nov, parbx_nov, rank_dec, parbx_dec)) |>
  cols_align(align = "center", columns = c(rank_change, rank_nov, parbx_nov, rank_dec, parbx_dec)) |> 
  cols_label(
    rank_change = "Change",
    rank_nov = "Rank",
    parbx_nov = md("<sub>wt</sub>PARB<b><i><sub>x</sub></i></b>"),
    rank_dec = "Rank",
    parbx_dec = md("<sub>wt</sub>PARB<b><i><sub>x</sub></i></b>")
  ) |>
  data_color(columns = starts_with("parbx_"),
             palette = c("#15607A", "#FFFFFF", "#FA8C00")) |> 
  opt_table_font(font = gt::google_font(name = "Atkinson Hyperlegible")) |> 
  tab_header(title = md("**Weighted Billing Performance Index**"),
             subtitle = "Top 10 Payers with the Lowest Percentage of AR Beyond 120 Days") |> 
  tab_spanner(label = md("**November**"), columns = c(rank_nov, parbx_nov)) |> 
  tab_spanner(label = md("**December**"), columns = c(rank_dec, parbx_dec)) |> 
  opt_stylize(color = "cyan", add_row_striping = FALSE) |>
  tab_options(
    quarto.disable_processing = TRUE,
    table.font.size = gt::px(18),
    table.width = gt::pct(100),
    heading.align = "left",
    heading.title.font.size = gt::px(24),
    heading.subtitle.font.size = gt::px(21)
              )
Weighted Billing Performance Index
Top 10 Payers with the Lowest Percentage of AR Beyond 120 Days
Change November December
Rank wtPARBx Rank wtPARBx
Horizon BCBS NJ +7 8 3.79% 1 0.06%
Medicare Illinois −1 1 0.3% 2 0.22%
Aetna −1 2 0.69% 3 0.34%
BCBS Illinois +1 5 1.28% 4 0.56%
GEICO +2 7 2.15% 5 1.23%
Cigna −3 3 1.01% 6 1.28%
BCBS Pennsylvania +3 10 5.76% 7 2.32%
UnitedHealthcare −4 4 1.28% 8 3.97%
Medicare NJ −3 6 1.29% 9 5.68%
BCBS Georgia −1 9 4.13% 10 7.52%

Annual BPI Summary

The final destination for all of this data is the annual summary of the monthly Billing Performance Index.

The Annual BPI is simply a list of the payers who participated in the Monthly BPI, ranked by the number of times that they made the top 10 that year. Also included are each payer’s mean, minimum, and maximum BPI for the year. Lirov sums up the importance of the annual summary:

A low percentage of accounts receivable beyond 120 days is critical to being included in the billing index. However, the frequency of inclusion in the index is a more robust performance metric, because it measures billing performance consistency over a longer time period.

tibble(
  rank = 1:15,
  n_months = c(
    12, 11, 11, 10, 10,
    7, 7, 7, 5, 4, 3,
    3, 3, 2, 2
  ),
  payer = c(
    "BCBS Illinois", "Cigna",
    "Medicare New Jersey",
    "Aetna", "UnitedHealthcare",
    "Medicare Illinois", "Horizon BCBS New Jersey",
    "BCBS Pennsylvania", "BCBS Georgia",
    "Anthem BCBS Colorado",
    "BCBS Michigan", "BCBS Texas", "GEICO",
    "Anthem BCBS Colorado", "Humana"
  ),
  min = c(
    7.1, 8.9, 7.5, 8.8, 11.3,
    5.8, 13.9, 12.4, 22.9, 12.4,
    3.2, 10.3, 33.4, 6.8, 7.9
  ) / 100,
  mean = c(
    10.9, 13.4, 15.7, 16.6, 17.2,
    14, 18, 23.5, 34.1, 19.1, 6.8,
    15.2, 34.9, 9.6, 9.9
  ) / 100,
  max = c(
    16, 24.1, 20.5, 22.1, 23.2,
    30.4, 24.3, 43.4, 43.3, 34.1,
    13.6, 20, 36.2, 12.3, 11.8
  ) / 100
) |> 
  gt(rowname_col = "rank", groupname_col = "payer", row_group_as_column = TRUE) |>
  fmt_percent(columns = c(min, mean, max), drop_trailing_zeros = TRUE) |>
  cols_align(align = "center", columns = c(rank, n_months, min, mean, max)) |> 
  cols_label(
    rank = "Rank",
    n_months = "Months",
    min = "Minimum",
    mean = "Average",
    max = "Maximum"
  ) |>
  data_color(columns = c(min, mean, max),
             palette = c("#15607A", "#FFFFFF", "#FA8C00")) |> 
  opt_table_font(font = gt::google_font(name = "Atkinson Hyperlegible")) |> 
  tab_header(title = md("**Annual Billing Performance Index**"),
             subtitle = "Top 15 Payers Ranked by Months Included on BPI.") |> 
  tab_spanner(label = md("**Percentage of AR Beyond 120 Days**"), columns = c(min, mean, max)) |> 
  opt_stylize(color = "cyan", add_row_striping = FALSE) |>
  tab_options(
    quarto.disable_processing = TRUE,
    table.font.size = gt::px(18),
    table.width = gt::pct(100),
    heading.align = "left",
    heading.title.font.size = gt::px(24),
    heading.subtitle.font.size = gt::px(21))
Annual Billing Performance Index
Top 15 Payers Ranked by Months Included on BPI.
Months Percentage of AR Beyond 120 Days
Minimum Average Maximum
BCBS Illinois 1 12 7.1% 10.9% 16%
Cigna 2 11 8.9% 13.4% 24.1%
Medicare New Jersey 3 11 7.5% 15.7% 20.5%
Aetna 4 10 8.8% 16.6% 22.1%
UnitedHealthcare 5 10 11.3% 17.2% 23.2%
Medicare Illinois 6 7 5.8% 14% 30.4%
Horizon BCBS New Jersey 7 7 13.9% 18% 24.3%
BCBS Pennsylvania 8 7 12.4% 23.5% 43.4%
BCBS Georgia 9 5 22.9% 34.1% 43.3%
Anthem BCBS Colorado 10 4 12.4% 19.1% 34.1%
14 2 6.8% 9.6% 12.3%
BCBS Michigan 11 3 3.2% 6.8% 13.6%
BCBS Texas 12 3 10.3% 15.2% 20%
GEICO 13 3 33.4% 34.9% 36.2%
Humana 15 2 7.9% 9.9% 11.8%

Mock PARBx

#> # A tibble: 1,620 × 5
#>    date       month    payer    aging_bin aging_prop
#>    <date>     <ord>    <chr>    <ord>          <dbl>
#>  1 2024-01-01 January  Medicare 0-30          0.31  
#>  2 2024-01-01 January  Medicare 31-60         0.37  
#>  3 2024-01-01 January  Medicare 61-90         0.17  
#>  4 2024-01-01 January  Medicare 91-120        0.0097
#>  5 2024-01-01 January  Medicare 121+          0.15  
#>  6 2024-02-01 February Medicare 0-30          0.22  
#>  7 2024-02-01 February Medicare 31-60         0.24  
#>  8 2024-02-01 February Medicare 61-90         0.077 
#>  9 2024-02-01 February Medicare 91-120        0.32  
#> 10 2024-02-01 February Medicare 121+          0.15  
#> # ℹ 1,610 more rows
mock_parbx() |>
  mutate(aging_prop = fuimus::roundup(aging_prop * 100)) |> 
  pivot_wider(names_from = "aging_bin", 
              values_from = "aging_prop") |> 
  arrange(month) |> 
  select(-date) |> 
  gt(rowname_col = "payer", 
     groupname_col = "month", 
     row_group_as_column = TRUE) |> 
  fmt_number(decimals = 1) |> 
  opt_table_font(font = google_font(name = "Atkinson Hyperlegible")) |> 
  tab_options(
    column_labels.font.weight = "bold",
    column_labels.font.size = px(16),
    column_labels.border.bottom.width = px(3),
    quarto.disable_processing = TRUE,
    table.font.size = px(18),
    table.width = pct(75),
    heading.align = "left",
    heading.title.font.size = px(24),
    heading.subtitle.font.size = px(21),
    # table_body.hlines.style = "none",
    column_labels.border.top.color = "darkgreen",
    column_labels.border.bottom.color = "darkgreen",
    table_body.border.bottom.color = "darkgreen",
    stub.border.style = "none",
    stub.background.color = "darkgreen",
    # stub.font.weight = "bold",
    row_group.font.weight = "bold"
    )
0-30 31-60 61-90 91-120 121+
January Medicare 35.7 14.4 5.6 20.8 23.5
Medicaid 9.0 36.1 22.1 3.5 29.3
Kaiser Permanente 23.5 21.1 17.4 31.2 6.9
Elevance (Anthem) 21.9 16.8 25.4 16.7 19.2
HCSC 30.6 55.4 2.1 0.9 10.9
UnitedHealth 12.1 20.8 29.2 11.4 26.4
Centene 19.8 26.2 19.1 16.9 18.1
CVS Aetna 3.1 14.3 21.4 38.0 23.1
Humana 29.5 2.7 29.5 26.6 11.7
Cigna 7.4 14.9 23.5 28.7 25.5
Molina 2.6 25.1 37.4 10.0 24.9
GuideWell 39.6 0.6 26.8 12.2 20.8
Highmark 32.1 25.5 6.0 19.7 16.7
BCBS MI 2.0 12.7 22.7 28.6 34.0
Univ. Healthcare 10.4 18.1 7.2 55.8 8.5
BCBS WY 3.7 35.1 26.4 16.1 18.7
Bright 12.4 1.3 23.5 35.5 27.3
Oscar 35.2 12.2 18.4 8.5 25.7
Wellcare 18.0 27.0 24.6 12.6 17.9
Omaha 21.6 26.0 18.7 29.4 4.4
Athene 66.7 16.5 5.0 0.9 10.9
American 23.1 34.8 1.6 6.6 33.9
Mass Mutual 18.6 8.2 18.7 48.6 5.9
New York Life 0.2 5.7 36.9 28.1 29.1
Lincoln Nat'l 22.0 22.1 16.9 23.9 15.0
Equitable 9.2 10.8 2.0 37.3 40.6
Allianz 20.6 20.3 30.6 19.2 9.3
February Medicare 28.6 16.8 16.1 33.2 5.4
Medicaid 29.1 12.1 19.2 16.1 23.4
Kaiser Permanente 23.1 8.1 23.8 31.7 13.3
Elevance (Anthem) 11.7 17.8 33.2 35.7 1.6
HCSC 0.5 25.7 19.8 17.3 36.7
UnitedHealth 24.9 34.5 3.9 14.5 22.2
Centene 6.1 33.9 24.9 8.8 26.2
CVS Aetna 13.5 32.7 23.1 7.5 23.1
Humana 35.2 23.9 9.9 8.5 22.5
Cigna 35.0 19.2 15.0 24.2 6.6
Molina 8.8 12.5 33.7 32.9 12.1
GuideWell 17.7 10.5 8.7 49.6 13.5
Highmark 10.7 19.6 25.0 25.5 19.2
BCBS MI 28.5 22.3 14.9 18.8 15.5
Univ. Healthcare 24.1 27.1 29.6 9.6 9.7
BCBS WY 29.8 4.2 13.4 28.2 24.4
Bright 4.8 42.8 0.2 44.9 7.3
Oscar 9.3 4.9 1.3 46.8 37.7
Wellcare 34.7 4.0 15.7 11.9 33.6
Omaha 33.5 23.6 1.2 9.9 31.7
Athene 8.6 37.6 11.4 10.7 31.7
American 32.5 8.5 12.9 25.8 20.3
Mass Mutual 30.3 1.3 7.4 29.7 31.3
New York Life 6.7 14.9 35.5 26.7 16.2
Lincoln Nat'l 38.8 12.5 15.0 28.1 5.5
Equitable 4.2 4.0 30.1 30.0 31.7
Allianz 23.8 6.2 18.3 26.4 25.3
March Medicare 24.8 24.4 25.9 7.6 17.3
Medicaid 5.6 31.0 24.3 19.7 19.4
Kaiser Permanente 35.8 2.9 26.2 18.5 16.7
Elevance (Anthem) 41.7 36.3 10.8 6.0 5.2
HCSC 5.0 35.0 13.1 42.8 4.1
UnitedHealth 2.7 21.2 19.2 16.2 40.6
Centene 37.0 5.8 1.1 11.8 44.3
CVS Aetna 27.5 11.5 17.7 13.4 29.9
Humana 26.1 26.9 30.6 0.1 16.3
Cigna 28.0 34.4 1.2 31.9 4.5
Molina 23.1 36.7 2.0 21.6 16.4
GuideWell 6.0 11.3 2.3 55.8 24.5
Highmark 29.2 25.5 15.6 9.0 20.6
BCBS MI 13.5 23.0 21.8 10.5 31.2
Univ. Healthcare 38.0 9.9 10.9 13.3 27.9
BCBS WY 36.3 13.0 26.9 0.4 23.4
Bright 11.4 6.8 30.1 36.8 14.9
Oscar 16.0 15.2 28.8 9.2 30.7
Wellcare 17.2 32.1 22.5 19.7 8.5
Omaha 10.6 26.6 13.5 26.7 22.6
Athene 8.6 34.5 12.7 36.4 7.7
American 23.1 11.0 31.8 9.8 24.3
Mass Mutual 46.0 0.7 12.8 5.5 35.0
New York Life 33.0 10.5 26.8 10.8 18.8
Lincoln Nat'l 19.2 22.5 15.5 22.7 20.1
Equitable 33.1 19.2 15.2 14.7 17.7
Allianz 23.0 18.2 30.5 15.9 12.3
April Medicare 8.3 24.1 24.5 22.1 20.9
Medicaid 41.4 0.2 24.4 26.6 7.4
Kaiser Permanente 23.9 6.0 27.0 24.7 18.4
Elevance (Anthem) 11.6 21.6 26.3 19.9 20.6
HCSC 19.2 19.3 10.5 29.9 21.1
UnitedHealth 25.4 22.4 9.4 25.3 17.5
Centene 6.0 12.5 28.2 24.0 29.3
CVS Aetna 4.8 27.9 23.2 27.7 16.4
Humana 19.6 24.6 24.0 20.4 11.4
Cigna 21.3 9.8 14.3 13.9 40.6
Molina 25.2 4.2 15.4 27.0 28.2
GuideWell 30.4 30.5 19.0 0.1 20.1
Highmark 42.3 15.7 22.1 19.7 0.3
BCBS MI 0.9 28.9 31.9 21.8 16.5
Univ. Healthcare 12.9 26.4 17.4 33.6 9.8
BCBS WY 28.7 32.0 15.4 12.8 11.1
Bright 23.6 18.5 16.5 27.1 14.3
Oscar 21.6 21.2 22.5 20.4 14.4
Wellcare 32.2 8.2 26.5 3.2 29.9
Omaha 3.8 19.0 26.3 9.3 41.6
Athene 4.8 10.4 29.3 1.4 54.1
American 0.9 17.7 21.4 30.4 29.5
Mass Mutual 30.6 30.7 11.5 2.5 24.8
New York Life 3.1 7.0 39.7 20.5 29.7
Lincoln Nat'l 22.9 22.8 8.7 18.4 27.2
Equitable 16.9 17.6 35.7 22.9 6.9
Allianz 30.8 24.8 33.8 0.1 10.6
May Medicare 29.3 10.4 29.1 5.1 26.0
Medicaid 21.8 4.4 11.0 55.3 7.5
Kaiser Permanente 22.4 9.8 10.1 3.3 54.3
Elevance (Anthem) 26.5 23.5 8.3 14.5 27.1
HCSC 19.6 26.5 35.7 12.7 5.5
UnitedHealth 13.0 23.2 29.6 12.1 22.2
Centene 25.3 3.9 23.0 23.9 23.9
CVS Aetna 42.6 1.2 16.5 31.6 8.1
Humana 28.9 14.0 27.8 10.4 18.9
Cigna 14.6 32.0 43.2 8.5 1.7
Molina 7.7 18.4 35.0 25.6 13.3
GuideWell 3.0 24.3 4.7 36.8 31.2
Highmark 19.1 26.2 13.3 30.6 10.8
BCBS MI 25.1 0.5 18.3 38.3 17.7
Univ. Healthcare 4.1 40.4 41.1 12.3 2.1
BCBS WY 22.7 15.8 28.2 15.3 18.0
Bright 15.4 26.2 18.8 13.2 26.4
Oscar 11.3 49.8 16.6 2.8 19.5
Wellcare 6.3 14.8 10.4 36.4 32.1
Omaha 31.4 21.8 11.8 25.0 10.1
Athene 18.8 5.6 24.6 29.8 21.2
American 4.3 25.4 21.5 8.2 40.6
Mass Mutual 13.8 30.4 20.8 11.2 23.8
New York Life 28.3 25.8 8.9 2.2 34.8
Lincoln Nat'l 14.1 2.5 7.8 31.3 44.4
Equitable 30.2 31.3 6.6 14.6 17.3
Allianz 22.2 17.0 9.7 22.9 28.2
June Medicare 9.5 36.5 6.3 15.7 32.0
Medicaid 30.2 37.7 7.6 13.1 11.5
Kaiser Permanente 13.1 16.1 35.1 20.2 15.5
Elevance (Anthem) 2.5 3.9 17.0 22.5 54.2
HCSC 11.8 31.0 3.9 39.3 13.9
UnitedHealth 15.2 12.8 21.1 27.1 23.9
Centene 10.3 15.9 19.0 26.7 28.1
CVS Aetna 18.4 20.2 23.3 21.9 16.1
Humana 4.5 11.4 37.1 26.4 20.5
Cigna 30.3 13.7 30.7 15.0 10.3
Molina 53.3 21.9 2.3 0.4 22.0
GuideWell 31.2 2.7 20.8 4.4 40.8
Highmark 0.9 43.6 20.4 2.2 32.8
BCBS MI 16.3 27.6 6.4 12.2 37.5
Univ. Healthcare 4.4 31.1 14.6 22.7 27.1
BCBS WY 10.9 9.2 0.1 39.4 40.4
Bright 12.3 18.1 18.9 24.7 26.0
Oscar 22.3 25.8 12.1 16.9 23.0
Wellcare 17.6 28.3 1.3 39.9 12.9
Omaha 1.2 11.0 30.9 40.4 16.4
Athene 27.6 15.9 10.2 20.8 25.5
American 15.4 21.8 31.1 15.6 16.2
Mass Mutual 25.1 5.6 7.0 39.9 22.4
New York Life 31.2 23.6 4.2 6.4 34.6
Lincoln Nat'l 31.1 16.2 17.2 12.5 22.9
Equitable 29.0 33.9 0.8 7.3 29.0
Allianz 28.5 6.8 44.1 13.1 7.5
July Medicare 26.6 8.0 3.0 31.8 30.6
Medicaid 31.1 1.4 25.7 22.9 18.8
Kaiser Permanente 33.5 28.6 11.4 10.0 16.6
Elevance (Anthem) 24.2 30.0 14.2 23.6 8.0
HCSC 4.1 25.1 32.1 22.7 16.1
UnitedHealth 1.6 40.9 8.2 40.9 8.4
Centene 30.4 11.4 28.1 2.2 27.9
CVS Aetna 2.3 23.9 13.6 35.1 25.1
Humana 39.4 25.6 23.9 4.5 6.7
Cigna 8.4 21.8 9.3 44.2 16.3
Molina 25.5 18.8 0.3 37.6 17.9
GuideWell 5.1 24.4 8.8 29.4 32.3
Highmark 26.4 20.3 37.5 10.6 5.2
BCBS MI 36.3 13.4 16.6 9.9 23.9
Univ. Healthcare 14.4 30.9 17.7 8.4 28.6
BCBS WY 2.7 25.4 1.8 33.0 37.1
Bright 1.4 20.0 31.0 19.9 27.7
Oscar 22.9 4.8 35.6 1.5 35.2
Wellcare 3.8 21.1 21.7 20.4 33.0
Omaha 17.9 19.8 24.9 16.1 21.3
Athene 16.0 34.2 19.5 8.5 21.8
American 31.6 39.3 19.5 8.6 1.1
Mass Mutual 9.7 18.8 13.0 30.6 27.9
New York Life 12.3 17.7 9.0 5.8 55.2
Lincoln Nat'l 23.5 15.3 22.3 20.3 18.6
Equitable 23.3 6.0 30.3 14.6 25.8
Allianz 2.4 31.8 17.4 27.6 20.8
August Medicare 34.2 18.5 14.8 2.7 29.8
Medicaid 2.3 26.9 16.7 19.2 35.0
Kaiser Permanente 47.5 5.5 19.9 8.0 19.0
Elevance (Anthem) 23.1 23.3 13.4 26.5 13.7
HCSC 22.4 17.8 22.7 18.9 18.2
UnitedHealth 16.1 24.5 20.5 13.8 25.0
Centene 13.0 24.1 54.1 7.6 1.2
CVS Aetna 28.1 13.7 30.1 22.9 5.2
Humana 55.2 21.7 12.2 6.0 4.9
Cigna 18.4 8.8 11.1 40.5 21.2
Molina 2.2 32.0 3.4 39.3 23.0
GuideWell 21.7 24.1 4.4 34.6 15.2
Highmark 21.0 24.9 26.5 4.1 23.6
BCBS MI 8.5 26.7 18.7 5.8 40.4
Univ. Healthcare 19.5 12.3 10.9 38.5 18.7
BCBS WY 1.5 24.1 21.4 32.2 20.9
Bright 27.2 5.7 17.0 12.5 37.6
Oscar 4.0 32.9 31.5 28.0 3.6
Wellcare 31.2 20.1 18.9 9.2 20.6
Omaha 8.9 23.6 16.2 28.4 23.0
Athene 18.9 15.4 30.5 12.2 23.0
American 9.2 33.3 11.0 32.1 14.4
Mass Mutual 8.0 35.3 28.4 17.0 11.4
New York Life 13.7 30.4 20.4 20.3 15.2
Lincoln Nat'l 8.5 8.4 23.2 28.7 31.1
Equitable 0.4 40.1 14.5 27.3 17.7
Allianz 7.4 23.9 6.2 25.1 37.4
September Medicare 4.1 17.7 29.9 11.3 36.9
Medicaid 31.5 4.1 22.7 28.1 13.6
Kaiser Permanente 4.6 24.8 24.0 23.0 23.6
Elevance (Anthem) 3.6 32.5 30.3 19.4 14.2
HCSC 19.0 32.7 12.1 29.2 7.0
UnitedHealth 9.3 22.7 10.7 20.2 37.1
Centene 25.0 21.3 14.1 10.6 28.9
CVS Aetna 1.4 26.6 14.6 26.7 30.8
Humana 38.2 16.3 26.4 1.8 17.3
Cigna 5.5 31.5 4.2 28.3 30.5
Molina 17.3 20.8 17.5 12.7 31.7
GuideWell 10.9 14.0 21.5 29.8 23.8
Highmark 28.2 15.9 0.1 24.0 31.9
BCBS MI 29.8 4.9 10.7 42.3 12.3
Univ. Healthcare 26.2 2.3 21.3 26.2 24.0
BCBS WY 17.0 6.1 39.6 2.6 34.7
Bright 29.3 15.1 10.4 21.7 23.5
Oscar 20.4 29.1 9.3 18.0 23.2
Wellcare 25.5 6.9 32.4 8.5 26.7
Omaha 16.3 17.6 22.7 21.2 22.1
Athene 53.5 6.9 18.0 6.7 14.8
American 21.9 5.6 30.8 19.5 22.1
Mass Mutual 2.8 18.5 8.4 53.5 16.8
New York Life 12.6 18.4 25.0 27.7 16.4
Lincoln Nat'l 30.0 26.9 2.4 7.2 33.6
Equitable 30.5 25.2 9.3 30.0 4.9
Allianz 42.5 7.7 12.3 6.3 31.1
October Medicare 1.7 48.5 8.0 7.6 34.3
Medicaid 29.5 15.9 11.9 21.1 21.6
Kaiser Permanente 8.3 32.9 15.0 18.5 25.2
Elevance (Anthem) 15.2 15.3 44.1 6.9 18.5
HCSC 25.6 22.9 7.2 30.5 13.8
UnitedHealth 20.3 25.6 15.1 17.8 21.3
Centene 27.6 24.7 10.4 3.3 34.0
CVS Aetna 18.8 17.1 26.0 10.8 27.2
Humana 12.3 22.6 22.8 28.1 14.1
Cigna 28.8 28.7 8.0 18.2 16.4
Molina 22.4 21.5 25.2 22.1 8.7
GuideWell 34.9 3.2 9.4 46.1 6.4
Highmark 21.6 9.1 18.1 30.9 20.3
BCBS MI 10.3 4.9 2.7 53.1 29.0
Univ. Healthcare 17.9 17.1 25.1 12.3 27.5
BCBS WY 38.1 22.7 0.3 36.0 3.0
Bright 19.5 11.5 29.0 32.8 7.3
Oscar 26.3 1.2 6.5 29.5 36.5
Wellcare 15.8 21.7 28.6 26.8 7.1
Omaha 42.5 21.3 0.4 22.8 13.0
Athene 15.3 25.9 5.6 3.3 49.8
American 22.1 24.0 21.2 29.0 3.8
Mass Mutual 24.8 10.4 26.4 30.0 8.4
New York Life 5.7 27.5 37.2 9.1 20.4
Lincoln Nat'l 41.3 5.9 33.9 6.8 12.0
Equitable 28.6 14.2 25.4 17.8 14.1
Allianz 24.1 53.5 1.9 4.2 16.3
November Medicare 17.4 34.6 28.8 9.2 10.0
Medicaid 24.2 27.1 34.0 9.9 4.7
Kaiser Permanente 18.9 34.0 32.9 1.6 12.7
Elevance (Anthem) 9.4 13.1 18.7 15.8 43.0
HCSC 3.5 27.2 16.2 26.9 26.1
UnitedHealth 24.6 36.0 0.3 2.7 36.3
Centene 13.6 10.1 12.9 16.1 47.3
CVS Aetna 7.2 12.2 20.4 36.4 23.8
Humana 35.6 8.9 30.5 1.3 23.6
Cigna 24.4 11.4 23.9 6.5 33.9
Molina 11.6 25.7 32.6 28.6 1.5
GuideWell 8.0 10.8 43.4 18.0 19.9
Highmark 0.6 27.4 28.1 14.9 29.0
BCBS MI 28.4 27.7 34.0 0.9 8.9
Univ. Healthcare 10.5 32.7 14.3 31.6 10.8
BCBS WY 4.7 34.7 41.6 18.6 0.3
Bright 18.7 15.5 30.6 30.6 4.5
Oscar 15.5 13.8 52.0 13.8 5.0
Wellcare 50.6 21.1 7.4 13.5 7.5
Omaha 11.6 24.7 27.5 35.5 0.8
Athene 10.1 26.7 25.7 17.4 20.0
American 29.1 24.1 37.0 9.2 0.7
Mass Mutual 17.7 16.4 15.0 30.2 20.7
New York Life 27.3 26.8 6.3 34.3 5.3
Lincoln Nat'l 27.1 8.6 30.9 15.7 17.8
Equitable 8.3 11.7 27.7 27.2 25.1
Allianz 25.6 23.9 7.5 30.9 12.1
December Medicare 32.9 0.1 29.7 17.9 19.4
Medicaid 32.8 18.7 15.0 15.8 17.7
Kaiser Permanente 12.9 24.1 32.7 29.5 0.8
Elevance (Anthem) 15.6 39.1 7.1 23.3 14.9
HCSC 1.8 49.1 19.1 12.4 17.6
UnitedHealth 15.9 24.5 29.7 27.3 2.6
Centene 7.7 40.5 30.6 2.0 19.1
CVS Aetna 30.6 27.7 15.9 15.2 10.6
Humana 17.9 10.9 25.2 41.3 4.8
Cigna 33.4 21.3 4.4 17.9 23.1
Molina 24.7 32.5 2.9 10.1 29.9
GuideWell 19.6 12.0 19.2 15.5 33.8
Highmark 24.2 1.2 30.4 31.2 12.9
BCBS MI 3.9 37.0 26.0 18.2 14.9
Univ. Healthcare 5.1 7.9 11.6 38.5 36.8
BCBS WY 9.2 17.7 22.8 16.5 33.8
Bright 41.1 7.6 7.9 25.3 18.1
Oscar 24.8 3.3 26.3 17.3 28.4
Wellcare 26.3 16.7 22.8 8.6 25.6
Omaha 20.9 17.7 21.4 21.1 18.8
Athene 54.9 16.9 10.4 16.1 1.7
American 16.6 7.6 32.7 28.9 14.2
Mass Mutual 25.7 31.5 11.8 9.5 21.5
New York Life 30.0 7.3 21.2 8.0 33.4
Lincoln Nat'l 24.2 18.1 4.7 31.1 21.8
Equitable 17.3 26.2 2.0 31.1 23.4
Allianz 15.4 17.9 31.1 22.9 12.7
ex_prop <- mock_parbx() |> 
  pivot_wider(names_from = "aging_bin", 
              values_from = "aging_prop") |> 
  select(month, payer, `121+`) |> 
  pivot_wider(names_from = month, values_from = `121+`) |> 
  rlang::set_names(c("payer", month.abb))

ex_prop_payer <- mock_parbx() |> 
  pivot_wider(names_from = "aging_bin", 
              values_from = "aging_prop") |> 
  select(month, payer, `121+`) |> 
  pivot_wider(names_from = payer, values_from = `121+`)

ex_prop |> 
  gt(rowname_col = "payer") |> 
  fmt_percent(decimals = 0) |>
  cols_align(align = "center") |> 
  data_color(
    columns = !payer,
    palette = "ggsci::red_material",
    apply_to = "text"
    ) |> 
  opt_table_font(font = google_font(name = "Fira Code")) |> 
  tab_options(
    column_labels.font.weight = "bold",
    quarto.disable_processing = TRUE,
    # table.background.color = "grey50",
    table.font.size = gt::px(18),
    table.width = gt::pct(100),
    heading.align = "left",
    heading.title.font.size = gt::px(24),
    heading.subtitle.font.size = gt::px(21))
Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
Medicare 13% 37% 39% 9% 35% 21% 20% 17% 31% 16% 39% 29%
Medicaid 12% 29% 23% 28% 8% 18% 0% 43% 28% 25% 20% 3%
Kaiser Permanente 26% 16% 18% 1% 36% 11% 5% 3% 27% 22% 16% 28%
Elevance (Anthem) 23% 9% 9% 24% 36% 26% 26% 29% 28% 0% 28% 19%
HCSC 38% 38% 17% 31% 32% 22% 14% 2% 9% 9% 10% 24%
UnitedHealth 26% 22% 29% 26% 7% 9% 45% 16% 7% 18% 9% 6%
Centene 0% 23% 20% 26% 5% 8% 0% 13% 8% 27% 15% 28%
CVS Aetna 15% 36% 38% 20% 20% 27% 26% 24% 24% 25% 29% 20%
Humana 6% 9% 8% 26% 10% 20% 0% 7% 3% 24% 23% 2%
Cigna 1% 2% 27% 16% 26% 3% 16% 41% 15% 15% 26% 14%
Molina 9% 11% 27% 27% 8% 7% 22% 41% 25% 37% 21% 15%
GuideWell 17% 2% 16% 23% 18% 25% 5% 32% 19% 31% 11% 16%
Highmark 13% 37% 34% 23% 18% 27% 17% 24% 17% 38% 1% 25%
BCBS MI 46% 4% 28% 7% 27% 25% 15% 44% 8% 10% 3% 30%
Univ. Healthcare 25% 25% 33% 9% 23% 24% 7% 32% 12% 22% 23% 25%
BCBS WY 30% 30% 9% 16% 25% 35% 0% 32% 6% 7% 26% 24%
Bright 4% 26% 27% 20% 28% 30% 25% 28% 4% 1% 27% 36%
Oscar 1% 32% 19% 30% 12% 1% 36% 12% 11% 12% 18% 2%
Wellcare 25% 21% 4% 41% 23% 29% 8% 7% 25% 12% 8% 17%
Omaha 5% 13% 2% 36% 29% 38% 6% 2% 4% 21% 18% 25%
Athene 22% 36% 8% 7% 4% 30% 28% 15% 9% 28% 5% 29%
American 25% 7% 17% 14% 28% 17% 30% 21% 35% 30% 20% 12%
Mass Mutual 14% 42% 13% 3% 21% 26% 20% 13% 32% 34% 32% 32%
New York Life 36% 33% 14% 2% 14% 24% 22% 25% 28% 17% 18% 12%
Lincoln Nat'l 28% 17% 21% 3% 28% 3% 6% 23% 38% 24% 27% 4%
Equitable 37% 16% 23% 32% 3% 24% 35% 28% 17% 22% 29% 10%
Allianz 26% 28% 12% 2% 32% 13% 6% 34% 4% 38% 31% 2%
ex_prop |> 
  reframe(
    payer,
    Jan = min_rank(Jan),
    Feb = min_rank(Feb),
    Mar = min_rank(Mar),
    Apr = min_rank(Apr),
    May = min_rank(May),
    Jun = min_rank(Jun),
    Jul = min_rank(Jul),
    Aug = min_rank(Aug),
    Sep = min_rank(Sep),
    Oct = min_rank(Oct),
    Nov = min_rank(Nov),
    Dec = min_rank(Dec)) |> 
  gt(rowname_col = "payer") |> 
  opt_table_font(font = google_font(name = "JetBrains Mono")) |> 
  data_color(
    columns = !payer,
    palette = "Greens",
    apply_to = "text",
    reverse = TRUE
    ) |> 
  cols_align(align = "center") |> 
  tab_options(
    column_labels.font.weight = "bold",
    column_labels.font.size = px(16),
    column_labels.border.bottom.width = px(3),
    quarto.disable_processing = TRUE,
    table.font.size = px(18),
    table.width = pct(75),
    heading.align = "left",
    heading.title.font.size = px(24),
    heading.subtitle.font.size = px(21),
    table_body.hlines.style = "none",
    column_labels.border.top.color = "darkgreen",
    column_labels.border.bottom.color = "darkgreen",
    table_body.border.bottom.color = "darkgreen",
    stub.border.style = "none",
    stub.background.color = "darkgreen"
    )
Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
Medicare 10 24 27 9 25 12 17 11 24 9 27 24
Medicaid 8 18 17 22 6 10 1 26 22 18 13 4
Kaiser Permanente 19 9 13 1 27 7 6 3 20 15 9 21
Elevance (Anthem) 15 5 6 17 26 20 21 19 21 1 22 14
HCSC 26 26 11 24 23 13 12 2 9 4 6 16
UnitedHealth 21 13 23 19 4 6 27 10 6 11 5 6
Centene 1 14 15 20 3 5 3 8 7 20 8 22
CVS Aetna 12 23 26 14 12 21 22 14 17 19 23 15
Humana 6 6 4 18 7 11 2 5 1 16 16 1
Cigna 2 1 19 11 17 2 14 24 13 8 19 10
Molina 7 7 20 21 5 4 18 25 19 25 15 11
GuideWell 13 2 10 16 11 17 5 20 16 23 7 12
Highmark 9 25 25 15 10 22 15 15 14 27 1 20
BCBS MI 27 3 22 7 18 18 13 27 8 5 2 25
Univ. Healthcare 18 15 24 8 15 15 10 21 12 14 17 19
BCBS WY 23 19 5 12 16 26 4 22 5 3 18 17
Bright 4 16 21 13 21 25 20 17 4 2 20 27
Oscar 3 20 14 23 8 1 26 6 11 6 12 2
Wellcare 17 12 2 27 14 23 11 4 18 7 4 13
Omaha 5 8 1 26 22 27 8 1 3 12 11 18
Athene 14 22 3 6 2 24 23 9 10 21 3 23
American 16 4 12 10 19 9 24 12 26 22 14 8
Mass Mutual 11 27 8 5 13 19 16 7 25 24 26 26
New York Life 24 21 9 3 9 16 19 16 23 10 10 9
Lincoln Nat'l 22 11 16 4 20 3 7 13 27 17 21 5
Equitable 25 10 18 25 1 14 25 18 15 13 24 7
Allianz 20 17 7 2 24 8 9 23 2 26 25 3