Author: Jordan Amdahl
Date: 2025-02-15

# Parametric Cure Models

#### Jordan Amdahl

#### 2025-02-15

# Introduction

Parametric cure models are a type of parametric survival model model in which it is assumed that there are a proportion of subjects who will not experience the event. In a mixture cure model, these ‘cured’ and ‘uncured’ subjects are modeled separately, with the cured individuals subject to no excess risk and the uncured individuals subject to excess risk modeled using a parametric survival distribution. In a non-mixture model, a parametric survival distribution is scaled such that survival asymptotically approaches the cure fraction.

# Mixture Cure Model

The following code fits a mixture cure model to the `bc` dataset from `flexsurv` using a Weibull distribution and a logistic link function for the cure fraction:

    library(flexsurvcure)
    cure_model <- flexsurvcure(Surv(rectime, censrec)~group, data=bc, link="logistic", dist="weibullPH", mixture=T)
    print(cure_model)

    ## Call:
    ## flexsurvcure(formula = Surv(rectime, censrec) ~ group, data = bc,
    ##     dist = "weibullPH", link = "logistic", mixture = T)
    ##
    ## Estimates:
    ##              data mean  est        L95%       U95%       se         exp(est)
    ## theta               NA   6.73e-01   5.84e-01   7.52e-01         NA         NA
    ## shape               NA   1.55e+00   1.38e+00   1.74e+00   9.07e-02         NA
    ## scale               NA   1.61e-05   5.10e-06   5.11e-05   9.50e-06         NA
    ## groupMedium   3.34e-01  -1.23e+00  -1.74e+00  -7.09e-01   2.64e-01   2.93e-01
    ## groupPoor     3.32e-01  -3.48e+00  -5.56e+00  -1.40e+00   1.06e+00   3.08e-02
    ##              L95%       U95%
    ## theta               NA         NA
    ## shape               NA         NA
    ## scale               NA         NA
    ## groupMedium   1.75e-01   4.92e-01
    ## groupPoor     3.85e-03   2.47e-01
    ##
    ## N = 686,  Events: 299,  Censored: 387
    ## Total time at risk: 771400
    ## Log-likelihood = -2580.012, df = 5
    ## AIC = 5170.025

Model results can be displayed graphically using the `plot` S3 method:

    plot(cure_model)

Predicted survival probabilities can also be generated using the `summary` S3 method:

    summary(cure_model, t=seq(from=0,to=3000,by=1000), type="survival", tidy=T)

    ##    time        est        lcl       ucl  group
    ## 1     0 1.00000000 1.00000000 1.0000000   Good
    ## 2  1000 0.83251996 0.78899137 0.8689163   Good
    ## 3  2000 0.71313032 0.64543914 0.7740272   Good
    ## 4  3000 0.67959584 0.59539163 0.7487667   Good
    ## 5     0 1.00000000 1.00000000 1.0000000 Medium
    ## 6  1000 0.68057306 0.62844495 0.7247046 Medium
    ## 7  2000 0.45286672 0.38363593 0.5287801 Medium
    ## 8  3000 0.38890796 0.30239122 0.4878845 Medium
    ## 9     0 1.00000000 1.00000000 1.0000000   Poor
    ## 10 1000 0.51803653 0.46475351 0.6308191   Poor
    ## 11 2000 0.17446456 0.12701669 0.4161586   Poor
    ## 12 3000 0.07796116 0.03824658 0.3797724   Poor

More complex models may be fitted by adding covariates to the parametric distribution used to model the uncured individuals. This is done by passing a list of formula, named according to the parameters affected, through the anc argument:

    cure_model_complex <- flexsurvcure(Surv(rectime, censrec)~group, data=bc, link="logistic", dist="weibullPH", mixture=T, anc=list(scale=~group))
    print(cure_model_complex)

    ## Call:
    ## flexsurvcure(formula = Surv(rectime, censrec) ~ group, data = bc,
    ##     dist = "weibullPH", link = "logistic", mixture = T, anc = list(scale = ~group))
    ##
    ## Estimates:
    ##                     data mean  est        L95%       U95%       se
    ## theta                      NA   2.62e-02   1.91e-02   3.59e-02         NA
    ## shape                      NA   1.49e+00   1.35e+00   1.65e+00   7.69e-02
    ## scale                      NA   4.65e-06   1.48e-06   1.46e-05   2.72e-06
    ## groupMedium          3.34e-01  -1.78e+00  -1.79e+00  -1.77e+00   4.39e-03
    ## groupPoor            3.32e-01   2.07e+00   1.76e+00   2.39e+00   1.61e-01
    ## scale(groupMedium)   3.34e-01   8.29e-01   4.92e-01   1.17e+00   1.72e-01
    ## scale(groupPoor)     3.32e-01   2.11e+00   1.71e+00   2.51e+00   2.03e-01
    ##                     exp(est)   L95%       U95%
    ## theta                      NA         NA         NA
    ## shape                      NA         NA         NA
    ## scale                      NA         NA         NA
    ## groupMedium          1.69e-01   1.68e-01   1.71e-01
    ## groupPoor            7.96e+00   5.81e+00   1.09e+01
    ## scale(groupMedium)   2.29e+00   1.64e+00   3.21e+00
    ## scale(groupPoor)     8.22e+00   5.52e+00   1.22e+01
    ##
    ## N = 686,  Events: 299,  Censored: 387
    ## Total time at risk: 771400
    ## Log-likelihood = -2571.857, df = 7
    ## AIC = 5157.713

    plot(cure_model_complex)

# Non-Mixture Cure Model

Non-mixture cure models can be fit by passing `mixture=FALSE` to `flexsurvcure`:

    library(flexsurvcure)
    cure_model_nmix <- flexsurvcure(Surv(rectime, censrec)~group, data=bc, link="loglog", dist="weibullPH", mixture=F)
    print(cure_model_nmix)

    ## Call:
    ## flexsurvcure(formula = Surv(rectime, censrec) ~ group, data = bc,
    ##     dist = "weibullPH", link = "loglog", mixture = F)
    ##
    ## Estimates:
    ##              data mean  est       L95%      U95%      se        exp(est)
    ## theta              NA   6.35e-01  7.31e-01  5.17e-01        NA        NA
    ## shape              NA   1.72e+00  1.53e+00  1.92e+00  1.01e-01        NA
    ## scale              NA   3.07e-06  9.19e-07  1.03e-05  1.89e-06        NA
    ## groupMedium  3.34e-01   8.35e-01  4.99e-01  1.17e+00  1.71e-01  2.31e+00
    ## groupPoor    3.32e-01   1.63e+00  1.31e+00  1.95e+00  1.64e-01  5.09e+00
    ##              L95%      U95%
    ## theta              NA        NA
    ## shape              NA        NA
    ## scale              NA        NA
    ## groupMedium  1.65e+00  3.22e+00
    ## groupPoor    3.69e+00  7.02e+00
    ##
    ## N = 686,  Events: 299,  Censored: 387
    ## Total time at risk: 771400
    ## Log-likelihood = -2567.8, df = 5
    ## AIC = 5145.6