If there are any other users who use AHRQ's SAS code comoanaly2010 and comformat2010 to create comorbidity variables, I thought you might be interested in the following PRELIM code we wrote to mimic its functionality in R. It seems to yield similar results, but may contain errors. Please feel free to comment (kindly) or enhance. I'm sure there are better ways to skin this cat, but we at least took a stab at it. Thought this would be a good use of the community if there are any other interested users.
################################################################################ # Function flag # # Intended to provide functionality from AHRQ comformat2010 comoanaly2010 # # Input, dataframe with # id in column 1 # msdrg in column 2 # diagnosis in columns 4-53 # Output, numeriuc list with id and one element per cc # dimnames = c('ID', # 'CHF','VALVE','PULMCIRC','PERIVASC', # 'HTN_C','PARA','NEURO','CHRNLUNG','DM', # 'DMCX','HYPOTHY','RENLFAIL','LIVER','ULCER', # 'AIDS','LYMPH','METS','TUMOR','ARTH', # 'ANEMDEF','ALCOHOL','DRUG','PSYCH','DEPRESS') ) flag = function(data, k) { data = data[k, ] print(data) print(k) id = as.matrix(data[1]) DX = data[4:53] DX = as.matrix(DX) DRG = as.matrix(data[2]) ##########format############################################################ chf = c(39891, 4280:4289, 42800:42889) v1 = paste(0, 9320:9324, sep = "") v5 = paste("V422", "", sep = "") v6 = paste("V433", "", sep = "") valve = c(v1, 3940:3971, 39400:39709, 3979, 4240:4249, 42400:42499, 7463:7466, 74630:74659, v5, v6) pulmcirc = c(41511:41519, 4160:4169, 41600:41689, 4179) p3 = paste(c(4471, 5571, 5579, "V434"), "", sep = "") perivasc = c(4400:4409, 44000:44089, 4411:4419, 44100:44189, 4420:4429, 44200:44289, 4431:4439, 44310:44389, 44421:44422, p3, 449) htn = c(4011, 4019, 64200:64204) htncx = c(4010, 4372) ############################################################################ # the following are special, temporary formats used in the creation of the # hypertension complicated comorbidity when overlapping with congestive # heart failure or renal failure occurs. These temporary formats are # referenced in the program called comoanaly2009.txt ############################################################################ htnpreg = c(64220:64224) htnwochf = c(40200, 40210, 40290, 40509, 40519, 40599) htnwchf = c(40201, 40211, 40291) hrenworf = c(40300, 40310, 40390, 40501, 40511, 40591, 64210:64214) hrenwrf = c(40301, 40311, 40391) hhrwohrf = c(40400, 40410, 40490) hhrwchf = c(40401, 40411, 40491) hhrwrf = c(40402, 40412, 40492) hhrwhrf = c(40403, 40413, 40493) ohtnpreg = c(64270:64274, 64290:64294) ############################################################################ para = c(3420:3449, 34200:34489, 43820:43853, 78072) neuro = c(3300:3319, 33000:33189, 3340:3359, 33400:33589, 3411:3419, 34110:34189, 3452:3453, 34520:34529, 3320, 3334, 3335, 3337, 3380, 7687, 7803, 7843, 340, 33371, 33372, 33379, 33385, 33394, 34500:34511, 34540:34591, 34700:34701, 34710:34711, 64940:64944, 76870:76873, 78031, 78032, 78039, 78097) chrnlung = c(490:492, 4900:4928, 49000:49279, 49300:49392, 494, 4940:4941, 49400:49409, 496:505, 4950:5049, 49500:50499, 5064) dm = c(25000:25033, 64800:64804, 24900:24931) dmcx = c(25040:25093, 7751, 24940:24991) hypothy = c(243:244, 2430:2442, 24300:24419, 2448, 2449) renlfail3 = paste(c("V420", "V451", "V568"), "", sep = "") renlfail4 = paste("V", c(4511:4512), sep = "") renlfail5 = paste("V", c(560:563, 5600:5632), sep = "") renlfail = c(5853:5856, 5859, 586, renlfail3, renlfail4, renlfail5) liver1 = paste(0, c(7022, 7023, 7032, 7033, 7044, 7054), sep = "") liver = c(liver1, 4560, 4561, 45620, 45621, 5710, 5712, 5713, 57140:57149, 5715:5716, 5718:5719, 5723, 5728, "V427") ulcer1 = paste(531, c(41, 51, 61, 70, 71, 91), sep = "") ulcer2 = paste(532, c(41, 51, 61, 70, 71, 91), sep = "") ulcer3 = paste(533, c(41, 51, 61, 70, 71, 91), sep = "") ulcer4 = paste(534, c(41, 51, 61, 70, 71, 91), sep = "") ulcer = c(ulcer1, ulcer2, ulcer3, ulcer4) aids = paste(0, c(42:44, 420:449, 4200:4289), sep = "") lymph = c(20000:20238, 20250:20301, 20302:20382, 2386, 2733) mets = c(1960:1991, 19600:19909, 20970:20975, 20979, 78951) tumor = c(1400:1729, 1740:1759, 14000:17289, 17400:17589, 20900:20924, 20931:20936, 25801:25803, 2093, 20925:20929, 179:195, 1790:1958, 17900:19579) arth = c(7010, 7100:7109, 7140:7149, 7200:7209, 71000:71089, 71400:71489, 72000:72089, 725) c1 = paste(c(2860:2869, 2871, 2873:2875), "", sep = "") coag = c(2860:2869, 2871, 2873:2875, 28600:28689, 28730:28749, 64930:64934, 28984) ob3 = paste("V", c(8530:8549, 8554), sep = "") obese = c(2780, "V854", ob3, 27800:27801, 64910:64914, 79391) wghtloss = c(260:263, 2600:2639, 26000:26389, 78321:78322) lytes = c(2760:2769, 27600:27689) bldloss = c(2800, 64820:64824) anemdef = c(2801:2819, 2859, 28010:28189, 28521:28529) alcohol = c(2910:2913, 2915, 2918, 2919, 29100:29129, 29181, 29182, 29189, 30300:30393, 30500:30503) drug = c(2920, 2929, 29282:29289, 30400:30493, 30520:30593, 64830:64834) psych = c(29500:29889, 2951:2989, 29910, 29911) depress = c(3004, 3090, 3091, 311, 30112) other = c("?") ############## V27 MS-DRG ################################################## card1 = paste(0, 1:2, sep = "") card2 = paste(0, card1, sep = "") carddrg = c(card2, 215:238, 242:251, 253:254, 258:262, 265, 280:293, 296:298, 302:303, 306:313) peridrg = c(299:301) renaldrg = c(652, 656:661, 673:675, 682:700) nerv1 = paste(0, c(20:42, 52:99), sep = "") nervdrg = c(nerv1, 100:103) ceredrg = paste(0, c(20:22, 34:38, 64:72), sep = "") pulmdrg = c(190:192, 202, 203) diabdrg = c(637:639) hypodrg = c(625:627, 643:645) renfdrg = c(652, 682:685) liverdrg = c(420:425, 432:434, 441:446) ulcedrg = c(377:384) hivdrg = c(969:970, 974:977) leukdrg = c(820:830, 834:849) canc1 = paste(0, 54:55, sep = "") cancdrg = c(canc1, 146:148, 180:182, 374:376, 435:437, 542:544, 582:585, 597:599, 656:658, 686:688, 715:716, 722:724, 736:741, 754:756, 826:830, 843:849) arthdrg = c(545:547) nutrdrg = c(640:641) anemdrg = c(808:812) alcdrg = c(894:897) coagdrg = c(813) htncxdrg = c(304, paste(0, 77:78, sep = "")) htndrg = c(305, paste(0, 79, sep = "")) psydrg = c(885) obesedrg = c(619:621) deprsdrg = c(881) ### FLAG ################################################################### flag = matrix(0, 1, 30) tmp = matrix(0, 1, 10) for (i in 2:50) { flag[1, 1] = pmax(flag[1, 1], as.numeric(c(DX[1, i] %in% chf))) flag[1, 2] = pmax(flag[1, 2], as.numeric(c(DX[1, i] %in% valve))) flag[1, 3] = pmax(flag[1, 3], as.numeric(c(DX[1, i] %in% pulmcirc))) flag[1, 4] = pmax(flag[1, 4], as.numeric(c(DX[1, i] %in% perivasc))) flag[1, 5] = pmax(flag[1, 5], as.numeric(c(DX[1, i] %in% htn))) flag[1, 6] = pmax(flag[1, 6], as.numeric(c(DX[1, i] %in% htncx))) flag[1, 7] = pmax(flag[1, 7], as.numeric(c(DX[1, i] %in% para))) flag[1, 8] = pmax(flag[1, 8], as.numeric(c(DX[1, i] %in% neuro))) flag[1, 9] = pmax(flag[1, 9], as.numeric(c(DX[1, i] %in% chrnlung))) flag[1, 10] = pmax(flag[1, 10], as.numeric(c(DX[1, i] %in% dm))) flag[1, 11] = pmax(flag[1, 11], as.numeric(c(DX[1, i] %in% dmcx))) flag[1, 12] = pmax(flag[1, 12], as.numeric(c(DX[1, i] %in% hypothy))) flag[1, 13] = pmax(flag[1, 13], as.numeric(c(DX[1, i] %in% renlfail))) flag[1, 14] = pmax(flag[1, 14], as.numeric(c(DX[1, i] %in% liver))) flag[1, 15] = pmax(flag[1, 15], as.numeric(c(DX[1, i] %in% ulcer))) flag[1, 16] = pmax(flag[1, 16], as.numeric(c(DX[1, i] %in% aids))) flag[1, 17] = pmax(flag[1, 17], as.numeric(c(DX[1, i] %in% lymph))) flag[1, 18] = pmax(flag[1, 18], as.numeric(c(DX[1, i] %in% mets))) flag[1, 19] = pmax(flag[1, 19], as.numeric(c(DX[1, i] %in% tumor))) flag[1, 20] = pmax(flag[1, 20], as.numeric(c(DX[1, i] %in% arth))) flag[1, 21] = pmax(flag[1, 21], as.numeric(c(DX[1, i] %in% coag))) flag[1, 22] = pmax(flag[1, 22], as.numeric(c(DX[1, i] %in% obese))) flag[1, 23] = pmax(flag[1, 23], as.numeric(c(DX[1, i] %in% wghtloss))) flag[1, 24] = pmax(flag[1, 24], as.numeric(c(DX[1, i] %in% lytes))) flag[1, 25] = pmax(flag[1, 25], as.numeric(c(DX[1, i] %in% bldloss))) flag[1, 26] = pmax(flag[1, 26], as.numeric(c(DX[1, i] %in% anemdef))) flag[1, 27] = pmax(flag[1, 27], as.numeric(c(DX[1, i] %in% alcohol))) flag[1, 28] = pmax(flag[1, 28], as.numeric(c(DX[1, i] %in% drug))) flag[1, 29] = pmax(flag[1, 29], as.numeric(c(DX[1, i] %in% psych))) flag[1, 30] = pmax(flag[1, 30], as.numeric(c(DX[1, i] %in% depress))) ##### TMP ############################################################## tmp[1, 1] = pmax(tmp[1, 1], as.numeric(c(DX[1, i] %in% htnpreg))) tmp[1, 2] = pmax(tmp[1, 2], as.numeric(c(DX[1, i] %in% htnwochf))) tmp[1, 3] = pmax(tmp[1, 3], as.numeric(c(DX[1, i] %in% htnwchf))) tmp[1, 4] = pmax(tmp[1, 4], as.numeric(c(DX[1, i] %in% hrenworf))) tmp[1, 5] = pmax(tmp[1, 5], as.numeric(c(DX[1, i] %in% hrenwrf))) tmp[1, 6] = pmax(tmp[1, 6], as.numeric(c(DX[1, i] %in% hhrwohrf))) tmp[1, 7] = pmax(tmp[1, 7], as.numeric(c(DX[1, i] %in% hhrwchf))) tmp[1, 8] = pmax(tmp[1, 8], as.numeric(c(DX[1, i] %in% hhrwrf))) tmp[1, 9] = pmax(tmp[1, 9], as.numeric(c(DX[1, i] %in% hhrwhrf))) tmp[1, 10] = pmax(tmp[1, 10], as.numeric(c(DX[1, i] %in% ohtnpreg))) } ###### DRG ################################################################# drg = matrix(0, nrow(DRG), 24) drg[1, 1] = as.numeric(c(DRG %in% carddrg)) drg[1, 2] = as.numeric(c(DRG %in% peridrg)) drg[1, 3] = as.numeric(c(DRG %in% ceredrg)) drg[1, 4] = as.numeric(c(DRG %in% nervdrg)) drg[1, 5] = as.numeric(c(DRG %in% pulmdrg)) drg[1, 6] = as.numeric(c(DRG %in% diabdrg)) drg[1, 7] = as.numeric(c(DRG %in% hypodrg)) drg[1, 8] = as.numeric(c(DRG %in% renaldrg)) drg[1, 9] = as.numeric(c(DRG %in% renfdrg)) drg[1, 10] = as.numeric(c(DRG %in% liverdrg)) drg[1, 11] = as.numeric(c(DRG %in% ulcedrg)) drg[1, 12] = as.numeric(c(DRG %in% hivdrg)) drg[1, 13] = as.numeric(c(DRG %in% leukdrg)) drg[1, 14] = as.numeric(c(DRG %in% cancdrg)) drg[1, 15] = as.numeric(c(DRG %in% arthdrg)) drg[1, 16] = as.numeric(c(DRG %in% nutrdrg)) drg[1, 17] = as.numeric(c(DRG %in% anemdrg)) drg[1, 18] = as.numeric(c(DRG %in% alcdrg)) drg[1, 19] = as.numeric(c(DRG %in% htncxdrg)) drg[1, 20] = as.numeric(c(DRG %in% htndrg)) drg[1, 21] = as.numeric(c(DRG %in% coagdrg)) drg[1, 22] = as.numeric(c(DRG %in% psydrg)) drg[1, 23] = as.numeric(c(DRG %in% obesedrg)) drg[1, 24] = as.numeric(c(DRG %in% deprsdrg)) ############################################################################ for (i in 1:nrow(drg)) { if (tmp[1, 1] == 1 || tmp[1, 2] == 1 || tmp[1, 4] == 1 || tmp[1, 6] == 1) flag[1, 6] = 1 if (tmp[1, 3] == 1 || tmp[1, 7] == 1) { flag[1, 6] = 1 flag[1, 1] = 1 } if (tmp[1, 5] == 1 || tmp[1, 8] == 1) { flag[1, 6] = 1 flag[1, 13] = 1 } if (tmp[1, 9] == 1) { flag[1, 6] = 1 flag[1, 1] = 1 flag[1, 13] = 1 } if (tmp[1, 10] == 1) { flag[1, 6] = 1 } ######################################################################## #set up code to only count the more severe comorbidity ######################################################################## if (flag[1, 6] == 1) flag[1, 5] = 0 if (flag[1, 18] == 1) flag[1, 19] = 0 if (flag[1, 11] == 1) flag[1, 10] = 0 ######################################################################## # redefining comorbidities by eliminating the DRG directly related # to comorbidity, thus limiting the screens to principal # diagnoses not directly related to comorbidity in question ######################################################################## if (flag[1, 1] == 1 && drg[1, 1] == 1) flag[1, 1] = 0 if (flag[1, 2] == 1 && drg[1, 1] == 1) flag[1, 2] = 0 if (flag[1, 3] == 1 && max(drg[1, 1], drg[1, 5]) == 1) flag[1, 3] = 0 if (flag[1, 4] == 1 && drg[1, 2] == 1) flag[1, 4] = 0 if (flag[1, 5] == 1 && drg[1, 20] == 1) flag[1, 5] = 0 ######################################################################## # apply DRG exclusions to hypertension complicated, congestive heart # failure, and renal failure comorbidities using the detailed # hypertension flags created above ######################################################################## if (flag[1, 6] == 1 && drg[1, 19] == 1) flag[1, 6] = 0 if (tmp[1, 1] == 1 && drg[1, 19] == 1) flag[1, 6] = 0 if (tmp[1, 2] == 1 && max(drg[1, 1], drg[1, 19]) == 1) flag[1, 6] = 0 if (tmp[1, 3] == 1 && drg[1, 19] == 1) flag[1, 6] = 0 if (tmp[1, 3] == 1 && drg[1, 1] == 1) { flag[1, 6] = 0 flag[1, 1] = 0 } if (tmp[1, 4] == 1 && max(drg[1, 19], drg[1, 8]) == 1) flag[1, 6] = 0 if (tmp[1, 5] == 1 && drg[1, 19] == 1) { flag[1, 6] = 0 } if (tmp[1, 5] == 1 && drg[1, 8] == 1) { flag[1, 6] = 0 flag[1, 13] = 0 } if (tmp[1, 6] == 1 && max(drg[1, 19], drg[1, 1], drg[1, 8]) == 1) flag[1, 6] = 0 if (tmp[1, 7] == 1 && drg[1, 19] == 1) flag[1, 6] = 0 if (tmp[1, 7] == 1 && drg[1, 1] == 1) { flag[1, 6] = 0 flag[1, 1] = 0 } if (tmp[1, 7] == 1 && drg[1, 8] == 1) { flag[1, 6] = 0 } if (tmp[1, 8] == 1 && max(drg[1, 1], drg[1, 19]) == 1) flag[1, 6] = 0 if (tmp[1, 8] == 1 && drg[1, 8] == 1) { flag[1, 6] = 0 flag[1, 13] = 0 } if (tmp[1, 9] == 1 && drg[1, 19] == 1) { flag[1, 6] = 0 } if (tmp[1, 9] == 1 && drg[1, 1] == 1) { flag[1, 6] = 0 flag[1, 1] = 0 } if (tmp[1, 9] == 1 && drg[1, 8] == 1) { flag[1, 6] = 0 flag[1, 13] = 0 } if (tmp[1, 10] == 1 && max(drg[1, 19], drg[1, 1], drg[1, 8]) == 1) flag[1, 6] = 0 for (j in c(7:10)) { if (flag[1, j] == 1 && drg[1, j - 4] == 1) flag[1, j] = 0 } for (j in c(11:12)) { if (flag[1, j] == 1 && drg[1, j - 5] == 1) flag[1, j] = 0 } for (j in c(13:18)) { if (flag[1, j] == 1 && drg[1, j - 4] == 1) flag[1, j] = 0 } for (j in c(19:20)) { if (flag[1, j] == 1 && drg[1, j - 5] == 1) flag[1, j] = 0 } if (flag[1, 21] == 1 && drg[1, 21] == 1) flag[1, 21] = 0 if (flag[1, 22] == 1 && max(drg[1, 16], drg[1, 23]) == 1) flag[1, 22] = 0 if (flag[1, 23] == 1 && drg[1, 16] == 1) flag[1, 23] = 0 if (flag[1, 24] == 1 && drg[1, 16] == 1) flag[1, 24] = 0 if (flag[1, 25] == 1 && drg[1, 17] == 1) flag[1, 25] = 0 if (flag[1, 26] == 1 && drg[1, 17] == 1) flag[1, 26] = 0 if (flag[1, 27] == 1 && drg[1, 18] == 1) flag[1, 27] = 0 if (flag[1, 28] == 1 && drg[1, 18] == 1) flag[1, 28] = 0 if (flag[1, 29] == 1 && drg[1, 22] == 1) flag[1, 29] = 0 if (flag[1, 30] == 1 && drg[1, 24] == 1) flag[1, 30] = 0 ######################################################################## # combine HTN and HTNCX into HTN_C ######################################################################## flag[1, 5] = max(flag[1, 5], flag[1, 6]) } flag = flag[1, c(1:5, 7:30)] # final=matrix(, nrow(flag), 30 , # dimnames = c('ID', # 'CHF','VALVE','PULMCIRC','PERIVASC', # 'HTN_C','PARA','NEURO','CHRNLUNG','DM', # 'DMCX','HYPOTHY','RENLFAIL','LIVER','ULCER', # 'AIDS','LYMPH','METS','TUMOR','ARTH', # 'COAG','OBESE','WGHTLOSS','LYTES','BLDLOSS', # 'ANEMDEF','ALCOHOL','DRUG','PSYCH','DEPRESS') ) return(flag) } -- View this message in context: http://r.789695.n4.nabble.com/AHRQ-Creation-of-Comorbidity-Variables-tp2529997p2529997.html Sent from the R help mailing list archive at Nabble.com. ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.