This is the main function which extracts comorbidities from a set of ICD-9 codes. Some comorbidity schemes have rules, for example, what to do when both 'hypertension' and 'hypertension with complications' are present. These rules are applied by default; if the exact fields from the original mappings are needed, use hierarchy = FALSE. For comorbidity counting, Charlson or Van Walraven scores the default should be used to apply the rules. For more about computing Hierarchical Condition Codes (HCC), see comorbid_hcc For more about comorbidities following the Clinical Classification Software (CCS) rules from AHRQ, see comorbid_ccs.

comorbid(x, map, visit_name = NULL, icd_name = NULL,
  short_code = guess_short(x, icd_name = icd_name),
  short_map = guess_short(map), return_df = FALSE,
  return_binary = FALSE, categorize_fun = categorize_simple, ...)

icd10_comorbid(x, map, visit_name = NULL, icd_name = NULL,
  short_code = NULL, short_map = guess_short(map), return_df = FALSE,
  return_binary = FALSE, icd10_comorbid_fun = icd10_comorbid_reduce,
  ...)

icd9_comorbid(x, map, visit_name = NULL, icd_name = NULL,
  short_code = guess_short(x, icd_name = icd_name),
  short_map = guess_short(map), return_df = FALSE,
  return_binary = FALSE, preclean = FALSE,
  categorize_fun = categorize_simple,
  comorbid_fun = comorbid_mat_mul_wide, ...)

icd9_comorbid_ahrq(x, ..., abbrev_names = TRUE, hierarchy = TRUE)

icd10_comorbid_ahrq(x, ..., abbrev_names = TRUE, hierarchy = TRUE)

icd9_comorbid_elix(x, ..., abbrev_names = TRUE, hierarchy = TRUE)

icd10_comorbid_elix(x, ..., abbrev_names = TRUE, hierarchy = TRUE)

icd9_comorbid_quan_elix(x, ..., abbrev_names = TRUE, hierarchy = TRUE)

icd10_comorbid_quan_elix(x, ..., abbrev_names = TRUE, hierarchy = TRUE)

icd9_comorbid_quan_deyo(x, ..., abbrev_names = TRUE, hierarchy = TRUE)

icd10_comorbid_quan_deyo(x, ..., abbrev_names = TRUE, hierarchy = TRUE)

icd9_comorbid_charlson(...)

icd10_comorbid_charlson(...)

comorbid_ccs(x, icd_name = get_icd_name(x), ...)

icd9_comorbid_ccs(x, ..., single = TRUE, lvl = NULL,
  map = icd::icd9_map_single_ccs, short_map = TRUE)

icd10_comorbid_ccs(x, ..., single = TRUE, lvl = NULL)

comorbid_ahrq(x, ...)

comorbid_elix(x, ...)

comorbid_quan_elix(x, ...)

comorbid_quan_deyo(x, ...)

comorbid_charlson(...)

Arguments

x

data.frame containing a column of patient-visit identifiers and a column of ICD codes. The data.frame may be in ‘long’ or ‘wide’ format, like the example vermont_dx and uranium_pathology data.

map

A named list of the comorbidities with each list item containing a vector of decimal ICD-9 codes. icd includes a number of these, e.g., icd9_map_elix. Alternatively, this can be omitted if the convenience functions, such as icd10_comorbid_charlson are used directly. map should be in the form of a list, with the names of the items corresponding to the comorbidities (e.g. ‘HTN’, or ‘diabetes’) and the contents of each list item being a character vector of short-form (no decimal place, zero left-padded) ICD codes. There is no default: the user should use the family of functions, e.g. comorbid_ahrq, since these also name the fields correctly, and these functions also apply any hierarchical rules (see hierarchy below)

visit_name

The name of the column in the data frame which contains the patient or visit identifier. Typically this is the visit identifier, since patients come leave and enter hospital with different ICD-9 codes. It is a character vector of length one. If left empty, or NULL, then an attempt is made to guess which field has the ID for the patient encounter (not a patient ID, although this can of course be specified directly). The guesses proceed until a single match is made. Data frames may be wide with many matching fields, so to avoid false positives, anything but a single match is rejected. If there are no successful guesses, and visit_id was not specified, then the first column of the data frame is used.

icd_name

The name of the column in the data.frame which contains the ICD codes. This is a character vector of length one. If it is NULL, icd9 will attempt to guess the column name, looking for progressively less likely possibilities until it matches a single column. Failing this, it will take the first column in the data frame. Specifying the column using this argument avoids the guesswork.

short_code

single logical value which determines whether the ICD-9 code provided is in short (TRUE) or decimal (FALSE) form. Where reasonable, this is guessed from the input data.

short_map

Same as short, but applied to map instead of the data frame of ICD codes, x. All the codes in a mapping should be of the same type, i.e. short or decimal.

return_df

single logical value, if TRUE, return 'tidy' data, i.e., the result is a data frame with the first column being the visit_id, and the second being the count. If visit_id was a factor or named differently in the input, this is preserved.

return_binary

Single logical value, if TRUE, the returned matrix or data.frame will be composed of 1 and 0, instead of TRUE and FALSE, respectively. This conversion can also be done by the internal functions icd:::logical_to_binary and icd:::binary_to_logical, or using other tools, e.g. apply(x, 2, as.integer)

categorize_fun

Internal. Function used for the categorization problem.

...

Arguments passed through to comorbid

icd10_comorbid_fun

Internal function Default will be fast and accurate. A function which calculates comorbidities for ICD-10 codes, in which the comorbidity map only specifies parent codes, not every possible child.

preclean

single logical value, which, if TRUE causes ICD-9 'short' code input to be padded to correct three (or four for E code) length before applying the comorbidity map. For very large data sets, e.g. ten million rows, this is much slower than the comorbidity calculation. If you know that the source ICD-9 codes are already well formed (or have already run icd9_add_leading_zeroes), then preclean can be set to FALSE to save time.

comorbid_fun

Internal. Function used inside categorization.

abbrev_names

single logical value that defaults to TRUE, in which case the shorter human-readable names stored in e.g. ahrqComorbidNamesAbbrev are applied to the data frame column names.

hierarchy

single logical value that defaults to TRUE, in which case the hierarchy defined for the mapping is applied. E.g. in Elixhauser, you can't have uncomplicated and complicated diabetes both flagged.

single

a logical value, if TRUE then use single level CCS, otherwise use multi level

lvl

If multiple level CCS, then level must be selected as a number between one and four.

Details

The order of visits may change depending on the original sequence, and the underlying algorithm used. Usually this would be the order of the first occurrence of each visit/patient identifier, but this is not guaranteed unless restore_id_order is set to TRUE.

data.frames of patient data may have columns within them which are of class icd9, icd10 etc., but do not themselves have a class: therefore, the S3 mechanism for dispatch is not suitable. I may add a wrapper function which looks inside a data.frame of comorbidities, and dispatches to the appropriate function, but right now the user must call the icd9_ or icd10_ prefixed function directly.

Functions

  • icd10_comorbid: ICD-10 comorbidities

  • icd9_comorbid: Get comorbidities from data.frame of ICD-9 codes

  • icd9_comorbid_ahrq: AHRQ comorbidities for ICD-9 codes

  • icd10_comorbid_ahrq: AHRQ comorbidities for ICD-10 codes

  • icd9_comorbid_elix: Elixhauser comorbidities for ICD-9 codes

  • icd10_comorbid_elix: Elixhauser comorbidities for ICD-10 codes

  • icd9_comorbid_quan_elix: Quan's Elixhauser comorbidities for ICD-9 codes

  • icd10_comorbid_quan_elix: Quan's Elixhauser comorbidities for ICD-10 codes

  • icd9_comorbid_quan_deyo: Quan's Deyo (Charlson) comorbidities for ICD-9 codes

  • icd10_comorbid_quan_deyo: Quan's Deyo (Charlson) comorbidities for ICD-10 codes

  • icd9_comorbid_charlson: Currently synonym for icd9_comorbid_quan_deyo

  • icd10_comorbid_charlson: Currently synonym for icd10_comorbid_quan_deyo

  • comorbid_ccs: Use AHRQ CCS for comorbidity classification

  • icd9_comorbid_ccs: Compute AHRQ Clinical Classifications Software (CCS) scores from ICD-9 codes

  • icd10_comorbid_ccs: Compute AHRQ Clinical Classifications Software (CCS) scores from ICD-10 codes

  • comorbid_ahrq: AHRQ comorbidities, infers whether to use ICD-9 or ICD-10 codes

  • comorbid_elix: Elixhauser comorbidities, infers whether to use ICD-9 or ICD-10 codes

  • comorbid_quan_elix: Quan's Elixhauser comorbidities, infers whether to use ICD-9 or ICD-10 codes

  • comorbid_quan_deyo: Quan's Deyo (Charlson) comorbidities, infers whether to use ICD-9 or ICD-10 codes

  • comorbid_charlson: Calculate comorbidities using Charlson categories according to Quan/Deyo ICD categories. Synonymous with link{comorbid_quan_deyo} in this release.

See also

icd9_map_single_ccs

Consider using comorbid_ahrq instead of comorbid_elix for more recently updated mappings based on the Elixhauser scheme.

Other comorbidity computations: comorbid_hcc, comorbid_pccc_dx

Other comorbidities: comorbid_hcc, comorbid_pccc_dx, icd10_map_ahrq_pcs, icd9_map_ahrq, icd9_map_elix, icd9_map_hcc, icd9_map_pccc, icd9_map_quan_deyo, icd9_map_quan_elix, icd9_map_single_ccs

Examples

library(icd) vermont_dx[1:5, 1:10]
#> visit_id age_group sex death DRG DX1 DX2 DX3 DX4 DX5 #> 1 7 40-44 male TRUE 640 27801 03842 51881 41519 99591 #> 2 10 75 and over female FALSE 470 71526 25000 42830 4280 4019 #> 3 13 75 and over female FALSE 470 71535 59651 78052 27800 V8537 #> 4 16 55-59 female FALSE 470 71535 49390 53081 27800 V140 #> 5 37 70-74 male FALSE 462 71536 4241 2859 2720 4414
# get first few rows and columns of Charlson comorbidities using Quan/Deyo # mapping of ICD-9 or ICD-10 codes Charlson categories comorbid_quan_deyo(vermont_dx)[1:5, 1:14]
#> MI CHF PVD Stroke Dementia Pulmonary Rheumatic PUD LiverMild DM #> 7 FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> 10 FALSE TRUE FALSE FALSE FALSE TRUE FALSE FALSE FALSE TRUE #> 13 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> 16 FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE #> 37 FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> DMcx Paralysis Renal Cancer #> 7 FALSE FALSE TRUE TRUE #> 10 FALSE FALSE FALSE FALSE #> 13 FALSE FALSE FALSE FALSE #> 16 FALSE FALSE FALSE FALSE #> 37 FALSE FALSE FALSE FALSE
# Note that the comorbidity calculations automatically finds the ICD code # columns, and uses 'wide' or 'long' format data. stopifnot( identical( comorbid_quan_deyo(vermont_dx), comorbid_quan_deyo(wide_to_long(vermont_dx)) ) ) # get summary AHRQ (based on Elixhauser) comorbidities for the Uranium data: summary(comorbid_ahrq(uranium_pathology))
#> CHF Valvular PHTN PVD #> Mode :logical Mode :logical Mode :logical Mode :logical #> FALSE:331 FALSE:305 FALSE:330 FALSE:264 #> TRUE :3 TRUE :29 TRUE :4 TRUE :70 #> HTN Paralysis NeuroOther Pulmonary #> Mode :logical Mode :logical Mode :logical Mode :logical #> FALSE:225 FALSE:334 FALSE:304 FALSE:220 #> TRUE :109 TRUE :30 TRUE :114 #> DM DMcx Hypothyroid Renal #> Mode :logical Mode :logical Mode :logical Mode :logical #> FALSE:331 FALSE:334 FALSE:334 FALSE:328 #> TRUE :3 TRUE :6 #> Liver PUD HIV Lymphoma #> Mode :logical Mode :logical Mode :logical Mode :logical #> FALSE:300 FALSE:330 FALSE:334 FALSE:334 #> TRUE :34 TRUE :4 #> Mets Tumor Rheumatic Coagulopathy #> Mode :logical Mode :logical Mode :logical Mode :logical #> FALSE:270 FALSE:287 FALSE:330 FALSE:331 #> TRUE :64 TRUE :47 TRUE :4 TRUE :3 #> Obesity WeightLoss FluidsLytes BloodLoss #> Mode :logical Mode :logical Mode :logical Mode :logical #> FALSE:328 FALSE:326 FALSE:333 FALSE:334 #> TRUE :6 TRUE :8 TRUE :1 #> Anemia Alcohol Drugs Psychoses #> Mode :logical Mode :logical Mode :logical Mode :logical #> FALSE:332 FALSE:334 FALSE:334 FALSE:333 #> TRUE :2 TRUE :1 #> Depression #> Mode :logical #> FALSE:334 #>
pts <- icd_long_data( visit_name = c("2", "1", "2", "3", "3"), icd9 = c("39891", "40110", "09322", "41514", "39891") ) comorbid(pts, icd9_map_ahrq, short_code = TRUE) # visit_name is now sorted
#> CHF Valvular PHTN PVD HTN HTNcx Paralysis NeuroOther Pulmonary DM #> 2 TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> 1 FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE #> 3 TRUE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> DMcx Hypothyroid Renal Liver PUD HIV Lymphoma Mets Tumor Rheumatic #> 2 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> 1 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> 3 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> Coagulopathy Obesity WeightLoss FluidsLytes BloodLoss Anemia Alcohol Drugs #> 2 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> 1 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> 3 FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> Psychoses Depression #> 2 FALSE FALSE #> 1 FALSE FALSE #> 3 FALSE FALSE
pts <- icd_long_data( visit_name = c("1", "2", "3", "4", "4"), icd_name = c("20084", "1742", "30410", "41514", "95893"), date = as.Date(c( "2011-01-01", "2011-01-02", "2011-01-03", "2011-01-04", "2011-01-04" )) ) pt_hccs <- comorbid_hcc(pts, date_name = "date") head(pt_hccs)
#> visit_name date hcc #> 1 1 2011-01-01 9 #> 2 2 2011-01-02 10 #> 3 3 2011-01-03 52 #> 4 4 2011-01-04 164
pts10 <- icd_long_data( visit_name = c("a", "b", "c", "d", "e"), icd_name = c("I058", NA, "T82817A", "", "I69369"), date = as.Date( c("2011-01-01", "2011-01-02", "2011-01-03", "2011-01-03", "2011-01-03") ) ) icd10_comorbid(pts10, map = icd10_map_ahrq)
#> CHF Valvular PHTN PVD HTN HTNcx Paralysis NeuroOther Pulmonary DM #> a FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> b FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> c FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> d FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> e FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE #> DMcx Hypothyroid Renal Liver PUD HIV Lymphoma Mets Tumor Rheumatic #> a FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> b FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> c FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> d FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> e FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> Coagulopathy Obesity WeightLoss FluidsLytes BloodLoss Anemia Alcohol Drugs #> a FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> b FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> c FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> d FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> e FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> Psychoses Depression #> a FALSE FALSE #> b FALSE FALSE #> c FALSE FALSE #> d FALSE FALSE #> e FALSE FALSE
# or if library(icd) hasn't been called first: icd::icd10_comorbid(pts10, map = icd::icd10_map_ahrq)
#> CHF Valvular PHTN PVD HTN HTNcx Paralysis NeuroOther Pulmonary DM #> a FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> b FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> c FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> d FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> e FALSE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE #> DMcx Hypothyroid Renal Liver PUD HIV Lymphoma Mets Tumor Rheumatic #> a FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> b FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> c FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> d FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> e FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> Coagulopathy Obesity WeightLoss FluidsLytes BloodLoss Anemia Alcohol Drugs #> a FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> b FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> c FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> d FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> e FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> Psychoses Depression #> a FALSE FALSE #> b FALSE FALSE #> c FALSE FALSE #> d FALSE FALSE #> e FALSE FALSE
# or most simply: icd::icd10_comorbid_ahrq(pts10)
#> CHF Valvular PHTN PVD HTN Paralysis NeuroOther Pulmonary DM DMcx #> a FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> b FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> c FALSE FALSE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> d FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> e FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE #> Hypothyroid Renal Liver PUD HIV Lymphoma Mets Tumor Rheumatic #> a FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> b FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> c FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> d FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> e FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> Coagulopathy Obesity WeightLoss FluidsLytes BloodLoss Anemia Alcohol Drugs #> a FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> b FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> c FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> d FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> e FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE #> Psychoses Depression #> a FALSE FALSE #> b FALSE FALSE #> c FALSE FALSE #> d FALSE FALSE #> e FALSE FALSE
# specify a simple custom comorbidity map: my_map <- list( "malady" = c("100", "2000"), "ailment" = c("003", "040") ) two_pts <- data.frame( visit_id = c("v01", "v01", "v02", "v02"), icd9 = as.icd9(c("040", "000", "100", "000")), stringsAsFactors = FALSE ) comorbid(two_pts, map = my_map)
#> malady ailment #> v01 FALSE TRUE #> v02 TRUE FALSE