Reading in Data

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

Inclusion and Exclusion Criteria

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

Replace boolean missing with 0

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.

Missingness

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.

Completeness for Predictor: Time to First Defibrillation

## 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.

Preliminary Data

FIRSTPULSELESSRHYTHM

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')

Age

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

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

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

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

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")