Skip to content

Commit

Permalink
fixmodel_lin_cont
Browse files Browse the repository at this point in the history
  • Loading branch information
pavlakrotka committed Sep 6, 2024
1 parent f1c88c5 commit 5422039
Show file tree
Hide file tree
Showing 7 changed files with 274 additions and 9 deletions.
2 changes: 1 addition & 1 deletion DESCRIPTION
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ Imports:
splines
SystemRequirements: JAGS 4.x.y
Roxygen: list(markdown = TRUE)
RoxygenNote: 7.3.1
RoxygenNote: 7.3.2
Suggests:
rmarkdown,
knitr
Expand Down
2 changes: 2 additions & 0 deletions NAMESPACE
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,13 @@ export(MAPprior_bin)
export(MAPprior_cont)
export(all_models)
export(datasim_bin)
export(datasim_bin_2)
export(datasim_cont)
export(fixmodel_bin)
export(fixmodel_cal_bin)
export(fixmodel_cal_cont)
export(fixmodel_cont)
export(fixmodel_lin_cont)
export(gam_cont)
export(get_ss_matrix)
export(inv_u_trend)
Expand Down
4 changes: 2 additions & 2 deletions R/datasim_bin_2.R
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#' Simulate binary data from a platform trial with a shared control arm and a given number of experimental treatment arms entering at given time points
#' Simulate binary data from a platform trial with a shared control arm and a given number of experimental treatment arms entering at given time points using a user-specified sample size matrix
#'
#' @description This function simulates data from a platform trial with a given number of experimental treatment arms entering at given time points and a shared control arm. The primary endpoint is a binary endpoint. The user specifies the timing of adding arms in terms of patients recruited to the trial so far and the sample size per experimental treatment arm.
#'
Expand Down Expand Up @@ -57,7 +57,7 @@
#' Trials with no time trend can be simulated too, by setting all elements of the vector `lambda` to zero and choosing an arbitrary pattern.
#'
#' @examples
#' ss_matrix <- matrix(c(125, 125, 125, 125, NA, 250), nrow = 3, byrow = T)
#' ss_matrix <- matrix(c(125, 125, 125, 125, NA, 250), nrow = 3, byrow = TRUE)
#' head(datasim_bin_2(SS_matrix = ss_matrix,
#' p0 = 0.7, OR = rep(1.8, 2), lambda = rep(0.15, 3), trend="stepwise_2"))
#'
Expand Down
90 changes: 90 additions & 0 deletions R/fixmodel_lin_cont.R
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
#' Frequentist linear regression model analysis for continuous data with linear adjustment for time
#'
#' @description This function performs linear regression taking into account all trial data until the arm under study leaves the trial and adjusting for time a continuous covariate
#'
#' @param data Data frame with trial data, e.g. result from the `datasim_cont()` function. Must contain columns named 'treatment', 'response' and 'period'.
#' @param arm Integer. Index of the treatment arm under study to perform inference on (vector of length 1). This arm is compared to the control group.
#' @param alpha Double. Significance level (one-sided). Default=0.025.
#' @param ncc Logical. Indicates whether to include non-concurrent data into the analysis. Default=TRUE.
#' @param check Logical. Indicates whether the input parameters should be checked by the function. Default=TRUE, unless the function is called by a simulation function, where the default is FALSE.
#' @param ... Further arguments passed by wrapper functions when running simulations.
#'
#' @importFrom stats lm
#' @importFrom stats pt
#' @importFrom stats coef
#' @importFrom stats confint
#'
#' @export
#'
#' @examples
#'
#' trial_data <- datasim_cont(num_arms = 3, n_arm = 100, d = c(0, 100, 250),
#' theta = rep(0.25, 3), lambda = rep(0.15, 4), sigma = 1, trend = "linear")
#'
#' fixmodel_lin_cont(data = trial_data, arm = 3)
#'
#' @return List containing the following elements regarding the results of comparing `arm` to control:
#'
#' - `p-val` - p-value (one-sided)
#' - `treat_effect` - estimated treatment effect in terms of the difference in means
#' - `lower_ci` - lower limit of the (1-2*`alpha`)*100% confidence interval
#' - `upper_ci` - upper limit of the (1-2*`alpha`)*100% confidence interval
#' - `reject_h0` - indicator of whether the null hypothesis was rejected or not (`p_val` < `alpha`)
#' - `model` - fitted model
#'
#' @author Pavla Krotka
#'
#' @references On model-based time trend adjustments in platform trials with non-concurrent controls. Bofill Roig, M., Krotka, P., et al. BMC Medical Research Methodology 22.1 (2022): 1-16.

fixmodel_lin_cont <- function(data, arm, alpha=0.025, ncc=TRUE, check=TRUE, ...){

if (check) {
if (!is.data.frame(data) | sum(c("treatment", "response", "j") %in% colnames(data))!=3) {
stop("The data frame with trial data must contain the columns 'treatment', 'response' and 'j'!")
}

if(!is.numeric(arm) | length(arm)!=1){
stop("The evaluated treatment arm (`arm`) must be one number!")
}

if(!is.numeric(alpha) | length(alpha)!=1 | alpha>=1 | alpha<=0){
stop("The significance level (`alpha`) must be one number between 0 and 1!")
}

if(!is.logical(ncc) | length(ncc)!=1){
stop("The indicator of including NCC data to the analysis (`ncc`) must be TRUE or FALSE!")
}
}

min_period <- min(data[data$treatment==arm,]$period)
max_period <- max(data[data$treatment==arm,]$period)

if (ncc) {
data_new <- data[data$period %in% c(1:max_period),]
} else {
data_new <- data[data$period %in% c(min_period:max_period),]
}

# fit linear model

mod <- lm(response ~ as.factor(treatment) + j, data_new)

res <- summary(mod)

# one-sided p-value
p_val <- pt(coef(res)[paste0("as.factor(treatment)", arm), "t value"], mod$df, lower.tail = FALSE)

# metrics
treat_effect <- res$coefficients[paste0("as.factor(treatment)", arm), "Estimate"]
lower_ci <- confint(mod, level = 1-(2*alpha))[paste0("as.factor(treatment)", arm), 1]
upper_ci <- confint(mod, level = 1-(2*alpha))[paste0("as.factor(treatment)", arm), 2]
reject_h0 <- (p_val < alpha)

return(list(p_val = p_val,
treat_effect = treat_effect,
lower_ci = lower_ci,
upper_ci = upper_ci,
reject_h0 = reject_h0,
model = mod))
}

124 changes: 124 additions & 0 deletions man/datasim_bin_2.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

49 changes: 49 additions & 0 deletions man/fixmodel_lin_cont.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 6 additions & 6 deletions r_pkg.R
Original file line number Diff line number Diff line change
@@ -1,22 +1,22 @@
#Sys.setenv("_R_CHECK_SYSTEM_CLOCK_" = 0)

# Create r package folder
usethis::create_package("C:/Users/pavla/Nextcloud/GitKraken/NCC")
usethis::create_package("D:/My Drive/GitKraken/NCC")

# Copy in R folder the functions of the r package
setwd("C:/Users/pavla/Nextcloud/GitKraken/NCC")
setwd("D:/My Drive/GitKraken/NCC")
devtools::document()
devtools::load_all()

# Build & check the package
devtools::build(pkg = "C:/Users/pavla/Nextcloud/GitKraken/NCC", path = NULL, binary = FALSE, manual = TRUE, vignettes = TRUE)
devtools::check_built(path = "C:/Users/pavla/Nextcloud/GitKraken/NCC", cran = TRUE, manual = TRUE, incoming = TRUE)
devtools::build_manual(pkg = "C:/Users/pavla/Nextcloud/GitKraken/NCC", path = NULL)
devtools::build(pkg = "D:/My Drive/GitKraken/NCC", path = NULL, binary = FALSE, manual = TRUE, vignettes = TRUE)
devtools::check_built(path = "D:/My Drive/GitKraken/NCC", cran = TRUE, manual = TRUE, incoming = TRUE)
devtools::build_manual(pkg = "D:/My Drive/GitKraken/NCC", path = NULL)

#create vignette
usethis::use_vignette("my-vignette")

pkgdown::build_site(pkg = "C:/Users/pavla/Nextcloud/GitKraken/NCC")
pkgdown::build_site(pkg = "D:/My Drive/GitKraken/NCC")

# https://www.r-bloggers.com/2017/08/building-a-website-with-pkgdown-a-short-guide/
# https://r-pkgs.org/vignettes.html

0 comments on commit 5422039

Please sign in to comment.