Load libraries

The following libraries are loaded as well as some custom R scripts.

#library(miceadds)
library(gdata)
library(readxl)
library(readr)
library(ggplot2)
library(ggthemes)
library(survival)
library(lubridate)
library(mice)
library(mitools)
library(twang)
library(dplyr)
library(tidyr)
library(magrittr)
library(knitr)
library(stringr)
library(rlist)
#library(grid)
library(scales)
library(broom)
library(pander)
source("utilities.R")
panderOptions("table.split.table", Inf)

Import, clean-up

The dataset is imported and tidied, interim datasets are removed.

source("data_tidying.R")
rm(raw, dif_segs, id_twostage)

Heat map of missing data patterns

The initial missing data analysis is shown via a heatmap and table of missing values.


Table of missing data

Number missing Percent missing
age 3 1
bloodloss 71 25
CEA 86 30
hlos 40 14
id_patients 0 0
isanatomic 0 0
isbilateral 0 0
isconversion 0 0
isextended 0 0
ismajor 0 0
lesioncount 25 9
lesionmaxdiameter 25 9
margin 47 17
primaryT 70 25
primaryN 66 23
primaryM 63 22
primarytumourgrade 90 32
primarytreatment 52 18
year_primary 38 13
sex 0 0
lap 0 0
cens_time 0 0
cens 0 0
index 0 0
difloc 0 0
time 0 0
rtime 0 0
rec 0 0
optime 107 38
era 0 0

Multiple imputation using chained equations

The default of five imputations are obtained using ten iterations for each. The classification and regression tree method is used.

imp <- mice(as.data.frame(subnew), method="cart", maxit=10)



Estimate propensity scores for each imputed dataset

propscores <- vector("list")
for(i in 1:5) {
      tmp <- ps(lap~age+sex+CEA+ismajor+difloc+isbilateral+lesionmaxdiameter+lesioncount+primarytumourgrade+primaryT+primaryN+year_primary+primarytreatment, estimand = "ATE", data=mice::complete(impmids,i), interaction.depth=2, n.trees = 10000, shrinkage=0.01, verbose=FALSE, bag.fraction = 0.3, stop.method = "ks.max")
      propscores[[paste("psate",i,sep="")]] <- tmp
}


Generate stabilised weights for each imputed dataset. Stabilised weights are generated by dividing the weight calculated by inverse propensity score by the average weight for the sample. Additionally, generate an interim list of weights (impweights) for upcoming plot.


impdata <- vector("list")
impweights <- vector("list")
impdata[["psate0"]] <- as.data.frame(subnew)
impdata[["psate0"]]$stable.w <- 1

  for (i in 1:5) {
      name <- paste("psate",i,sep="")
      impdata[[name]] <- mice::complete(impmids,i)
      impdata[[name]]$stable.w <- stable.weights(propscores[[i]], "ks.max")
      impweights[[name]] <- data.frame(weights=stable.weights(propscores[[i]], "ks.max"), treat=propscores[[i]]$treat, id=propscores[[i]]$data$id_patients)
}


Plots and balance computations for each imputed dataset

Balance tables and balance plots for each imputed dataset

Dataset number 1
tx.mn ct.mn std.eff.sz p tx.mn ct.mn std.eff.sz p
age 63.36 60.21 0.27 0.02 63.16 61.31 0.16 0.22
age: 0.00 0.02 NA 0.00 0.00 0.02 NA 0.00
sex:female 0.40 0.33 0.16 0.17 0.38 0.31 0.14 0.26
sex:male 0.60 0.67 -0.16 NA 0.62 0.69 -0.14 NA
CEA 37.55 66.23 -0.16 0.27 34.68 62.53 -0.17 0.28
CEA: 0.28 0.33 -0.10 0.41 0.29 0.36 -0.15 0.28
ismajor 0.27 0.69 -0.84 0.00 0.39 0.55 -0.31 0.02
difloc 0.34 0.56 -0.43 0.00 0.41 0.47 -0.12 0.35
isbilateral 0.11 0.27 -0.41 0.00 0.13 0.22 -0.23 0.08
lesionmaxdiameter 32.32 41.26 -0.34 0.01 34.08 38.12 -0.16 0.22
lesionmaxdiameter: 0.06 0.12 -0.23 0.11 0.06 0.13 -0.26 0.11
lesioncount 1.50 2.24 -0.53 0.00 1.59 1.97 -0.28 0.03
lesioncount: 0.06 0.12 -0.23 0.11 0.06 0.13 -0.26 0.11
primarytumourgrade:moderately differentiated 0.54 0.44 0.20 0.04 0.50 0.45 0.10 0.23
primarytumourgrade:poorly differentiated 0.17 0.12 0.15 NA 0.18 0.12 0.16 NA
primarytumourgrade:well differentiated 0.03 0.06 -0.23 NA 0.03 0.05 -0.14 NA
primarytumourgrade: 0.26 0.38 -0.27 NA 0.29 0.38 -0.20 NA
primaryT:2 0.23 0.12 0.26 0.10 0.22 0.11 0.28 0.07
primaryT:3 0.42 0.44 -0.05 NA 0.43 0.42 0.01 NA
primaryT:4 0.14 0.15 -0.04 NA 0.13 0.15 -0.07 NA
primaryT: 0.21 0.28 -0.17 NA 0.22 0.32 -0.23 NA
primaryN:0 0.34 0.22 0.25 0.00 0.29 0.24 0.12 0.05
primaryN:1 0.22 0.38 -0.40 NA 0.26 0.34 -0.18 NA
primaryN:2 0.16 0.12 0.09 NA 0.16 0.13 0.09 NA
primaryN:3 0.08 0.01 0.26 NA 0.07 0.01 0.24 NA
primaryN: 0.20 0.26 -0.14 NA 0.22 0.29 -0.17 NA
year_primary:0 0.03 0.02 0.07 0.37 0.03 0.02 0.07 0.48
year_primary:1 0.42 0.33 0.20 NA 0.41 0.35 0.12 NA
year_primary:2 0.25 0.25 0.00 NA 0.26 0.22 0.08 NA
year_primary:3 0.09 0.08 0.03 NA 0.09 0.07 0.07 NA
year_primary:4 0.04 0.06 -0.08 NA 0.04 0.06 -0.10 NA
year_primary:5 0.07 0.09 -0.10 NA 0.07 0.10 -0.15 NA
year_primary: 0.10 0.17 -0.26 NA 0.10 0.17 -0.24 NA
primarytreatment:no 0.25 0.24 0.02 0.51 0.24 0.27 -0.07 0.43
primarytreatment:yes 0.60 0.55 0.09 NA 0.60 0.51 0.17 NA
primarytreatment: 0.16 0.21 -0.14 NA 0.16 0.22 -0.14 NA
Dataset number 2
tx.mn ct.mn std.eff.sz p tx.mn ct.mn std.eff.sz p
age 63.36 60.34 0.26 0.03 63.11 60.90 0.20 0.12
sex:female 0.40 0.33 0.16 0.17 0.36 0.32 0.07 0.60
sex:male 0.60 0.67 -0.16 NA 0.64 0.68 -0.07 NA
CEA 34.54 50.39 -0.10 0.38 32.61 45.15 -0.09 0.45
ismajor 0.27 0.69 -0.84 0.00 0.40 0.55 -0.30 0.05
difloc 0.34 0.56 -0.43 0.00 0.41 0.46 -0.12 0.41
isbilateral 0.11 0.27 -0.41 0.00 0.12 0.21 -0.24 0.05
lesionmaxdiameter 32.13 40.99 -0.34 0.00 33.70 36.41 -0.11 0.38
lesioncount 1.47 2.12 -0.48 0.00 1.53 1.86 -0.25 0.04
primarytumourgrade:moderately differentiated 0.76 0.67 0.22 0.18 0.76 0.70 0.13 0.53
primarytumourgrade:poorly differentiated 0.19 0.25 -0.14 NA 0.20 0.24 -0.09 NA
primarytumourgrade:well differentiated 0.05 0.09 -0.18 NA 0.04 0.06 -0.10 NA
primaryT:2 0.29 0.20 0.20 0.15 0.26 0.16 0.23 0.16
primaryT:3 0.51 0.62 -0.20 NA 0.57 0.64 -0.14 NA
primaryT:4 0.20 0.19 0.03 NA 0.17 0.20 -0.09 NA
primaryN:0 0.42 0.30 0.23 0.00 0.42 0.30 0.26 0.01
primaryN:1 0.29 0.51 -0.48 NA 0.31 0.51 -0.44 NA
primaryN:2 0.19 0.17 0.06 NA 0.18 0.17 0.03 NA
primaryN:3 0.10 0.02 0.27 NA 0.09 0.02 0.22 NA
year_primary:0 0.05 0.02 0.12 0.63 0.04 0.02 0.11 0.68
year_primary:1 0.47 0.41 0.13 NA 0.43 0.45 -0.04 NA
year_primary:2 0.26 0.32 -0.13 NA 0.26 0.31 -0.12 NA
year_primary:3 0.09 0.09 -0.02 NA 0.13 0.08 0.15 NA
year_primary:4 0.05 0.06 -0.08 NA 0.05 0.06 -0.08 NA
year_primary:5 0.08 0.09 -0.04 NA 0.09 0.08 0.05 NA
primarytreatment:no 0.31 0.33 -0.04 0.75 0.34 0.34 0.00 0.97
primarytreatment:yes 0.69 0.67 0.04 NA 0.66 0.66 0.00 NA
Dataset number 3
tx.mn ct.mn std.eff.sz p tx.mn ct.mn std.eff.sz p
age 63.36 60.33 0.26 0.03 62.98 60.49 0.22 0.09
sex:female 0.40 0.33 0.16 0.17 0.38 0.34 0.09 0.53
sex:male 0.60 0.67 -0.16 NA 0.62 0.66 -0.09 NA
CEA 36.58 64.16 -0.16 0.18 36.91 54.70 -0.11 0.34
ismajor 0.27 0.69 -0.84 0.00 0.39 0.55 -0.32 0.02
difloc 0.34 0.56 -0.43 0.00 0.42 0.46 -0.08 0.53
isbilateral 0.11 0.27 -0.41 0.00 0.12 0.22 -0.25 0.05
lesionmaxdiameter 32.46 41.48 -0.34 0.00 34.06 38.69 -0.18 0.17
lesioncount 1.48 2.12 -0.47 0.00 1.58 1.87 -0.23 0.06
primarytumourgrade:moderately differentiated 0.75 0.70 0.13 0.23 0.73 0.74 -0.01 0.50
primarytumourgrade:poorly differentiated 0.21 0.22 -0.03 NA 0.23 0.20 0.07 NA
primarytumourgrade:well differentiated 0.03 0.08 -0.25 NA 0.03 0.06 -0.16 NA
primaryT:2 0.26 0.21 0.11 0.60 0.25 0.20 0.11 0.69
primaryT:3 0.54 0.59 -0.09 NA 0.54 0.58 -0.10 NA
primaryT:4 0.20 0.20 -0.01 NA 0.22 0.21 0.01 NA
primaryN:0 0.41 0.34 0.14 0.00 0.36 0.34 0.04 0.50
primaryN:1 0.31 0.48 -0.37 NA 0.35 0.44 -0.20 NA
primaryN:2 0.18 0.17 0.03 NA 0.19 0.17 0.06 NA
primaryN:3 0.10 0.01 0.29 NA 0.10 0.05 0.17 NA
year_primary:0 0.04 0.03 0.06 0.66 0.04 0.04 0.03 0.78
year_primary:1 0.47 0.38 0.16 NA 0.46 0.37 0.17 NA
year_primary:2 0.27 0.30 -0.05 NA 0.26 0.32 -0.14 NA
year_primary:3 0.10 0.12 -0.04 NA 0.11 0.10 0.02 NA
year_primary:4 0.04 0.06 -0.12 NA 0.04 0.06 -0.11 NA
year_primary:5 0.08 0.11 -0.13 NA 0.08 0.10 -0.06 NA
primarytreatment:no 0.32 0.31 0.01 0.95 0.31 0.30 0.03 0.81
primarytreatment:yes 0.68 0.69 -0.01 NA 0.69 0.70 -0.03 NA
Dataset number 4
tx.mn ct.mn std.eff.sz p tx.mn ct.mn std.eff.sz p
age 63.36 60.65 0.23 0.05 63.04 61.81 0.11 0.41
sex:female 0.40 0.33 0.16 0.17 0.37 0.31 0.12 0.36
sex:male 0.60 0.67 -0.16 NA 0.63 0.69 -0.12 NA
CEA 33.52 62.36 -0.18 0.15 30.66 56.82 -0.18 0.14
ismajor 0.27 0.69 -0.84 0.00 0.40 0.56 -0.32 0.02
difloc 0.34 0.56 -0.43 0.00 0.41 0.46 -0.10 0.44
isbilateral 0.11 0.27 -0.41 0.00 0.14 0.22 -0.21 0.14
lesionmaxdiameter 32.49 40.54 -0.30 0.01 33.45 38.07 -0.19 0.14
lesioncount 1.48 2.15 -0.49 0.00 1.62 1.94 -0.24 0.08
primarytumourgrade:moderately differentiated 0.75 0.66 0.22 0.22 0.74 0.66 0.18 0.39
primarytumourgrade:poorly differentiated 0.19 0.26 -0.18 NA 0.21 0.28 -0.17 NA
primarytumourgrade:well differentiated 0.06 0.08 -0.11 NA 0.05 0.06 -0.06 NA
primaryT:2 0.27 0.17 0.23 0.10 0.24 0.15 0.22 0.05
primaryT:3 0.53 0.57 -0.08 NA 0.57 0.56 0.04 NA
primaryT:4 0.20 0.26 -0.16 NA 0.18 0.30 -0.29 NA
primaryN:0 0.42 0.31 0.22 0.00 0.39 0.35 0.08 0.07
primaryN:1 0.31 0.49 -0.40 NA 0.35 0.44 -0.20 NA
primaryN:2 0.18 0.18 -0.01 NA 0.18 0.19 -0.04 NA
primaryN:3 0.10 0.01 0.28 NA 0.09 0.02 0.25 NA
year_primary:0 0.05 0.03 0.09 0.68 0.05 0.03 0.09 0.80
year_primary:1 0.46 0.40 0.12 NA 0.46 0.45 0.02 NA
year_primary:2 0.28 0.30 -0.04 NA 0.29 0.27 0.05 NA
year_primary:3 0.09 0.09 -0.02 NA 0.09 0.09 0.00 NA
year_primary:4 0.04 0.07 -0.16 NA 0.04 0.07 -0.17 NA
year_primary:5 0.08 0.11 -0.10 NA 0.08 0.10 -0.07 NA
primarytreatment:no 0.26 0.32 -0.13 0.28 0.24 0.31 -0.16 0.24
primarytreatment:yes 0.74 0.68 0.13 NA 0.76 0.69 0.16 NA
Dataset number 5
tx.mn ct.mn std.eff.sz p tx.mn ct.mn std.eff.sz p
age 63.36 60.04 0.29 0.02 62.64 60.99 0.14 0.26
sex:female 0.40 0.33 0.16 0.17 0.39 0.32 0.15 0.24
sex:male 0.60 0.67 -0.16 NA 0.61 0.68 -0.15 NA
CEA 34.48 55.85 -0.14 0.26 36.43 53.43 -0.11 0.36
ismajor 0.27 0.69 -0.84 0.00 0.42 0.55 -0.27 0.04
difloc 0.34 0.56 -0.43 0.00 0.42 0.48 -0.13 0.32
isbilateral 0.11 0.27 -0.41 0.00 0.12 0.22 -0.27 0.03
lesionmaxdiameter 33.08 40.51 -0.29 0.02 35.69 38.34 -0.11 0.40
lesioncount 1.48 2.14 -0.48 0.00 1.55 1.90 -0.27 0.03
primarytumourgrade:moderately differentiated 0.77 0.64 0.31 0.01 0.77 0.67 0.24 0.05
primarytumourgrade:poorly differentiated 0.20 0.25 -0.12 NA 0.20 0.23 -0.08 NA
primarytumourgrade:well differentiated 0.03 0.12 -0.45 NA 0.03 0.10 -0.40 NA
primaryT:2 0.30 0.20 0.23 0.10 0.30 0.19 0.23 0.13
primaryT:3 0.52 0.63 -0.22 NA 0.53 0.64 -0.22 NA
primaryT:4 0.18 0.17 0.01 NA 0.18 0.17 0.02 NA
primaryN:0 0.42 0.32 0.21 0.00 0.40 0.34 0.12 0.00
primaryN:1 0.28 0.49 -0.46 NA 0.30 0.47 -0.39 NA
primaryN:2 0.18 0.19 -0.01 NA 0.19 0.18 0.02 NA
primaryN:3 0.11 0.01 0.33 NA 0.12 0.01 0.34 NA
year_primary:0 0.03 0.02 0.07 0.76 0.04 0.02 0.10 0.70
year_primary:1 0.46 0.39 0.14 NA 0.45 0.40 0.11 NA
year_primary:2 0.26 0.29 -0.07 NA 0.26 0.28 -0.04 NA
year_primary:3 0.10 0.10 0.00 NA 0.10 0.09 0.03 NA
year_primary:4 0.06 0.06 -0.05 NA 0.05 0.08 -0.12 NA
year_primary:5 0.09 0.13 -0.14 NA 0.10 0.14 -0.14 NA
primarytreatment:no 0.28 0.34 -0.13 0.28 0.28 0.36 -0.18 0.20
primarytreatment:yes 0.72 0.66 0.13 NA 0.72 0.64 0.18 NA

Generate an “imputationList”" object from the data

This will allow the use of mitools to combine the results of analyses from the survey and other packages and account for the imputations using Rubin’s rules. At this stage, we also construct some new compound variables - the number of laparoscopic procedures, calculation of the “gaptime” and a marker for death OR recurrence.

mit <- impdata[2:6]

for (i in 1:5) {
  mit[[i]] %>% group_by(id_patients) %>%
    mutate(ctime = ifelse(index<max(index),rtime,cens_time),
    numlap = sum(lap),
    cens_month = round(cens_time/365.25*12, digits = 1),
    gaptime = rtime-time,
    censrec = ifelse(index<max(index), 0, cens)) -> mit[[i]]
  mit[[i]]$numlap <- car::Recode(mit[[i]]$numlap, '2:4=2')
  mit[[i]]$index <- car::recode(mit[[i]]$index, '2:4=2')
  mit[[i]] %>% mutate(mhlos = hlos-mean(hlos, na.rm=T)) -> mit[[i]]
}

midata <- imputationList(mit)


The same variables are added to the original (unimputed, unweighted) dataset.

Survey design

These design objects describe the data to the survey package so it can make appropriate adjustments to errors based on clustering and multiple imputation. It ensures that the standard error calculations are appropriate.

design.ate <- svydesign(ids = ~id_patients, weights=~stable.w, data=midata)
design.sing <- svydesign(ids = ~id_patients, weights=~stable.w, data=midata$imputations$psate1)
design.unw <- svydesign(ids = ~id_patients, data=midata)

Demographics

Code for demographics generation - makes extensive use of dplyr.

#Summarise distinct patient numbers and total procedure numbers by surgical approach
ptnumbers <- 
  new %>% 
  group_by(lap) %>% 
  summarise(
    patients = n_distinct(id_patients),
    procedures = n())
  

#Number of patients with single procedures
singlepts <- 
  new %>% 
  group_by(id_patients) %>% 
  filter(n()==1) %>% 
  nrow()

#Multiple procedures
multiplepts <- 
  new %>% 
  group_by(id_patients) %>% 
  filter(n()>1) %>% 
  tally() %>% 
  nrow()
 

procnum <- 
  matrix(c("Single procedures ", singlepts, "Multiple procedures ",
           multiplepts), nrow = 2, byrow = T)
colnames(procnum) <- c("Group", "n")


#Procedures and conversions
proc_list <- 
  new %>% 
  group_by(lap, surgicalapproach) %>% 
  tally()

proc_list <- proc_list[,2:3]

#Procedure type ---------------------

#Hepatectomies
majorhep <- 
  new %>% 
  filter(grepl("hepatectomy", liverprocs)) %>% 
  mutate(
    side= ifelse(grepl("left", liverprocs),
                 "left hepatectomy",
                 "right hepatectomy")) %>%
  group_by(lap, side) %>%
  tally() 
majorhep$lap <- car::recode(majorhep$lap, "1='Lap'; 0='Open'", as.factor.result=T)


#Left lateral
lls <- 
  new %>% 
  filter(grepl("left lateral", liverprocs),
         !grepl("hepatectomy", liverprocs)) %>% 
  group_by(lap) %>%
  tally() 
lls$lap <- car::recode(lls$lap, "1='Lap'; 0='Open'", as.factor.result=T) 

#Segmentectomy/biseg
segment <- new %>% 
  filter(grepl("segment", liverprocs),
         !grepl("hepatectomy", liverprocs),
         !grepl("left lateral", liverprocs)) %>% 
  group_by(lap) %>%
  tally()
segment$lap <- car::recode(segment$lap, "1='Lap'; 0='Open'", as.factor.result=T)
#Tumorectomy (only)
tumorectomy <- 
  new %>% 
  filter(!grepl("hepatectomy", liverprocs), !grepl("left lateral", liverprocs), 
         !grepl("segmentectomy", liverprocs)) %>% 
  group_by(lap) %>%
  tally()
tumorectomy$lap <- car::recode(tumorectomy$lap, "1='Lap'; 0='Open'", as.factor.result=T)


Demographics Output


Patients and Procedures
Laparoscopic Patients Procedures
0 122 138
1 140 146
Multiple procedures
Group n
Single procedures 222
Multiple procedures 27
Surgical approach
Surgical approach n
open 138
hand assist laparoscopic 2
hybrid 10
laparoscopic 119
laparoscopic converted to hand assist 1
laparoscopic converted to hybrid 1
laparoscopic converted to open 13
Major hepatectomy
Laparoscopic Hepatectomy n
Open left hepatectomy 25
Open right hepatectomy 70
Lap left hepatectomy 7
Lap right hepatectomy 32
Left lateral sectionectomy
Laparoscopic n
Open 12
Lap 46
Segmentectomy/Bisegmentectomy
Laparoscopic n
Open 23
Lap 35
Tumorectomy
Laparoscopic n
Open 8
Lap 26

Changes in operative approach over time.

#Year-by-year histogram
new$year <- year(new$opdate)
new$year <- as.factor(new$year)
new %>% group_by(ismajor,lap,year) %>% tally() -> testgraph
testgraph %>% filter(as.character(year)>"1999") -> testgraph
ggplot(testgraph, aes(x=year, y=n, fill=interaction(lap,ismajor))) + geom_histogram(stat="identity") + scale_fill_manual(labels=c("open minor", "lap minor", "open major", "lap major"), name="Procedure type", values = c("royalblue1", "blue4","lightgreen", "green4")) + theme_gdocs() + ggtitle("Operative approach: year-by-year change")

Code for generation of weighted statistics

#Setup for unw vs wtd periop outcomes - Bloodloss, LOS, operative time and margin (posmarg separate)

#weighted, pooled(MI) data
postopwtd <- MIcombine(with(design.ate, svyby(~bloodloss+hlos+optime+margin, ~lap,svyquantile, quantiles=0.5, ci=TRUE, vartype = "var")))

#unweighted, pooled data
postopunw <- MIcombine(with(design.unw, svyby(~bloodloss+hlos+optime+margin, ~lap,svyquantile, quantiles=0.5, ci=TRUE, vartype = "var")))

#----------------------

#Positive margin - get proportions, then compare props and extract P-value

#Weighted
posmargwtd <- MIcombine(with(design.ate, svyby(~posmarg, ~lap, svyciprop, vartype="var")))

#Rubins rule - manual calculation of the Chi-squared statistic for comparison of proportions
X2wtd <- sum(mapply(function(x) x$statistic, lapply(with(design.ate, svytable(~lap + posmarg, Ntotal = 284, round = T)), prop.test)))/5

#Unweighted
posmargunw <- MIcombine(with(design.unw, svyby(~posmarg, ~lap, svyciprop, vartype="var")))

#Rubins rule
X2unw <- sum(mapply(function(x) x$statistic, lapply(with(design.unw, svytable(~lap + posmarg, Ntotal = 284, round = T)), prop.test)))/5

Results of Weighted univariate analysis

  results se (lower upper) missInfo
0:bloodloss 580 72.46 428.4 731.6 51 %
1:bloodloss 300 44.7 212.4 387.6 0 %
0:hlos 7.8 0.5529 6.471 9.129 83 %
1:hlos 5 0.3784 4.258 5.742 0 %
0:optime 169.9 18.98 129.2 210.6 59 %
1:optime 131.2 11.63 106.3 156 58 %
0:margin 4.8 1.142 2.538 7.062 20 %
1:margin 5.2 1.192 2.843 7.557 18 %

Results of Unweighted univariate analysis

  results se (lower upper) missInfo
0:bloodloss 580 63.01 441.2 718.8 66 %
1:bloodloss 200 25.51 150 250 0 %
0:hlos 8 0.2551 7.5 8.5 0 %
1:hlos 5 0.2562 4.498 5.502 0 %
0:optime 182 16.83 146.2 217.8 56 %
1:optime 120 5.343 109.5 130.5 0 %
0:margin 4.2 0.8886 2.408 5.992 33 %
1:margin 5 0.7667 3.497 6.503 0 %

Results of Weighted margin status

p = 0.035
  results se (lower upper) missInfo
0 0.1796 0.04688 0.08143 0.2777 51 %
1 0.08852 0.03012 0.02693 0.1501 41 %

Results of Unweighted margin status

p = 0.032
  results se (lower upper) missInfo
0 0.1899 0.03665 0.117 0.2628 24 %
1 0.09452 0.02932 0.03536 0.1537 34 %


Kaplan-Meier survival estimates and follow-up

[1] “Median follow-up (reverse KM method): 33.37 months” Median OS (cohort): 111.5 months

  median LCL UCL
lap=0 101.3 58.2 NA
lap=1 118.3 50.1 NA

Combination of Chi Square Statistics for Multiply Imputed Data

Using 5 Imputed Data Sets

F(1,10016.78)=0.067 p=0.79525

Chi Square Approximation Chi2(1)=0.067 p=0.79525

D p df df2 chisq.approx p.approx
0.06734 0.7953 1 10017 0.06734 0.7952

[1] “Open 5yr OS: 0.663 (95% CI 0.521-0.806)” [1] “Laparoscopic 5yr OS: 0.599 (95% CI 0.482-0.716)”

Kaplan-Meier RFS
  median LCL UCL
lap=0, strata(index)=index=1 42.2 22.7 NA
lap=0, strata(index)=index=2 21.2 13 NA
lap=1, strata(index)=index=1 32.3 25.2 58.6
lap=1, strata(index)=index=2 32.9 24.4 NA

Combination of Chi Square Statistics for Multiply Imputed Data

Using 5 Imputed Data Sets

F(1,40816.53)=0.04 p=0.84238

Chi Square Approximation Chi2(1)=0.04 p=0.84238

D p df df2 chisq.approx p.approx
0.03954 0.8424 1 40817 0.03954 0.8424

Open 5yr OS: 0.465 (95% CI 0.331-0.599)Laparoscopic 5yr OS: 0.378 (95% CI 0.262-0.494)

  median LCL UCL
lap=0 42.2 22.7 NA

lap=1 32.3 25.2 58.6

Combination of Chi Square Statistics for Multiply Imputed Data

Using 5 Imputed Data Sets

F(1,40369.41)=0.046 p=0.83061

Chi Square Approximation Chi2(1)=0.046 p=0.83061

D p df df2 chisq.approx p.approx
0.04576 0.8306 1 40369 0.04576 0.8306
  median LCL UCL
lap=0 21.2 13 NA
lap=1 32.9 24.4 NA

Combination of Chi Square Statistics for Multiply Imputed Data

Using 5 Imputed Data Sets

F(1,24167.28)=1.189 p=0.27558

Chi Square Approximation Chi2(1)=1.189 p=0.27557

D p df df2 chisq.approx p.approx
1.189 0.2756 1 24167 1.189 0.2756

Weighted regression

pander(spm(doublerobust.full)) #full os doublerobust
  est se t df Pr(>|t|) lo 95 hi 95 nmis fmi lambda
lap 0.1512 0.3298 0.4586 619.5 0.6467 -0.4965 0.7989 NA 0.08328 0.08033
ismajor -0.2032 0.368 -0.5523 281.3 0.5812 -0.9276 0.5211 NA 0.1254 0.1192
isbilateral -0.3589 0.7891 -0.4549 56.95 0.6509 -1.939 1.221 NA 0.2895 0.265
primaryN2 0.02581 0.4992 0.05171 28.9 0.9591 -0.9953 1.047 NA 0.4114 0.372
primaryN3 0.2483 0.4527 0.5485 65.45 0.5852 -0.6556 1.152 NA 0.2692 0.2472
primaryN4 -0.4366 0.8557 -0.5102 16.74 0.6166 -2.244 1.371 NA 0.5406 0.4888
primaryT2 0.7625 0.5542 1.376 89.21 0.1723 -0.3386 1.864 NA 0.2288 0.2117
primaryT3 1.757 0.5742 3.06 275.2 0.002431 0.6268 2.888 NA 0.1269 0.1205
lesioncount 0.2215 0.2125 1.042 68.66 0.3009 -0.2025 0.6454 NA 0.2625 0.2414
pander(spm(doublerobust.final)) #final os double robust
  est se t df Pr(>|t|) lo 95 hi 95 nmis fmi lambda
lap 0.1304 0.3113 0.4189 4613 0.6753 -0.4798 0.7406 NA 0.0298 0.02938
pander(spm(rec_double.full)) #full Rfs doublerobust
  est se t df Pr(>|t|) lo 95 hi 95 nmis fmi lambda
lap 0.04581 0.2205 0.2078 3455 0.8354 -0.3865 0.4782 NA 0.03452 0.03396
ismajor 0.03514 0.2241 0.1568 803.6 0.8755 -0.4048 0.475 NA 0.07282 0.07052
isbilateral 0.4109 0.3869 1.062 313.5 0.2891 -0.3505 1.172 NA 0.1185 0.1129
primaryN2 0.1182 0.3011 0.3927 50.57 0.6962 -0.4863 0.7228 NA 0.3081 0.2812
primaryN3 0.2834 0.362 0.7829 36.34 0.4388 -0.4506 1.017 NA 0.3657 0.3318
primaryN4 0.1061 0.5887 0.1802 28.42 0.8582 -1.099 1.311 NA 0.415 0.3752
lesioncount 0.06626 0.1028 0.6443 420.5 0.5197 -0.1359 0.2684 NA 0.1018 0.09751
primaryT2 0.3426 0.3321 1.032 79.72 0.3053 -0.3182 1.003 NA 0.2427 0.224
primaryT3 0.7932 0.3524 2.251 280.1 0.02517 0.09951 1.487 NA 0.1257 0.1195
pander(spm(rec_double.final)) #final rfs double robust
  est se t df Pr(>|t|) lo 95 hi 95 nmis fmi lambda
lap -0.03262 0.209 -0.1561 32169 0.876 -0.4423 0.377 NA 0.01103 0.01097
pander(spm(mvr.os)) #full os multivar 
  est se t df Pr(>|t|) lo 95 hi 95 nmis fmi lambda
lap 0.3846 0.3529 1.09 120.6 0.278 -0.3141 1.083 NA 0.1953 0.1821
ismajor -0.3395 0.444 -0.7648 51.68 0.4479 -1.231 0.5515 NA 0.3046 0.2782
isbilateral -0.3332 0.8118 -0.4104 69.17 0.6828 -1.953 1.286 NA 0.2615 0.2405
primaryN2 0.1717 0.5185 0.3312 22.52 0.7436 -0.9022 1.246 NA 0.4668 0.4214
primaryN3 0.3676 0.4794 0.7668 31.38 0.4489 -0.6096 1.345 NA 0.3944 0.357
primaryN4 -0.2597 0.8469 -0.3066 15.25 0.7633 -2.062 1.543 NA 0.5656 0.5122
lesioncount 0.2407 0.2236 1.076 62.56 0.2859 -0.2063 0.6877 NA 0.2756 0.2529
primaryT2 0.7182 0.5825 1.233 69.74 0.2218 -0.4437 1.88 NA 0.2604 0.2395
primaryT3 1.664 0.6105 2.725 131.7 0.007303 0.456 2.871 NA 0.1865 0.1743
bloodloss -1.435e-05 0.0005085 -0.02822 52.14 0.9776 -0.001035 0.001006 NA 0.3032 0.277
mhlos -0.06835 0.09213 -0.7419 11.56 0.473 -0.2699 0.1332 NA 0.6447 0.5881
optime 0.002552 0.002666 0.9574 24.79 0.3476 -0.00294 0.008044 NA 0.4447 0.4017
posmarg2 1.001 0.3928 2.548 47.33 0.01415 0.2107 1.791 NA 0.3189 0.2907
pander(mvr.os.raw) #full rfs multivar
Fitting Proportional Hazards Regression Model: Surv(time, ctime, censrec) ~ lap + cluster(id_patients) + ismajor + isbilateral + primaryN + lesioncount + primaryT + bloodloss + mhlos + optime + posmarg
  coef exp(coef) robust se z p
lap 1.198 3.313 0.868 1.38 0.2
ismajor -0.8508 0.4271 1.421 -0.5988 0.5
isbilateral -1.302 0.272 4.677 -0.2783 0.8
primaryN1 0.5226 1.686 0.9429 0.5542 0.6
primaryN2 1.634 5.125 0.949 1.722 0.09
primaryN3 -0.1627 0.8498 0.6924 -0.235 0.8
lesioncount 0.2604 1.297 1.059 0.246 0.8
primaryT3 0.4009 1.493 0.9847 0.4071 0.7
primaryT4 2.26 9.583 1.044 2.164 0.03
bloodloss -1.697e-05 1 0.0007696 -0.02205 1
mhlos 0.1751 1.191 0.08436 2.075 0.04
optime -0.009029 0.991 0.005808 -1.555 0.1
posmarg1 2.436 11.43 0.8564 2.844 0.004

Likelihood ratio test=22.75 on 13 df, p=0.0447748 n= 106, number of events= 17 (178 observations deleted due to missingness)

pander(spm(mvr.rfs))
  est se t df Pr(>|t|) lo 95 hi 95 nmis fmi lambda
lap 0.1169 0.2351 0.4974 5021 0.6189 -0.344 0.5778 NA 0.02854 0.02815
ismajor -0.03091 0.2744 -0.1126 121.5 0.9105 -0.5742 0.5124 NA 0.1946 0.1815
isbilateral 0.4257 0.3673 1.159 993.6 0.2467 -0.2951 1.147 NA 0.0653 0.06342
primaryN2 0.1733 0.3095 0.5598 72.18 0.5774 -0.4438 0.7903 NA 0.2557 0.2354
primaryN3 0.3071 0.3815 0.805 27.09 0.4278 -0.4756 1.09 NA 0.4252 0.3843
primaryN4 0.1313 0.543 0.2419 35.83 0.8103 -0.97 1.233 NA 0.3684 0.3341
lesioncount 0.06948 0.09343 0.7437 344.6 0.4576 -0.1143 0.2532 NA 0.1128 0.1077
primaryT2 0.3437 0.3326 1.033 76.24 0.3048 -0.3188 1.006 NA 0.2485 0.229
primaryT3 0.7699 0.3965 1.942 68.64 0.05625 -0.02109 1.561 NA 0.2626 0.2414
bloodloss -8.427e-05 0.0003267 -0.2579 62.9 0.7973 -0.0007372 0.0005687 NA 0.2749 0.2522
mhlos 0.06212 0.0445 1.396 141.8 0.1649 -0.02584 0.1501 NA 0.1794 0.168
optime 0.0007663 0.001784 0.4295 597.8 0.6677 -0.002737 0.00427 NA 0.08483 0.08177
posmarg2 0.6043 0.3123 1.935 39.86 0.06006 -0.02683 1.236 NA 0.3487 0.3168
pander(mvr.rfs.raw)
Fitting Proportional Hazards Regression Model: Surv(gaptime, (rec == 1 | censrec == 1)) ~ lap + cluster(id_patients) + ismajor + isbilateral + primaryN + lesioncount + primaryT + bloodloss + mhlos + optime + strata(index) + posmarg
  coef exp(coef) robust se z p
lap -0.2621 0.7695 0.4181 -0.6268 0.5
ismajor -0.2572 0.7732 0.414 -0.6212 0.5
isbilateral -0.4267 0.6526 0.4327 -0.9861 0.3
primaryN1 0.7076 2.029 0.4145 1.707 0.09
primaryN2 0.1123 1.119 0.6905 0.1626 0.9
primaryN3 0.03162 1.032 0.7293 0.04335 1
lesioncount 0.178 1.195 0.1226 1.453 0.1
primaryT3 0.07271 1.075 0.4329 0.168 0.9
primaryT4 0.7002 2.014 0.4797 1.46 0.1
bloodloss -0.00019 0.9998 0.0004663 -0.4074 0.7
mhlos 0.02749 1.028 0.03879 0.7086 0.5
optime -0.001182 0.9988 0.002798 -0.4225 0.7
posmarg1 1.111 3.037 0.5621 1.976 0.05

Likelihood ratio test=12.12 on 13 df, p=0.5178495 n= 106, number of events= 45 (178 observations deleted due to missingness)

pander(spm(os_final)) #final os multivar
  est se t df Pr(>|t|) lo 95 hi 95 nmis fmi lambda
primaryT2 0.9008 0.5469 1.647 42.59 0.1069 -0.2025 2.004 NA 0.3369 0.3064
primaryT3 1.705 0.574 2.97 51.74 0.004508 0.5528 2.857 NA 0.3044 0.278
posmarg2 0.8393 0.341 2.461 58.81 0.01679 0.1569 1.522 NA 0.2847 0.2608
lap 0.02384 0.296 0.08053 2198 0.9358 -0.5566 0.6043 NA 0.04348 0.04261
lesioncount 0.1797 0.09706 1.851 177.6 0.06582 -0.01188 0.3712 NA 0.1595 0.1501
pander(spm(rfs_final)) #final rfs multivar
  est se t df Pr(>|t|) lo 95 hi 95 nmis fmi lambda
primaryT2 0.3955 0.3563 1.11 57.51 0.2716 -0.3178 1.109 NA 0.2881 0.2637
primaryT3 0.8582 0.3987 2.152 51.84 0.03604 0.05806 1.658 NA 0.3041 0.2778
posmarg2 0.5568 0.3399 1.638 24.56 0.1142 -0.1439 1.258 NA 0.4469 0.4036
mhlos 0.04734 0.04543 1.042 152.4 0.299 -0.04242 0.1371 NA 0.1728 0.162
lap -0.01222 0.2158 -0.05665 39503 0.9548 -0.4352 0.4107 NA 0.00991 0.00986

Regression output