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.