MISTIE III: Time-to-Event Outcome
Josh Betz (jbetz@jhu.edu), Kelly Van Lancker (kvanlan3@jhu.edu), and Michael Rosenblum (mrosen@jhu.edu)
- Executive Summary
- Covariate Adjusted Analysis in Practice
- Simulated Minimally Invasive Surgery for Intracerebral Hemorrhage
- Types of Tests & Estimators: Time-to-Event Outcomes
- Implementing Unadjusted Tests & Models
- Covariate Adjusted Analyses
Executive Summary
Randomly allocating participants to treatment arms will tend to produce groups that are initially comparable to one another across both observed and unobserved factors. In any given randomized trial, there will be some degree of imbalance in the distribution of baseline covariates between treatment groups. When a variable is a strong predictor of the outcome and is imbalanced across treatment arms, it represents a potential confounding variable and source of bias, even if these differences are not statistically significant (Assmann et al. 2000). Confounding can be addressed both in the design phase of a trial, using stratified randomization to lessen the potential for imbalance, and in during the analysis phase, through covariate adjustment.
Covariate adjustment can lead to a more efficient trial, potentially lowering the required sample size to detect a given treatment effect if it exists, or provide greater precision (shorter confidence interval widths and higher power) for the same sample size and treatment effect. When stratified randomization is used, covariate adjustment is generally suggested, but not always implemented, which can lead to reduced power and precision (Kahan and Morris 2011). Accessible and practical discussions of baseline balance, stratified randomized trials, and adjusted analyses are also available to offer further explanation and guidance to investigators (Kernan 1999; Assmann et al. 2000).
When using regression models for inference, it is important to understand how model misspecification may affect statistical inference. Fortunately, there are several approaches to covariate-adjusted analyses whose validity does not depend on a correctly specified model, or provide inference with greater robustness to misspecification than those used in common practice.
The focus of this template is on the analysis of time-to-event outcomes. This tutorial illustrates the use of covariate-adjusted analysis in clinical trials using synthetic data simulated to mimic features of the MISTIE III trial. This tutorial illustrates calculating the restricted mean survival time (RMST) and survival probability with and without adjustment for covariates. These methods are contrasted against methods commonly used in observational studies and randomized trials, such as the logrank test and Cox Proportional Hazards model.
Using This Tutorial
This tutorial contains an example dataset as well as code to illustrate how to perform covariate adjustment in practice for continuous and binary outcomes using R. R is a free and open source language and statistical computing environment. Rstudio is a powerful development environment for using the R language. The ability of R can be extended by downloading software packages from the Comprehensive R Archival Network (CRAN). In R, these packages can be installed from the Comprehensive R Archival Network, or CRAN, using the install.packages()
command. In Rstudio IDE, there is a ‘Packages’ tab that allows users to see which packages are installed, which packages are currently in use, and install or update packages using a graphical interface. Once the required packages are installed, data can be downloaded from Github, and users can run the code on their own devices.
Covariate Adjusted Analysis in Practice
Once R and Rstudio have been installed, additional packages must be installed from CRAN or Github, and some tools may need to be installed to compile packages from source code.
Installing RTools - Compiling Packages from Source
Some R packages must be compiled from source code. RTools is a set of software tools for compiling such R packages. Choose the appropriate version of RTools for your version of R.
Installing R Packages from CRAN
The following packages and their dependencies needs to be installed:
- knitr - Tools for literate programming: including code in reproducible reports
- devtools - A suite of tools for R package development
- tidyverse - An ecosystem of packages for working with data
- table1 - Creating simple tabulations in aggregate and by treatment arm
- survminer - Creating plots of time-to-event data
- survRM2 - Calculating the restricted mean survival time (RMST) with and without covariate adjustment.
required_packages <-
c("knitr",
"devtools",
"tidyverse",
"table1",
"survminer",
"coxrobust",
"survRM2"
)
install.packages(required_packages)
NOTE: Packages only need to be installed once: after installation, they can be updated using the ‘Packages’ tab in RStudio.
Installing R Packages from GitHub
Github is a platform for developing software and documentation with version control. It is a common platform for R package development, testing, reporting and addressing software issues. Use devtools::install_github
to install packages hosted on Github.
devtools::install_github("nt-williams/simul")
devtools::install_github("nt-williams/adjrct")
Loading Installed Packages
Once the required packages are installed, they can be loaded using library()
command.
library(knitr) # Printing tables in reports
library(tidyverse) # Data manipulation: dplyr, tidyr
library(table1) # Creation of Summary tables
library(survival) # For AFT & Cox Proportional Hazards Models
library(survminer) # For Kaplan-Meier Plots
library(coxrobust) # For coxr: Robust Cox PH Model
library(survRM2) # For restricted mean survival times (RMST)
library(adjrct) # For TMLE estimates of RMST, Survival Probability
library(splines) # For adding smoothing splines
Simulated Minimally Invasive Surgery for Intracerebral Hemorrhage
Data used in this example are simulated using data based on the Minimally Invasive Surgery with Thrombolysis in Intracerebral haemorrhage Evacuation trial (MISTIE III: NCT01827046). In this study, participants were randomized 1:1 to standard-of-care medical management, or minimal invasive surgery with Alteplase for ICH removal. Outcomes were measured at 30, 180, and 365-days post-randomization using the Modified Rankin Scale (MRS). Survival was also assessed, with patients administratively censored on the date of their final MRS assessment.
A new synthetic dataset was created by resampling baseline covariates from the original data with replacement. The columns in the synthetic dataset were sequentially replaced using simulated values based on predictions from a sequence of regression models based on the actual study data.
sim_participant_id
: Patient id- Baseline Covariates
age
: Age in yearsmale
: male sexhx_cvd
: cardiovascular disease historyhx_hyperlipidemia
: hyperlipidemia historyon_anticoagulants
: on anticoagulant medicationon_antiplatelets
: on antiplatelet medicationich_location
: intracerebral hemorrhage location: (Lobar
,Deep
)ich_s_volume
: intracerebral hemorrhage volume on stability scanivh_s_volume
: intraventricular hemorrhage volume on stability scangcs_category
: presenting Glasgow Coma Score (GCS)
- Treatment:
arm
: treatment armich_eot_volume
: intracerebral hemorrhage volume on end-of-treatment scan
- Outcome:
mrs_30d
: MRS at 30 days (0-3
,4
,5
,6
)mrs_30d_complete
: MRS at 30 days if no data were missingmrs_180d
: MRS at 180 days (0-2
,3
,4
,5
,6
)mrs_180d_complete
: MRS at 180 days if no data were missingmrs_365d
: MRS at 365 days (0-1
,2
,3
,4
,5
,6
)mrs_365d_complete
: MRS at 365 days if no data were missingdays_on_study
: days until death or administrative censoringdied_on_study
: participant died (1
) or is censored (0
)
The outcomes mrs_30d
, mrs_180d
, and mrs_365d
contain missing values: the actual values before the missingness mechanism is applied are also included with the _complete
suffix.
Baseline Demographics & Stratum
Below are summary statistics of participant characteristics at baseline.
table1(
~ mrs_30d + mrs_180d +
on_antiplatelets + ich_location + ich_s_volume + ivh_s_volume +
gcs_category | arm,
data = sim_miii
)
Outcomes
table1(
~ mrs_30d + mrs_180d + mrs_365d | arm,
data = sim_miii
)
Reference level for Treatment
When the treatment is a factor
variable, we can use the levels()
function to see the reference level (i.e. the comparator/control group): it will appear as the first level.
# Check reference level
levels(sim_miii$arm)
## [1] "medical" "surgical"
Make sure that the reference level is appropriately chosen before running analyses to avoid errors in interpretation and inference.
Types of Tests & Estimators: Time-to-Event Outcomes
The Kaplan-Meier (K-M) estimate of the survival function is a ubiquitous approach to estimating and visualizing the survival probability, i.e. the probability of not having an event of interest, over a follow-up period. The K-M estimator assumes that censoring is independent of the event time within each treatment arm, which may be violated if certain baseline characteristics, such as disease severity, are associated with both the event time of interest and dropout (Dı́az et al. 2018). This could occur if individuals with greater baseline severity are more likely to have the event and more likely to drop out before the event is observed.
The logrank test is perhaps the most common method for performing sample size calculations and performing unadjusted comparisons of time-to-event outcomes. The logrank test is valid if censoring is independent of the treatment or independent of the event time in each treatment arm (Lancker, Dukes, and Vansteelandt 2021). The logrank test is most powerful under the proportional hazards assumption. When the proportional hazards assumption is violated, a weight function can be specified in a weighted logrank test to emphasize different domains of the survival curve. For more on the use of weighted logrank tests to address violations of the proportional hazards, see Lin and León (2017).
The Cox Proportional Hazards (PH) regression is the most common method for performing covariate-adjusted comparisons of time-to-event outcomes under the proportional hazards assumption. The logrank test is equivalent to the Score test in a Cox PH model which only includes a treatment indicator and no additional covariates. Inclusion of covariates allows relaxation of the uninformative censoring assumption, but raises concerns about the impact of model assumptions and specification.
The validity of tests for the hypothesis of no treatment effect in randomized experiments using the Cox PH model depends on the relationship of censoring times to the treatment assignment and covariates. If censoring times are conditionally independent of treatment assignment given the covariates, or conditionally independent of the covariates given the treatment assignment, tests are valid when the sandwich variance estimator is used. However, if the model is mispecified and the distribution of censoring times depends on both the treatment and covariates, tests based on the Cox model will not be valid, and alternatives should be considered (DiRienzo and Lagakos 2001).
When the proportional hazards assumption is violated, the estimates from a Cox PH model represent a weighted average of the hazard functions over time. The weights in this weighted average are determined by both the survival in each group and the censoring distribution. This dependence upon the censoring distribution makes it difficult to meaningfully interpret the estimate when there are appreciable violations of the PH assumption (Rudser, LeBlanc, and Emerson 2012).
Even in the situation when the proportional hazards assumption appears to hold, the clinical interpretation of the hazard ratio is not straightforward. In the absence of censoring, measures of a treatment effect are usually based on summaries of the outcome distribution that explicitly reference the scale of measurement of the outcome which facilitate evaluation of clinical importance, such as the mean, median, or proportion above or below a clinically meaningful threshold (Rudser, LeBlanc, and Emerson 2012). The hazard function is the instantaneous rate at which events occur, which changes over time, and does not quantify the expected length of time until the event (Rudser, LeBlanc, and Emerson 2012).
Since quantities such as survival probabilities (e.g. survival at 5 years), quantiles (e.g. median, 75th percentile), or the restricted mean survival time (RMST, e.g. average time without an event in the 5 yeras post randomization) explicitly reference the time frame of events, they may be more clinically meaningful for comparing treatments (Rudser, LeBlanc, and Emerson 2012). Survival probability and RMST are interpretable under violations of the proportional hazards assumption, and estimators for these quantities exist that are doubly robust (i.e. consistent if either the censoring or survival distributions are consistently estimated) and are at least as efficient as the K-M estimator (Dı́az et al. 2018).
While covariate-adjusted hazard ratios can be obtained from a Cox PH model, these are conditional treatment effects: they are the estimated hazard ratio given all of the covariates in the model. Covariate adjusted estimators of the survival probability and RMST are marginal treatment effects, which are useful for assessing the public health impact of an intervention on the intended use population. For more information on estimands and estimators for survival data, see the pages on estimands and estimators and models.
Implementing Unadjusted Tests & Models
Kaplan-Meier Survival Estimate: Death
KM for Death - Time Scale: Days
time_to_death_km <-
survfit(
formula = Surv(time = days_on_study, event = died_on_study) ~ arm,
data = sim_miii
)
ggsurvplot(
fit = time_to_death_km,
conf.int = TRUE,
risk.table = TRUE,
xlab = "Days",
ylab = "Survival probability"
)
KM for Death - Stratified by ich_location
ggsurvplot(
fit = time_to_death_km,
conf.int = TRUE,
facet.by = "ich_location",
xlab = "Days",
ylab = "Survival probability"
) +
theme(
# Adjust Plot Labels for Readability
axis.text.x = element_text(size = 18),
axis.text.y = element_text(size = 18),
axis.title.y = element_text(size = 26),
axis.title.x = element_text(size = 26),
strip.text = element_text(size = 26),
legend.text = element_text(size = 22),
legend.title = element_text(size = 22)
)
Logrank Test
The logrank test (and the G-rho family of rank-based test procedures) can be obtained using survival::survdiff
:
survival::survdiff(
formula = Surv(time = days_on_study, event = died_on_study) ~ arm,
data = sim_miii
)
## Call:
## survival::survdiff(formula = Surv(time = days_on_study, event = died_on_study) ~
## arm, data = sim_miii)
##
## N Observed Expected (O-E)^2/E (O-E)^2/V
## arm=medical 250 64 49.6 4.19 8.06
## arm=surgical 250 40 54.4 3.82 8.06
##
## Chisq= 8.1 on 1 degrees of freedom, p= 0.005
Cox Proportional Hazards Model
The Cox Proportional Hazards model can be fit using the survival::coxph
function. Robust standard errors can be utilized with the argument robust = TRUE
.
unadjusted_cox <-
survival::coxph(
formula = Surv(time = days_on_study, event = died_on_study) ~ arm,
# Use Efron's Method for Tied Event Times
ties = "efron",
# Use Robust Standard Errors
robust = TRUE,
data = sim_miii
)
summary(unadjusted_cox)
## Call:
## survival::coxph(formula = Surv(time = days_on_study, event = died_on_study) ~
## arm, data = sim_miii, ties = "efron", robust = TRUE)
##
## n= 500, number of events= 104
##
## coef exp(coef) se(coef) robust se z Pr(>|z|)
## armsurgical -0.5670 0.5672 0.2016 0.1995 -2.841 0.00449 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## exp(coef) exp(-coef) lower .95 upper .95
## armsurgical 0.5672 1.763 0.3836 0.8387
##
## Concordance= 0.575 (se = 0.024 )
## Likelihood ratio test= 8.16 on 1 df, p=0.004
## Wald test = 8.07 on 1 df, p=0.004
## Score (logrank) test = 8.12 on 1 df, p=0.004, Robust = 8.03 p=0.005
##
## (Note: the likelihood ratio and score tests assume independence of
## observations within a cluster, the Wald and robust score tests do not).
Assuming the proportional hazards assumption is correct, the hazard of death in those in the surgical arm was 35% lower ((1 - 0.6464) = 0.3536
) than the medical management arm.
The Proportional Hazards (PH) assumption can be assessed using survival::cox.zph
:
unadjusted_cox_ph_test <- cox.zph(unadjusted_cox)
print(unadjusted_cox_ph_test)
## chisq df p
## arm 9.85 1 0.0017
## GLOBAL 9.85 1 0.0017
# Plot
plot(cox.zph(unadjusted_cox))
These plots should show an approximately constant value over time when the proportional hazards assumption holds.
Restricted Mean Survival Time: survRM2::rmst2
with(
sim_miii,
survRM2::rmst2(
time = days_on_study,
status = died_on_study,
arm = tx,
tau = 90
)
)
##
## The truncation time: tau = 90 was specified.
##
## Restricted Mean Survival Time (RMST) by arm
## Est. se lower .95 upper .95
## RMST (arm=1) 84.510 1.160 82.237 86.783
## RMST (arm=0) 75.744 1.932 71.957 79.531
##
##
## Restricted Mean Time Lost (RMTL) by arm
## Est. se lower .95 upper .95
## RMTL (arm=1) 5.490 1.160 3.217 7.763
## RMTL (arm=0) 14.256 1.932 10.469 18.043
##
##
## Between-group contrast
## Est. lower .95 upper .95 p
## RMST (arm=1)-(arm=0) 8.766 4.350 13.182 0
## RMST (arm=1)/(arm=0) 1.116 1.054 1.181 0
## RMTL (arm=1)/(arm=0) 0.385 0.235 0.630 0
The average survival time in the first 90 days was 83 days in the surgical arm and 76 days in the medical arm: the difference in average survival time (RMST) between arms in the first 90 months was 7.1 days. The ratio of RMST between treatment and control was 1.09 (9% increase in RMST).
Targeted Maximum Likelihood Estimator (TMLE): adjrct::survrct
The first step in using adjrct::survrct
is to compute the metadata necessary for computing the model-robust estimates of restricted mean survival time and survival probability: NOTE: in this particular dataset, this may take some time, considerably more than survRM2::rmst()
.
surv_metadata_unadj <-
adjrct::survrct(
outcome.formula = Surv(days_on_study, died_on_study) ~ tx,
trt.formula = tx ~ 1,
data = sim_miii,
)
Unadjusted Restricted Mean Survival Time (RMST)
adjrct::rmst(
metadata = surv_metadata_unadj,
horizon = 90
)
The results here are in line with the RMST calculated using survRM2::rmst2()
.
Unadjusted Survival Probability
adjrct::survprob(
metadata = surv_metadata_unadj,
horizon = 90
)
## Warning: step size truncated due to increasing deviance
## Warning: step size truncated due to increasing deviance
## Warning: step size truncated due to increasing deviance
## Warning: step size truncated due to increasing deviance
The unadjusted survival probability in the first 90 days was 0.88 in the in the surgical arm and 0.77 in the medical arm. The difference in the probability of surviving the first 90 days between surgical and medical was 0.11 (i.e an 11% lower risk of dying in the first 90 days in the treatment arm relative to control).
Covariate Adjusted Analyses
Propensity Score
ps_model <-
mgcv::gam(
formula =
tx ~ s(age) + male + hx_cvd + hx_hyperlipidemia +
on_anticoagulants + on_antiplatelets + ich_location +
s(ich_s_volume) + s(ivh_s_volume) + gcs_category,
data = sim_miii,
family = binomial(link = "logit")
)
summary(ps_model)
##
## Family: binomial
## Link function: logit
##
## Formula:
## tx ~ s(age) + male + hx_cvd + hx_hyperlipidemia + on_anticoagulants +
## on_antiplatelets + ich_location + s(ich_s_volume) + s(ivh_s_volume) +
## gcs_category
##
## Parametric coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.17041 0.23550 -0.724 0.4693
## male1. Male 0.07898 0.20003 0.395 0.6930
## hx_cvd1. Yes 0.17986 0.28062 0.641 0.5216
## hx_hyperlipidemia1. Yes -0.37854 0.21745 -1.741 0.0817 .
## on_anticoagulants1. Yes -0.27188 0.41718 -0.652 0.5146
## on_antiplatelets1. Yes 0.44788 0.23563 1.901 0.0573 .
## ich_locationLobar -0.08078 0.20635 -0.391 0.6955
## gcs_category2. Moderate (9-12) 0.06881 0.23064 0.298 0.7654
## gcs_category3. Mild (13-15) 0.36935 0.25002 1.477 0.1396
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Approximate significance of smooth terms:
## edf Ref.df Chi.sq p-value
## s(age) 5.381 6.561 12.174 0.0757 .
## s(ich_s_volume) 1.000 1.001 0.001 0.9798
## s(ivh_s_volume) 1.000 1.000 0.519 0.4715
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## R-sq.(adj) = 0.0228 Deviance explained = 4.03%
## UBRE = 0.39596 Scale est. = 1 n = 500
Adjusted Cox Proportional Hazards Model
adjusted_cox <-
coxph(
formula = Surv(days_on_study, died_on_study) ~ arm +
# Covariates
pspline(age) + male + hx_cvd + hx_hyperlipidemia +
on_anticoagulants + on_antiplatelets + ich_location +
pspline(ich_s_volume) + pspline(ivh_s_volume) + gcs_category,
# Use Efron's Method for Tied Event Times
ties = "efron",
# Use Robust Standard Errors
robust = TRUE,
data = sim_miii
)
Assuming the proportional hazards assumption holds, conditioning on age, sex, antiplatelet and anticoagulant use, ICH location, and the volumes of ICH and IVH on the stability scan, the hazard of death in those receiving surgery was 21% lower ((1 - exp(-0.241460)) = 0.2145198
) than the medical arm. Note that this is also a conditional treatment effect, not a marginal treatment effect.
cox.zph(
fit = adjusted_cox
)
## chisq df p
## arm 10.06992 0.99 0.0015
## pspline(age) 0.20280 4.02 0.9953
## male 0.87577 0.99 0.3462
## hx_cvd 0.00932 0.98 0.9197
## hx_hyperlipidemia 0.02266 0.99 0.8783
## on_anticoagulants 0.07419 0.99 0.7813
## on_antiplatelets 0.16014 0.99 0.6842
## ich_location 6.89229 1.00 0.0086
## pspline(ich_s_volume) 3.40417 4.01 0.4944
## pspline(ivh_s_volume) 0.07829 4.02 0.9993
## gcs_category 2.79527 1.99 0.2447
## GLOBAL 26.87130 20.96 0.1735
Here we can see departures from the proportional hazards assumption:
cox.zph(
fit = adjusted_cox
) %>%
plot(var = "arm")
abline(h = 0, col = rgb(1, 0, 0, 0.75))
Targeted Maximum Likelihood
surv_metadata_adj <-
adjrct::survrct(
outcome.formula = Surv(days_on_study, died_on_study) ~ tx +
age + male + hx_cvd + hx_hyperlipidemia +
on_anticoagulants + on_antiplatelets + ich_location +
ich_s_volume + ivh_s_volume + gcs_category,
trt.formula =
tx ~
age + male + hx_cvd + hx_hyperlipidemia +
on_anticoagulants + on_antiplatelets + ich_location +
ich_s_volume + ivh_s_volume + gcs_category,
data = sim_miii
)
Calculate Restricted Mean Survival Time
rmst_metadata_adj <-
adjrct::rmst(
metadata = surv_metadata_adj,
horizon = 90
)
rmst_metadata_adj
## RMST Estimator: tmle
## Marginal RMST: E(min[T, 90] | A = a)
## Treatment Arm
## Estimate: 84.28
## Std. error: 1.19
## 95% CI: (81.95, 86.61)
## Control Arm
## Estimate: 76.65
## Std. error: 1.77
## 95% CI: (73.17, 80.13)
## Treatment Effect: E(min[T, 90] | A = 1) - E(min[T, 90] | A = 0)
## Additive effect
## Estimate: 7.63
## Std. error: 2.11
## 95% CI: (3.49, 11.77)
rmst_metadata_adj_table <-
with(
rmst_metadata_adj$estimates[[1]],
bind_rows(
data.frame(
Arm = "Treatment",
Estimate = arm1,
SE = arm1.std.error,
LCL = arm1.conf.low,
UCL = arm1.conf.high
),
data.frame(
Arm = "Control",
Estimate = arm0,
SE = arm0.std.error,
LCL = arm0.conf.low,
UCL = arm0.conf.high
),
data.frame(
Arm = "Treatment - Control",
Estimate = theta,
SE = std.error,
LCL = theta.conf.low,
UCL = theta.conf.high
)
)
)
kable(
x = rmst_metadata_adj_table,
caption = "TMLE covariate-adjusted estimates of Restricted Mean Survival Time.",
digits = 2
)
Arm | Estimate | SE | LCL | UCL |
---|---|---|---|---|
Treatment | 84.28 | 1.19 | 81.95 | 86.61 |
Control | 76.65 | 1.77 | 73.17 | 80.13 |
Treatment - Control | 7.63 | 2.11 | 3.49 | 11.77 |
TMLE covariate-adjusted estimates of Restricted Mean Survival Time.
The covariate-adjusted RMST is slightly smaller than the unadjusted estimate for the surgical group (81.5 vs 83.0), and slightly larger for the medical group (77.3 vs. 75.9). As a result, there is a slightly smaller covariate-adjusted difference in RMST at 90 days compared to the unadjusted estimate (4.2 vs 7.1).
Calculate Survival Probability
survival_metadata_adj <-
adjrct::survprob(
metadata = surv_metadata_adj,
horizon = 90
)
## Warning: step size truncated due to increasing deviance
## Warning: step size truncated due to increasing deviance
## Warning: step size truncated due to increasing deviance
## Warning: step size truncated due to increasing deviance
survival_metadata_adj
## Survival Probability Estimator: tmle
## Marginal Survival Probability: Pr(T > 90 | A = a)
## Treatment Arm
## Estimate: 0.89
## Std. error: 0.02
## 95% CI: (0.85, 0.93)
## Control Arm
## Estimate: 0.81
## Std. error: 0.02
## 95% CI: (0.77, 0.86)
## Treatment Effect: Pr(T > 90 | A = 1) - Pr(T > 90 | A = 0)
## Additive effect
## Estimate: 0.08
## Std. error: 0.03
## 95% CI: (0.02, 0.14)
survival_metadata_adj_table <-
with(
survival_metadata_adj$estimates[[1]],
bind_rows(
data.frame(
Arm = "Treatment",
Estimate = arm1,
SE = arm1.std.error,
LCL = arm1.conf.low,
UCL = arm1.conf.high
),
data.frame(
Arm = "Control",
Estimate = arm0,
SE = arm0.std.error,
LCL = arm0.conf.low,
UCL = arm0.conf.high
),
data.frame(
Arm = "Treatment - Control",
Estimate = theta,
SE = std.error,
LCL = theta.conf.low,
UCL = theta.conf.high
)
)
)
kable(
x = survival_metadata_adj_table,
caption = "TMLE covariate-adjusted estimates of survival probability.",
digits = 2
)
Arm | Estimate | SE | LCL | UCL |
---|---|---|---|---|
Treatment | 0.89 | 0.02 | 0.85 | 0.93 |
Control | 0.81 | 0.02 | 0.77 | 0.86 |
Treatment - Control | 0.08 | 0.03 | 0.02 | 0.14 |
TMLE covariate-adjusted estimates of survival probability.
The covariate-adjusted survival probability is slightly smaller than the unadjusted estimate for the surgical group (0.86 vs 0.88), and slightly larger for the medical group (0.79 vs. 0.77). As a result, there is a slightly smaller covariate-adjusted difference in survival probability at 90 days compared to the unadjusted estimate (0.07 vs 0.11).