tests/testthat/test_external.R

extdat <- data.frame(start = c(5, 10, 15, 20),
                     stop =  c(10, 15, 20, 25),
                     n = c(100, 100, 100, 100),
                     r = c(50, 40, 30, 20))

test_that("External data gives precise extrapolation",{
  nde_mod <- survextrap(Surv(years, status) ~ 1, data=colons,
                        chains=1, external = extdat,
                        add_knots=c(4, 10, 25), fit_method="opt")
  expect_true(hazard(nde_mod, t=20)$upper < 0.5)
  expect_true(all(c(4,10,25) %in% nde_mod$mspline$knots))
})

test_that("External data with covariates",{
  extdat$sex = 1
  nde_mod1 <- survextrap(Surv(years, status) ~ sex, data=colons,
                         chains=1, external = extdat,
                         add_knots=c(4, 10, 25), fit_method="opt")
  haz1 <- hazard(nde_mod1, newdata=list(sex=c(0,1)), t=20)
  extdat$sex = 0
  nde_mod0 <- survextrap(Surv(years, status) ~ sex, data=colons,
                         chains=1, external = extdat,
                         add_knots=c(4, 10, 25), fit_method="opt")
  haz0 <- hazard(nde_mod0, newdata=list(sex=c(0,1)), t=20)
  ## more precise estimate given external data with the desired covariate value
  expect_true(haz1$upper[haz1$sex==1] < haz0$upper[haz0$sex==1])
})

test_that("External data with nonproportional hazards",{
  extdat$sex = 1
  expect_no_error({
    nde_mod1 <- survextrap(Surv(years, status) ~ sex, nonprop=TRUE, data=colons,
                           chains=1, external = extdat,
                           add_knots=c(4, 10, 25), fit_method="opt")
    nde_mod1
  })
})

test_that("External data with cure and covariates",{
  extdat$sex = 1
  expect_no_error({
    nde_mod1 <- survextrap(Surv(years, status) ~ 1, cure=~sex, data=colons,
                           chains=1, external = extdat,
                           add_knots=c(4, 10, 25), fit_method="opt")
    nde_mod1
  })
})

test_that("external data MCMC fit",{
  skip_on_cran()
  extdat$sex = 1
  suppressWarnings({
    nde_mod1 <- survextrap(Surv(years, status) ~ sex, data=colons,
                           chains=1, external = extdat,
                           add_knots=c(4, 10, 25), fit_method="mcmc", iter=1000)
    expect_true(is.numeric(nde_mod1$loo$estimates["looic","Estimate"]))
  })
})

test_that("No individual-level data",{
  nde_mod1 <- survextrap(~1, external = extdat,
                         mspline = list(df=5), fit_method="opt")
  nde_mod1$mspline
  plot_hazsurv(nde_mod1)
  expect_warning(nde_mod1 <- survextrap(Surv(time, event) ~1, external = extdat,
                                        mspline = list(df=5), fit_method="opt"),
                 "`formula` has a left-hand side, but `data` not supplied")
  expect_error(survextrap(external = extdat), "argument \"formula\" is missing")
})

extdatc <- rbind(cbind(extdat, treat="no"),
                 cbind(extdat, treat="yes"))
extdatc$treat <- factor(extdatc$treat)

test_that("No individual-level data, covariates",{
  nde_mod2 <- survextrap(~treat, external = extdatc,
                         mspline = list(df=5), fit_method="opt")
  expect_false(nde_mod2$indiv)
})

Try the survextrap package in your browser

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

survextrap documentation built on June 10, 2025, 5:11 p.m.