library(dplyr)
library(readr)
library(ggplot2)
data <- read.csv("GWTG/Resuscitation/v4_bootcamp-gwtg-resus/data/bootcamp_2024_02_gwtg_resus_cpa.csv",header = T)
data = data %>% mutate(Unique_ID = paste(PATIENT_DISPLAY_ID,"-",SITE_DISPLAY_ID))
The data was read in and a unique ID was created by combining the variables PATIENT_DISPLAY_ID and SITE_DISPLAY_ID, with a - inbetween
Heart <- data %>%
filter(SUBJECTTYPE == 3) %>%
filter(ILLNESSCATEGORY == 3) %>%
filter(DNARORDER != 1) %>%
filter(EXCLUDE1 != 1) %>%
filter(EVENTLOCATION %in% c(1,2,3,4,6,7,8,11,13,14,15,16)) %>%
filter(INITIALCONDITION_COMPRESSIONS != 2) %>%
filter(CPAAGE >= 18) %>%
filter(CPAAGE <= 100) %>%
select(Unique_ID, EVENT_ID, DISCHARGEDISPOSITION, REASONRESUSENDED, RACE_ETHN, COMPRESSDATETIME, ANYROSV, CPAAGE, SUBJECTTYPE, ILLNESSCATEGORY, EVENTLOCATION, EVENTWITNESSED, HOSPITALWIDERESPONSEACTIVATED, INITIALCONDITION, INITIALCONDITION_COMPRESSIONS, PULSERHYTHM, FIRSTPULSELESSRHYTHM, ANYVFPVT, DEFIB, NUMDEFIBSHOCKS, EPINEPHRINEBOLUS, VASOPRESSINBOLUS, DRUG_ANYVASOPRESSOR, DRUG_DOBUTAMINE, DRUG_NOREPINEPHRINE, DRUG_PHENYLEPHRINE, DRUG_CACLGLUC, DRUG_SODIUMBICARBONATE, DRUG_MAGNESIUMSULFATE, NONDRUG_CARDIOPULMONARYBYPASS, NONDRUG_CHESTTUBE, NONDRUG_PACEMAKERTRANSCUT, NONDRUG_PACEMAKERTRANSVOREPI, NONDRUG_PERIOCARDIOCENTESIS, NONDRUG_THORACENTESIS, PRIOR24ICUDISCHARGE, PEC_ACUTECNSNONSTROKEEVENT, PEC_ACUTESTROKE, PEC_CARDIACMALFORMATIONACY, PEC_CARDIACMALFORMATIONCYA, PEC_CHFTHISADMISSION, PEC_CHFPRIORADMISSION, PEC_DIABETESMELLITUS, PEC_HEPATICINSUFFICIENCY, PEC_HYPOTENSIONHYPOPERFUSION, PEC_PNEUMONIA, PEC_RENALINSUFFICIENCY, PEC_RESPIRATORYINSUFFICIENCY, PEC_SEPTICEMIA, ECPROCACT, CANULSUC, NOSHOCK2MIN,DRUG_AMIODARONE,DRUG_LIDOCAINE,EPINEPHRINEBOLUSNUMDOSES, IVIO_EPI_BOLUS, IVIO_VAS_BOLUS, PULSELESSDATETIME)
Heart <- Heart %>%
group_by(Unique_ID) %>%
mutate(MultipleCPR = n() > 1) %>%
ungroup()
Heart = Heart %>% arrange(Unique_ID, EVENT_ID)
Duplicates = Heart %>% group_by(Unique_ID) %>% filter(n() > 1)
last_duplicates = Duplicates %>% group_by(Unique_ID) %>% slice(n())
Heart <- Heart %>% anti_join(Duplicates)
Heart = rbind(Heart,last_duplicates)
Heart <- Heart %>% mutate(MultipleCPR = ifelse(MultipleCPR == TRUE, 'Yes', 'No'))
dim(Heart)
## [1] 3340 59
The following inclusion and exclusion criteria was applied:
The variables were subset to 56 variables of interest. Using the new Unique_ID variable, the variable Multiple_CPR was created which is a yes/no variable indicating if there are multiple instances of getting CPR for that unique patient, and the last instance of CPR is used as their one observation. In every case, these instances were at most a few hours apart. After all of the filtering, we are left with 3340 observations
Heart$DRUG_ANYVASOPRESSOR[is.na(Heart$DRUG_ANYVASOPRESSOR)] <- 0
Heart$DRUG_DOBUTAMINE[is.na(Heart$DRUG_DOBUTAMINE)] <- 0
Heart$DRUG_NOREPINEPHRINE[is.na(Heart$DRUG_NOREPINEPHRINE)] <- 0
Heart$DRUG_PHENYLEPHRINE[is.na(Heart$DRUG_PHENYLEPHRINE)] <- 0
Heart$DRUG_CACLGLUC[is.na(Heart$DRUG_CACLGLUC)] <- 0
Heart$DRUG_SODIUMBICARBONATE[is.na(Heart$DRUG_SODIUMBICARBONATE)] <- 0
Heart$DRUG_MAGNESIUMSULFATE[is.na(Heart$DRUG_MAGNESIUMSULFATE)] <- 0
Heart$NONDRUG_CARDIOPULMONARYBYPASS[is.na(Heart$NONDRUG_CARDIOPULMONARYBYPASS)] <- 0
Heart$NONDRUG_CHESTTUBE[is.na(Heart$NONDRUG_CHESTTUBE)] <- 0
Heart$NONDRUG_PACEMAKERTRANSCUT[is.na(Heart$NONDRUG_PACEMAKERTRANSCUT)] <- 0
Heart$NONDRUG_PACEMAKERTRANSVOREPI[is.na(Heart$NONDRUG_PACEMAKERTRANSVOREPI)] <- 0
Heart$NONDRUG_PERIOCARDIOCENTESIS[is.na(Heart$NONDRUG_PERIOCARDIOCENTESIS)] <- 0
Heart$NONDRUG_THORACENTESIS[is.na(Heart$NONDRUG_THORACENTESIS)] <- 0
Heart$PEC_ACUTECNSNONSTROKEEVENT[is.na(Heart$PEC_ACUTECNSNONSTROKEEVENT)] <- 0
Heart$PEC_ACUTESTROKE[is.na(Heart$PEC_ACUTESTROKE)] <- 0
Heart$PEC_CARDIACMALFORMATIONACY[is.na(Heart$PEC_CARDIACMALFORMATIONACY)] <- 0
Heart$PEC_CARDIACMALFORMATIONCYA[is.na(Heart$PEC_CARDIACMALFORMATIONCYA)] <- 0
Heart$PEC_CHFTHISADMISSION[is.na(Heart$PEC_CHFTHISADMISSION)] <- 0
Heart$PEC_CHFPRIORADMISSION[is.na(Heart$PEC_CHFPRIORADMISSION)] <- 0
Heart$PEC_DIABETESMELLITUS[is.na(Heart$PEC_DIABETESMELLITUS)] <- 0
Heart$PEC_HEPATICINSUFFICIENCY[is.na(Heart$PEC_HEPATICINSUFFICIENCY)] <- 0
Heart$PEC_HYPOTENSIONHYPOPERFUSION[is.na(Heart$PEC_HYPOTENSIONHYPOPERFUSION)] <- 0
Heart$PEC_PNEUMONIA[is.na(Heart$PEC_PNEUMONIA)] <- 0
Heart$PEC_RENALINSUFFICIENCY[is.na(Heart$PEC_RENALINSUFFICIENCY)] <- 0
Heart$PEC_RESPIRATORYINSUFFICIENCY[is.na(Heart$PEC_RESPIRATORYINSUFFICIENCY)] <- 0
Heart$PEC_SEPTICEMIA[is.na(Heart$PEC_SEPTICEMIA)] <- 0
Heart$ECPROCACT[is.na(Heart$ECPROCACT)] <- 0
Heart$DRUG_AMIODARONE[is.na(Heart$DRUG_AMIODARONE)] <- 0
Heart$DRUG_LIDOCAINE[is.na(Heart$DRUG_LIDOCAINE)] <- 0
Each Boolean variable has either a 1 indicating yes, or missing indicating no. Here we replace every boolean variable missing value with 0.
Missing.Percentage = sapply(Heart, function(x) paste(round(sum(is.na(x))/nrow(Heart),4)*100,"%"))
Missing.Percentage
## Unique_ID EVENT_ID
## "0 %" "0 %"
## DISCHARGEDISPOSITION REASONRESUSENDED
## "0.03 %" "0 %"
## RACE_ETHN COMPRESSDATETIME
## "0 %" "0 %"
## ANYROSV CPAAGE
## "2.49 %" "0 %"
## SUBJECTTYPE ILLNESSCATEGORY
## "0 %" "0 %"
## EVENTLOCATION EVENTWITNESSED
## "0 %" "0 %"
## HOSPITALWIDERESPONSEACTIVATED INITIALCONDITION
## "0.03 %" "0 %"
## INITIALCONDITION_COMPRESSIONS PULSERHYTHM
## "0 %" "94.04 %"
## FIRSTPULSELESSRHYTHM ANYVFPVT
## "1.98 %" "0.03 %"
## DEFIB NUMDEFIBSHOCKS
## "54.37 %" "57.43 %"
## EPINEPHRINEBOLUS VASOPRESSINBOLUS
## "99.79 %" "99.79 %"
## DRUG_ANYVASOPRESSOR DRUG_DOBUTAMINE
## "0 %" "0 %"
## DRUG_NOREPINEPHRINE DRUG_PHENYLEPHRINE
## "0 %" "0 %"
## DRUG_CACLGLUC DRUG_SODIUMBICARBONATE
## "0 %" "0 %"
## DRUG_MAGNESIUMSULFATE NONDRUG_CARDIOPULMONARYBYPASS
## "0 %" "0 %"
## NONDRUG_CHESTTUBE NONDRUG_PACEMAKERTRANSCUT
## "0 %" "0 %"
## NONDRUG_PACEMAKERTRANSVOREPI NONDRUG_PERIOCARDIOCENTESIS
## "0 %" "0 %"
## NONDRUG_THORACENTESIS PRIOR24ICUDISCHARGE
## "0 %" "99.79 %"
## PEC_ACUTECNSNONSTROKEEVENT PEC_ACUTESTROKE
## "0 %" "0 %"
## PEC_CARDIACMALFORMATIONACY PEC_CARDIACMALFORMATIONCYA
## "0 %" "0 %"
## PEC_CHFTHISADMISSION PEC_CHFPRIORADMISSION
## "0 %" "0 %"
## PEC_DIABETESMELLITUS PEC_HEPATICINSUFFICIENCY
## "0 %" "0 %"
## PEC_HYPOTENSIONHYPOPERFUSION PEC_PNEUMONIA
## "0 %" "0 %"
## PEC_RENALINSUFFICIENCY PEC_RESPIRATORYINSUFFICIENCY
## "0 %" "0 %"
## PEC_SEPTICEMIA ECPROCACT
## "0 %" "0 %"
## CANULSUC NOSHOCK2MIN
## "98.89 %" "86.02 %"
## DRUG_AMIODARONE DRUG_LIDOCAINE
## "0 %" "0 %"
## EPINEPHRINEBOLUSNUMDOSES IVIO_EPI_BOLUS
## "21.86 %" "0.87 %"
## IVIO_VAS_BOLUS PULSELESSDATETIME
## "99.76 %" "0 %"
## MultipleCPR
## "0 %"
The values above indicate the percentage of the variable that is missing. Some variables contain too much missing data to allow any imputation or further speculation on. As seen above, these variables are EPINEPHRINEBOLUS, CANULSUC, IVIO_VAS_BOLUS, PULSERHYTHM, NUMDEFIBSHOCKS, VASOPRESSINBOLUS, PRIOR24ICUDISCHARGE, and NOSHOCK2MIN all have over half of their data missing. These will not be used evaluated as potential predictors in our model.
## Time_Until_Defib
## "2.69 %"
We demonstrated our ability to merge data from two different databases in the GWTG-R registry by acquiring the “time until first defib” variable from the defibrillation database. Note that the data is complete and only 2.69% of data points are missing.
New_Heart = Heart
New_Heart$DISCHARGEDISPOSITION = as.factor(New_Heart$DISCHARGEDISPOSITION)
FIRSTPULSELESSRHYTHM_table = as.data.frame(table(New_Heart$DISCHARGEDISPOSITION,New_Heart$FIRSTPULSELESSRHYTHM))
ggplot(FIRSTPULSELESSRHYTHM_table, aes(x = Freq, y = Var2, fill = Var1)) + geom_col(color = 'black') + labs(x = "Proportion of death/survived", y = "Count") + theme_minimal() + ggtitle('First Pulse Rhythm count')
ggplot(FIRSTPULSELESSRHYTHM_table, aes(x = Freq, y = Var2, fill = Var1)) + geom_col(position = "fill",color = 'black') + labs(x = "Proportion of death/survived", y = "First Pulse Rhythm") + scale_x_continuous(expand = expansion(mult = c(0, .1))) + scale_fill_brewer(palette = "Paired", guide = guide_legend(title = NULL, reverse = TRUE)) + theme_minimal() + theme(legend.position = "top") + ggtitle('First Pulse Rhythm vs outcome')
tester_heart <- New_Heart[complete.cases(New_Heart$DISCHARGEDISPOSITION), ]
ggplot(tester_heart,aes(x = CPAAGE, fill = as.factor(DISCHARGEDISPOSITION))) + geom_density(alpha = .5) + theme_minimal() + labs(x = 'Age',y = 'density') + guides(fill=guide_legend(title="Outcome"))
Initial_condition_table = as.data.frame(table(New_Heart$DISCHARGEDISPOSITION,New_Heart$INITIALCONDITION))
ggplot(Initial_condition_table, aes(x = Freq, y = Var2, fill = Var1)) + geom_col(color = 'black') + labs(x = "Proportion of death/survived", y = "Count") + theme_minimal() + ggtitle('Inital conditon count')
ggplot(Initial_condition_table, aes(x = Freq, y = Var2, fill = Var1)) + geom_col(position = "fill",color = 'black') + labs(x = "Proportion of death/survived", y = "Initial condition") + scale_x_continuous(expand = expansion(mult = c(0, .1))) + scale_fill_brewer(palette = "Paired", guide = guide_legend(title = NULL, reverse = TRUE)) + theme_minimal() + theme(legend.position = "top") + ggtitle('Inital conditon vs outcome')
ANYVFPVT_table = as.data.frame(table(New_Heart$DISCHARGEDISPOSITION,New_Heart$ANYVFPVT))
ggplot(ANYVFPVT_table, aes(x = Freq, y = Var2, fill = Var1)) + geom_col(color = 'black') + labs(x = "Proportion of death/survived", y = "Count") + theme_minimal() + ggtitle('ANYVFPVT count')
ggplot(ANYVFPVT_table, aes(x = Freq, y = Var2, fill = Var1)) + geom_col(position = "fill",color = 'black') + labs(x = "Proportion of death/survived", y = "ANYVFPVT") + scale_x_continuous(expand = expansion(mult = c(0, .1))) + scale_fill_brewer(palette = "Paired", guide = guide_legend(title = NULL, reverse = TRUE)) + theme_minimal() + theme(legend.position = "top") + ggtitle('ANYVFPVT vs outcome')
PEC_RENALINSUFFICIENCY_table = as.data.frame(table(New_Heart$DISCHARGEDISPOSITION,New_Heart$PEC_RENALINSUFFICIENCY))
ggplot(PEC_RENALINSUFFICIENCY_table, aes(x = Freq, y = Var2, fill = Var1)) + geom_col(color = 'black') + labs(x = "Proportion of death/survived", y = "Count") + theme_minimal() + ggtitle('PEC_RENALINSUFFICIENCY count')
ggplot(PEC_RENALINSUFFICIENCY_table, aes(x = Freq, y = Var2, fill = Var1)) + geom_col(position = "fill",color = 'black') + labs(x = "Proportion of death/survived", y = "PEC_RENALINSUFFICIENCY") + scale_x_continuous(expand = expansion(mult = c(0, .1))) + scale_fill_brewer(palette = "Paired", guide = guide_legend(title = NULL, reverse = TRUE)) + theme_minimal() + theme(legend.position = "top") + ggtitle('PEC_RENALINSUFFICIENCY vs outcome')
Multiple_CPR_table = as.data.frame(table(New_Heart$DISCHARGEDISPOSITION,New_Heart$MultipleCPR))
ggplot(Multiple_CPR_table, aes(x = Freq, y = Var2, fill = Var1)) + geom_col(color = 'black') + labs(x = "Proportion of death/survived", y = "Count") + theme_minimal() + ggtitle('Multiple CPR count')
ggplot(Multiple_CPR_table, aes(x = Freq, y = Var2, fill = Var1)) + geom_col(position = "fill",color = 'black') + labs(x = "Proportion of death/survived", y = "Multiple CPR") + scale_x_continuous(expand = expansion(mult = c(0, .1))) + scale_fill_brewer(palette = "Paired", guide = guide_legend(title = NULL, reverse = TRUE)) + theme_minimal() + theme(legend.position = "top")