Skip to content

Commit

Permalink
801 cleanup pseudo dual simulations (#819)
Browse files Browse the repository at this point in the history
* update code and test

* update doc

* [skip style] [skip vbump] Restyle files

* update var

* fix methods

* fix par names

* trigger checks

* trigger checks

* trigger checks

---------

Co-authored-by: github-actions <41898282+github-actions[bot]@users.noreply.github.com>
  • Loading branch information
pengguanya and github-actions[bot] committed Jun 13, 2024
1 parent 667d44d commit 41ca20d
Show file tree
Hide file tree
Showing 10 changed files with 279 additions and 199 deletions.
1 change: 1 addition & 0 deletions NAMESPACE
Original file line number Diff line number Diff line change
Expand Up @@ -387,6 +387,7 @@ export(OneParExpPrior)
export(OneParLogNormalPrior)
export(ProbitLogNormal)
export(ProbitLogNormalRel)
export(PseudoDualSimulations)
export(PseudoSimulations)
export(Quantiles2LogisticNormal)
export(RuleDesign)
Expand Down
48 changes: 24 additions & 24 deletions R/Design-methods.R
Original file line number Diff line number Diff line change
Expand Up @@ -2878,17 +2878,17 @@ setMethod("simulate",
final_td_target_end_of_trial_at_dose_grid = TDtargetEndOfTrialDoseGridList,
final_cis = CIList,
final_ratios = ratioList,
FinalGstarEstimates = GstarList,
FinalGstarAtDoseGrid = GstarAtDoseGridList,
FinalGstarCIs = CIGstarList,
FinalGstarRatios = ratioGstarList,
final_gstar_estimates = GstarList,
final_gstar_at_dose_grid = GstarAtDoseGridList,
final_gstar_cis = CIGstarList,
final_gstar_ratios = ratioGstarList,
final_tdeot_cis = CITDEOTList,
final_tdeot_ratios = ratioTDEOTList,
FinalOptimalDose = OptimalDoseList,
FinalOptimalDoseAtDoseGrid = OptimalDoseAtDoseGridList,
final_optimal_dose = OptimalDoseList,
final_optimal_dose_at_dose_grid = OptimalDoseAtDoseGridList,
fit = fitDLEList,
fitEff = fitEffList,
sigma2est = sigma2Estimates,
fit_eff = fitEffList,
sigma2_est = sigma2Estimates,
stop_reasons = stopReasons,
stop_report = stop_report,
seed = RNGstate
Expand Down Expand Up @@ -3431,17 +3431,17 @@ setMethod("simulate",
final_td_target_end_of_trial_at_dose_grid = TDtargetEndOfTrialDoseGridList,
final_cis = CIList,
final_ratios = ratioList,
FinalGstarEstimates = GstarList,
FinalGstarAtDoseGrid = GstarAtDoseGridList,
FinalGstarCIs = CIGstarList,
FinalGstarRatios = ratioGstarList,
final_gstar_estimates = GstarList,
final_gstar_at_dose_grid = GstarAtDoseGridList,
final_gstar_cis = CIGstarList,
final_gstar_ratios = ratioGstarList,
final_tdeot_cis = CITDEOTList,
final_tdeot_ratios = ratioTDEOTList,
FinalOptimalDose = OptimalDoseList,
FinalOptimalDoseAtDoseGrid = OptimalDoseAtDoseGridList,
final_optimal_dose = OptimalDoseList,
final_optimal_dose_at_dose_grid = OptimalDoseAtDoseGridList,
fit = fitDLEList,
fitEff = fitEffList,
sigma2est = sigma2Estimates,
fit_eff = fitEffList,
sigma2_est = sigma2Estimates,
sigma2betaWest = sigma2betaWEstimates,
stop_reasons = stopReasons,
stop_report = stop_report,
Expand Down Expand Up @@ -3904,17 +3904,17 @@ setMethod("simulate",
final_td_target_end_of_trial_at_dose_grid = TDtargetEndOfTrialDoseGridList,
final_cis = CIList,
final_ratios = ratioList,
FinalGstarEstimates = GstarList,
FinalGstarAtDoseGrid = GstarAtDoseGridList,
FinalGstarCIs = CIGstarList,
FinalGstarRatios = ratioGstarList,
final_gstar_estimates = GstarList,
final_gstar_at_dose_grid = GstarAtDoseGridList,
final_gstar_cis = CIGstarList,
final_gstar_ratios = ratioGstarList,
final_tdeot_cis = CITDEOTList,
final_tdeot_ratios = ratioTDEOTList,
FinalOptimalDose = OptimalDoseList,
FinalOptimalDoseAtDoseGrid = OptimalDoseAtDoseGridList,
final_optimal_dose = OptimalDoseList,
final_optimal_dose_at_dose_grid = OptimalDoseAtDoseGridList,
fit = fitDLEList,
fitEff = fitEffList,
sigma2est = sigma2Estimates,
fit_eff = fitEffList,
sigma2_est = sigma2Estimates,
stop_reasons = stopReasons,
stop_report = stop_report,
seed = RNGstate
Expand Down
159 changes: 72 additions & 87 deletions R/Simulations-class.R
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,7 @@ NULL

## class ----

#' `GeneralSimulations`
#'
#' @description `r lifecycle::badge("stable")`
#'
#' `GeneralSimulations` @description `r lifecycle::badge("stable")`
#' This class captures trial simulations.
#' Here also the random generator state before starting the simulation is
#' saved, in order to be able to reproduce the outcome. For this just use
Expand Down Expand Up @@ -612,112 +609,100 @@ PseudoSimulations <- function(fit,
stop("Class PseudoSimulations cannot be instantiated directly. Please use one of its subclasses instead.")
}

# nolint start
## ===============================================================================
## -------------------------------------------------------------------------------
## Class for Pseudo simulation using DLE and efficacy responses (Pseudo models except 'EffFlexi' model)
## -----------------------------------------------------------------------------------
# PseudoDualSimulations ----

##' Class `PseudoDualSimulations`
##'
##' This is a class which captures the trial simulations design using both the
##' DLE and efficacy responses. The design of model from \code{\linkS4class{ModelTox}}
##' class and the efficacy model from \code{\linkS4class{ModelEff}} class
##' (except \code{\linkS4class{EffFlexi}} class). It contains all slots from
##' \code{\linkS4class{GeneralSimulations}} and \code{\linkS4class{PseudoSimulations}} object.
##' In comparison to the parent class \code{\linkS4class{PseudoSimulations}},
##' it contains additional slots to
##' capture the dose-efficacy curve and the sigma2 estimates.
##'
##' @slot fitEff list of the final values. If DLE and efficacy samples are generated, it contains the
##' final fitted values. If no DLE and efficacy samples are used, it contains the modal estimates of the
##' parameters in the two models and the posterior estimates of the probabilities of the occurrence of a
##' DLE and the expected efficacy responses.
##' @slot FinalGstarEstimates a vector of the final estimates of Gstar at the end of each simulations.
##' @slot FinalGstarAtDoseGrid is a vector of the final estimates of Gstar at dose Grid at the end of each simulations
##' @slot FinalGstarCIs is the list of all 95% credibility interval of the final estimates of Gstar
##' @slot FinalGstarRatios is the vector of the ratios of the CI, the ratio of the upper to the lower 95% credibility interval
##' of the final estimates of Gstar
##' @slot FinalOptimalDose is the vector of the final optimal dose, the minimum of the final TDtargetEndOfTrial estimates and Gstar
##' estimates
##' @slot FinalOptimalDoseAtDoseGrid is the vector of the final optimal dose, the minimum of the final TDtargetEndOfTrial estimates
##' and Gstar estimates at dose Grid
##' @slot sigma2est the vector of the final posterior mean sigma2 estimates
##'
##' @export
## class ----

#' `PseudoDualSimulations`
#'
#' @description `r lifecycle::badge("stable")`
#' This class conducts trial simulations for designs using both the
#' DLE and efficacy responses. It defines final values for
#' efficacy fit and DLE, estimates of Gstar, optimal dose and sigma2.
#'
#' @slot fit_eff (`list`)\cr final values of efficacy fit.
#' @slot final_gstar_estimates (`numeric`)\cr final Gstar estimates.
#' @slot final_gstar_at_dose_grid (`numeric`)\cr final Gstar estimates at dose grid.
#' @slot final_gstar_cis (`list`)\cr list of 95% confidence interval for Gstar estimates.
#' @slot final_gstar_ratios (`numeric`)\cr ratios of confidence intervals for Gstar estimates.
#' @slot final_optimal_dose (`numeric`)\cr final optimal dose.
#' @slot final_optimal_dose_at_dose_grid (`numeric`)\cr final optimal dose at dose grid.
#' @slot sigma2_est (`numeric`)\cr final sigma2 estimates.
#'
#' @aliases PseudoDualSimulations
#' @export
.PseudoDualSimulations <-
setClass(
Class = "PseudoDualSimulations",
representation(
fitEff = "list",
FinalGstarEstimates = "numeric",
FinalGstarAtDoseGrid = "numeric",
FinalGstarCIs = "list",
FinalGstarRatios = "numeric",
FinalOptimalDose = "numeric",
FinalOptimalDoseAtDoseGrid = "numeric",
sigma2est = "numeric"
slots = c(
fit_eff = "list",
final_gstar_estimates = "numeric",
final_gstar_at_dose_grid = "numeric",
final_gstar_cis = "list",
final_gstar_ratios = "numeric",
final_optimal_dose = "numeric",
final_optimal_dose_at_dose_grid = "numeric",
sigma2_est = "numeric"
),
prototype(
FinalGstarEstimates = c(0.1, 0.1),
FinalGstarAtDoseGrid = c(0.1, 0.1),
FinalGstarCIs = list(
c(0.1, 0.2),
c(0.1, 0.2)
),
FinalGstarRatios = c(0.01, 0.01),
FinalOptimalDose = c(0.01, 0.01),
FinalOptimalDoseAtDoseGrid = c(0.01, 0.01),
sigma2est = c(0.001, 0.002)
prototype = prototype(
final_gstar_estimates = c(0.1, 0.1),
final_gstar_at_dose_grid = c(0.1, 0.1),
final_gstar_cis = list(c(0.1, 0.2), c(0.1, 0.2)),
final_gstar_ratios = c(0.01, 0.01),
final_optimal_dose = c(0.01, 0.01),
final_optimal_dose_at_dose_grid = c(0.01, 0.01),
sigma2_est = c(0.001, 0.002)
),
contains = "PseudoSimulations",
validity = v_pseudo_dual_simulations
)

validObject(.PseudoDualSimulations())

##' Initialization function for 'DualPseudoSimulations' class
##' @param fitEff please refer to \code{\linkS4class{PseudoDualSimulations}} class object
##' @param FinalGstarEstimates please refer to \code{\linkS4class{PseudoDualSimulations}} class object
##' @param FinalGstarAtDoseGrid please refer to \code{\linkS4class{PseudoDualSimulations}} class object
##' @param FinalGstarCIs please refer to \code{\linkS4class{PseudoDualSimulations}} class object
##' @param FinalGstarRatios please refer to \code{\linkS4class{PseudoDualSimulations}} class object
##' @param FinalOptimalDose please refer to \code{\linkS4class{PseudoDualSimulations}} class object
##' @param FinalOptimalDoseAtDoseGrid please refer to \code{\linkS4class{PseudoDualSimulations}} class object
##' @param sigma2est please refer to \code{\linkS4class{PseudoDualSimulations}} class object
##' @param \dots additional parameters from \code{\linkS4class{PseudoSimulations}}
##' @return the \code{\linkS4class{PseudoDualSimulations}} object
PseudoDualSimulations <- function(fitEff,
FinalGstarEstimates,
FinalGstarAtDoseGrid,
FinalGstarCIs,
FinalGstarRatios,
FinalOptimalDose,
FinalOptimalDoseAtDoseGrid,
sigma2est,
## constructor ----

#' @rdname PseudoDualSimulations-class
#'
#' @param fit_eff (`list`)\cr see slot definition.
#' @param final_gstar_estimates (`numeric`)\cr see slot definition.
#' @param final_gstar_at_dose_grid (`numeric`)\cr see slot definition.
#' @param final_gstar_cis (`list`)\cr see slot definition.
#' @param final_gstar_ratios (`numeric`)\cr see slot definition.
#' @param final_optimal_dose (`numeric`)\cr see slot definition.
#' @param final_optimal_dose_at_dose_grid (`numeric`)\cr see slot definition.
#' @param sigma2_est (`numeric`)\cr see slot definition.
#' @param \dots additional parameters from [`PseudoSimulations`]
#' @export
PseudoDualSimulations <- function(fit_eff,
final_gstar_estimates,
final_gstar_at_dose_grid,
final_gstar_cis,
final_gstar_ratios,
final_optimal_dose,
final_optimal_dose_at_dose_grid,
sigma2_est,
...) {
start <- PseudoSimulations(...)
.PseudoDualSimulations(start,
fitEff = fitEff,
FinalGstarEstimates = FinalGstarEstimates,
FinalGstarAtDoseGrid = FinalGstarAtDoseGrid,
FinalGstarCIs = FinalGstarCIs,
FinalGstarRatios = FinalGstarRatios,
FinalOptimalDose = FinalOptimalDose,
FinalOptimalDoseAtDoseGrid = FinalOptimalDoseAtDoseGrid,
sigma2est = sigma2est
fit_eff = fit_eff,
final_gstar_estimates = final_gstar_estimates,
final_gstar_at_dose_grid = final_gstar_at_dose_grid,
final_gstar_cis = final_gstar_cis,
final_gstar_ratios = final_gstar_ratios,
final_optimal_dose = final_optimal_dose,
final_optimal_dose_at_dose_grid = final_optimal_dose_at_dose_grid,
sigma2_est = sigma2_est
)
}

## default constructor ----

#' @rdname PseudoDualSimulations-class
#' @note Typically, end users will not use the `.DefaultPseudoDualSimulations()` function.
#' @note Do not use the `.DefaultPseudoDualSimulations()` function.
#' @export
.DefaultPseudoDualSimulations <- function() {
stop(paste0("Class PseudoDualSimulations cannot be instantiated directly. Please use one of its subclasses instead."))
stop("Class PseudoDualSimulations cannot be instantiated directly. Please use a subclass.")
}

# nolint start
# PseudoDualFlexiSimulations ----

## class ----
Expand Down
18 changes: 9 additions & 9 deletions R/Simulations-methods.R
Original file line number Diff line number Diff line change
Expand Up @@ -2304,7 +2304,7 @@ setMethod("plot",
## save the plot
plotList[[plotIndex <- plotIndex + 1L]] <-
qplot(factor(0),
y = y, data = data.frame(y = x@sigma2est), geom = "boxplot",
y = y, data = data.frame(y = x@sigma2_est), geom = "boxplot",
xlab = "", ylab = "Efficacy variance estimates"
) +
coord_flip() + scale_x_discrete(breaks = NULL)
Expand Down Expand Up @@ -2504,26 +2504,26 @@ setMethod("summary",
}

## A summary for all final Gstar obtained
GstarSummary <- summary(object@FinalGstarEstimates)
ratioGstarSummary <- summary(object@FinalGstarRatios)
GstarSummary <- summary(object@final_gstar_estimates)
ratioGstarSummary <- summary(object@final_gstar_ratios)

FinalDoseRecSummary <- summary(object@FinalOptimalDose)
FinalDoseRecSummary <- summary(object@final_optimal_dose)
FinalRatioSummary <- summary(object@final_ratios)



## find names in the fit efficacy list (check it is with or without samples)
FitNames <- sapply(object@fitEff, names)
FitNames <- sapply(object@fit_eff, names)
if ("ExpEff" %in% FitNames) {
## fitted efficacy level at dose most often selected
EffFitAtDoseMostSelected <- sapply(
object@fitEff,
object@fit_eff,
function(f) {
f$ExpEff[xMostSelected]
}
)
meanEffFitMatrix <- sapply(
object@fitEff,
object@fit_eff,
"[[",
"ExpEff"
)
Expand All @@ -2536,7 +2536,7 @@ setMethod("summary",
} else { ## fitted efficacy level at dose most often selected
EffFitAtDoseMostSelected <-
sapply(
object@fitEff,
object@fit_eff,
function(f) {
f$middle[xMostSelected]
}
Expand All @@ -2546,7 +2546,7 @@ setMethod("summary",
## at each dose level
## (this is required for plotting)
meanEffFitMatrix <- sapply(
object@fitEff,
object@fit_eff,
"[[",
"middle"
)
Expand Down
10 changes: 5 additions & 5 deletions R/Simulations-validity.R
Original file line number Diff line number Diff line change
Expand Up @@ -123,16 +123,16 @@ v_pseudo_simulations <- function(object) {
}

#' @describeIn v_pseudo_simulations validates that the [`PseudoDualSimulations`] object
#' contains valid `fitEff`, `FinalGstarEstimates` , `FinalGstarAtDoseGrid`,
#' `FinalGstarCIs` , `FinalGstarRatios`, `FinalOptimalDose`, `FinalOptimalDoseAtDoseGrid`
#' object and valid `sigma2est` simulations.
#' contains valid `fit_eff`, `final_gstar_estimates` , `final_gstar_at_dose_grid`,
#' `final_gstar_cis` , `final_gstar_ratios`, `final_optimal_dose`, `final_optimal_dose_at_dose_grid`
#' object and valid `sigma2_est` simulations.

v_pseudo_dual_simulations <- function(object) {
v <- Validate()
nSims <- length(object@data)
v$check(
identical(length(object@sigma2est), nSims),
"sigma2est has to have same length as data"
identical(length(object@sigma2_est), nSims),
"sigma2_est has to have same length as data"
)
v$result()
}
Expand Down
10 changes: 7 additions & 3 deletions man/GeneralSimulations-class.Rd

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

Loading

0 comments on commit 41ca20d

Please sign in to comment.