diff --git a/DESCRIPTION b/DESCRIPTION index 0baeeac..3f0fb8a 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: bmstate Type: Package Title: Bayesian multistate modeling -Version: 0.2.6 +Version: 0.2.7 Authors@R: c(person(given = "Juho", family = "Timonen", diff --git a/R/MultistateModel.R b/R/MultistateModel.R index 532dc18..a738be8 100644 --- a/R/MultistateModel.R +++ b/R/MultistateModel.R @@ -192,6 +192,17 @@ MultistateModel <- R6::R6Class("MultistateModel", invisible(NULL) }, + #' @description Set assumed prior mean baseline hazard rates (side + #' effect) based on average hazards in data. + #' @param data A \code{\link{JointData}} or \code{\link{PathData}} object. + set_prior_mean_h0_data = function(data) { + if (inherits(data, "PathData")) { + data <- JointData$new(data, NULL) + } + checkmate::assert_class(data, "JointData") + df_ttype <- average_haz_per_ttype(data$paths) |> dplyr::arrange(.data$trans_idx) + self$set_prior_mean_h0(exp(df_ttype$log_h0_avg)) + }, #' @description Create model #' diff --git a/R/stan.R b/R/stan.R index 5e16d78..a665556 100644 --- a/R/stan.R +++ b/R/stan.R @@ -57,8 +57,10 @@ ensure_exposed_stan_functions <- function(...) { #' @param model A \code{\link{MultistateModel}} object. #' @param data A \code{\link{JointData}} or \code{\link{PathData}} object. #' @param return_stanfit Return also the raw 'Stan' fit object? -#' @param set_auc_normalizers Set AUC normalization based on SS doses. #' @inheritParams create_stan_model +#' @param set_normalizers Set covariate normalization automatically? +#' @param set_prior_h0 Set prior mean average baseline hazard levels based +#' on data? #' @param max_conc_factor Factor to multiply observed max concentration by #' to get concentration upper bound. #' @param method Must be one of \code{"sample"} (default), @@ -69,7 +71,8 @@ ensure_exposed_stan_functions <- function(...) { #' @return A \code{\link{MultistateModelFit}} object. #' @family Stan-related functions fit_stan <- function(model, data, - set_auc_normalizers = TRUE, + set_normalizers = TRUE, + set_prior_h0 = TRUE, filepath = NULL, return_stanfit = FALSE, max_conc_factor = 100, @@ -82,20 +85,28 @@ fit_stan <- function(model, data, checkmate::assert_choice(method, c("sample", "pathfinder", "optimize")) checkmate::assert_logical(return_stanfit, len = 1) - checkmate::assert_logical(set_auc_normalizers, len = 1) + checkmate::assert_logical(set_normalizers, len = 1) + checkmate::assert_logical(set_prior_h0, len = 1) prefit_checks(model, data) # Get Stan model object stan_model <- create_stan_model(filepath = filepath) - # Set normalizing locations and scales (side effect) - model$set_normalizers(data) - if (!is.null(data$dosing) && set_auc_normalizers) { - mu_CL <- exp(-2) - aaa <- data$dosing$dose_ss / mu_CL - loc <- mean(aaa) - sca <- stats::sd(aaa) - model$set_auc_normalizers(loc, sca) + # Set prior mean baseline hazard rates (side effect) + if (set_prior_h0) { + model$set_prior_mean_h0_data(data) + } + + # Set covariate normalizing locations and scales (side effect) + if (set_normalizers) { + model$set_normalizers(data) + if (!is.null(data$dosing)) { + mu_CL <- exp(-2) + aaa <- data$dosing$dose_ss / mu_CL + loc <- mean(aaa) + sca <- stats::sd(aaa) + model$set_auc_normalizers(loc, sca) + } } # Set max PK concentration @@ -106,10 +117,6 @@ fit_stan <- function(model, data, model$pk_model$set_max_conc(MC) } - # Set prior mean baseline hazard rates (side effect) - df_ttype <- average_haz_per_ttype(data$paths) |> dplyr::arrange(.data$trans_idx) - model$set_prior_mean_h0(exp(df_ttype$log_h0_avg)) - # Create Stan input list sd <- create_stan_data(model, data) diff --git a/man/MultiStateModel.Rd b/man/MultiStateModel.Rd index 6361f81..97d0a6b 100644 --- a/man/MultiStateModel.Rd +++ b/man/MultiStateModel.Rd @@ -32,6 +32,7 @@ hazard model part?} \item \href{#method-MultistateModel-set_auc_normalizers}{\code{MultistateModel$set_auc_normalizers()}} \item \href{#method-MultistateModel-get_prior_mean_h0}{\code{MultistateModel$get_prior_mean_h0()}} \item \href{#method-MultistateModel-set_prior_mean_h0}{\code{MultistateModel$set_prior_mean_h0()}} +\item \href{#method-MultistateModel-set_prior_mean_h0_data}{\code{MultistateModel$set_prior_mean_h0_data()}} \item \href{#method-MultistateModel-new}{\code{MultistateModel$new()}} \item \href{#method-MultistateModel-set_knots}{\code{MultistateModel$set_knots()}} \item \href{#method-MultistateModel-get_knots}{\code{MultistateModel$get_knots()}} @@ -155,6 +156,24 @@ effect). } } \if{html}{\out{
}} +\if{html}{\out{}} +\if{latex}{\out{\hypertarget{method-MultistateModel-set_prior_mean_h0_data}{}}} +\subsection{Method \code{set_prior_mean_h0_data()}}{ +Set assumed prior mean baseline hazard rates (side +effect) based on average hazards in data. +\subsection{Usage}{ +\if{html}{\out{
}}\preformatted{MultistateModel$set_prior_mean_h0_data(data)}\if{html}{\out{
}} +} + +\subsection{Arguments}{ +\if{html}{\out{
}} +\describe{ +\item{\code{data}}{A \code{\link{JointData}} or \code{\link{PathData}} object.} +} +\if{html}{\out{
}} +} +} +\if{html}{\out{
}} \if{html}{\out{}} \if{latex}{\out{\hypertarget{method-MultistateModel-new}{}}} \subsection{Method \code{new()}}{ diff --git a/man/fit_stan.Rd b/man/fit_stan.Rd index da65c5b..8ba7968 100644 --- a/man/fit_stan.Rd +++ b/man/fit_stan.Rd @@ -7,7 +7,8 @@ fit_stan( model, data, - set_auc_normalizers = TRUE, + set_normalizers = TRUE, + set_prior_h0 = TRUE, filepath = NULL, return_stanfit = FALSE, max_conc_factor = 100, @@ -20,7 +21,10 @@ fit_stan( \item{data}{A \code{\link{JointData}} or \code{\link{PathData}} object.} -\item{set_auc_normalizers}{Set AUC normalization based on SS doses.} +\item{set_normalizers}{Set covariate normalization automatically?} + +\item{set_prior_h0}{Set prior mean average baseline hazard levels based +on data?} \item{filepath}{Deprecated.}