tests/testthat/test-singleEventSurvival.R

test_that("singleEventSurvival validates required columns", {
  bad <- data.frame(subject_id = 1:3, time = c(1, 2, 3))

  expect_error(
    OdysseusSurvivalModule:::singleEventSurvival(bad),
    "must contain: subject_id, time, status"
  )
})


test_that("singleEventSurvival returns expected overall structure for KM", {
  df <- data.frame(
    subject_id = 1:10,
    time = c(5, 8, 12, 20, 30, 9, 15, 21, 25, 40),
    status = c(1, 0, 1, 1, 0, 1, 0, 1, 0, 1)
  )

  out <- OdysseusSurvivalModule:::singleEventSurvival(
    survivalData = df,
    timeScale = "days",
    model = "km"
  )

  expect_s3_class(out, "singleEventSurvival")
  expect_true("overall" %in% names(out))
  expect_true(all(c("data", "summary") %in% names(out$overall)))
  expect_true(all(c("time", "n_risk", "n_event", "survival") %in% names(out$overall$data)))
  expect_equal(out$overall$summary$n, nrow(df))
})


test_that("singleEventSurvival supports gender and age_group strata", {
  df <- data.frame(
    subject_id = 1:12,
    time = c(5, 8, 12, 20, 30, 9, 15, 21, 25, 40, 18, 27),
    status = c(1, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0),
    gender = c("Male", "Male", "Female", "Female", "Male", "Female", "Male", "Female", "Male", "Female", "Male", "Female"),
    age_years = c(22, 35, 41, 59, 66, 28, 47, 73, 52, 61, 19, 45)
  )

  out <- OdysseusSurvivalModule:::singleEventSurvival(
    survivalData = df,
    model = "km",
    strata = c("gender", "age_group"),
    ageBreaks = list(c(18, 44), c(45, 64), c(65, Inf))
  )

  expect_true("overall" %in% names(out))
  expect_true(any(grepl("^gender=", names(out))))
  expect_true(any(grepl("^age_group=", names(out))))
  expect_true("logrank_test_gender" %in% names(out))
  expect_true("logrank_test_age_group" %in% names(out))
  expect_true(all(out$logrank_test_gender$testType == "pairwise"))
  expect_true(all(out$logrank_test_age_group$testType == "pairwise"))
})


test_that("singleEventSurvival requires age_years for age_group strata", {
  df <- data.frame(
    subject_id = 1:6,
    time = c(3, 5, 7, 9, 11, 13),
    status = c(1, 0, 1, 0, 1, 0)
  )

  expect_error(
    OdysseusSurvivalModule:::singleEventSurvival(
      survivalData = df,
      model = "km",
      strata = c("age_group")
    ),
    "age_years"
  )
})


test_that("singleEventSurvival supports parametric model output", {
  df <- data.frame(
    subject_id = 1:10,
    time = c(5, 8, 12, 20, 30, 9, 15, 21, 25, 40),
    status = c(1, 0, 1, 1, 0, 1, 0, 1, 0, 1),
    age_years = c(22, 35, 41, 59, 66, 28, 47, 73, 52, 61)
  )

  out <- OdysseusSurvivalModule:::singleEventSurvival(
    survivalData = df,
    model = "weibull",
    covariates = c("age_years"),
    timeScale = "months"
  )

  expect_true("overall" %in% names(out))
  expect_true(all(c("data", "summary") %in% names(out$overall)))
  expect_true(all(c("lower", "upper", "hazard") %in% names(out$overall$data)))
  expect_true(all(is.na(out$overall$data$lower)))
  expect_true(all(is.na(out$overall$data$upper)))
  expect_equal(out$overall$summary$timeScale, "months")
})

Try the OdysseusSurvivalModule package in your browser

Any scripts or data that you put into this service are public.

OdysseusSurvivalModule documentation built on April 3, 2026, 5:06 p.m.