Subgroup Treatment Effect Pattern (STEP) Fit for Binary (Response) Outcome
Source:R/fit_rsp_step.R
fit_rsp_step.Rd
This fits the Subgroup Treatment Effect Pattern logistic regression models for a binary (response) outcome. The treatment arm variable must have exactly 2 levels, where the first one is taken as reference and the estimated odds ratios are for the comparison of the second level vs. the first one.
The (conditional) logistic regression model which is fit is:response ~ arm * poly(biomarker, degree) + covariates + strata(strata)
where degree
is specified by control_step()
.
Note that for the default degree 0 the biomarker
variable is not included in the model.
Usage
fit_rsp_step(variables, data, control = c(control_step(), control_logistic()))
Arguments
- variables
(named
list
ofcharacter
)
list of analysis variables: needsresponse
,arm
,biomarker
, and optionalcovariates
andstrata
.- data
(
data.frame
)
the dataset containing the variables to summarize.- control
(named
list
)
combined control list fromcontrol_step()
andcontrol_logistic()
.
Value
a matrix of class step
. The first part of the columns describe the
subgroup intervals used for the biomarker variable, including where the
center of the intervals are and their bounds. The second part of the
columns contain the estimates for the treatment arm comparison.
See also
control_step()
and control_logistic()
for the available
customization options.
Examples
# Testing dataset with just two treatment arms.
library(survival)
library(dplyr)
library(scda)
adrs <- synthetic_cdisc_data("latest")$adrs
adrs_f <- adrs %>%
filter(
PARAMCD == "BESRSPI",
ARM %in% c("B: Placebo", "A: Drug X")
) %>%
mutate(
# Reorder levels of ARM to have Placebo as reference arm for Odds Ratio calculations.
ARM = droplevels(forcats::fct_relevel(ARM, "B: Placebo")),
RSP = case_when(AVALC %in% c("PR", "CR") ~ 1, TRUE ~ 0),
SEX = factor(SEX)
)
variables <- list(
arm = "ARM",
biomarker = "BMRKR1",
covariates = "AGE",
response = "RSP"
)
# Fit default STEP models: Here a constant treatment effect is estimated in each subgroup.
# We use a large enough bandwidth to avoid too small subgroups and linear separation in those.
step_matrix <- fit_rsp_step(
variables = variables,
data = adrs_f,
control = c(control_logistic(), control_step(bandwidth = 0.5))
)
dim(step_matrix)
#> [1] 39 11
head(step_matrix)
#> Percentile Center Percentile Lower Percentile Upper Interval Center
#> [1,] 0.025 0 0.525 1.240529
#> [2,] 0.050 0 0.550 1.628805
#> [3,] 0.075 0 0.575 1.818258
#> [4,] 0.100 0 0.600 2.003407
#> [5,] 0.125 0 0.625 2.300801
#> [6,] 0.150 0 0.650 2.638651
#> Interval Lower Interval Upper n logor se ci_lower ci_upper
#> [1,] 0.4055982 5.395951 141 0.6502015 1.237905 -1.776048 3.076451
#> [2,] 0.4055982 5.647079 147 0.6388035 1.237637 -1.786920 3.064527
#> [3,] 0.4055982 5.781817 154 0.6052792 1.237136 -1.819463 3.030022
#> [4,] 0.4055982 5.996697 161 0.5901414 1.236425 -1.833207 3.013490
#> [5,] 0.4055982 6.206216 167 0.9757680 1.166698 -1.310917 3.262453
#> [6,] 0.4055982 6.384348 174 1.0373428 1.167055 -1.250043 3.324728
# Specify different polynomial degree for the biomarker interaction to use more flexible local
# models. Or specify different logistic regression options, including confidence level.
step_matrix2 <- fit_rsp_step(
variables = variables,
data = adrs_f,
control = c(control_logistic(conf_level = 0.9), control_step(bandwidth = 0.6, degree = 1))
)
# Use a global constant model. This is helpful as a reference for the subgroup models.
step_matrix3 <- fit_rsp_step(
variables = variables,
data = adrs_f,
control = c(control_logistic(), control_step(bandwidth = NULL, num_points = 2L))
)
# It is also possible to use strata, i.e. use conditional logistic regression models.
variables2 <- list(
arm = "ARM",
biomarker = "BMRKR1",
covariates = "AGE",
response = "RSP",
strata = c("STRATA1", "STRATA2")
)
step_matrix4 <- fit_rsp_step(
variables = variables2,
data = adrs_f,
control = c(control_logistic(), control_step(bandwidth = 0.6))
)