From 3f0f6c087810cd3b5aa2e6c91d5b42bc0f1d460f Mon Sep 17 00:00:00 2001 From: Joel Therrien Date: Thu, 29 Aug 2019 13:54:38 -0700 Subject: [PATCH] Add optional penalties when splitting variables that have NAs. Also include several bug fixes from the Java project. --- DESCRIPTION | 2 +- R/create_java_covariates.R | 12 ++--- R/loadData.R | 12 ++--- R/processFormula.R | 40 ++++++++++++++- R/train.R | 50 ++++++++++++------- inst/java/largeRCRF-library-1.0-SNAPSHOT.jar | Bin 123171 -> 125547 bytes man/train.Rd | 47 +++++++++++------ 7 files changed, 114 insertions(+), 49 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index b8829b0..6dca363 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,7 +1,7 @@ Package: largeRCRF Type: Package Title: Large Random Competing Risks Forests -Version: 1.0.4 +Version: 1.0.5 Authors@R: c( person("Joel", "Therrien", email = "joel_therrien@sfu.ca", role = c("aut", "cre", "cph")), person("Jiguo", "Cao", email = "jiguo_cao@sfu.ca", role = c("aut", "dgs")) diff --git a/R/create_java_covariates.R b/R/create_java_covariates.R index 3c60a25..4cb1bd0 100644 --- a/R/create_java_covariates.R +++ b/R/create_java_covariates.R @@ -29,8 +29,8 @@ NULL # @rdname covariates -Java_BooleanCovariate <- function(name, index){ - covariate <- .jnew(.class_BooleanCovariate, name, as.integer(index)) +Java_BooleanCovariate <- function(name, index, na.penalty){ + covariate <- .jnew(.class_BooleanCovariate, name, as.integer(index), na.penalty) covariate <- .jcast(covariate, .class_Object) # needed for later adding it into Java Lists return(covariate) @@ -38,19 +38,19 @@ Java_BooleanCovariate <- function(name, index){ # @rdname covariates # @param levels The levels of the factor as a character vector -Java_FactorCovariate <- function(name, index, levels){ +Java_FactorCovariate <- function(name, index, levels, na.penalty){ levelsArray <- .jarray(levels, makeResponse(.class_String)) levelsList <- .jcall("java/util/Arrays", "Ljava/util/List;", "asList", .jcast(levelsArray, "[Ljava/lang/Object;")) - covariate <- .jnew(.class_FactorCovariate, name, as.integer(index), levelsList) + covariate <- .jnew(.class_FactorCovariate, name, as.integer(index), levelsList, na.penalty) covariate <- .jcast(covariate, .class_Object) # needed for later adding it into Java Lists return(covariate) } # @rdname covariates -Java_NumericCovariate <- function(name, index){ - covariate <- .jnew(.class_NumericCovariate, name, as.integer(index)) +Java_NumericCovariate <- function(name, index, na.penalty){ + covariate <- .jnew(.class_NumericCovariate, name, as.integer(index), na.penalty) covariate <- .jcast(covariate, .class_Object) # needed for later adding it into Java Lists return(covariate) diff --git a/R/loadData.R b/R/loadData.R index 7a1c0df..5ee2383 100644 --- a/R/loadData.R +++ b/R/loadData.R @@ -1,4 +1,4 @@ -loadData <- function(data, xVarNames, responses, covariateList.java = NULL){ +loadData <- function(data, xVarNames, responses, covariateList.java = NULL, na.penalty = NULL){ if(class(responses) == "integer" | class(responses) == "numeric"){ responses <- Numeric(responses) @@ -6,7 +6,7 @@ loadData <- function(data, xVarNames, responses, covariateList.java = NULL){ # connectToData provides a pre-created covariate list we can re-use if(is.null(covariateList.java)){ - covariateList.java <- getCovariateList(data, xVarNames) + covariateList.java <- getCovariateList(data, xVarNames, na.penalty) } textColumns <- list() @@ -22,7 +22,7 @@ loadData <- function(data, xVarNames, responses, covariateList.java = NULL){ } -getCovariateList <- function(data, xvarNames){ +getCovariateList <- function(data, xvarNames, na.penalty){ covariateList <- .jcast(.jnew(.class_ArrayList, length(xvarNames)), .class_List) for(i in 1:length(xvarNames)){ @@ -31,14 +31,14 @@ getCovariateList <- function(data, xvarNames){ column <- data[,xName] if(class(column) == "numeric" | class(column) == "integer"){ - covariate <- Java_NumericCovariate(xName, i-1) + covariate <- Java_NumericCovariate(xName, i-1, na.penalty[i]) } else if(class(column) == "logical"){ - covariate <- Java_BooleanCovariate(xName, i-1) + covariate <- Java_BooleanCovariate(xName, i-1, na.penalty[i]) } else if(class(column) == "factor"){ lvls <- levels(column) - covariate <- Java_FactorCovariate(xName, i-1, lvls) + covariate <- Java_FactorCovariate(xName, i-1, lvls, na.penalty[i]) } else{ stop("Unknown column type") diff --git a/R/processFormula.R b/R/processFormula.R index 26d1097..e86b369 100644 --- a/R/processFormula.R +++ b/R/processFormula.R @@ -2,7 +2,7 @@ # Internal function that takes a formula and processes it for use in the Java # code. existingCovariateList is optional; if not provided then a new one is # created internally. -processFormula <- function(formula, data, covariateList.java = NULL){ +processFormula <- function(formula, data, covariateList.java = NULL, na.penalty = NULL){ # Having an R copy of the data loaded at the same time can be wasteful; we # also allow users to provide an environment of the data which gets removed @@ -52,8 +52,44 @@ processFormula <- function(formula, data, covariateList.java = NULL){ # remove any response variables on the right-hand-side covariateData <- filteredData[, !(names(filteredData) %in% variablesToDrop), drop=FALSE] + # Now that we know how many predictor variables we have, we should check na.penalty + if(!is.null(na.penalty)){ + if(!is.numeric(na.penalty) & !is.logical(na.penalty)){ + stop("na.penalty must be either logical or numeric.") + } + + if(is.logical(na.penalty) & length(na.penalty) != 1 & length(na.penalty) != ncol(covariateData)){ + stop("na.penalty must have length of either 1 or the number of predictor variables if logical.") + } + + if(is.numeric(na.penalty) & length(na.penalty) != 1){ + stop("na.penalty must have length 1 if logical.") + } + + if(anyNA(na.penalty)){ + stop("na.penalty cannot contain NAs.") + } + + + # All good; now to transform it. + if(is.numeric(na.penalty)){ + na.threshold <- na.penalty + na.penalty <- apply(covariateData, 2, function(x){mean(is.na(x))}) >= na.threshold + } + else if(is.logical(na.penalty) & length(na.penalty) == 1){ + na.penalty <- rep(na.penalty, times = ncol(covariateData)) + } + # else{} - na.penalty is logical and the correct length; no need to do anything to it + + } - dataset <- loadData(covariateData, colnames(covariateData), responses, covariateList.java = covariateList.java) + dataset <- loadData( + covariateData, + colnames(covariateData), + responses, + covariateList.java = covariateList.java, + na.penalty = na.penalty + ) return(dataset) } \ No newline at end of file diff --git a/R/train.R b/R/train.R index 116bc09..a513413 100644 --- a/R/train.R +++ b/R/train.R @@ -178,9 +178,9 @@ train.internal <- function(dataset, splitFinder, #' @param data A data.frame containing the columns of the predictors and #' responses. #' @param splitFinder A split finder that's used to score splits in the random -#' forest training algorithm. See \code{\link{CompetingRiskSplitFinders}} -#' or \code{\link{WeightedVarianceSplitFinder}}. If you don't specify one, -#' this function tries to pick one based on the response. For +#' forest training algorithm. See \code{\link{CompetingRiskSplitFinders}} or +#' \code{\link{WeightedVarianceSplitFinder}}. If you don't specify one, this +#' function tries to pick one based on the response. For #' \code{\link{CR_Response}} without censor times, it will pick a #' \code{\link{LogRankSplitFinder}}; while if censor times were provided it #' will pick \code{\link{GrayLogRankSplitFinder}}; for integer or numeric @@ -188,19 +188,19 @@ train.internal <- function(dataset, splitFinder, #' @param nodeResponseCombiner A response combiner that's used to combine #' responses for each terminal node in a tree (regression example; average the #' observations in each tree into a single number). See -#' \code{\link{CR_ResponseCombiner}} or -#' \code{\link{MeanResponseCombiner}}. If you don't specify one, this function -#' tries to pick one based on the response. For \code{\link{CR_Response}} it -#' picks a \code{\link{CR_ResponseCombiner}}; for integer or numeric -#' responses it picks a \code{\link{MeanResponseCombiner}}. +#' \code{\link{CR_ResponseCombiner}} or \code{\link{MeanResponseCombiner}}. If +#' you don't specify one, this function tries to pick one based on the +#' response. For \code{\link{CR_Response}} it picks a +#' \code{\link{CR_ResponseCombiner}}; for integer or numeric responses it +#' picks a \code{\link{MeanResponseCombiner}}. #' @param forestResponseCombiner A response combiner that's used to combine #' predictions across trees into one final result (regression example; average #' the prediction of each tree into a single number). See -#' \code{\link{CR_FunctionCombiner}} or -#' \code{\link{MeanResponseCombiner}}. If you don't specify one, this function -#' tries to pick one based on the response. For \code{\link{CR_Response}} it -#' picks a \code{\link{CR_FunctionCombiner}}; for integer or numeric -#' responses it picks a \code{\link{MeanResponseCombiner}}. +#' \code{\link{CR_FunctionCombiner}} or \code{\link{MeanResponseCombiner}}. If +#' you don't specify one, this function tries to pick one based on the +#' response. For \code{\link{CR_Response}} it picks a +#' \code{\link{CR_FunctionCombiner}}; for integer or numeric responses it +#' picks a \code{\link{MeanResponseCombiner}}. #' @param ntree An integer that specifies how many trees should be trained. #' @param numberOfSplits A tuning parameter specifying how many random splits #' should be tried for a covariate; a value of 0 means all splits will be @@ -217,6 +217,20 @@ train.internal <- function(dataset, splitFinder, #' @param maxNodeDepth This parameter is analogous to \code{nodeSize} in that it #' controls tree length; by default \code{maxNodeDepth} is an extremely high #' number and tree depth is controlled by \code{nodeSize}. +#' @param na.penalty This parameter controls whether predictor variables with +#' NAs should be penalized when being considered for a best split. Best splits +#' (and the associated score) are determined on only non-NA data; the penalty +#' is to take the best split identified, and to randomly assign any NAs +#' (according to the proportion of data split left and right), and then +#' recalculate the corresponding split score, when is then compared with the +#' other split candiate variables. This penalty adds some computational time, +#' so it may be disabled for some variables. \code{na.penalty} may be +#' specified as a vector of logicals indicating, for each predictor variable, +#' whether the penalty should be applied to that variable. If it's length 1 +#' then it applies to all variables. Alternatively, a single numeric value may +#' be provided to indicate a threshold whereby the penalty is activated only +#' if the proportion of NAs for that variable in the training set exceeds that +#' threshold. #' @param splitPureNodes This parameter determines whether the algorithm will #' split a pure node. If set to FALSE, then before every split it will check #' that every response is the same, and if so, not split. If set to TRUE it @@ -290,17 +304,17 @@ train.internal <- function(dataset, splitFinder, #' #' forest <- train(CR_Response(delta, u) ~ x1 + x2, data, #' LogRankSplitFinder(1:2), CR_ResponseCombiner(1:2), -#' CR_FunctionCombiner(1:2), ntree=100, numberOfSplits=5, +#' CR_FunctionCombiner(1:2), ntree=100, numberOfSplits=5, #' mtry=1, nodeSize=10) #' newData <- data.frame(x1 = c(-1, 0, 1), x2 = 0) #' ypred <- predict(forest, newData) train <- function(formula, data, splitFinder = NULL, nodeResponseCombiner = NULL, forestResponseCombiner = NULL, ntree, numberOfSplits, mtry, - nodeSize, maxNodeDepth = 100000, splitPureNodes=TRUE, savePath=NULL, - savePath.overwrite=c("warn", "delete", "merge"), cores = getCores(), - randomSeed = NULL, displayProgress = TRUE){ + nodeSize, maxNodeDepth = 100000, na.penalty = TRUE, splitPureNodes=TRUE, + savePath=NULL, savePath.overwrite=c("warn", "delete", "merge"), + cores = getCores(), randomSeed = NULL, displayProgress = TRUE){ - dataset <- processFormula(formula, data) + dataset <- processFormula(formula, data, na.penalty = na.penalty) forest <- train.internal(dataset, splitFinder = splitFinder, nodeResponseCombiner = nodeResponseCombiner, diff --git a/inst/java/largeRCRF-library-1.0-SNAPSHOT.jar b/inst/java/largeRCRF-library-1.0-SNAPSHOT.jar index ad8f858f7978f7eba45e90d37eccc2deeee26475..9de61f03759561b32ff0b89c0d6ccc6392f7830c 100644 GIT binary patch delta 22939 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