Title: | Matching Adjusted Indirect Comparison |
Version: | 0.1.2 |
Description: | Facilitates performing matching adjusted indirect comparison (MAIC) analysis where the endpoint of interest is either time-to-event (e.g. overall survival) or binary (e.g. objective tumor response). The method is described by Signorovitch et al (2012) <doi:10.1016/j.jval.2012.05.004>. |
License: | Apache License 2.0 |
URL: | https://github.com/hta-pharma/maicplus/, https://hta-pharma.github.io/maicplus/ |
BugReports: | https://github.com/hta-pharma/maicplus/issues |
Depends: | R (≥ 4.1) |
Imports: | graphics, grDevices, stats, survival, lubridate, matrixStats, MASS, boot, stringr, lmtest, sandwich |
Suggests: | knitr, testthat (≥ 2.0), ggplot2, rmarkdown, dplyr, survminer, flexsurv, tibble, vdiffr, checkmate |
VignetteBuilder: | knitr |
Encoding: | UTF-8 |
Language: | en-US |
LazyData: | true |
RoxygenNote: | 7.3.2 |
Config/testthat/edition: | 3 |
NeedsCompilation: | no |
Packaged: | 2025-02-21 14:57:33 UTC; root |
Author: | Gregory Chen [aut], Michael Seo [aut], Isaac Gravestock [aut, cre], Miranta Antoniou [ctb], Chrysostomos Kalyvas [ctb], MSD, Inc. [cph, fnd], F. Hoffmann-La Roche AG [cph, fnd] |
Maintainer: | Isaac Gravestock <isaac.gravestock@roche.com> |
Repository: | CRAN |
Date/Publication: | 2025-02-21 16:00:02 UTC |
maicplus: Matching Adjusted Indirect Comparison
Description
Facilitates performing matching adjusted indirect comparison (MAIC) analysis where the endpoint of interest is either time-to-event (e.g. overall survival) or binary (e.g. objective tumor response). The method is described by Signorovitch et al (2012) doi:10.1016/j.jval.2012.05.004.
Author(s)
Maintainer: Isaac Gravestock isaac.gravestock@roche.com
Authors:
Gregory Chen xiangyi.gregory.chen@msd.com
Michael Seo michael.seo@roche.com
Other contributors:
Miranta Antoniou miranta.antoniou@roche.com [contributor]
Chrysostomos Kalyvas chrysostomos.kal@gmail.com [contributor]
MSD, Inc. [copyright holder, funder]
F. Hoffmann-La Roche AG [copyright holder, funder]
See Also
Useful links:
Report bugs at https://github.com/hta-pharma/maicplus/issues
Binary outcome data from single arm trial
Description
Binary outcome data from single arm trial
Usage
adrs_sat
Format
A data frame with 500 rows and 5 columns:
- USUBJID
Unique subject identifiers for patients.
- ARM
Assigned treatment arm.
- AVAL
Analysis value, in this dataset an indicator of response.
- PARAM
Parameter type of
AVAL
.- RESPONSE
Indicator of response.
See Also
Other unanchored datasets:
adsl_sat
,
adtte_sat
,
agd
,
centered_ipd_sat
,
pseudo_ipd_sat
,
weighted_sat
Binary outcome data from two arm trial
Description
Binary outcome data from two arm trial
Usage
adrs_twt
Format
A data frame with 1000 rows and 5 columns:
- USUBJID
Unique subject identifiers for patients.
- ARM
Assigned treatment arm,
"A"
,"C"
.- AVAL
Analysis value, in this dataset an indicator of response.
- PARAM
Parameter type of
AVAL
.- RESPONSE
Indicator of response.
See Also
Other anchored datasets:
adsl_twt
,
adtte_twt
,
agd
,
centered_ipd_twt
,
pseudo_ipd_twt
,
weighted_twt
Patient data from single arm study
Description
Patient data from single arm study
Usage
adsl_sat
Format
a data frame with 500 rows and 8 columns:
- USUBJID
Unique subject identifiers for patients.
- ARM
Assigned treatment arm.
- AGE
Age in years at baseline.
- SEX
Sex of patient recorded as character
"Male"
/"Female"
.- SMOKE
Smoking status at baseline as integer
1
/0
.- ECOG0
Indicator of ECOG score = 0 at baseline as integer
1
/0
.- N_PR_THER
Number of prior therapies received as integer
1, 2, 3, 4
.- SEX_MALE
Indicator of
SEX == "Male"
as numeric1
/0
.
See Also
Other unanchored datasets:
adrs_sat
,
adtte_sat
,
agd
,
centered_ipd_sat
,
pseudo_ipd_sat
,
weighted_sat
Patient data from two arm trial
Description
Patient data from two arm trial
Usage
adsl_twt
Format
A data frame with 1000 rows and 8 columns:
- USUBJID
Unique subject identifiers for patients.
- ARM
Assigned treatment arm.
- AGE
Age in years at baseline.
- SEX
Sex of patient recorded as character "Male"/"Female"
- SMOKE
Smoking status at baseline as integer
1
/0
.- ECOG0
Indicator of ECOG score = 0 at baseline as integer
1
/0
.- N_PR_THER
Number of prior therapies received as integer
1, 2, 3, 4
.- SEX_MALE
Indicator of SEX == "Male" as numeric 1/0
See Also
Other anchored datasets:
adrs_twt
,
adtte_twt
,
agd
,
centered_ipd_twt
,
pseudo_ipd_twt
,
weighted_twt
Survival data from single arm trial
Description
Survival data from single arm trial
Usage
adtte_sat
Format
A data frame with 500 rows and 10 columns:
- USUBJID
Unique subject identifiers for patients.
- ARM
Assigned treatment arm,
"A"
.- AVAL
Analysis value which in this dataset overall survival time in days.
- AVALU
Unit of
AVAL
.- PARAMCD
Paramater code of
AVAL
,"OS"
.- PARAM
Parameter name of
AVAL
,"Overall Survival
.- CNSR
Censoring indicator
0
/1
.- TIME
Survival time in days.
- EVENT
Event indicator
0
/1
.
See Also
Other unanchored datasets:
adrs_sat
,
adsl_sat
,
agd
,
centered_ipd_sat
,
pseudo_ipd_sat
,
weighted_sat
Survival data from two arm trial
Description
Survival data from two arm trial
Usage
adtte_twt
Format
A data frame with 1000 rows and 10 columns:
- USUBJID
Unique subject identifiers for patients.
- ARM
Assigned treatment arm,
"A"
,"C"
.- AVAL
Analysis value which in this dataset overall survival time in days.
- AVALU
Unit of
AVAL
.- PARAMCD
Parameter code of
AVAL
,"OS"
.- PARAM
Parameter name of
AVAL
,"Overall Survival
.- CNSR
Censoring indicator
0
/1
.- TIME
Survival time in days.
- EVENT
Event indicator
0
/1
.
See Also
Other anchored datasets:
adrs_twt
,
adsl_twt
,
agd
,
centered_ipd_twt
,
pseudo_ipd_twt
,
weighted_twt
Aggregate effect modifier data from published study
Description
This data is formatted to be used in center_ipd()
.
Usage
agd
Format
A data frame with 3 rows and 9 columns:
- STUDY
The study name, Study_XXXX
- ARM
Study arm name or total
- N
Number of observations in study arm
- AGE_MEAN
Mean age in study arm
- AGE_MEDIAN
Median age in study arm
- AGE_SD
Standard deviation of age in study arm
- SEX_MALE_COUNT
Number of male patients
- ECOG0_COUNT
Number of patients with ECOG score = 0
- SMOKE_COUNT
Number of smokers
- N_PR_THER_MEDIAN
Median number of prior therapies
See Also
Other unanchored datasets:
adrs_sat
,
adsl_sat
,
adtte_sat
,
centered_ipd_sat
,
pseudo_ipd_sat
,
weighted_sat
Other anchored datasets:
adrs_twt
,
adsl_twt
,
adtte_twt
,
centered_ipd_twt
,
pseudo_ipd_twt
,
weighted_twt
Basic Kaplan Meier (KM) plot function
Description
This function can generate a basic KM plot with or without risk set table appended at the bottom. In a single plot,
it can include up to 4 KM curves. This depends on number of levels in 'treatment' column in the input data.frame
kmdat
Usage
basic_kmplot(
kmdat,
endpoint_name = "Time to Event Endpoint",
time_scale = NULL,
time_grid = NULL,
show_risk_set = TRUE,
main_title = "Kaplan-Meier Curves",
subplot_heights = NULL,
suppress_plot_layout = FALSE,
use_colors = NULL,
use_line_types = NULL,
use_pch_cex = 0.65,
use_pch_alpha = 100
)
Arguments
kmdat |
a |
endpoint_name |
a string, name of time to event endpoint, to be show in the last line of title |
time_scale |
a string, time unit of median survival time, taking a value of 'years', 'months', 'weeks' or 'days' |
time_grid |
a numeric vector in the unit of |
show_risk_set |
logical, show risk set table or not, TRUE by default |
main_title |
a string, main title of the KM plot |
subplot_heights |
a numeric vector, heights argument to |
suppress_plot_layout |
logical, suppress the layout setting in this function so that user can specify layout outside of the function, FALSE by default |
use_colors |
a character vector of length up to 4, colors to the KM curves, it will be passed to |
use_line_types |
a numeric vector of length up to 4, line type to the KM curves, it will be passed to |
use_pch_cex |
a scalar between 0 and 1, point size to indicate censored individuals on the KM curves, it will be
passed to |
use_pch_alpha |
a scalar between 0 and 255, degree of color transparency of points to indicate censored
individuals on the KM curves, it will be passed to |
Value
a KM plot with or without risk set table appended at the bottom, with up to 4 KM curves
Examples
library(survival)
data(adtte_sat)
data(pseudo_ipd_sat)
combined_data <- rbind(adtte_sat[, c("TIME", "EVENT", "ARM")], pseudo_ipd_sat)
kmobj <- survfit(Surv(TIME, EVENT) ~ ARM, combined_data, conf.type = "log-log")
kmdat <- do.call(rbind, survfit_makeup(kmobj))
kmdat$treatment <- factor(kmdat$treatment)
# without risk set table
basic_kmplot(kmdat,
time_scale = "month",
time_grid = seq(0, 20, by = 2),
show_risk_set = FALSE,
main_title = "Kaplan-Meier Curves",
subplot_heights = NULL,
suppress_plot_layout = FALSE,
use_colors = NULL,
use_line_types = NULL
)
# with risk set table
basic_kmplot(kmdat,
time_scale = "month",
time_grid = seq(0, 20, by = 2),
show_risk_set = TRUE,
main_title = "Kaplan-Meier Curves",
subplot_heights = NULL,
suppress_plot_layout = FALSE,
use_colors = NULL,
use_line_types = NULL
)
Basic Kaplan Meier (KM) plot function using ggplot
Description
This function generates a basic KM plot using ggplot.
Usage
basic_kmplot2(
kmlist,
kmlist_name,
endpoint_name = "Time to Event Endpoint",
show_risk_set = TRUE,
main_title = "Kaplan-Meier Curves",
break_x_by = NULL,
censor = TRUE,
xlab = "Time",
xlim = NULL,
use_colors = NULL,
use_line_types = NULL
)
Arguments
kmlist |
a list of |
kmlist_name |
a vector indicating the treatment names of each |
endpoint_name |
a string, name of time to event endpoint, to be show in the last line of title |
show_risk_set |
logical, show risk set table or not, TRUE by default |
main_title |
a string, main title of the KM plot |
break_x_by |
bin parameter for |
censor |
indicator to include censor information |
xlab |
label name for x-axis of the plot |
xlim |
x limit for the x-axis of the plot |
use_colors |
a character vector of length up to 4, colors to the KM curves,
it will be passed to 'col' of |
use_line_types |
a numeric vector of length up to 4, line type to the KM curves,
it will be passed to |
Value
A Kaplan-Meier plot object created with survminer::ggsurvplot()
.
Examples
library(survival)
data(adtte_sat)
data(pseudo_ipd_sat)
kmobj_A <- survfit(Surv(TIME, EVENT) ~ ARM,
data = adtte_sat,
conf.type = "log-log"
)
kmobj_B <- survfit(Surv(TIME, EVENT) ~ ARM,
data = pseudo_ipd_sat,
conf.type = "log-log"
)
kmlist <- list(kmobj_A = kmobj_A, kmobj_B = kmobj_B)
kmlist_name <- c("A", "B")
basic_kmplot2(kmlist, kmlist_name)
Bucher method for combining treatment effects
Description
Given two treatment effects of A vs. C and B vs. C derive the treatment effects of A vs. B using the Bucher method. Two-sided confidence interval and Z-test p-value are also calculated. Treatment effects and standard errors should be in log scale for hazard ratio, odds ratio, and risk ratio. Treatment effects and standard errors should be in natural scale for risk difference and mean difference.
Usage
bucher(trt, com, conf_lv = 0.95)
## S3 method for class 'maicplus_bucher'
print(x, ci_digits = 2, pval_digits = 3, exponentiate = FALSE, ...)
Arguments
trt |
a list of two scalars for the study with the
experimental arm. |
com |
same as |
conf_lv |
a numerical scalar, prescribe confidence level to derive two-sided confidence interval for the treatment effect |
x |
|
ci_digits |
an integer, number of decimal places for point estimate and derived confidence limits |
pval_digits |
an integer, number of decimal places to display Z-test p-value |
exponentiate |
whether the treatment effect and confidence interval should be exponentiated. This applies to relative treatment effects. Default is set to false. |
... |
not used |
Value
a list with 5 elements,
- est
a scalar, point estimate of the treatment effect
- se
a scalar, standard error of the treatment effect
- ci_l
a scalar, lower confidence limit of a two-sided CI with prescribed nominal level by
conf_lv
- ci_u
a scalar, upper confidence limit of a two-sided CI with prescribed nominal level by
conf_lv
- pval
p-value of Z-test, with null hypothesis that
est
is zero
Methods (by generic)
-
print(maicplus_bucher)
: Print method formaicplus_bucher
objects
Examples
trt <- list(est = log(1.1), se = 0.2)
com <- list(est = log(1.3), se = 0.18)
result <- bucher(trt, com, conf_lv = 0.9)
print(result, ci_digits = 3, pval_digits = 3)
Calculate Statistics for Weight Plot Legend
Description
Calculates ESS reduction and median weights which is used to create legend for weights plot
Usage
calculate_weights_legend(weighted_data)
Arguments
weighted_data |
object returned after calculating weights using estimate_weights |
Value
list of ESS, ESS reduction, median value of scaled and unscaled weights, and missing count
Examples
data("weighted_sat")
calculate_weights_legend(weighted_sat)
Center individual patient data (IPD) variables using aggregate data averages
Description
This function subtracts IPD variables (prognostic variables and/or effect modifiers) by the aggregate data averages. This centering is needed in order to calculate weights. IPD and aggregate data variable names should match.
Usage
center_ipd(ipd, agd)
Arguments
ipd |
IPD variable names should match the aggregate data names without the suffix. This would involve either changing the aggregate data name or the ipd name. For instance, if we binarize SEX variable with MALE as a reference using dummize_ipd, function names the new variable as SEX_MALE. In this case, SEX_MALE should also be available in the aggregate data. |
agd |
pre-processed aggregate data which contain STUDY, ARM, and N. Variable names should be followed by legal suffixes (i.e. MEAN, MEDIAN, SD, or PROP). Note that COUNT suffix is no longer accepted. |
Value
centered ipd using aggregate level data averages
Examples
data(adsl_sat)
data(agd)
agd <- process_agd(agd)
ipd_centered <- center_ipd(ipd = adsl_sat, agd = agd)
Centered patient data from single arm trial
Description
Centered patient data from single arm trial
Usage
centered_ipd_sat
Format
A data frame with 500 rows and 14 columns:
- USUBJID
Unique subject identifiers for patients.
- ARM
Assigned treatment arm.
- AGE
Age in years at baseline.
- SEX
Sex of patient recorded as character
"Male"
/"Female"
.- SMOKE
Smoking status at baseline as integer
1
/0
.- ECOG0
Indicator of ECOG score = 0 at baseline as integer
1
/0
.- N_PR_THER
Number of prior therapies received as integer
1, 2, 3, 4
.- SEX_MALE
Indicator of
SEX == "Male"
as numeric1
/0
.- AGE_CENTERED
Age in years at baseline relative to average in aggregate data agd.
- AGE_MEDIAN_CENTERED
AGE
greater/less thanMEDIAN_AGE
in agd coded as1
/0
and then centered at 0.5.- AGE_SQUARED_CENTERED
AGE
squared and centered with respect to theAGE
in agd. The squared age in the aggregate data is derived from theE(X^2)
term in the variance formula.- SEX_MALE_CENTERED
SEX_MALE
centered by the proportion of male patients in agd- ECOG0_CENTERED
ECOG0
centered by the proportion ofECOG0
in agd- SMOKE_CENTERED
SMOKE
centered by the proportion ofSMOKE
in agd- N_PR_THER_MEDIAN_CENTERED
N_PR_THER
centered by the median in agd.
See Also
Other unanchored datasets:
adrs_sat
,
adsl_sat
,
adtte_sat
,
agd
,
pseudo_ipd_sat
,
weighted_sat
Centered patient data from two arm trial
Description
Centered patient data from two arm trial
Usage
centered_ipd_twt
Format
A data frame with 1000 rows and 14 columns:
- USUBJID
Unique subject identifiers for patients.
- ARM
Assigned treatment arm.
- AGE
Age in years at baseline.
- SEX
Sex of patient recorded as character
"Male"
/"Female"
.- SMOKE
Smoking status at baseline as integer
1
/0
.- ECOG0
Indicator of ECOG score = 0 at baseline as integer
1
/0
.- N_PR_THER
Number of prior therapies received as integer
1, 2, 3, 4
.- SEX_MALE
Indicator of
SEX == "Male"
as numeric1
/0
.- AGE_CENTERED
Age in years at baseline relative to average in aggregate data agd.
- AGE_MEDIAN_CENTERED
AGE
greater/less thanMEDIAN_AGE
in agd coded as1
/0
and then centered at 0.5.- AGE_SQUARED_CENTERED
AGE
squared and centered with respect to theAGE
in agd. The squared age in the aggregate data is derived from theE(X^2)
term in the variance formula.- SEX_MALE_CENTERED
SEX_MALE
centered by the proportion of male patients in agd- ECOG0_CENTERED
ECOG0
centered by the proportion ofECOG0
in agd- SMOKE_CENTERED
SMOKE
centered by the proportion ofSMOKE
in agd- N_PR_THER_MEDIAN_CENTERED
N_PR_THER
centered by the median in agd.
See Also
Other anchored datasets:
adrs_twt
,
adsl_twt
,
adtte_twt
,
agd
,
pseudo_ipd_twt
,
weighted_twt
Check to see if weights are optimized correctly
Description
This function checks to see if the optimization is done properly
by checking the covariate averages before and after adjustment.
In case of ties when calculating median,
we return the mean of the two numbers. For more details,
see ties
parameter in matrixStats::weightedMedian.
Usage
check_weights(weighted_data, processed_agd)
## S3 method for class 'maicplus_check_weights'
print(
x,
mean_digits = 2,
prop_digits = 2,
sd_digits = 3,
digits = getOption("digits"),
...
)
Arguments
weighted_data |
object returned after calculating weights using |
processed_agd |
a data frame, object returned after using |
x |
object from check_weights |
mean_digits |
number of digits for rounding mean columns in the output |
prop_digits |
number of digits for rounding proportion columns in the output |
sd_digits |
number of digits for rounding mean columns in the output |
digits |
minimal number of significant digits, see print.default. |
... |
further arguments to print.data.frame |
Value
data.frame of weighted and unweighted covariate averages of the IPD,
average of aggregate data, and sum of inner products of covariate x_i
and the weights (exp(x_i\beta)
)
Methods (by generic)
-
print(maicplus_check_weights)
: Print method for check_weights objects
Examples
data(weighted_sat)
data(agd)
check_weights(weighted_sat, process_agd(agd))
Create dummy variables from categorical variables in an individual patient data (ipd)
Description
This is a convenient function to convert categorical variables into dummy binary variables. This would be especially useful if the variable has more than two factors. Note that the original variable is kept after a variable is dummized.
Usage
dummize_ipd(raw_ipd, dummize_cols, dummize_ref_level)
Arguments
raw_ipd |
ipd data that contains variable to dummize |
dummize_cols |
vector of column names to binarize |
dummize_ref_level |
vector of reference level of the variables to binarize |
Value
ipd with dummized columns
Examples
data(adsl_twt)
dummize_ipd(adsl_twt, dummize_cols = c("SEX"), dummize_ref_level = c("Male"))
Note on Expected Sample Size Reduction
Description
Note on Expected Sample Size Reduction
Usage
ess_footnote_text(width = 0.9 * getOption("width"))
Arguments
width |
Number of characters to break string into new lines ( |
Value
A character string
Derive individual weights in the matching step of MAIC
Description
Assuming data is properly processed, this function takes individual patient data (IPD) with centered covariates (effect modifiers and/or prognostic variables) as input, and generates weights for each individual in IPD trial to match the covariates in aggregate data.
The plot function displays individuals weights with key summary in top right legend that includes
median weight, effective sample size (ESS), and reduction percentage (what percent ESS is reduced from the
original sample size). There are two options of plotting: base R plot and ggplot
. The default
for base R plot is to plot unscaled and scaled separately. The default
for ggplot
is to plot unscaled and scaled weights on a same plot.
Usage
estimate_weights(
data,
centered_colnames = NULL,
start_val = 0,
method = "BFGS",
n_boot_iteration = NULL,
set_seed_boot = 1234,
boot_strata = "ARM",
...
)
## S3 method for class 'maicplus_estimate_weights'
plot(
x,
ggplot = FALSE,
bin_col = "#6ECEB2",
vline_col = "#688CE8",
main_title = NULL,
scaled_weights = TRUE,
bins = 50,
...
)
Arguments
data |
a numeric matrix, centered covariates of IPD, no missing value in any cell is allowed |
centered_colnames |
a character or numeric vector (column indicators) of centered covariates |
start_val |
a scalar, the starting value for all coefficients of the propensity score regression |
method |
a string, name of the optimization algorithm (see 'method' argument of |
n_boot_iteration |
an integer, number of bootstrap iterations. By default is NULL which means bootstrapping
procedure will not be triggered, and hence the element |
set_seed_boot |
a scalar, the random seed for conducting the bootstrapping, only relevant if
|
boot_strata |
a character vector of column names in |
... |
Additional |
x |
object from estimate_weights |
ggplot |
indicator to print base weights plot or |
bin_col |
a string, color for the bins of histogram |
vline_col |
a string, color for the vertical line in the histogram |
main_title |
title of the plot. For ggplot, name of scaled weights plot and unscaled weights plot, respectively. |
scaled_weights |
(base plot only) an indicator for using scaled weights instead of regular weights |
bins |
( |
Value
a list with the following 4 elements,
- data
a data.frame, includes the input
data
with appended column 'weights' and 'scaled_weights'. Scaled weights has a summation to be the number of rows indata
that has no missing value in any of the effect modifiers- centered_colnames
column names of centered effect modifiers in
data
- nr_missing
number of rows in
data
that has at least 1 missing value in specified centered effect modifiers- ess
effective sample size, square of sum divided by sum of squares
- opt
R object returned by
base::optim()
, for assess convergence and other details- boot_strata
'strata' from a boot::boot object
- boot_seed
column names in
data
of the stratification factors- boot
a n by 2 by k array or NA, where n equals to number of rows in
data
, and k equalsn_boot_iteration
. The 2 columns in the second dimension include a column of numeric indexes of the rows indata
that are selected at a bootstrapping iteration and a column of weights.boot
is NA when argumentn_boot_iteration
is set as NULL
Methods (by generic)
-
plot(maicplus_estimate_weights)
: Plot method for estimate_weights objects
Examples
data(centered_ipd_sat)
centered_colnames <- grep("_CENTERED", colnames(centered_ipd_sat), value = TRUE)
weighted_data <- estimate_weights(data = centered_ipd_sat, centered_colnames = centered_colnames)
# To later estimate bootstrap confidence intervals, we calculate the weights
# for the bootstrap samples:
weighted_data_boot <- estimate_weights(
data = centered_ipd_sat, centered_colnames = centered_colnames, n_boot_iteration = 100
)
plot(weighted_sat)
if (requireNamespace("ggplot2")) {
plot(weighted_sat, ggplot = TRUE)
}
helper function: transform TTE ADaM data to suitable input for survival R package
Description
helper function: transform TTE ADaM data to suitable input for survival R package
Usage
ext_tte_transfer(dd, time_scale = "months", trt = NULL)
Arguments
dd |
data frame, ADTTE read via |
time_scale |
a character string, 'years', 'months', 'weeks' or 'days', time unit of median survival time |
trt |
values to include in treatment column |
Value
a data frame that can be used as input to survival::Surv
Calculate standard error from the reported confidence interval.
Description
Comparator studies often only report confidence interval of the
treatment effects. This function calculates standard error of the
treatment effect given the reported confidence interval.
For relative treatment effect (i.e. hazard ratio, odds ratio, and
risk ratio), the function would log the confidence interval.
For risk difference and mean difference,
we do not log the confidence interval.
The option to log the confidence interval is controlled
by 'log'
parameter.
Usage
find_SE_from_CI(CI_lower = NULL, CI_upper = NULL, CI_perc = 0.95, log = TRUE)
Arguments
CI_lower |
Reported lower percentile value of the treatment effect |
CI_upper |
Reported upper percentile value of the treatment effect |
CI_perc |
Percentage of confidence interval reported |
log |
Whether the confidence interval should be logged. For relative treatment effect, log should be applied because estimated log treatment effect is approximately normally distributed. |
Value
Standard error of log relative treatment effect if 'log'
is true and standard error of the treatment effect if 'log'
is false
Examples
find_SE_from_CI(CI_lower = 0.55, CI_upper = 0.90, CI_perc = 0.95)
Create pseudo IPD given aggregated binary data
Description
Create pseudo IPD given aggregated binary data
Usage
get_pseudo_ipd_binary(binary_agd, format = c("stacked", "unstacked"))
Arguments
binary_agd |
a data.frame that take different formats depending on |
format |
a string, "stacked" or "unstacked" |
Value
a data.frame of pseudo binary IPD, with columns USUBJID, ARM, RESPONSE
Examples
# example of unstacked
testdat <- data.frame(Yes = 280, No = 120)
rownames(testdat) <- "B"
get_pseudo_ipd_binary(
binary_agd = testdat,
format = "unstacked"
)
# example of stacked
get_pseudo_ipd_binary(
binary_agd = data.frame(
ARM = rep("B", 2),
RESPONSE = c("YES", "NO"),
COUNT = c(280, 120)
),
format = "stacked"
)
Convert Time Values Using Scaling Factors
Description
Convert Time Values Using Scaling Factors
Usage
get_time_as(times, as = NULL)
Arguments
times |
Numeric time values |
as |
A time scale to convert to. One of "days", "weeks", "months", "years" |
Value
Returns a numeric vector calculated from times / get_time_conversion(factor = as)
Examples
get_time_as(50, as = "months")
Helper function to summarize outputs from glm fit
Description
Helper function to summarize outputs from glm fit
Usage
glm_makeup(binobj, legend = "before matching", weighted = FALSE)
Arguments
binobj |
returned object from |
legend |
label to indicate the binary fit |
weighted |
logical flag indicating whether weights have been applied in the glm fit |
Value
A data.frame
containing a summary of the number of events and subjects in a logistic
regression model.
Examples
data(adrs_sat)
pseudo_adrs <- get_pseudo_ipd_binary(
binary_agd = data.frame(
ARM = rep("B", 2),
RESPONSE = c("YES", "NO"),
COUNT = c(280, 120)
),
format = "stacked"
)
pseudo_adrs$RESPONSE <- as.numeric(pseudo_adrs$RESPONSE)
combined_data <- rbind(adrs_sat[, c("USUBJID", "ARM", "RESPONSE")], pseudo_adrs)
combined_data$ARM <- as.factor(combined_data$ARM)
binobj_dat <- stats::glm(RESPONSE ~ ARM, combined_data, family = binomial("logit"))
glm_makeup(binobj_dat)
Kaplan Meier (KM) plot function for anchored and unanchored cases
Description
It is wrapper function of basic_kmplot
. The argument setting is similar to maic_anchored
and
maic_unanchored
, and it is used in those two functions.
Usage
kmplot(
weights_object,
tte_ipd,
tte_pseudo_ipd,
trt_ipd,
trt_agd,
trt_common = NULL,
normalize_weights = FALSE,
trt_var_ipd = "ARM",
trt_var_agd = "ARM",
km_conf_type = "log-log",
km_layout = c("all", "by_trial", "by_arm"),
...
)
Arguments
weights_object |
an object returned by |
tte_ipd |
a data frame of individual patient data (IPD) of internal trial, contain at least |
tte_pseudo_ipd |
a data frame of pseudo IPD by digitized KM curves of external trial (for time-to-event
endpoint), contain at least |
trt_ipd |
a string, name of the interested investigation arm in internal trial |
trt_agd |
a string, name of the interested investigation arm in external trial |
trt_common |
a string, name of the common comparator in internal and external trial, by default is NULL, indicating unanchored case |
normalize_weights |
logical, default is |
trt_var_ipd |
a string, column name in |
trt_var_agd |
a string, column name in |
km_conf_type |
a string, pass to |
km_layout |
a string, only applicable for unanchored case ( |
... |
other arguments in |
Value
In unanchored case, a KM plot with risk set table. In anchored case, depending on km_layout
,
if "by_trial", 2 by 1 plot, first all KM curves (incl. weighted) in IPD trial, and then KM curves in AgD trial, with risk set table.
if "by_arm", 2 by 1 plot, first KM curves of
trt_agd
andtrt_ipd
(with and without weights), and then KM curves oftrt_common
in AgD trial and IPD trial (with and without weights). Risk set table is appended.if "all", 2 by 2 plot, all plots in "by_trial" and "by_arm" without risk set table appended.
Examples
# unanchored example using kmplot
data(weighted_sat)
data(adtte_sat)
data(pseudo_ipd_sat)
kmplot(
weights_object = weighted_sat,
tte_ipd = adtte_sat,
tte_pseudo_ipd = pseudo_ipd_sat,
trt_var_ipd = "ARM",
trt_var_agd = "ARM",
endpoint_name = "Overall Survival",
trt_ipd = "A",
trt_agd = "B",
trt_common = NULL,
km_conf_type = "log-log",
time_scale = "month",
time_grid = seq(0, 20, by = 2),
use_colors = NULL,
use_line_types = NULL,
use_pch_cex = 0.65,
use_pch_alpha = 100
)
# anchored example using kmplot
data(weighted_twt)
data(adtte_twt)
data(pseudo_ipd_twt)
# plot by trial
kmplot(
weights_object = weighted_twt,
tte_ipd = adtte_twt,
tte_pseudo_ipd = pseudo_ipd_twt,
trt_ipd = "A",
trt_agd = "B",
trt_common = "C",
trt_var_ipd = "ARM",
trt_var_agd = "ARM",
endpoint_name = "Overall Survival",
km_conf_type = "log-log",
km_layout = "by_trial",
time_scale = "month",
time_grid = seq(0, 20, by = 2),
use_colors = NULL,
use_line_types = NULL,
use_pch_cex = 0.65,
use_pch_alpha = 100
)
# plot by arm
kmplot(
weights_object = weighted_twt,
tte_ipd = adtte_twt,
tte_pseudo_ipd = pseudo_ipd_twt,
trt_ipd = "A",
trt_agd = "B",
trt_common = "C",
trt_var_ipd = "ARM",
trt_var_agd = "ARM",
endpoint_name = "Overall Survival",
km_conf_type = "log-log",
km_layout = "by_arm",
time_scale = "month",
time_grid = seq(0, 20, by = 2),
use_colors = NULL,
use_line_types = NULL,
use_pch_cex = 0.65,
use_pch_alpha = 100
)
# plot all
kmplot(
weights_object = weighted_twt,
tte_ipd = adtte_twt,
tte_pseudo_ipd = pseudo_ipd_twt,
trt_ipd = "A",
trt_agd = "B",
trt_common = "C",
trt_var_ipd = "ARM",
trt_var_agd = "ARM",
endpoint_name = "Overall Survival",
km_conf_type = "log-log",
km_layout = "all",
time_scale = "month",
time_grid = seq(0, 20, by = 2),
use_colors = NULL,
use_line_types = NULL,
use_pch_cex = 0.65,
use_pch_alpha = 100
)
Kaplan-Meier (KM) plot function for anchored and unanchored cases using ggplot
Description
This is wrapper function of basic_kmplot2
.
The argument setting is similar to maic_anchored
and maic_unanchored
,
and it is used in those two functions.
Usage
kmplot2(
weights_object,
tte_ipd,
tte_pseudo_ipd,
trt_ipd,
trt_agd,
trt_common = NULL,
normalize_weights = FALSE,
trt_var_ipd = "ARM",
trt_var_agd = "ARM",
km_conf_type = "log-log",
km_layout = c("all", "by_trial", "by_arm"),
time_scale,
...
)
Arguments
weights_object |
an object returned by |
tte_ipd |
a data frame of individual patient data (IPD) of internal trial, contain at least |
tte_pseudo_ipd |
a data frame of pseudo IPD by digitized KM curves of external trial (for time-to-event
endpoint), contain at least |
trt_ipd |
a string, name of the interested investigation arm in internal trial |
trt_agd |
a string, name of the interested investigation arm in external trial |
trt_common |
a string, name of the common comparator in internal and external trial, by default is NULL, indicating unanchored case |
normalize_weights |
logical, default is |
trt_var_ipd |
a string, column name in |
trt_var_agd |
a string, column name in |
km_conf_type |
a string, pass to |
km_layout |
a string, only applicable for unanchored case ( |
time_scale |
a string, time unit of median survival time, taking a value of 'years', 'months', weeks' or 'days' |
... |
other arguments in |
Value
In unanchored case, a KM plot with risk set table. In anchored case, depending on km_layout
,
if "by_trial", 2 by 1 plot, first all KM curves (incl. weighted) in IPD trial, and then KM curves in AgD trial, with risk set table.
if "by_arm", 2 by 1 plot, first KM curves of
trt_agd
andtrt_ipd
(with and without weights), and then KM curves oftrt_common
in AgD trial and IPD trial (with and without weights). Risk set table is appended.if "all", 2 by 2 plot, all plots in "by_trial" and "by_arm" without risk set table appended.
Examples
# unanchored example using kmplot2
data(weighted_sat)
data(adtte_sat)
data(pseudo_ipd_sat)
kmplot2(
weights_object = weighted_sat,
tte_ipd = adtte_sat,
tte_pseudo_ipd = pseudo_ipd_sat,
trt_ipd = "A",
trt_agd = "B",
trt_common = NULL,
trt_var_ipd = "ARM",
trt_var_agd = "ARM",
endpoint_name = "Overall Survival",
km_conf_type = "log-log",
time_scale = "month",
break_x_by = 2,
xlim = c(0, 20)
)
# anchored example using kmplot2
data(weighted_twt)
data(adtte_twt)
data(pseudo_ipd_twt)
# plot by trial
kmplot2(
weights_object = weighted_twt,
tte_ipd = adtte_twt,
tte_pseudo_ipd = pseudo_ipd_twt,
trt_ipd = "A",
trt_agd = "B",
trt_common = "C",
trt_var_ipd = "ARM",
trt_var_agd = "ARM",
endpoint_name = "Overall Survival",
km_conf_type = "log-log",
km_layout = "by_trial",
time_scale = "month",
break_x_by = 2
)
# plot by arm
kmplot2(
weights_object = weighted_twt,
tte_ipd = adtte_twt,
tte_pseudo_ipd = pseudo_ipd_twt,
trt_ipd = "A",
trt_agd = "B",
trt_common = "C",
trt_var_ipd = "ARM",
trt_var_agd = "ARM",
endpoint_name = "Overall Survival",
km_conf_type = "log-log",
km_layout = "by_arm",
time_scale = "month",
break_x_by = 2
)
# plot all
kmplot2(
weights_object = weighted_twt,
tte_ipd = adtte_twt,
tte_pseudo_ipd = pseudo_ipd_twt,
trt_ipd = "A",
trt_agd = "B",
trt_common = "C",
trt_var_ipd = "ARM",
trt_var_agd = "ARM",
endpoint_name = "Overall Survival",
km_conf_type = "log-log",
km_layout = "all",
time_scale = "month",
break_x_by = 2,
xlim = c(0, 20),
show_risk_set = FALSE
)
Anchored MAIC for binary and time-to-event endpoint
Description
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",
normalize_weights = FALSE,
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 |
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 |
trt_agd |
a string, name of the interested investigation arm in external trial |
trt_common |
a string, name of the common comparator in internal and external trial |
trt_var_ipd |
a string, column name in |
trt_var_agd |
a string, column name in |
normalize_weights |
logical, default is |
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 |
boot_ci_type |
a string, one of |
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 |
km_conf_type |
a string, pass to |
binary_robust_cov_type |
a string to pass to argument |
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
andtrt_var_agd
For time-to-event analysis, the follow columns are required:
EVENT - numeric,
1
for censored/death,0
otherwiseTIME - numeric column, observation time of the
EVENT
; unit in days
For binary outcomes:
RESPONSE - numeric,
1
for event occurred,0
otherwise
Value
A list, contains 'descriptive' and 'inferential'
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$descriptive$summary
result_tte$inferential$summary
# 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"
)
result_binary$descriptive$summary
result_binary$inferential$summary
Unanchored MAIC for binary and time-to-event endpoint
Description
This is a wrapper function to provide adjusted effect estimates and relevant statistics in unanchored case (i.e. there is no common comparator arm in the internal and external trial).
Usage
maic_unanchored(
weights_object,
ipd,
pseudo_ipd,
trt_ipd,
trt_agd,
trt_var_ipd = "ARM",
trt_var_agd = "ARM",
normalize_weights = FALSE,
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 |
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 |
trt_agd |
a string, name of the interested investigation arm in external trial |
trt_var_ipd |
a string, column name in |
trt_var_agd |
a string, column name in |
normalize_weights |
logical, default is |
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 |
boot_ci_type |
a string, one of |
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 |
km_conf_type |
a string, pass to |
binary_robust_cov_type |
a string to pass to argument |
Details
For time-to-event analysis, 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
andtrt_var_agd
EVENT - numeric, 1 for censored/death, 0 for otherwise
TIME - numeric column, observation time of the
EVENT
; unit in days
Value
A list, contains 'descriptive' and 'inferential'
Examples
#
# unanchored example using maic_unanchored for time-to-event data
#
data(centered_ipd_sat)
data(adtte_sat)
data(pseudo_ipd_sat)
#### derive weights
weighted_data <- estimate_weights(
data = centered_ipd_sat,
centered_colnames = grep("_CENTERED$", names(centered_ipd_sat)),
start_val = 0,
method = "BFGS"
)
weighted_data2 <- estimate_weights(
data = centered_ipd_sat,
centered_colnames = grep("_CENTERED$", names(centered_ipd_sat)),
start_val = 0,
method = "BFGS",
n_boot_iteration = 100,
set_seed_boot = 1234
)
# inferential result
result <- maic_unanchored(
weights_object = weighted_data,
ipd = adtte_sat,
pseudo_ipd = pseudo_ipd_sat,
trt_var_ipd = "ARM",
trt_var_agd = "ARM",
trt_ipd = "A",
trt_agd = "B",
endpoint_name = "Overall Survival",
endpoint_type = "tte",
eff_measure = "HR",
time_scale = "month",
km_conf_type = "log-log"
)
result$descriptive$summary
result$inferential$summary
result_boot <- maic_unanchored(
weights_object = weighted_data2,
ipd = adtte_sat,
pseudo_ipd = pseudo_ipd_sat,
trt_var_ipd = "ARM",
trt_var_agd = "ARM",
trt_ipd = "A",
trt_agd = "B",
endpoint_name = "Overall Survival",
endpoint_type = "tte",
eff_measure = "HR",
time_scale = "month",
km_conf_type = "log-log"
)
result$descriptive$summary
result$inferential$summary
#
# unanchored example using maic_unanchored for binary outcome
#
data(centered_ipd_sat)
data(adrs_sat)
centered_ipd_sat
centered_colnames <- grep("_CENTERED$", colnames(centered_ipd_sat), value = TRUE)
weighted_data <- estimate_weights(data = centered_ipd_sat, centered_colnames = centered_colnames)
weighted_data2 <- estimate_weights(
data = centered_ipd_sat, centered_colnames = centered_colnames,
n_boot_iteration = 100
)
# get dummy binary IPD
pseudo_adrs <- get_pseudo_ipd_binary(
binary_agd = data.frame(
ARM = rep("B", 2),
RESPONSE = c("YES", "NO"),
COUNT = c(280, 120)
),
format = "stacked"
)
# unanchored binary MAIC, with CI based on sandwich estimator
maic_unanchored(
weights_object = weighted_data,
ipd = adrs_sat,
pseudo_ipd = pseudo_adrs,
trt_ipd = "A",
trt_agd = "B",
trt_var_ipd = "ARM",
trt_var_agd = "ARM",
endpoint_type = "binary",
endpoint_name = "Binary Endpoint",
eff_measure = "RR",
# binary specific args
binary_robust_cov_type = "HC3"
)
# unanchored binary MAIC, with bootstrapped CI
maic_unanchored(
weights_object = weighted_data2,
ipd = adrs_sat,
pseudo_ipd = pseudo_adrs,
trt_ipd = "A",
trt_agd = "B",
trt_var_ipd = "ARM",
trt_var_agd = "ARM",
endpoint_type = "binary",
endpoint_name = "Binary Endpoint",
eff_measure = "RR",
# binary specific args
binary_robust_cov_type = "HC3"
)
#---------------------------------
Helper function to retrieve median survival time from a survival::survfit
object
Description
Extract and display median survival time with confidence interval
Usage
medSurv_makeup(km_fit, legend = "before matching", time_scale)
Arguments
km_fit |
returned object from |
legend |
a character string, name used in 'type' column in returned data frame |
time_scale |
a character string, 'years', 'months', 'weeks' or 'days', time unit of median survival time |
Value
a data frame with a index column 'type', median survival time and confidence interval
Examples
data(adtte_sat)
data(pseudo_ipd_sat)
library(survival)
combined_data <- rbind(adtte_sat[, c("TIME", "EVENT", "ARM")], pseudo_ipd_sat)
kmobj <- survfit(Surv(TIME, EVENT) ~ ARM, combined_data, conf.type = "log-log")
# Derive median survival time
medSurv <- medSurv_makeup(kmobj, legend = "before matching", time_scale = "day")
medSurv
Diagnosis plot of proportional hazard assumption for anchored and unanchored
Description
Diagnosis plot of proportional hazard assumption for anchored and unanchored
Usage
ph_diagplot(
weights_object,
tte_ipd,
tte_pseudo_ipd,
trt_ipd,
trt_agd,
trt_common = NULL,
trt_var_ipd = "ARM",
trt_var_agd = "ARM",
endpoint_name = "Time to Event Endpoint",
time_scale,
zph_transform = "log",
zph_log_hazard = TRUE
)
Arguments
weights_object |
an object returned by |
tte_ipd |
a data frame of individual patient data (IPD) of internal trial, contain at least "USUBJID", "EVENT", "TIME" columns and a column indicating treatment assignment |
tte_pseudo_ipd |
a data frame of pseudo IPD by digitized KM curves of external trial (for time-to-event endpoint), contain at least "EVENT", "TIME" |
trt_ipd |
a string, name of the interested investigation arm in internal trial |
trt_agd |
a string, name of the interested investigation arm in external trial
|
trt_common |
a string, name of the common comparator in internal and external trial, by default is NULL, indicating unanchored case |
trt_var_ipd |
a string, column name in |
trt_var_agd |
a string, column name in |
endpoint_name |
a string, name of time to event endpoint, to be show in the last line of title |
time_scale |
a string, time unit of median survival time, taking a value of 'years', 'months', 'weeks' or 'days' |
zph_transform |
a string, pass to |
zph_log_hazard |
a logical, if TRUE (default), y axis of the time dependent hazard function is log-hazard, otherwise, hazard. |
Value
a 3 by 2 plot, include log-cumulative hazard plot, time dependent hazard function and unscaled Schoenfeld residual plot, before and after matching
Examples
# unanchored example using ph_diagplot
data(weighted_sat)
data(adtte_sat)
data(pseudo_ipd_sat)
ph_diagplot(
weights_object = weighted_sat,
tte_ipd = adtte_sat,
tte_pseudo_ipd = pseudo_ipd_sat,
trt_var_ipd = "ARM",
trt_var_agd = "ARM",
trt_ipd = "A",
trt_agd = "B",
trt_common = NULL,
endpoint_name = "Overall Survival",
time_scale = "week",
zph_transform = "log",
zph_log_hazard = TRUE
)
# anchored example using ph_diagplot
data(weighted_twt)
data(adtte_twt)
data(pseudo_ipd_twt)
ph_diagplot(
weights_object = weighted_twt,
tte_ipd = adtte_twt,
tte_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",
time_scale = "week",
zph_transform = "log",
zph_log_hazard = TRUE
)
PH Diagnosis Plot of Log Cumulative Hazard Rate versus time or log-time
Description
This plot is also known as log negative log survival rate.
Usage
ph_diagplot_lch(
km_fit,
time_scale,
log_time = TRUE,
endpoint_name = "",
subtitle = "",
exclude_censor = TRUE
)
Arguments
km_fit |
returned object from |
time_scale |
a character string, 'years', 'months', 'weeks' or 'days', time unit of median survival time |
log_time |
logical, TRUE (default) or FALSE |
endpoint_name |
a character string, name of the endpoint |
subtitle |
a character string, subtitle of the plot |
exclude_censor |
logical, should censored data point be plotted |
Details
a diagnosis plot for proportional hazard assumption, versus log-time (default) or time
Value
a plot of log cumulative hazard rate
Examples
library(survival)
data(adtte_sat)
data(pseudo_ipd_sat)
combined_data <- rbind(adtte_sat[, c("TIME", "EVENT", "ARM")], pseudo_ipd_sat)
kmobj <- survfit(Surv(TIME, EVENT) ~ ARM, combined_data, conf.type = "log-log")
ph_diagplot_lch(kmobj,
time_scale = "month", log_time = TRUE,
endpoint_name = "OS", subtitle = "(Before Matching)"
)
PH Diagnosis Plot of Schoenfeld residuals for a Cox model fit
Description
PH Diagnosis Plot of Schoenfeld residuals for a Cox model fit
Usage
ph_diagplot_schoenfeld(
coxobj,
time_scale = "months",
log_time = TRUE,
endpoint_name = "",
subtitle = ""
)
Arguments
coxobj |
object returned from |
time_scale |
a character string, 'years', 'months', 'weeks' or 'days', time unit of median survival time |
log_time |
logical, TRUE (default) or FALSE |
endpoint_name |
a character string, name of the endpoint |
subtitle |
a character string, subtitle of the plot |
Value
a plot of Schoenfeld residuals
Examples
library(survival)
data(adtte_sat)
data(pseudo_ipd_sat)
combined_data <- rbind(adtte_sat[, c("TIME", "EVENT", "ARM")], pseudo_ipd_sat)
unweighted_cox <- coxph(Surv(TIME, EVENT == 1) ~ ARM, data = combined_data)
ph_diagplot_schoenfeld(unweighted_cox,
time_scale = "month", log_time = TRUE,
endpoint_name = "OS", subtitle = "(Before Matching)"
)
Plot MAIC weights in a histogram with key statistics in legend
Description
Generates a base R histogram of weights. Default is to plot either unscaled or scaled weights and not both.
Usage
plot_weights_base(
weighted_data,
bin_col,
vline_col,
main_title,
scaled_weights
)
Arguments
weighted_data |
object returned after calculating weights using estimate_weights |
bin_col |
a string, color for the bins of histogram |
vline_col |
a string, color for the vertical line in the histogram |
main_title |
title of the plot |
scaled_weights |
an indicator for using scaled weights instead of regular weights |
Value
a plot of unscaled or scaled weights
Examples
plot_weights_base(weighted_sat,
bin_col = "#6ECEB2",
vline_col = "#688CE8",
main_title = c("Scaled Individual Weights", "Unscaled Individual Weights"),
scaled_weights = TRUE
)
Plot MAIC weights in a histogram with key statistics in legend using ggplot2
Description
Generates a ggplot
histogram of weights. Default is to plot both unscaled and scaled weights on a same graph.
Usage
plot_weights_ggplot(weighted_data, bin_col, vline_col, main_title, bins)
Arguments
weighted_data |
object returned after calculating weights using estimate_weights |
bin_col |
a string, color for the bins of histogram |
vline_col |
a string, color for the vertical line in the histogram |
main_title |
Name of scaled weights plot and unscaled weights plot, respectively. |
bins |
number of bin parameter to use |
Value
a plot of unscaled and scaled weights
Examples
if (requireNamespace("ggplot2")) {
plot_weights_ggplot(weighted_sat,
bin_col = "#6ECEB2",
vline_col = "#688CE8",
main_title = c("Scaled Individual Weights", "Unscaled Individual Weights"),
bins = 50
)
}
Pre-process aggregate data
Description
This function checks the format of the aggregate data. Data is required to have three columns: STUDY, ARM, and N. Column names that do not have legal suffixes (MEAN, MEDIAN, SD, COUNT, or PROP) are dropped. If a variable is a count variable, it is converted to proportions by dividing the sample size (N). Note, when the count is specified, proportion is always calculated based on the count, that is, specified proportion will be ignored if applicable. If the aggregated data comes from multiple sources (i.e. different analysis population) and sample size differs for each variable, one option is to specify proportion directly instead of count by using suffix _PROP.
Usage
process_agd(raw_agd)
Arguments
raw_agd |
raw aggregate data should contain STUDY, ARM, and N. Variable names should be followed by legal suffixes (i.e. MEAN, MEDIAN, SD, COUNT, or PROP). |
Value
pre-processed aggregate level data
Examples
data(agd)
agd <- process_agd(agd)
Pseudo individual patient survival data from published study
Description
Pseudo individual patient survival data from published study
Usage
pseudo_ipd_sat
Format
A data frame with 300 rows and 3 columns:
- TIME
Survival time in days.
- EVENT
Event indicator
0
/1
.- ARM
Assigned treatment arm,
"B"
.
See Also
Other unanchored datasets:
adrs_sat
,
adsl_sat
,
adtte_sat
,
agd
,
centered_ipd_sat
,
weighted_sat
Pseudo individual patient survival data from published two arm study
Description
Pseudo individual patient survival data from published two arm study
Usage
pseudo_ipd_twt
Format
A data frame with 800 rows and 3 columns:
- TIME
Survival time in days.
- EVENT
Event indicator
0
/1
.- ARM
Assigned treatment arm,
"B"
,"C"
.
See Also
Other anchored datasets:
adrs_twt
,
adsl_twt
,
adtte_twt
,
agd
,
centered_ipd_twt
,
weighted_twt
Reformat maicplus_bucher
alike object
Description
Reformat maicplus_bucher
alike object
Usage
reformat(
x,
ci_digits = 2,
pval_digits = 3,
show_pval = TRUE,
exponentiate = FALSE
)
Arguments
x |
a list, structured like a |
ci_digits |
an integer, number of decimal places for point estimate and derived confidence limits |
pval_digits |
an integer, number of decimal places to display Z-test p-value |
show_pval |
a logical value, default is TRUE. If FALSE, p-value will not be output as the second element of the character vector |
exponentiate |
whether the treatment effect and confidence interval should be exponentiated. This applies to relative treatment effects. Default is set to false. |
Get and Set Time Conversion Factors
Description
Get and Set Time Conversion Factors
Usage
set_time_conversion(
default = "days",
days = 1,
weeks = 7,
months = 365.25/12,
years = 365.25
)
get_time_conversion(factor = c("days", "weeks", "months", "years"))
Arguments
default |
The default time scale, commonly whichever has factor = 1 |
days |
Factor to divide data time units to get time in days |
weeks |
Factor to divide data time units to get time in weeks |
months |
Factor to divide data time units to get time in months |
years |
Factor to divide data time units to get time in years |
factor |
Time factor to get. |
Value
No value returned. Conversion factors are stored internally and used within functions.
Examples
# The default time scale is days:
set_time_conversion(default = "days", days = 1, weeks = 7, months = 365.25 / 12, years = 365.25)
# Set the default time scale to years
set_time_conversion(
default = "years",
days = 1 / 365.25,
weeks = 1 / 52.17857,
months = 1 / 12,
years = 1
)
# Get time scale factors:
get_time_conversion("years")
get_time_conversion("weeks")
Helper function to select set of variables used for Kaplan-Meier plot
Description
Helper function to select set of variables used for Kaplan-Meier plot
Usage
survfit_makeup(km_fit, single_trt_name = "treatment")
Arguments
km_fit |
returned object from |
single_trt_name |
name of treatment if no strata are specified in |
Value
a list of data frames of variables from survival::survfit()
. Data frame is divided by treatment.
Examples
library(survival)
data(adtte_sat)
data(pseudo_ipd_sat)
combined_data <- rbind(adtte_sat[, c("TIME", "EVENT", "ARM")], pseudo_ipd_sat)
kmobj <- survfit(Surv(TIME, EVENT) ~ ARM, combined_data, conf.type = "log-log")
survfit_makeup(kmobj)
Weighted object for single arm trial data
Description
Weighted object for single arm trial data
Usage
weighted_sat
Format
A maicplus_estimate_weights
object created by estimate_weights()
containing
- data
patient level data with weights
- centered_colnames
Columns used in MAIC
- nr_missing
Number of observations with missing data
- ess
Expected sample size
- opt
Information from
optim
from weight calculation- boot
Parameters and bootstrap sample weights,
NULL
in this object
See Also
Other unanchored datasets:
adrs_sat
,
adsl_sat
,
adtte_sat
,
agd
,
centered_ipd_sat
,
pseudo_ipd_sat
Weighted object for two arm trial data
Description
The weighted patient data for a two arm trial generated from the centered patient data (centered_ipd_twt). It has weights calculated for 100 bootstrap samples.
The object is generated using the following code:
estimate_weights( data = centered_ipd_twt, centered_colnames = c( "AGE_CENTERED", "AGE_MEDIAN_CENTERED", "AGE_SQUARED_CENTERED", "SEX_MALE_CENTERED", "ECOG0_CENTERED", "SMOKE_CENTERED" ), n_boot_iteration = 100 )
Usage
weighted_twt
Format
A maicplus_estimate_weights
object created by estimate_weights()
containing
- data
patient level data with weights
- centered_colnames
Columns used in MAIC
- nr_missing
Number of observations with missing data
- ess
Expected sample size
- opt
Information from
optim
from weight calculation- boot
Parameters and bootstrap sample weights for the 100 samples
See Also
Other anchored datasets:
adrs_twt
,
adsl_twt
,
adtte_twt
,
agd
,
centered_ipd_twt
,
pseudo_ipd_twt