Skip to contents

This is a wrapper function to provide adjusted effect estimates and relevant statistics in anchored case (i.e. there is a common comparator arm in the internal and external trial).

Usage

maic_anchored(
  weights_object,
  ipd,
  pseudo_ipd,
  trt_ipd,
  trt_agd,
  trt_common,
  trt_var_ipd = "ARM",
  trt_var_agd = "ARM",
  endpoint_type = "tte",
  endpoint_name = "Time to Event Endpoint",
  eff_measure = c("HR", "OR", "RR", "RD"),
  boot_ci_type = c("norm", "basic", "stud", "perc", "bca"),
  time_scale = "months",
  km_conf_type = "log-log",
  binary_robust_cov_type = "HC3"
)

Arguments

weights_object

an object returned by estimate_weight

ipd

a data frame that meet format requirements in 'Details', individual patient data (IPD) of internal trial

pseudo_ipd

a data frame, pseudo IPD from digitized KM curve of external trial (for time-to-event endpoint) or from contingency table (for binary endpoint)

trt_ipd

a string, name of the interested investigation arm in internal trial ipd (internal IPD)

trt_agd

a string, name of the interested investigation arm in external trial pseudo_ipd (pseudo IPD)

trt_common

a string, name of the common comparator in internal and external trial

trt_var_ipd

a string, column name in ipd that contains the treatment assignment

trt_var_agd

a string, column name in ipd that contains the treatment assignment

endpoint_type

a string, one out of the following "binary", "tte" (time to event)

endpoint_name

a string, name of time to event endpoint, to be show in the last line of title

eff_measure

a string, "RD" (risk difference), "OR" (odds ratio), "RR" (relative risk) for a binary endpoint; "HR" for a time-to-event endpoint. By default is NULL, "OR" is used for binary case, otherwise "HR" is used.

boot_ci_type

a string, one of c("norm","basic", "stud", "perc", "bca") to select the type of bootstrap confidence interval. See boot::boot.ci for more details.

time_scale

a string, time unit of median survival time, taking a value of 'years', 'months', 'weeks' or 'days'. NOTE: it is assumed that values in TIME column of ipd and pseudo_ipd is in the unit of days

km_conf_type

a string, pass to conf.type of survfit

binary_robust_cov_type

a string to pass to argument type of sandwich::vcovHC, see possible options in the documentation of that function. Default is "HC3"

Value

A list, contains 'descriptive' and 'inferential'

Details

It is required that input ipd and pseudo_ipd to have the following columns. This function is not sensitive to upper or lower case of letters in column names.

  • USUBJID - character, unique subject ID

  • ARM - character or factor, treatment indicator, column name does not have to be 'ARM'. User specify in trt_var_ipd and trt_var_agd

For time-to-event analysis, the follow columns are required:

  • EVENT - numeric, 1 for censored/death, 0 otherwise

  • TIME - numeric column, observation time of the EVENT; unit in days

For binary outcomes:

  • RESPONSE - numeric, 1 for event occurred, 0 otherwise

Examples

# Anchored example using maic_anchored for time-to-event data
data(weighted_twt)
data(adtte_twt)
data(pseudo_ipd_twt)

result_tte <- maic_anchored(
  weights_object = weighted_twt,
  ipd = adtte_twt,
  pseudo_ipd = pseudo_ipd_twt,
  trt_var_ipd = "ARM",
  trt_var_agd = "ARM",
  trt_ipd = "A",
  trt_agd = "B",
  trt_common = "C",
  endpoint_name = "Overall Survival",
  endpoint_type = "tte",
  eff_measure = "HR",
  time_scale = "month",
  km_conf_type = "log-log",
)
result_tte$inferential$report_median_surv
#>   treatment                 type records    n.max  n.start   events     rmean
#> 1     ARM=C IPD, before matching     500 500.0000 500.0000 500.0000  2.564797
#> 2     ARM=A IPD, before matching     500 500.0000 500.0000 190.0000  8.709690
#> 3     ARM=C  IPD, after matching     500 173.4208 173.4208 173.4208  2.690665
#> 4     ARM=A  IPD, after matching     500 173.4208 173.4208  55.5418 10.575301
#> 5     ARM=C        AgD, external     500 500.0000 500.0000 500.0000  2.455272
#> 6     ARM=B        AgD, external     300 300.0000 300.0000 178.0000  4.303551
#>    se(rmean)    median   0.95LCL   0.95UCL
#> 1 0.11366994  1.836467  1.644765  2.045808
#> 2 0.35514766  7.587627  6.278691 10.288538
#> 3 0.20750373  1.818345  1.457222  2.352181
#> 4 0.57325902 12.166430 10.244293        NA
#> 5 0.09848888  1.851987  1.670540  2.009650
#> 6 0.33672602  2.746131  2.261125  3.320857
result_tte$inferential$report_overall_robustCI
#>                         Matching treatment     N  n.events(%) median[95% CI]
#> 2           IPD/Overall Survival     ARM=A   500   190( 38.0)  7.6[6.3;10.3]
#> 1                                    ARM=C   500   500(100.0)  1.8[1.6; 2.0]
#> 21 weighted IPD/Overall Survival     ARM=A 173.4  55.5( 32.0) 12.2[10.2; NA]
#> 11                                   ARM=C 173.4 173.4(100.0)  1.8[ 1.5;2.4]
#> 22          Agd/Overall Survival     ARM=B   300   178( 59.3)   2.7[2.3;3.3]
#> 12                                   ARM=C   500   500(100.0)   1.9[1.7;2.0]
#> 7                  ** adj.A vs B        --    --           --             --
#>           HR[95% CI] p-Value
#> 2    0.22[0.19;0.26]  <0.001
#> 1                           
#> 21   0.16[0.11;0.24]  <0.001
#> 11                          
#> 22   0.57[0.48;0.68]  <0.001
#> 12                          
#> 7  0.29 [0.19; 0.44]  <0.001
result_tte$inferential$report_overall_bootCI
#>                         Matching treatment     N  n.events(%) median[95% CI]
#> 2           IPD/Overall Survival     ARM=A   500   190( 38.0)  7.6[6.3;10.3]
#> 1                                    ARM=C   500   500(100.0)  1.8[1.6; 2.0]
#> 21 weighted IPD/Overall Survival     ARM=A 173.4  55.5( 32.0) 12.2[10.2; NA]
#> 11                                   ARM=C 173.4 173.4(100.0)  1.8[ 1.5;2.4]
#> 22          AgD/Overall Survival     ARM=B   300   178( 59.3)   2.7[2.3;3.3]
#> 12                                   ARM=C   500   500(100.0)   1.9[1.7;2.0]
#> 7                  ** adj.A vs B        --    --           --             --
#>           HR[95% CI] p-Value
#> 2    0.22[0.19;0.26]  <0.001
#> 1                           
#> 21   0.16[0.11;0.24]  <0.001
#> 11                          
#> 22   0.57[0.48;0.68]  <0.001
#> 12                          
#> 7  0.29 [0.20; 0.43]    <NA>
# Anchored example using maic_anchored for binary outcome
data(weighted_twt)
data(adrs_twt)

# Reported summary data
pseudo_adrs <- get_pseudo_ipd_binary(
  binary_agd = data.frame(
    ARM = c("B", "C", "B", "C"),
    RESPONSE = c("YES", "YES", "NO", "NO"),
    COUNT = c(280, 120, 200, 200)
  ),
  format = "stacked"
)

# inferential result
result_binary <- maic_anchored(
  weights_object = weighted_twt,
  ipd = adrs_twt,
  pseudo_ipd = pseudo_adrs,
  trt_var_ipd = "ARM",
  trt_var_agd = "ARM",
  trt_ipd = "A",
  trt_agd = "B",
  trt_common = "C",
  endpoint_name = "Binary Event",
  endpoint_type = "binary",
  eff_measure = "OR"
)
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Warning: non-integer #successes in a binomial glm!
#> Waiting for profiling to be done...
#> Waiting for profiling to be done...
#> Waiting for profiling to be done...
#> Waiting for profiling to be done...

result_binary$inferential$report_overall_robustCI
#>                     Matching treatment   N n.events(%)        OR[95% CI]
#> A           IPD/Binary Event         A 500   390(78.0)   1.70[1.28;2.26]
#> C                                    C 500   338(67.6)                  
#> A1 weighted IPD/Binary Event         A 500 128.8(25.8)   1.14[0.67;1.95]
#> C1                                   C 500 124.2(24.8)                  
#> B           AgD/Binary Event         B 480   280(58.3)   2.33[1.75;3.12]
#> C2                                   C 320   120(37.5)                  
#> 7              ** adj.A vs B        --  --          -- 0.49 [0.27; 0.90]
#>    p-Value
#> A   <0.001
#> C         
#> A1   0.624
#> C1        
#> B   <0.001
#> C2        
#> 7    0.022
result_binary$inferential$report_overall_bootCI
#>                     Matching treatment   N n.events(%)        OR[95% CI]
#> A           IPD/Binary Event         A 500   390(78.0)   1.70[1.28;2.26]
#> C                                    C 500   338(67.6)                  
#> A1 weighted IPD/Binary Event         A 500 128.8(25.8)   1.14[0.33;0.98]
#> C1                                   C 500 124.2(24.8)                  
#> B           AgD/Binary Event         B 480   280(58.3)   2.33[1.75;3.12]
#> C2                                   C 320   120(37.5)                  
#> 7              ** adj.A vs B        --  --          -- 0.49 [0.14; 0.42]
#>    p-Value
#> A   <0.001
#> C         
#> A1      NA
#> C1        
#> B   <0.001
#> C2        
#> 7     <NA>