From 4c7d809f69751bcd90ce9befaca62c731432db52 Mon Sep 17 00:00:00 2001 From: andrewallenbruce Date: Sat, 29 Jun 2024 19:26:40 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20@=20andrewal?= =?UTF-8?q?lenbruce/northstar@801105a986e69c4ebf24517750c39baf9a6f9ea4=20?= =?UTF-8?q?=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- articles/northstar.html | 121 ++++++++++++++++++++++--------- pkgdown.yml | 2 +- reference/index.html | 11 ++- reference/is_rarc_code.html | 141 ++++++++++++++++++++++++++++++++++++ reference/search_aocs.html | 52 ++++++++----- reference/search_mues.html | 4 +- reference/search_ptps.html | 10 +-- search.json | 2 +- sitemap.xml | 3 + 9 files changed, 277 insertions(+), 69 deletions(-) create mode 100644 reference/is_rarc_code.html diff --git a/articles/northstar.html b/articles/northstar.html index c5958cd..bacd379 100644 --- a/articles/northstar.html +++ b/articles/northstar.html @@ -133,13 +133,14 @@

Load Exampledplyr::filter(!hcpcs %in% c("WCPAIN", "MATERIALCTR", "MATERIALOFF", + "MEDREC", "SPBARIATRIC", "LETTER")) |> dplyr::mutate( # coinsurance = charges - allowed, balance = charges - (payments + adjustments), .after = adjustments)) -
#> # A tibble: 39,025 × 17
+
#> # A tibble: 39,020 × 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   
@@ -162,7 +163,7 @@ 

Load Example#> 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 +#> # ℹ 39,000 more rows #> # ℹ 7 more variables: charges <dbl>, allowed <dbl>, payments <dbl>, #> # adjustments <dbl>, balance <dbl>, class <fct>, adj <chr>

@@ -174,13 +175,16 @@

Place of Service keys = search_pos()$pos_code, values = chr(search_pos()$pos_type)) -x_pos <- x |> +pos_trie

+
#> A string_trie object with 99 entries
+
+x_pos <- x |> 
   dplyr::mutate(
     pos_type = triebeard::longest_match(pos_trie, pos), 
     .after = pos)
 
 x_pos
-
#> # A tibble: 39,025 × 18
+
#> # A tibble: 39,020 × 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   
@@ -203,25 +207,49 @@ 

Place of Service#> 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 +#> # ℹ 39,000 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) |> 
+# hcpcs_unq <- collapse::funique(x$hcpcs[!x$hcpcs %in% not_hcpcs])
+hcpcs_unq <- collapse::funique(x$hcpcs)
+
+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
+
#> # A tibble: 34 × 6
+#>    hcpcs_code rbcs_procedure rbcs_category rbcs_subcategory          rbcs_family
+#>    <chr>      <fct>          <fct>         <chr>                     <chr>      
+#>  1 90791      Non-Procedure  E&M           Behavioral Health Servic… Psychother…
+#>  2 90792      Non-Procedure  E&M           Behavioral Health Servic… Psychother…
+#>  3 90832      Non-Procedure  E&M           Behavioral Health Servic… Psychother…
+#>  4 90833      Non-Procedure  E&M           Behavioral Health Servic… Psychother…
+#>  5 90834      Non-Procedure  E&M           Behavioral Health Servic… Psychother…
+#>  6 90836      Non-Procedure  E&M           Behavioral Health Servic… Psychother…
+#>  7 90837      Non-Procedure  E&M           Behavioral Health Servic… Psychother…
+#>  8 90839      Non-Procedure  E&M           Behavioral Health Servic… Psychother…
+#>  9 90840      Non-Procedure  E&M           Behavioral Health Servic… Psychother…
+#> 10 90846      Non-Procedure  E&M           Behavioral Health Servic… Psychother…
+#> 11 90847      Non-Procedure  E&M           Behavioral Health Servic… Psychother…
+#> 12 90853      Non-Procedure  E&M           Behavioral Health Servic… Psychother…
+#> 13 96101      Non-Procedure  E&M           Behavioral Health Servic… No RBCS Fa…
+#> 14 96116      Non-Procedure  E&M           Behavioral Health Servic… No RBCS Fa…
+#> 15 96121      Non-Procedure  E&M           Behavioral Health Servic… No RBCS Fa…
+#> 16 96130      Non-Procedure  E&M           Behavioral Health Servic… No RBCS Fa…
+#> 17 96131      Non-Procedure  E&M           Behavioral Health Servic… No RBCS Fa…
+#> 18 96132      Non-Procedure  E&M           Behavioral Health Servic… No RBCS Fa…
+#> 19 96133      Non-Procedure  E&M           Behavioral Health Servic… No RBCS Fa…
+#> 20 96136      Non-Procedure  E&M           Behavioral Health Servic… No RBCS Fa…
+#> # ℹ 14 more rows
+#> # ℹ 1 more variable: hcpcs_description <chr>

Define Modifiers @@ -231,29 +259,23 @@

Define Modifiers 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>
+search_modifiers(mod_code = mod_unq) |> + select(mod_code, mod_description)
+
#> # A tibble: 9 × 2
+#>   mod_code mod_description                                                      
+#>   <chr>    <chr>                                                                
+#> 1 25       Significant, Separately Identifiable Evaluation and Management Servi…
+#> 2 59       Distinct Procedural Service                                          
+#> 3 95       Synchronous Telemedicine Service Rendered Via a Real-Time Interactiv…
+#> 4 AH       Clinical psychologist                                                
+#> 5 AJ       Clinical social worker                                               
+#> 6 GT       Via interactive audio and video telecommunication systems            
+#> 7 HJ       Employee assistance program                                          
+#> 8 U8       Medicaid level of care 8, as defined by each state                   
+#> 9 UD       Medicaid level of care 13, as defined by each state
 x |> 
-  select(
-    claim_id,
-    dos,
-    order,
-    hcpcs
-    ) |> 
+  select(claim_id, dos, order, hcpcs) |> 
   group_by(claim_id) |> 
   filter(n() > 1) |> 
   ungroup()
@@ -273,12 +295,39 @@

Define Modifiers#> # ℹ 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
+ tidyr::unnest(cols = aoc_complements) + +aoc_pairs <- aocs |> + filter(aoc_type == "Primary") |> + select(hcpcs_primary = hcpcs_code, hcpcs_addon = aoc_complement) + +ex_aoc <- x |> + select(claim_id, dos, order, hcpcs) |> + group_by(claim_id) |> + filter(n() > 1) |> + ungroup() + +prim <- ex_aoc |> + filter(order == 1) |> + select(claim_id, dos, hcpcs_primary = hcpcs) + +addon <- ex_aoc |> + filter(order != 1) |> + select(claim_id, dos, order_addon = order, hcpcs_addon = hcpcs) + +addon |> + left_join(prim, by = join_by(claim_id, dos)) |> + filter(claim_id %in% c('46440-13', '16057-35', '57128-01')) #|> +
#> # A tibble: 4 × 5
+#>   claim_id dos        order_addon hcpcs_addon hcpcs_primary
+#>   <glue>   <date>           <int> <chr>       <chr>        
+#> 1 46440-13 2023-03-31           2 90840       90839        
+#> 2 16057-35 2023-11-16           2 90834       99214        
+#> 3 16057-35 2023-11-16           3 90836       99214        
+#> 4 57128-01 2023-12-18           2 96121       96116
-aocs |> 
-  filter(aoc_type == "Primary")
-
#> Error in eval(expr, envir, enclos): object 'aocs' not found
+ # semi_join(aoc_pairs) |> + # pull(claim_id) diff --git a/pkgdown.yml b/pkgdown.yml index 912927a..820ad89 100644 --- a/pkgdown.yml +++ b/pkgdown.yml @@ -8,7 +8,7 @@ articles: modifiers: modifiers.html ncci-edits: ncci-edits.html northstar: northstar.html -last_built: 2024-06-29T06:14Z +last_built: 2024-06-29T19:24Z urls: reference: https://andrewallenbruce.github.io/northstar/reference article: https://andrewallenbruce.github.io/northstar/articles diff --git a/reference/index.html b/reference/index.html index 413aea6..43e5041 100644 --- a/reference/index.html +++ b/reference/index.html @@ -109,7 +109,7 @@

Search Codesetssearch_aocs() -
NCCI Add-On Code Edits
+
NCCI Edits: Add-On Codes
search_denials() @@ -139,7 +139,7 @@

Search Codesetssearch_mues()

-
NCCI Medically Unlikely Edits (MUEs)
+
NCCI Edits: Medically Unlikely Edits (MUEs)
search_opps() @@ -164,7 +164,7 @@

Search Codesetssearch_ptps()

-
NCCI Procedure to Procedure (PTP) Edits
+
NCCI Edits: Procedure to Procedure (PTP)
search_rbcs() @@ -380,6 +380,11 @@

Validation Checksis_rarc_code() +

+
Validate RARC Codes
+
+ is_valid_length()
Check if string is valid length of a HCPCS code
diff --git a/reference/is_rarc_code.html b/reference/is_rarc_code.html new file mode 100644 index 0000000..c137975 --- /dev/null +++ b/reference/is_rarc_code.html @@ -0,0 +1,141 @@ + +Validate RARC Codes — is_rarc_code • northstar + Skip to contents + + +
+
+
+ +
+

Validate RARC Codes

+
+ +
+

Usage

+
is_rarc_code(x)
+
+ +
+

Arguments

+
x
+

<chr> vector of RARC adjustment codes, a two-to-three character +alphanumeric string.

+ +
+
+

Value

+ + +

a tibble

+ + +
+ +
+

Examples

+
x <- c("- 253", "OA-23", "PI-", "-45 ",
+       "OA23", "MA109", "N9", "N722")
+
+is_rarc_code(x)
+#> [1] FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE
+
+x[which(is_rarc_code(x))]
+#> [1] "MA109" "N9"    "N722" 
+
+
+
+
+ + +
+ + + +
+ + + + + + + diff --git a/reference/search_aocs.html b/reference/search_aocs.html index 5291213..eb09895 100644 --- a/reference/search_aocs.html +++ b/reference/search_aocs.html @@ -1,5 +1,13 @@ -NCCI Add-On Code Edits — search_aocs • northstarNCCI Edits: Add-On Codes — search_aocs • northstar @@ -76,13 +84,17 @@
-

Medicare NCCI Add-On Code Edits

+

An Add-on Code (AOC) is a Healthcare Common Procedure Coding System (HCPCS) / +Current Procedural Terminology (CPT) code that describes a service that is +performed in conjunction with the primary service by the same practitioner. +An AOC is rarely eligible for payment if it’s the only procedure reported by +a practitioner.

@@ -131,11 +143,10 @@

Value

Details

-

An AOC is a HCPCS/CPT code that describes a service that, with rare -exception, is performed in conjunction with another primary service by the -same practitioner. An AOC is rarely eligible for payment if it is the only -procedure reported by a practitioner.

-

Some CPT codes are identified as Add-on Codes (AOCs), which describe a +

Add-on codes may be identified in three ways:

  1. The add-on code is in the AOC file as a Type 1, Type 2, or Type 3 AOC (formerly displayed as Type I, Type II or Type III).

  2. +
  3. In the Medicare Physician Fee Schedule, an AOC generally has a global surgery period of ZZZ.

  4. +
  5. In the CPT Manual, an add-on code is designated by the symbol +. The code descriptor of an AOC generally includes phrases such as "each additional" or "(List separately in addition to primary procedure)."

  6. +

Some CPT codes are identified as Add-on Codes (AOCs), which describe a service that can only be reported in addition to a primary procedure.

For specific primary codes, AOCs shall not be reported as a supplemental service for other HCPCS/CPT codes not listed as a primary code.

@@ -143,27 +154,30 @@

Details +reportable with an AOC.

+

Similarly, complications inherent in an invasive procedure occurring during +the procedure are not separately reportable. For example, control of bleeding +during an invasive procedure is considered part of the procedure and is not +separately reportable.

Although the AOC and primary code are normally reported for the same date of service, there are unusual circumstances where the two services may be reported for different dates of service (e.g., 99291 and 99292).

AOC Edit Types

-
  • Type 1: CPT Professional or HCPCS files define all acceptable primary codes. MACs should not allow other primary codes with Type 1 AOCs.

  • -
  • Type 2: CPT Professional and HCPCS files do not define any primary codes. MACs should develop their own lists of acceptable primary codes.

  • -
  • Type 3: CPT Professional or HCPCS files define some, but not all, acceptable primary codes. MACs should allow the listed primary codes for these AOCs but may develop their own lists of additional acceptable primary codes.

  • + +

    CMS divided the AOCs into three types to distinguish the payment policy for each type:

    • Type 1: A Type 1 AOC has a limited number of identifiable primary procedure codes. The Change Request (CR) lists the Type 1 AOCs with their acceptable primary procedure codes. A Type 1 AOC, with one exception, is eligible for payment if one of the listed primary procedure codes is also eligible for payment to the same practitioner for the same patient on the same date of service. Claims processing contractors must adopt edits to assure that Type 1 AOCs are never paid unless a listed primary procedure code is also paid.

    • +
    • Type 2: A Type 2 AOC does not have a specific list of primary procedure codes. The CR lists the Type 2 AOCs without any primary procedure codes. Claims processing contractors are encouraged to develop their own lists of primary procedure codes for this type of AOC. Like the Type 1 AOCs, a Type 2 AOC is eligible for payment if an acceptable primary procedure code as determined by the claims processing contractor is also eligible for payment to the same practitioner for the same patient on the same date of service.

    • +
    • Type 3: A Type 3 AOC has some, but not all, specific primary procedure codes identified in the CPT Manual. The CR lists the Type 3 AOCs with the primary procedure codes that are specifically identifiable. However, claims processing contractors are advised that these lists are not exclusive and there are other acceptable primary procedure codes for AOCs in this Type. Claims processing contractors are encouraged to develop their own lists of additional primary procedure codes for this group of AOCs. Like the Type 1 AOCs, a Type 3 AOC is eligible for payment if an acceptable primary procedure code as determined by the claims processing contractor is also eligible for payment to the same practitioner for the same patient on the same date of service.

-

PTP Edits In general, NCCI PTP edits do not include edits with most AOCs

+

PTP Edits

-

because edits related to the primary procedure(s) are adequate to prevent -inappropriate payment for an add-on coded procedure (i.e., if an edit -prevents payment of the primary procedure code, the AOC shall not be paid).

+

In general, NCCI PTP edits do not include edits with most AOCs because edits +related to the primary procedure(s) are adequate to prevent inappropriate +payment for an add-on coded procedure (i.e., if an edit prevents payment of +the primary procedure code, the AOC shall not be paid).

diff --git a/reference/search_mues.html b/reference/search_mues.html index 15ec9cb..efae9b4 100644 --- a/reference/search_mues.html +++ b/reference/search_mues.html @@ -1,7 +1,7 @@ NCCI Medically Unlikely Edits (MUEs) — search_mues • northstarNCCI Edits: Medically Unlikely Edits (MUEs) — search_mues • northstarNCCI Procedure to Procedure (PTP) Edits — search_ptps • northstarNCCI Edits: Procedure to Procedure (PTP) — search_ptps • northstar