--- title: "Getting Started with OdysseusSurvivalModule" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Getting Started with OdysseusSurvivalModule} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>", eval = FALSE ) ``` ## Introduction OdysseusSurvivalModule supports a two-step workflow: 1. Build a subject-level survival dataset from OMOP CDM cohorts. 2. Estimate survival curves from that dataset with `singleEventSurvival()`. This vignette uses Eunomia as the example CDM and focuses on the package API as it exists today. ## Package Surface The exported function is `singleEventSurvival()`. The cohort-to-survival-data helper, `addCohortSurvival()`, is currently internal, so vignette examples call it with `:::`. ```{r setup} library(OdysseusSurvivalModule) library(DatabaseConnector) library(Eunomia) ``` ## Connect to Eunomia ```{r eunomia-setup} connectionDetails <- Eunomia::getEunomiaConnectionDetails() connection <- DatabaseConnector::connect(connectionDetails) cdmDatabaseSchema <- Eunomia::getEunomiaCdmDatabaseSchema() cohortDatabaseSchema <- Eunomia::getEunomiaResultsSchema() ``` ## Prerequisite: Target and Outcome Cohorts `addCohortSurvival()` does not create cohorts from concept IDs. It expects existing target and outcome cohort tables. In a typical OHDSI workflow, those cohorts are created ahead of time with ATLAS, Circe, or custom SQL and stored in the cohort results schema. For the examples below, assume a table named `cohort` exists in the Eunomia results schema and contains: - target cohort definition `1` - outcome cohort definition `2` ## Build Survival Data ```{r build-survival} survivalData <- OdysseusSurvivalModule:::addCohortSurvival( connection = connection, cdmDatabaseSchema = cdmDatabaseSchema, cohortDatabaseSchema = cohortDatabaseSchema, targetCohortTable = "cohort", targetCohortId = 1, outcomeCohortTable = "cohort", outcomeCohortId = 2, outcomeDateVariable = "cohort_start_date", followUpDays = 365, includeAge = TRUE, includeGender = TRUE ) head(survivalData) ``` The resulting data frame contains `subject_id`, `time`, and `status`, with optional `age_years` and `gender` columns when requested. ## Fit a Kaplan-Meier Model ```{r km-fit} kmFit <- singleEventSurvival( survivalData = survivalData, timeScale = "days", model = "km", strata = "gender", confInt = 0.95 ) names(kmFit) kmFit[["overall"]]$summary kmFit[["gender=Female"]]$summary kmFit$logrank_test_gender ``` The returned object is a named list. Each stratum entry contains: - `data`: survival step data - `summary`: aggregate statistics such as median and mean survival When `strata = "gender"`, the list includes entries such as `gender=Female` and `gender=Male`, plus `overall`. ## Inspect the Returned Data ```{r inspect-output} overall_curve <- kmFit[["overall"]]$data female_curve <- kmFit[["gender=Female"]]$data head(overall_curve) head(female_curve) ``` Each `data` table contains stepwise survival information, including `time`, `n_risk`, `n_event`, `survival`, `hazard`, and cumulative event counts. ## Plot a Returned Curve `singleEventSurvival()` returns tabular survival output rather than a `survfit` object, so plotting is done from the returned `data` frame. ```{r plot-km} plot( kmFit[["overall"]]$data$time, kmFit[["overall"]]$data$survival, type = "s", xlab = "Time (days)", ylab = "Survival probability", main = "Overall Kaplan-Meier curve" ) ``` ## Fit Cox and Parametric Models The `model` argument supports `"km"`, `"cox"`, `"weibull"`, `"exponential"`, `"lognormal"`, and `"loglogistic"`. ```{r other-models} coxFit <- singleEventSurvival( survivalData = survivalData, timeScale = "days", model = "cox", covariates = c("age_years"), confInt = 0.95 ) weibullFit <- singleEventSurvival( survivalData = survivalData, timeScale = "days", model = "weibull", covariates = c("age_years") ) coxFit[["overall"]]$summary weibullFit[["overall"]]$summary ``` For Cox and parametric models, the function still returns survival summaries and step data. It does not return a coefficient table or hazard-ratio table. ## Cleanup ```{r cleanup} DatabaseConnector::disconnect(connection) ``` ## Summary The core workflow is: 1. Prepare target and outcome cohorts in Eunomia. 2. Build subject-level survival data with `OdysseusSurvivalModule:::addCohortSurvival()`. 3. Fit survival models with `singleEventSurvival()`. 4. Work with the returned `data` and `summary` components directly.