R/internal.R

Defines functions null_maxlogL saturated_maxlogL extract_fun_args fo_and_data formula2Surv

Documented in extract_fun_args fo_and_data formula2Surv null_maxlogL saturated_maxlogL

#' @title Internal functions for formula and data handle
#' @description Utility functions useful for passing data from functions
#' inside others.
#'
#' @encoding UTF-8
#' @author Jaime Mosquera GutiƩrrez, \email{jmosquerag@unal.edu.co}
#' @param model_frame a model frame build internally in some functions on
#'        \strong{EstimationTools} package
#' @export
#' @keywords internal
#' @rdname internalfunc
#'
#==============================================================================
# Formula conversion for 'survfit' using --------------------------------------
#==============================================================================
formula2Surv <- function(model_frame){
  vars <- names(model_frame)
  y_var <- paste0('Surv(', vars[1L], ', rep(1, nrow(model_frame)))')
  right_side <- if (length(vars) > 1){
    paste(vars[2L:end(vars)[1]], collapse = "+")
  } else {
    "1"
  }
  formula <- as.formula(paste0(y_var, "~", right_side))
  return(formula)
}
#==============================================================================
# Data preparation for TTT computation ----------------------------------------
#==============================================================================
#' @export
#' @keywords internal
#' @rdname internalfunc
#'
fo_and_data <- function(y, fo, model_frame, data, fo2Surv = TRUE){
  if ( !is.Surv(y) ){
    if ( fo2Surv ) fo <- formula2Surv(model_frame)
    if ( missing(data) | is.null(data) ) data <- model_frame
  } else {
    if ( missing(data) | is.null(data) ){
      vars <- names(model_frame)
      ySurv <- vars[1L]
      yname <- gsub("Surv\\((.*?),.*", "\\1", ySurv)
      statusname <- gsub(paste0("Surv\\(", yname, ",(.*?)\\)"), "\\1", ySurv)
      right_hand <- attr(stats::terms(fo), 'term.labels')

      if (length(right_hand) == 0){
        factorname <- NULL
        data <- data.frame(y[,1], y[,2])
      } else {
        factorname <- as.character(right_hand[1])
        other_column <- model_frame[,2]
        data <- data.frame(y[,1], y[,2], other_column)
      }
      colnames(data) <- c(yname, statusname, factorname)
    }
  }
  return(list(data = data, fo = fo))
}
#==============================================================================
# Extract arguments from ... when it contains inputs for multiple functions ---
# (used only for integration routines in 'integration' wrapper)
#==============================================================================
#' @export
#' @keywords internal
#' @rdname internalfunc
extract_fun_args <- function(fun, exclude, ...){
  dots <- substitute(...())
  args_list <- formals(fun)
  routine_args <- names(args_list[-1])
  if ( !missing(exclude) ){
    routine_args <- routine_args[!(routine_args %in% exclude)]
    key_args <- routine_args[routine_args %in% names(dots)]
    # routine_input_args <- args_list[key_args]
    routine_input_args <- dots[key_args]
  } else {
    routine_input_args <- args_list[routine_args]
  }
  add_args <- dots[!(names(dots) %in% routine_args)]
  return(list(routine_input_args, add_args))
}
#==============================================================================
# Saturated model -------------------------------------------------------------
#==============================================================================
#' @export
#' @keywords internal
#' @rdname internalfunc
saturated_maxlogL <- function(object, silent = TRUE){
  if (silent) options(warn = -1)
  y <- object$outputs$response
  X <- factor(1:length(y))
  formulas <- object$inputs$formulas
  formulas <- sapply(formulas, function(x) formula(~X))
  maxlogL_call <- object$inputs$call
  maxlogL_call[['data']] <- data.frame(X, y)
  maxlogL_call[['formulas']] <- formulas
  saturated_model <- eval(maxlogL_call)
  if (silent) options(warn = 0)
  return(saturated_model)
}
#==============================================================================
# Null model-------------------------------------------------------------------
#==============================================================================
#' @export
#' @keywords internal
#' @rdname internalfunc
null_maxlogL <- function(object, silent = TRUE){
  if (silent) options(warn = -1)
  X <- 1
  y <- object$outputs$response
  formulas <- object$inputs$formulas
  formulas <- sapply(formulas, function(x) formula(~1))
  maxlogL_call <- object$inputs$call
  maxlogL_call[['data']] <- data.frame(X, y)
  maxlogL_call[['formulas']] <- formulas
  saturated_model <- eval(maxlogL_call)
  if (silent) options(warn = 0)
  return(saturated_model)
}

Try the EstimationTools package in your browser

Any scripts or data that you put into this service are public.

EstimationTools documentation built on Dec. 10, 2022, 9:07 a.m.