tests/testthat/test-plotHR.R

test_that("Check the prPhNewData function", {
  set.seed(1000)
  n <- 110
  ds <- data.frame(
    ftime = rexp(n),
    fstatus = sample(0:1, size = n, replace = TRUE),
    x1 = factor(sample(c("a", "aa", "aaa"), size = n, replace = TRUE)),
    x2 = rnorm(n, mean = 3, 2),
    x3 = factor(sample(c("a", "aa", "aaa"), size = n, replace = TRUE))
  )

  library(rms)
  dd <<- datadist(ds)
  options(datadist = "dd")

  fit <- coxph(Surv(ftime, fstatus) ~ x1 + x2, data = ds)
  expect_error(prPhNewData(fit, "aa"))

  expect_equivalent(nrow(prPhNewData(fit, "x1")),
    length(unique(ds$x1)),
    info = "The length should be equal to the different type within the data"
  )

  expect_equivalent(nrow(prPhNewData(fit, "x2")),
    length(unique(ds$x2)),
    info = "The length should be equal to the different type within the data"
  )

  expect_equivalent(length(unique(prPhNewData(fit, "x2")$x1)),
    1,
    info = "All other variables should be only of one type"
  )

  expect_equivalent(nrow(prPhNewData(fit, "x2", xlim = quantile(ds$x2, c(.05, .5)))),
    length(unique(ds$x2[ds$x2 <= quantile(ds$x2, .5) &
      ds$x2 >= quantile(ds$x2, .05)])),
    info = "The values beyond the xlim should be ignored"
  )

  fit <- cph(Surv(ftime, fstatus) ~ x1 + x2, data = ds)
  expect_error(prPhNewData(fit, "aa"))

  expect_equivalent(nrow(prPhNewData(fit, "x1")),
    length(unique(ds$x1)),
    info = "The length should be equal to the different type within the data"
  )

  expect_equivalent(nrow(prPhNewData(fit, "x2")),
    length(unique(ds$x2)),
    info = "The length should be equal to the different type within the data"
  )

  expect_equivalent(length(unique(prPhNewData(fit, "x2")$x1)),
    1,
    info = "All other variables should be only of one type"
  )

  expect_equivalent(nrow(prPhNewData(fit, "x2", xlim = quantile(ds$x2, c(.05, .5)))),
    length(unique(ds$x2[ds$x2 <= quantile(ds$x2, .5) &
      ds$x2 >= quantile(ds$x2, .05)])),
    info = "The values beyond the xlim should be ignored"
  )

  fit <- cph(Surv(ftime, fstatus) ~ x1 + x2, data = ds)
  expect_equivalent(
    ncol(prPhNewData(fit, "x2")),
    2
  )
})



test_that("Check the prPhEstimate function", {
  # From the cph example
  library(rms)
  n <- 100
  set.seed(731)
  age <- 50 + 12 * rnorm(n)
  label(age) <- "Age"
  sex <- factor(sample(c("Male", "Female"), n,
    rep = TRUE, prob = c(.6, .4)
  ))
  cens <- 15 * runif(n)
  h <- .02 * exp(.04 * (age - 50) + .8 * (sex == "Female"))
  dt <- -log(runif(n)) / h
  label(dt) <- "Follow-up Time"
  e <- ifelse(dt <= cens, 1, 0)
  dt <- pmin(dt, cens)
  units(dt) <- "Year"

  ds <- data.frame(
    age = age,
    sex = sex,
    e = e,
    dt = dt
  )

  dd <<- datadist(ds)
  options(datadist = "dd")

  fit <- cph(Surv(dt, e) ~ age + sex, x = TRUE, y = TRUE, data = ds)
  est <- prPhEstimate(fit,
    alpha = .05,
    term.label = "age",
    ylog = TRUE,
    cntrst = TRUE
  )
  expect_equivalent(
    colnames(est),
    c(
      "xvalues", "estimate",
      "lower", "upper"
    )
  )

  est <- prPhEstimate(fit,
    alpha = .05,
    term.label = "age",
    ylog = TRUE,
    cntrst = FALSE
  )
  expect_equivalent(
    colnames(est),
    c(
      "xvalues", "estimate",
      "lower", "upper"
    )
  )


  est <- prPhEstimate(fit,
    alpha = .05,
    term.label = "age",
    ylog = TRUE,
    cntrst = TRUE
  )

  expect_true(coef(fit)["age"] *
    (with(est, estimate[which.max(xvalues)] -
      estimate[which.min(xvalues)])) > 0,
  info = "Two negative estimates should produce a positive value as well as two positive"
  )

  fit <- coxph(Surv(dt, e) ~ age + sex, x = TRUE, y = TRUE)
  expect_error(prPhEstimate(fit,
    term.label = "age",
    alpha = .05,
    ylog = TRUE,
    cntrst = TRUE
  ))

  est <- prPhEstimate(fit,
    term.label = "age",
    alpha = .05,
    ylog = TRUE,
    cntrst = FALSE
  )
  expect_equivalent(
    colnames(est),
    c(
      "xvalues", "estimate",
      "lower", "upper"
    )
  )

  est <- prPhEstimate(fit,
    term.label = "age",
    alpha = .05,
    ylog = FALSE,
    cntrst = FALSE
  )
  expect_true(all(est$estimate > 0))
  expect_true(all(est$lower > 0))
  expect_true(all(est$upper > 0))
  expect_true(all(est$xvalues <= max(age)))
  expect_true(all(est$xvalues >= min(age)))

  fit <- cph(Surv(dt, e) ~ rcs(age, 3) + sex, x = TRUE, y = TRUE, data = ds)
  est <- prPhEstimate(fit,
    alpha = .05,
    term.label = "age",
    ylog = TRUE,
    cntrst = TRUE
  )
  expect_equivalent(
    colnames(est),
    c(
      "xvalues", "estimate",
      "lower", "upper"
    )
  )

  fit <- coxph(Surv(dt, e) ~ pspline(age, 3) + sex, data = ds)
  est <- prPhEstimate(fit,
    alpha = .05,
    term.label = "age",
    ylog = TRUE,
    cntrst = FALSE
  )
  expect_equivalent(
    colnames(est),
    c(
      "xvalues", "estimate",
      "lower", "upper"
    )
  )
})

test_that("General plotting funcitonality of plotHR", {
  library(survival)
  library(rms)

  # Get data for example
  n <- 1000
  set.seed(731)

  age <- round(50 + 12 * rnorm(n), 1)
  label(age) <- "Age"

  sex <- factor(sample(c("Male", "Female"), n,
    rep = TRUE, prob = c(.6, .4)
  ))
  cens <- 15 * runif(n)

  smoking <- factor(sample(c("Yes", "No"), n,
    rep = TRUE, prob = c(.2, .75)
  ))

  h <- .02 * exp(.02 * (age - 50) + .1 * ((age - 50) / 10)^3 + .8 * (sex == "Female") + 2 * (smoking == "Yes"))
  dt <- -log(runif(n)) / h
  label(dt) <- "Follow-up Time"

  e <- ifelse(dt <= cens, 1, 0)
  dt <- pmin(dt, cens)
  units(dt) <- "Year"

  # Add missing data to smoking
  smoking[sample(1:n, round(n * 0.05))] <- NA

  # Create a data frame since plotHR will otherwise
  # have a hard time getting the names of the variables
  ds <- data.frame(
    dt = dt,
    e = e,
    age = age,
    smoking = smoking,
    sex = sex
  )

  library(splines)
  dd <<- datadist(ds)
  options(datadist = "dd")
  fit.coxph <- coxph(Surv(dt, e) ~ bs(age, 3) + sex + smoking, data = ds)

  org_par <- par(xaxs = "i")
  plotHR(fit.coxph, term = "age", plot.bty = "o", xlim = c(30, 70), xlab = "Age")

  dd <- datadist(ds)
  options(datadist = "dd")
  fit.cph <- cph(Surv(dt, e) ~ rcs(age, 4) + sex + smoking, data = ds, x = TRUE, y = TRUE)

  plotHR(fit.cph, term = 1, plot.bty = "l", xlim = c(30, 70), xlab = "Age")

  plotHR(fit.cph, term = "age", plot.bty = "l", xlim = c(30, 70), ylog = FALSE, rug = "ticks", xlab = "Age")

  unadjusted_fit <- cph(Surv(dt, e) ~ rcs(age, 4), data = ds, x = TRUE, y = TRUE)
  out <- plotHR(list(fit.cph, unadjusted_fit),
                term = "age", xlab = "Age",
                polygon_ci = c(TRUE, FALSE),
                col.term = c("#08519C", "#77777799"),
                col.se = c("#DEEBF7BB", grey(0.6)),
                lty.term = c(1, 2),
                plot.bty = "l", xlim = c(30, 70)
  )
  expect_class(out, "plotHR")
})
gforge/Greg documentation built on Feb. 3, 2024, 5:37 a.m.