Validate RARC Codes
+Arguments
+- x +
<chr>
vector of RARC adjustment codes, a two-to-three character +alphanumeric string.
+
+
Value
+ + +a tibble
+ + +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 @@
#> # 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
-
-#> 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()
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_denials()
@@ -139,7 +139,7 @@ search_opps()
@@ -164,7 +164,7 @@ search_rbcs()
@@ -380,6 +380,11 @@ is_valid_length()
Validate RARC Codes
+<chr>
vector of RARC adjustment codes, a two-to-three character
+alphanumeric string.
a tibble
+ + +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.
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:
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).
In the Medicare Physician Fee Schedule, an AOC generally has a global surgery period of ZZZ
.
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)."
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 @@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).
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.
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).