Skip to contents
  • Calculate Patient Age -> Check ICD/HCPCS for Age Conflicts
  • Calculate Provider Lag -> Days between DOS and DOR
  • Calculate Balance -> Charges - (Payments + Adjustments)
  • Calculate Coinsurance -> Charges - Allowed

Load Example

(x <- get_example() |> 
   dplyr::filter(!hcpcs %in% c("WCPAIN", 
                               "MATERIALCTR", 
                               "MATERIALOFF", 
                               "SPBARIATRIC", 
                               "LETTER")) |> 
   dplyr::mutate(
     # coinsurance = charges - allowed,
     balance = charges - (payments + adjustments), 
     .after = adjustments))
#> # A tibble: 39,025 × 17
#>    claim_id dos        dor        dob        icd   order hcpcs units mod   pos  
#>    <glue>   <date>     <date>     <date>     <chr> <int> <chr> <int> <chr> <chr>
#>  1 30564-03 2022-08-09 NA         2007-11-05 F32.9     1 96101     1 NA    23   
#>  2 00068-01 2022-08-16 2022-08-17 1990-02-24 F43.…     1 90837     1 NA    02   
#>  3 00318-01 2022-08-16 2022-08-22 2012-10-24 F43.…     1 90832     1 NA    11   
#>  4 01908-01 2022-08-16 2022-09-12 1985-01-09 F43.…     1 90834     1 95    02   
#>  5 02295-01 2022-08-16 2022-08-16 1977-09-30 F43.…     1 90837     1 95    10   
#>  6 04305-01 2022-08-16 2022-08-16 2006-01-07 A69.…     1 90791     1 NA    11   
#>  7 04367-01 2022-08-16 2022-08-16 1980-07-24 F43.…     1 90791     1 AH    02   
#>  8 04367-01 2022-08-16 2022-08-16 1980-07-24 F43.…     2 96130     1 AH    02   
#>  9 04367-01 2022-08-16 2022-08-16 1980-07-24 F43.…     3 96131     1 AH    02   
#> 10 04367-01 2022-08-16 2022-08-16 1980-07-24 F43.…     4 96136     1 AH    02   
#> 11 04367-01 2022-08-16 2022-08-16 1980-07-24 F43.…     5 96137     3 AH    02   
#> 12 04386-01 2022-08-16 2022-08-22 2011-08-22 F90.2     1 90834     1 NA    11   
#> 13 05014-01 2022-08-16 2022-08-17 2003-09-09 F40.…     1 90837     1 NA    11   
#> 14 06641-01 2022-08-16 2022-08-16 1987-07-21 F43.…     1 90791     1 NA    11   
#> 15 06641-01 2022-08-16 2022-08-16 1987-07-21 F43.…     2 96130     1 NA    11   
#> 16 06641-01 2022-08-16 2022-08-16 1987-07-21 F43.…     3 96131     1 NA    11   
#> 17 06641-01 2022-08-16 2022-08-16 1987-07-21 F43.…     4 96136     1 NA    11   
#> 18 06641-01 2022-08-16 2022-08-16 1987-07-21 F43.…     5 96137     3 NA    11   
#> 19 07395-01 2022-08-16 2022-08-16 1994-11-18 F43.…     1 90837     1 NA    11   
#> 20 09495-01 2022-08-16 2022-08-17 1960-07-02 F44.4     1 90837     1 NA    10   
#> # ℹ 39,005 more rows
#> # ℹ 7 more variables: charges <dbl>, allowed <dbl>, payments <dbl>,
#> #   adjustments <dbl>, balance <dbl>, class <fct>, adj <chr>

Place of Service

pos_trie <- triebeard::trie(
    keys = search_pos()$pos_code,
    values = chr(search_pos()$pos_type))

x_pos <- x |> 
  dplyr::mutate(
    pos_type = triebeard::longest_match(pos_trie, pos), 
    .after = pos)

x_pos
#> # A tibble: 39,025 × 18
#>    claim_id dos        dor        dob        icd   order hcpcs units mod   pos  
#>    <glue>   <date>     <date>     <date>     <chr> <int> <chr> <int> <chr> <chr>
#>  1 30564-03 2022-08-09 NA         2007-11-05 F32.9     1 96101     1 NA    23   
#>  2 00068-01 2022-08-16 2022-08-17 1990-02-24 F43.…     1 90837     1 NA    02   
#>  3 00318-01 2022-08-16 2022-08-22 2012-10-24 F43.…     1 90832     1 NA    11   
#>  4 01908-01 2022-08-16 2022-09-12 1985-01-09 F43.…     1 90834     1 95    02   
#>  5 02295-01 2022-08-16 2022-08-16 1977-09-30 F43.…     1 90837     1 95    10   
#>  6 04305-01 2022-08-16 2022-08-16 2006-01-07 A69.…     1 90791     1 NA    11   
#>  7 04367-01 2022-08-16 2022-08-16 1980-07-24 F43.…     1 90791     1 AH    02   
#>  8 04367-01 2022-08-16 2022-08-16 1980-07-24 F43.…     2 96130     1 AH    02   
#>  9 04367-01 2022-08-16 2022-08-16 1980-07-24 F43.…     3 96131     1 AH    02   
#> 10 04367-01 2022-08-16 2022-08-16 1980-07-24 F43.…     4 96136     1 AH    02   
#> 11 04367-01 2022-08-16 2022-08-16 1980-07-24 F43.…     5 96137     3 AH    02   
#> 12 04386-01 2022-08-16 2022-08-22 2011-08-22 F90.2     1 90834     1 NA    11   
#> 13 05014-01 2022-08-16 2022-08-17 2003-09-09 F40.…     1 90837     1 NA    11   
#> 14 06641-01 2022-08-16 2022-08-16 1987-07-21 F43.…     1 90791     1 NA    11   
#> 15 06641-01 2022-08-16 2022-08-16 1987-07-21 F43.…     2 96130     1 NA    11   
#> 16 06641-01 2022-08-16 2022-08-16 1987-07-21 F43.…     3 96131     1 NA    11   
#> 17 06641-01 2022-08-16 2022-08-16 1987-07-21 F43.…     4 96136     1 NA    11   
#> 18 06641-01 2022-08-16 2022-08-16 1987-07-21 F43.…     5 96137     3 NA    11   
#> 19 07395-01 2022-08-16 2022-08-16 1994-11-18 F43.…     1 90837     1 NA    11   
#> 20 09495-01 2022-08-16 2022-08-17 1960-07-02 F44.4     1 90837     1 NA    10   
#> # ℹ 39,005 more rows
#> # ℹ 8 more variables: pos_type <chr>, charges <dbl>, allowed <dbl>,
#> #   payments <dbl>, adjustments <dbl>, balance <dbl>, class <fct>, adj <chr>

Categorize HCPCS

hcpcs_unq <- collapse::funique(x$hcpcs[!x$hcpcs %in% not_hcpcs])
#> Error in eval(expr, envir, enclos): object 'not_hcpcs' not found
search_rbcs(hcpcs_code = hcpcs_unq) |> 
  dplyr::select(hcpcs_code:rbcs_family) |> 
  dplyr::left_join(
    search_descriptions(hcpcs_code = hcpcs_unq, 
                        hcpcs_desc_type = "Long") |> 
  dplyr::select(hcpcs_code, hcpcs_description),
  by = dplyr::join_by(hcpcs_code))
#> Error in eval(expr, envir, enclos): object 'hcpcs_unq' not found

Define Modifiers

mod_unq <- strsplit(toupper(x$mod[!is.na(x$mod)]), "-") |> 
  list_c() |> 
  funique()

search_modifiers(mod_code = mod_unq)
#> # A tibble: 9 × 9
#>   mod_code mod_type mod_category mod_description                 mod_information
#>   <chr>    <fct>    <fct>        <chr>                           <chr>          
#> 1 25       CPT      General      Significant, Separately Identi… It may be nece…
#> 2 59       CPT      General      Distinct Procedural Service     Under certain …
#> 3 95       CPT      Telehealth   Synchronous Telemedicine Servi… Synchronous te…
#> 4 AH       HCPCS    NA           Clinical psychologist           NA             
#> 5 AJ       HCPCS    NA           Clinical social worker          NA             
#> 6 GT       HCPCS    NA           Via interactive audio and vide… NA             
#> 7 HJ       HCPCS    NA           Employee assistance program     NA             
#> 8 U8       HCPCS    NA           Medicaid level of care 8, as d… NA             
#> 9 UD       HCPCS    NA           Medicaid level of care 13, as … NA             
#> # ℹ 4 more variables: mod_instructions <chr>, mod_correct_use <chr>,
#> #   mod_incorrect_use <chr>, mod_resources <chr>
x |> 
  select(
    claim_id,
    dos,
    order,
    hcpcs
    ) |> 
  group_by(claim_id) |> 
  filter(n() > 1) |> 
  ungroup()
#> # A tibble: 12,138 × 4
#>    claim_id dos        order hcpcs
#>    <glue>   <date>     <int> <chr>
#>  1 04367-01 2022-08-16     1 90791
#>  2 04367-01 2022-08-16     2 96130
#>  3 04367-01 2022-08-16     3 96131
#>  4 04367-01 2022-08-16     4 96136
#>  5 04367-01 2022-08-16     5 96137
#>  6 06641-01 2022-08-16     1 90791
#>  7 06641-01 2022-08-16     2 96130
#>  8 06641-01 2022-08-16     3 96131
#>  9 06641-01 2022-08-16     4 96136
#> 10 06641-01 2022-08-16     5 96137
#> # ℹ 12,128 more rows
aocs <- search_aocs(hcpcs_code = hcpcs_unq) |> 
  tidyr::unnest(cols = aoc_complements)
#> Error in eval(expr, envir, enclos): object 'hcpcs_unq' not found
aocs |> 
  filter(aoc_type == "Primary")
#> Error in eval(expr, envir, enclos): object 'aocs' not found