Skip to contents
library(medicalcoder)
packageVersion("medicalcoder")
## [1] '0.7.0'

Introduction

The medicalcoder package implements several variants of the Elixhauser comorbidity algorithm.

  • Based on codes provided by the Agency for Healthcare Research and Quality (AHRQ) for fiscal years 2022 through 2025 (Healthcare Research and (AHRQ) 2025)
    • elixhauser_ahrq2022
    • elixhauser_ahrq2023
    • elixhauser_ahrq2024
    • elixhauser_ahrq2025
  • Codes from Table 2 of Quan et al. (2005)
    • elixhauser_elixhauser1988: (Elixhauser et al. 1998; Quan et al. 2005)
    • elixhauser_ahrq_web: (Quan et al. 2005; Healthcare Cost and Utilization Project (HCUP) 2017)
    • elixhauser_quan2005: (Quan et al. 2005)

IMPORTANT NOTE: Elixhauser 1998 and AHRQ Web used diagnosis-related group (DRG) codes as part of the methods. The medicalcoder package does not use DRG codes. This is consistent with the way these methods were implemented in Quan et al. (2005).

ICD Codes and Index Scores

End users may access three lookup tables relevant to Elixhauser variants.

str(get_elixhauser_codes())
## 'data.frame':    10428 obs. of  14 variables:
##  $ icdv                     : int  9 9 9 9 9 9 9 9 9 9 ...
##  $ dx                       : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ full_code                : chr  "042" "070.22" "070.23" "070.32" ...
##  $ code                     : chr  "042" "07022" "07023" "07032" ...
##  $ poaexempt                : int  NA NA NA NA NA NA NA NA NA NA ...
##  $ condition                : chr  "AIDS" "LIVER" "LIVER" "LIVER" ...
##  $ elixhauser_ahrq_web      : int  1 1 1 1 1 1 1 0 0 0 ...
##  $ elixhauser_elixhauser1988: int  1 0 0 1 1 0 1 0 0 0 ...
##  $ elixhauser_quan2005      : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ elixhauser_ahrq2022      : int  NA NA NA NA NA NA NA NA NA NA ...
##  $ elixhauser_ahrq2023      : int  NA NA NA NA NA NA NA NA NA NA ...
##  $ elixhauser_ahrq2024      : int  NA NA NA NA NA NA NA NA NA NA ...
##  $ elixhauser_ahrq2025      : int  NA NA NA NA NA NA NA NA NA NA ...
##  $ elixhauser_ahrq_icd10    : int  NA NA NA NA NA NA NA NA NA NA ...
str(get_elixhauser_index_scores())
## 'data.frame':    112 obs. of  10 variables:
##  $ condition                : chr  "AIDS" "AIDS" "ALCOHOL" "ALCOHOL" ...
##  $ index                    : chr  "mortality" "readmission" "mortality" "readmission" ...
##  $ elixhauser_ahrq_web      : int  0 19 -1 6 -2 9 0 4 NA NA ...
##  $ elixhauser_elixhauser1988: int  0 19 -1 6 -2 9 0 4 NA NA ...
##  $ elixhauser_quan2005      : int  0 19 -1 6 -2 9 0 4 NA NA ...
##  $ elixhauser_ahrq2022      : int  -4 5 -1 3 -3 5 NA NA -1 2 ...
##  $ elixhauser_ahrq2023      : int  -4 5 -1 3 -3 5 NA NA 0 2 ...
##  $ elixhauser_ahrq2024      : int  -4 5 -1 3 -3 5 NA NA 0 2 ...
##  $ elixhauser_ahrq2025      : int  -4 5 -1 3 -3 5 NA NA 0 2 ...
##  $ elixhauser_ahrq_icd10    : int  -4 5 -1 3 -3 5 NA NA 0 2 ...
str(get_elixhauser_poa())
## 'data.frame':    49 obs. of  7 variables:
##  $ condition            : chr  "AIDS" "ALCOHOL" "ANEMDEF" "AUTOIMMUNE" ...
##  $ poa_required         : int  0 0 1 0 1 0 0 0 0 0 ...
##  $ elixhauser_ahrq2022  : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ elixhauser_ahrq2023  : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ elixhauser_ahrq2024  : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ elixhauser_ahrq2025  : int  1 1 1 1 1 1 1 1 1 1 ...
##  $ elixhauser_ahrq_icd10: int  1 1 1 1 1 1 1 1 1 1 ...
  • get_elixhauser_codes() returns a data.frame of the ICD codes mapping to each condition with indicators for the inclusion in specific variants.

  • get_elixhauser_index_scores() returns a data.frame with points scored per condition for both mortality and readmission indices by variant.

  • get_elixhauser_poa() returns a data.frame which reports which conditions are required and not required to be present-on-admission for the conditions to be classified as a comorbidity by variant. For the variants not listed the default is as with the Charlson and PCCC methods, the code needs to be present-on-admission for the condition to be flagged.

Applying Elixhauser

The Elixhauser method considers if the diagnostic codes are for primary or secondary diagnoses. As such, the following call will throw a warning that the primarydx.var or primarydx argument was not set and that all conditions will be assumed to be secondary. To suppress this warning pass an appropriate value for either argument.

# will warn because primarydx and primarydx.var are both NULL
mdcr_results0 <-
  comorbidities(
    data = mdcr,
    id.vars = "patid",
    icdv.var = "icdv",
    icd.codes = "code",
    dx.var = "dx",
    flag.method = "current",
    poa = 1,
    method = "elixhauser_ahrq2025"
  )
## Warning: Assuming all codes provided are secondary diagnostic codes.  Define
## `primarydx.var` or `primarydx` if this assumption is incorrect.

# no warning
mdcr_results <-
  comorbidities(
    data = mdcr,
    id.vars = "patid",
    icdv.var = "icdv",
    icd.codes = "code",
    dx.var = "dx",
    flag.method = "current",
    poa = 1,
    method = "elixhauser_ahrq2025",
    primarydx = 0
  )

identical(mdcr_results, mdcr_results0)
## [1] TRUE

The return object is a data.frame with 0/1 integer indicator columns for the relevant conditions, the id.vars (if applicable), num_cmrb, the number of comorbidities, cmrb_flag, a 0/1 indicator for presence of at least one comorbidity, and the mortality and readmission index scores.

str(mdcr_results)
## Classes 'medicalcoder_comorbidities' and 'data.frame':   38262 obs. of  54 variables:
##  $ patid              : int  10000 10002 10005 10006 10008 10010 10014 10015 10017 10018 ...
##  $ AIDS               : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ ALCOHOL            : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ ALCOHOLLIVER_MLD   : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ ANEMDEF            : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ AUTOIMMUNE         : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ BLDLOSS            : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ CANCER_LEUK        : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ CANCER_LYMPH       : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ CANCER_METS        : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ CANCER_NSITU       : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ CANCER_SOLID       : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ CBVD_POA           : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ CBVD_SQLA          : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ CBVD_SQLAPARALYSIS : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ COAG               : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ DEMENTIA           : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ DEPRESS            : int  0 1 0 0 0 0 0 0 0 1 ...
##  $ DIAB_CX            : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ DIAB_UNCX          : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ DRUG_ABUSE         : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ DRUG_ABUSEPSYCHOSES: int  0 0 0 0 0 0 0 0 0 0 ...
##  $ HF                 : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ HFHTN_CX           : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ HFHTN_CXRENLFL_SEV : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ HTN_CX             : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ HTN_CXRENLFL_SEV   : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ HTN_UNCX           : int  0 0 0 0 0 0 1 0 0 0 ...
##  $ LIVER_MLD          : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ LIVER_MLD_NEURO    : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ LIVER_SEV          : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ LUNG_CHRONIC       : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ NEURO_MOVT         : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ NEURO_OTH          : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ NEURO_OTH_SEIZ     : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ NEURO_SEIZ         : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ OBESE              : int  0 1 0 0 0 0 0 0 0 0 ...
##  $ PARALYSIS          : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ PERIVASC           : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ PSYCHOSES          : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ PULMCIRC           : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ RENLFL_MOD         : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ RENLFL_SEV         : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ THYROID_HYPO       : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ THYROID_OTH        : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ ULCER_PEPTIC       : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ VALVE              : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ VALVE_AUTOIMMUNE   : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ WGHTLOSS           : int  0 0 0 0 0 0 1 0 0 0 ...
##  $ CBVD               : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ num_cmrb           : int  0 2 0 0 0 0 2 0 0 1 ...
##  $ cmrb_flag          : int  0 1 0 0 0 0 1 0 0 1 ...
##  $ mortality_index    : int  0 -15 0 0 0 0 13 0 0 -8 ...
##  $ readmission_index  : int  0 0 0 0 0 0 6 0 0 2 ...
##  - attr(*, "method")= chr "elixhauser_ahrq2025"
##  - attr(*, "id.vars")= chr "patid"
##  - attr(*, "flag.method")= chr "current"

Call summary() to get a list of summaries which can be used to generate summary tables.

summary(mdcr_results)
## $conditions
##       condition count      percent
## 1          AIDS     3  0.007840677
## 2       ALCOHOL    11  0.028749151
## 3       ANEMDEF   700  1.829491401
## 4    AUTOIMMUNE   170  0.444305055
## 5       BLDLOSS    33  0.086247452
## 6   CANCER_LEUK   381  0.995766034
## 7  CANCER_LYMPH    76  0.198630495
## 8   CANCER_METS   213  0.556688098
## 9  CANCER_NSITU     0  0.000000000
## 10 CANCER_SOLID   477  1.246667712
## 11         CBVD   117  0.305786420
## 12         COAG   877  2.292091370
## 13     DEMENTIA    35  0.091474570
## 14      DEPRESS   321  0.838952485
## 15      DIAB_CX   123  0.321467775
## 16    DIAB_UNCX   184  0.480894883
## 17   DRUG_ABUSE    77  0.201244054
## 18           HF   246  0.642935550
## 19       HTN_CX   286  0.747477915
## 20     HTN_UNCX   395  1.032355862
## 21    LIVER_MLD   179  0.467827087
## 22    LIVER_SEV   159  0.415555904
## 23 LUNG_CHRONIC  1359  3.551826878
## 24   NEURO_MOVT   139  0.363284721
## 25    NEURO_OTH   948  2.477654069
## 26   NEURO_SEIZ  1490  3.894203126
## 27        OBESE   315  0.823271131
## 28    PARALYSIS   767  2.004599864
## 29     PERIVASC   209  0.546233861
## 30    PSYCHOSES    96  0.250901678
## 31     PULMCIRC   332  0.867701636
## 32   RENLFL_MOD   107  0.279650828
## 33   RENLFL_SEV   247  0.645549109
## 34 THYROID_HYPO   371  0.969630443
## 35  THYROID_OTH    36  0.094088129
## 36 ULCER_PEPTIC    23  0.060111860
## 37        VALVE   572  1.494955831
## 38     WGHTLOSS   616  1.609952433
## 39         >= 1  7869 20.566096911
## 40         >= 2  3186  8.326799435
## 41         >= 3  1135  2.966389629
## 42         >= 4   347  0.906905023
## 43         >= 5   120  0.313627097
## 44         >= 6    25  0.065338979
## 45         >= 7     7  0.018294914
## 46         >= 8     1  0.002613559
## 
## $index_summary
##         index min q1 median q3 max
## 1 readmission  -2  0      0  0  35
## 2   mortality -24  0      0  0  75
Counts and percentages of patients in the mdcr example data sets with the Elixhauser Quan et al. (2005) comorbidities.
Count Percentage
Comorbidity
AIDS 3 0.008
ALCOHOL 11 0.029
ANEMDEF 700 1.829
AUTOIMMUNE 170 0.444
BLDLOSS 33 0.086
CANCER_LEUK 381 0.996
CANCER_LYMPH 76 0.199
CANCER_METS 213 0.557
CANCER_NSITU 0 0.000
CANCER_SOLID 477 1.247
CBVD 117 0.306
COAG 877 2.292
DEMENTIA 35 0.091
DEPRESS 321 0.839
DIAB_CX 123 0.321
DIAB_UNCX 184 0.481
DRUG_ABUSE 77 0.201
HF 246 0.643
HTN_CX 286 0.747
HTN_UNCX 395 1.032
LIVER_MLD 179 0.468
LIVER_SEV 159 0.416
LUNG_CHRONIC 1359 3.552
NEURO_MOVT 139 0.363
NEURO_OTH 948 2.478
NEURO_SEIZ 1490 3.894
OBESE 315 0.823
PARALYSIS 767 2.005
PERIVASC 209 0.546
PSYCHOSES 96 0.251
PULMCIRC 332 0.868
RENLFL_MOD 107 0.280
RENLFL_SEV 247 0.646
THYROID_HYPO 371 0.970
THYROID_OTH 36 0.094
ULCER_PEPTIC 23 0.060
VALVE 572 1.495
WGHTLOSS 616 1.610
Total Comorbidities
>= 1 7869 20.566
>= 2 3186 8.327
>= 3 1135 2.966
>= 4 347 0.907
>= 5 120 0.314
>= 6 25 0.065
>= 7 7 0.018
>= 8 1 0.003

References

Elixhauser, Anne, Claudia Steiner, D Robert Harris, and Rosanna M Coffey. 1998. “Comorbidity Measures for Use with Administrative Data.” Medical Care 36 (1): 8–27. https://doi.org/10.1097/00005650-199801000-00004.
Healthcare Cost and Utilization Project (HCUP). 2017. “Elixhauser Comorbidity Software for ICD-9-CM.” https://hcup-us.ahrq.gov/toolssoftware/comorbidity/comorbidity.jsp.
Healthcare Research, Agency for, and Quality (AHRQ). 2025. “Elixhauser Comorbidity Software Refined for ICD-10-CM Healthcare Cost and Utilization Project (HCUP).” https://hcup-us.ahrq.gov/toolssoftware/comorbidityicd10/comorbidity_icd10.jsp.
Quan, Hude, Vijaya Sundararajan, Patricia Halfon, Andrew Fong, Bernard Burnand, Jean-Christophe Luthi, L Duncan Saunders, Catherine A. Beck, Thomas E. Feasby, and William A. Ghali. 2005. “Coding Algorithms for Defining Comorbidities in ICD-9-CM and ICD-10 Administrative Data.” Medical Care 43 (11): 1130–39. https://doi.org/10.1097/01.mlr.0000182534.19832.83.