Practical Examples with Eunomia

Introduction

This vignette shows realistic package usage against Eunomia without assuming any API that the package does not expose. The examples use two cohort definitions already available in a cohort table:

Connect to Eunomia

library(OdysseusSurvivalModule)
library(DatabaseConnector)
library(Eunomia)

connectionDetails <- Eunomia::getEunomiaConnectionDetails()
connection <- DatabaseConnector::connect(connectionDetails)

cdmDatabaseSchema <- Eunomia::getEunomiaCdmDatabaseSchema()
cohortDatabaseSchema <- Eunomia::getEunomiaResultsSchema()

Example 1: Build a Survival Dataset

survivalData <- OdysseusSurvivalModule:::addCohortSurvival(
  connection = connection,
  cdmDatabaseSchema = cdmDatabaseSchema,
  cohortDatabaseSchema = cohortDatabaseSchema,
  targetCohortTable = "cohort",
  targetCohortId = 1,
  outcomeCohortTable = "cohort",
  outcomeCohortId = 2,
  followUpDays = 365,
  includeAge = TRUE,
  includeGender = TRUE
)

head(survivalData)

Example 2: Overall Kaplan-Meier Summary

kmOverall <- singleEventSurvival(
  survivalData = survivalData,
  timeScale = "days",
  model = "km"
)

kmOverall[["overall"]]$summary
head(kmOverall[["overall"]]$data)

Example 3: Compare Gender Groups

kmGender <- singleEventSurvival(
  survivalData = survivalData,
  timeScale = "days",
  model = "km",
  strata = "gender"
)

kmGender[["gender=Female"]]$summary
kmGender[["gender=Male"]]$summary
kmGender$logrank_test_gender

Example 4: Compare Age Groups

kmAge <- singleEventSurvival(
  survivalData = survivalData,
  timeScale = "days",
  model = "km",
  strata = "age_group",
  ageBreaks = list(c(18, 49), c(50, 64), c(65, Inf))
)

kmAge[["age_group=18-49"]]$summary
kmAge[["age_group=50-64"]]$summary
kmAge[["age_group=65+"]]$summary
kmAge$logrank_test_age_group

Example 5: Compare Model Families

modelNames <- c("km", "cox", "weibull", "lognormal")

fits <- lapply(modelNames, function(modelName) {
  singleEventSurvival(
    survivalData = survivalData,
    timeScale = "days",
    model = modelName,
    covariates = if (modelName == "km") NULL else c("age_years")
  )
})
names(fits) <- modelNames

summaryTable <- data.frame(
  model = names(fits),
  medianSurvival = vapply(fits, function(x) x[["overall"]]$summary$medianSurvival, numeric(1)),
  meanSurvival = vapply(fits, function(x) x[["overall"]]$summary$meanSurvival, numeric(1)),
  stringsAsFactors = FALSE
)

summaryTable

Example 6: Produce a Simple Report Table

reportTable <- data.frame(
  group = c("Overall", "Female", "Male"),
  n = c(
    kmGender[["overall"]]$summary$n,
    kmGender[["gender=Female"]]$summary$n,
    kmGender[["gender=Male"]]$summary$n
  ),
  events = c(
    kmGender[["overall"]]$summary$events,
    kmGender[["gender=Female"]]$summary$events,
    kmGender[["gender=Male"]]$summary$events
  ),
  medianSurvival = c(
    kmGender[["overall"]]$summary$medianSurvival,
    kmGender[["gender=Female"]]$summary$medianSurvival,
    kmGender[["gender=Male"]]$summary$medianSurvival
  ),
  stringsAsFactors = FALSE
)

reportTable

Example 7: Plot from Returned Data

plot(
  kmGender[["gender=Female"]]$data$time,
  kmGender[["gender=Female"]]$data$survival,
  type = "s",
  col = "firebrick",
  xlab = "Time (days)",
  ylab = "Survival probability",
  ylim = c(0, 1),
  main = "Kaplan-Meier curve by gender"
)

lines(
  kmGender[["gender=Male"]]$data$time,
  kmGender[["gender=Male"]]$data$survival,
  type = "s",
  col = "steelblue"
)

Cleanup

DatabaseConnector::disconnect(connection)

Summary

The practical Eunomia workflow is:

  1. Connect to Eunomia.
  2. Use prebuilt target and outcome cohorts.
  3. Build a survival dataset with the internal helper.
  4. Fit one or more models with singleEventSurvival().
  5. Read results from named list entries and their data and summary fields.