The medicalcoder package implements several variants of
the Elixhauser comorbidity algorithm.
elixhauser_ahrq2022elixhauser_ahrq2023elixhauser_ahrq2024elixhauser_ahrq2025elixhauser_elixhauser1988: (Elixhauser et al. 1998; Quan et al. 2005)elixhauser_ahrq_web: (Quan et
al. 2005; Cost and (HCUP) 2017)elixhauser_quan2005: (Quan et
al. 2005)IMPORTANT NOTE: Elixhauser 1998 and AHRQ Web used
diagnostic 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).
End users may access three lookup tables relevant to Elixhauser variants.
str(get_elixhauser_codes())
## 'data.frame':    10679 obs. of  12 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" ...
##  $ 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 ...
str(get_elixhauser_index_scores())
## 'data.frame':    112 obs. of  9 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 ...
str(get_elixhauser_poa())
## 'data.frame':    43 obs. of  7 variables:
##  $ condition          : chr  "AIDS" "ALCOHOL" "ANEMDEF" "ANEMDEF" ...
##  $ desc               : chr  "Acquired immune deficiency syndrome" "Alcohol abuse" "Anemias due to other nutritional deficiencies" "Deficiency anemias" ...
##  $ poa_required       : int  0 0 1 1 0 1 1 0 0 0 ...
##  $ elixhauser_ahrq2022: int  1 1 NA 1 1 NA 1 1 1 1 ...
##  $ elixhauser_ahrq2023: int  1 1 1 NA 1 1 NA 1 1 1 ...
##  $ elixhauser_ahrq2024: int  1 1 1 NA 1 1 NA 1 1 1 ...
##  $ elixhauser_ahrq2025: int  1 1 1 NA 1 1 NA 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.
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] TRUEThe 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  43 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 ...
##  $ 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             : 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 ...
##  $ HF               : 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_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_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_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 ...
##  $ WGHTLOSS         : int  0 0 0 0 0 0 1 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   609  1.591657519
## 11         CBVD     0  0.000000000
## 12         COAG   877  2.292091370
## 13     DEMENTIA    35  0.091474570
## 14      DEPRESS   321  0.838952485
## 15      DIAB_CX   123  0.321467775
## 16    DIAB_UNCX   193  0.504416915
## 17   DRUG_ABUSE    77  0.201244054
## 18           HF   246  0.642935550
## 19       HTN_CX   286  0.747477915
## 20     HTN_UNCX   406  1.061105013
## 21    LIVER_MLD   206  0.538393184
## 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   112  0.292718624
## 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  7850 20.516439287
## 40         >= 2  3230  8.441796038
## 41         >= 3  1171  3.060477759
## 42         >= 4   357  0.933040615
## 43         >= 5   116  0.303172861
## 44         >= 6    27  0.070566097
## 45         >= 7     4  0.010454237
## 46         >= 8     2  0.005227118
## 
## $index_summary
##         index min q1 median q3 max
## 1 readmission  -2  0      0  0  42
## 2   mortality -24  0      0  0  85x <- summary(mdcr_results)$conditions
tab <-
  kableExtra::kbl(
    x = x,
    format = "html",
    caption = "Counts and percentages of patients in the mdcr example data sets with the Elixhauser @quan2005 comorbidities.",
    col.names = c("", "Count", "Percentage"),
    digits = 3
  )
tab <- kableExtra::pack_rows(tab, group_label = "Comorbidity", start_row = 1, end_row = 39)
tab <- kableExtra::pack_rows(tab, group_label = "Total Comorbidities", start_row = 39, end_row = nrow(x))
tab| 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 | 609 | 1.592 | 
| CBVD | 0 | 0.000 | 
| COAG | 877 | 2.292 | 
| DEMENTIA | 35 | 0.091 | 
| DEPRESS | 321 | 0.839 | 
| DIAB_CX | 123 | 0.321 | 
| DIAB_UNCX | 193 | 0.504 | 
| DRUG_ABUSE | 77 | 0.201 | 
| HF | 246 | 0.643 | 
| HTN_CX | 286 | 0.747 | 
| HTN_UNCX | 406 | 1.061 | 
| LIVER_MLD | 206 | 0.538 | 
| 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 | 112 | 0.293 | 
| 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 | 7850 | 20.516 | 
| >= 2 | 3230 | 8.442 | 
| >= 3 | 1171 | 3.060 | 
| >= 4 | 357 | 0.933 | 
| >= 5 | 116 | 0.303 | 
| >= 6 | 27 | 0.071 | 
| >= 7 | 4 | 0.010 | 
| >= 8 | 2 | 0.005 |