## ----include = FALSE---------------------------------------------------------- knitr::opts_chunk$set( collapse = TRUE, comment = "#>" ) ## ----setup, eval=FALSE-------------------------------------------------------- # library(OdysseusPathwayModule) # library(Eunomia) # # connectionDetails <- Eunomia::getEunomiaConnectionDetails() ## ----cohorts, eval=FALSE------------------------------------------------------ # generationSet <- Eunomia::createCohorts(connectionDetails) # # generationSet ## ----post_index, eval=FALSE--------------------------------------------------- # postIndexResults <- executeCohortPathways( # connectionDetails = connectionDetails, # cohortDatabaseSchema = "main", # cohortTableName = "cohort", # targetCohortIds = 4, # eventCohortIds = c(1, 2, 3), # maxDepth = 3, # collapseWindow = 30 # ) ## ----post_index_names, eval=FALSE--------------------------------------------- # names(postIndexResults) ## ----post_index_inspect, eval=FALSE------------------------------------------- # head(postIndexResults$pathwaysAnalysisPathsData) # head(postIndexResults$pathwayAnalysisCodesLong) ## ----pre_index, eval=FALSE---------------------------------------------------- # preIndexResults <- executeCohortPathways( # connectionDetails = connectionDetails, # cohortDatabaseSchema = "main", # cohortTableName = "cohort", # targetCohortIds = 4, # eventCohortIds = c(1, 2, 3), # analysisType = "pre-index", # lookbackStartDay = -365, # lookbackEndDay = -1, # maxDepth = 3, # collapseWindow = 30 # ) ## ----pre_index_90, eval=FALSE------------------------------------------------- # preIndex90 <- executeCohortPathways( # connectionDetails = connectionDetails, # cohortDatabaseSchema = "main", # cohortTableName = "cohort", # targetCohortIds = 4, # eventCohortIds = c(1, 2, 3), # analysisType = "pre-index", # lookbackStartDay = -90, # lookbackEndDay = -1, # maxDepth = 3 # ) ## ----code_mapping, eval=FALSE------------------------------------------------- # subset( # postIndexResults$pathwayAnalysisCodesLong, # select = c(pathwayAnalysisGenerationId, code, targetCohortId, eventCohortId, isCombo, numberOfEvents) # ) ## ----separate_tables, eval=FALSE---------------------------------------------- # connection <- DatabaseConnector::connect(connectionDetails) # # DatabaseConnector::executeSql(connection, "DROP TABLE IF EXISTS target_cohorts;") # DatabaseConnector::executeSql(connection, "DROP TABLE IF EXISTS event_cohorts;") # # DatabaseConnector::executeSql( # connection, # "CREATE TABLE target_cohorts AS # SELECT * # FROM main.cohort # WHERE cohort_definition_id = 4;" # ) # # DatabaseConnector::executeSql( # connection, # "CREATE TABLE event_cohorts AS # SELECT * # FROM main.cohort # WHERE cohort_definition_id IN (1, 2, 3);" # ) # # resultsSeparateTables <- executeCohortPathways( # connectionDetails = connectionDetails, # cohortDatabaseSchema = "main", # cohortTableName = "target_cohorts", # outcomeDatabaseSchema = "main", # outcomeTableName = "event_cohorts", # targetCohortIds = 4, # eventCohortIds = c(1, 2, 3) # ) # # DatabaseConnector::disconnect(connection) ## ----esg_mock_data, eval=FALSE------------------------------------------------ # # --- Mock cpResults with multi-step pathways --- # # Bitmask combo codes: 2 = Celecoxib, 4 = Diclofenac, 8 = GiBleed # mockPathsData <- data.frame( # pathwayAnalysisGenerationId = rep(1L, 5), # targetCohortId = rep(4L, 5), # step1 = c( 2L, 2L, 4L, 4L, 2L), # step2 = c( 4L, 8L, 2L, 8L, NA), # step3 = c( 8L, NA, 8L, NA, NA), # countValue = c(120L, 80L, 95L, 65L, 40L) # ) # # mockCodesLong <- data.frame( # pathwayAnalysisGenerationId = rep(1L, 3), # code = c(2L, 4L, 8L), # targetCohortId = rep(4L, 3), # eventCohortId = c(1L, 2L, 3L), # isCombo = rep(0L, 3), # numberOfEvents = rep(1L, 3) # ) # # mockIsCombo <- data.frame( # targetCohortId = rep(4L, 3), # comboId = c(2L, 4L, 8L), # numberOfEvents = rep(1L, 3), # isCombo = rep(0L, 3) # ) # # mockCpResults <- list( # pathwayAnalysisStatsData = data.frame( # pathwayAnalysisGenerationId = 1L, # targetCohortId = 4L, # countValue = 400L # ), # pathwaysAnalysisPathsData = mockPathsData, # pathwaysAnalysisEventsData = data.frame(eventCohortId = 1:3, countValue = c(240L, 215L, 360L)), # pathwaycomboIds = data.frame(comboIds = c(2L, 4L, 8L)), # pathwayAnalysisCodesLong = mockCodesLong, # isCombo = mockIsCombo, # pathwayAnalysisCodesData = data.frame( # pathwayAnalysisGenerationId = rep(1L, 3), # code = c(2L, 4L, 8L), # isCombo = rep(0L, 3) # ) # ) ## ----event_sequence_graph, eval=FALSE----------------------------------------- # # Map cohort IDs to human-readable names # generationSet <- data.frame( # cohortId = c(1L, 2L, 3L, 4L), # cohortName = c("Celecoxib", "Diclofenac", "GiBleed", "NSAIDs") # ) # # esg <- buildEventSequenceGraph( # cpResults = mockCpResults, # generationSet = generationSet, # maxSteps = 3, # minCount = 1 # ) # # # Print a summary # esg ## ----esg_real_note, eval=FALSE------------------------------------------------ # # With real data: # # generationSet <- Eunomia::createCohorts(connectionDetails) # # generationSet$cohortName <- generationSet$name # # # # esg <- buildEventSequenceGraph( # # cpResults = postIndexResults, # # generationSet = generationSet, # # maxSteps = 3, # # minCount = 5 # # ) ## ----graph_components, eval=FALSE--------------------------------------------- # # The igraph object — vertices are (event, step) pairs, edges are transitions # ig <- esg$graph # # # Vertex attributes # igraph::V(ig)$eventName # human-readable event names # igraph::V(ig)$step # pathway step number # igraph::V(ig)$count # patient count at this node # igraph::V(ig)$share # share within the step (sums to 1) # # # Edge attributes # igraph::E(ig)$weight # patient count crossing this transition # igraph::E(ig)$probability # transition probability (sums to 1 per source) # igraph::E(ig)$sourceStep # igraph::E(ig)$targetStep # # # Decoded pathways # head(esg$sequences) # # # Summary statistics # esg$summary ## ----plot_esg, eval=FALSE----------------------------------------------------- # # Default plot # plot(esg) # # # Customized plot # plot(esg, # colorPalette = c("#1b9e77", "#d95f02", "#7570b3"), # edgeWidthRange = c(1, 10), # vertexSizeRange = c(10, 30), # main = "Post-Index Treatment Pathways" # ) ## ----transition_probs, eval=FALSE--------------------------------------------- # # Extract edge data frame # edgeDf <- igraph::as_data_frame(esg$graph, what = "edges") # # # View transitions from Step 1 to Step 2 # edgeDf[edgeDf$sourceStep == 1, ] ## ----igraph_analysis, eval=FALSE---------------------------------------------- # ig <- esg$graph # # # Out-degree: how many distinct next-step events each node leads to # igraph::degree(ig, mode = "out") # # # Weighted betweenness (inverse weight = lower traffic → higher betweenness) # igraph::betweenness(ig, weights = 1 / igraph::E(ig)$weight) # # # Shortest weighted paths between all pairs # igraph::distances(ig, weights = 1 / igraph::E(ig)$weight) # # # Identify hubs and authorities (HITS) # igraph::hub_score(ig, weights = igraph::E(ig)$weight)$vector # igraph::authority_score(ig, weights = igraph::E(ig)$weight)$vector # # # Export to data frames for use outside igraph # vertDf <- igraph::as_data_frame(ig, what = "vertices") # edgeDf <- igraph::as_data_frame(ig, what = "edges")