From 48859b0249c14a502e41bbd1116ad0e70fcc0446 Mon Sep 17 00:00:00 2001 From: Joel Therrien Date: Mon, 12 Aug 2019 14:19:45 -0700 Subject: [PATCH] Add variable importance --- NAMESPACE | 1 + R/cr_integratedBrierScore.R | 35 +--- R/java_classes_directory.R | 9 + R/loadData.R | 25 +-- R/misc.R | 17 ++ R/processCensoringDistribution.R | 39 +++++ R/processFormula.R | 59 +++++++ R/train.R | 100 ++--------- R/vimp.R | 175 +++++++++++++++++++ inst/java/largeRCRF-library-1.0-SNAPSHOT.jar | Bin 116676 -> 123171 bytes man/train.Rd | 2 +- man/vimp.Rd | 48 +++++ tests/testthat/test_vimp.R | 102 +++++++++++ 13 files changed, 482 insertions(+), 130 deletions(-) create mode 100644 R/processCensoringDistribution.R create mode 100644 R/processFormula.R create mode 100644 R/vimp.R create mode 100644 man/vimp.Rd create mode 100644 tests/testthat/test_vimp.R diff --git a/NAMESPACE b/NAMESPACE index c60de41..402bb00 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -35,4 +35,5 @@ export(loadForest) export(naiveConcordance) export(saveForest) export(train) +export(vimp) import(rJava) diff --git a/R/cr_integratedBrierScore.R b/R/cr_integratedBrierScore.R index 9525238..a86645e 100644 --- a/R/cr_integratedBrierScore.R +++ b/R/cr_integratedBrierScore.R @@ -59,45 +59,14 @@ integratedBrierScore <- function(responses, predictions, event, time, censoringD java.censoringDistribution <- NULL if(!is.null(censoringDistribution)){ - if(is.numeric(censoringDistribution)){ - # estimate ECDF - censoringTimes <- .jarray(censoringDistribution, "D") - java.censoringDistribution <- .jcall(.class_Utils, makeResponse(.class_RightContinuousStepFunction), "estimateOneMinusECDF", censoringTimes) - - } else if(is.list(censoringDistribution)){ - # First check that censoringDistribution fits the correct format - if(is.null(censoringDistribution$x) | is.null(censoringDistribution$y)){ - stop("If the censoringDistribution is provided as a list, it must have an x and a y item that are numeric.") - } - - if(length(censoringDistribution$x) != length(censoringDistribution$y)){ - stop("x and y in censoringDistribution must have the same length.") - } - - if(!is.numeric(censoringDistribution$x) | !is.numeric(censoringDistribution$y)){ - stop("x and y in censoringDistribution must both be numeric.") - } - - java.censoringDistribution <- createRightContinuousStepFunction(censoringDistribution$x, censoringDistribution$y, defaultY = 1.0) - - } else if("stepfun" %in% class(censoringDistribution)){ - x <- stats::knots(censoringDistribution) - y <- censoringDistribution(x) - - java.censoringDistribution <- createRightContinuousStepFunction(x, y, defaultY = 1.0) - } - else{ - stop("Invalid censoringDistribution") - } - - # Make sure we wrap it in an Optional + java.censoringDistribution <- processCensoringDistribution(censoringDistribution) java.censoringDistribution <- .object_Optional(java.censoringDistribution) - } else{ java.censoringDistribution <- .object_Optional(NULL) } + predictions.java <- lapply(predictions, function(x){return(x$javaObject)}) predictions.java <- convertRListToJava(predictions.java) diff --git a/R/java_classes_directory.R b/R/java_classes_directory.R index 97598c3..8ffe241 100644 --- a/R/java_classes_directory.R +++ b/R/java_classes_directory.R @@ -10,6 +10,7 @@ .class_Collection <- "java/util/Collection" .class_Serializable <- "java/io/Serializable" .class_File <- "java/io/File" +.class_Random <- "java/util/Random" # Utility Classes .class_DataUtils <- "ca/joeltherrien/randomforest/utils/DataUtils" @@ -53,6 +54,14 @@ .class_LogRankSplitFinder <- "ca/joeltherrien/randomforest/responses/competingrisk/splitfinder/LogRankSplitFinder" .class_WeightedVarianceSplitFinder <- "ca/joeltherrien/randomforest/responses/regression/WeightedVarianceSplitFinder" +# VIMP classes +.class_IBSCalculator <- "ca/joeltherrien/randomforest/responses/competingrisk/IBSCalculator" +.class_ErrorCalculator <- "ca/joeltherrien/randomforest/tree/vimp/ErrorCalculator" +.class_RegressionErrorCalculator <- "ca/joeltherrien/randomforest/tree/vimp/RegressionErrorCalculator" +.class_IBSErrorCalculatorWrapper <- "ca/joeltherrien/randomforest/tree/vimp/IBSErrorCalculatorWrapper" +.class_VariableImportanceCalculator <- "ca/joeltherrien/randomforest/tree/vimp/VariableImportanceCalculator" + + .object_Optional <- function(object=NULL){ if(is.null(object)){ return(.jcall("java/util/Optional", "Ljava/util/Optional;", "empty")) diff --git a/R/loadData.R b/R/loadData.R index 9e870c2..7a1c0df 100644 --- a/R/loadData.R +++ b/R/loadData.R @@ -18,7 +18,7 @@ loadData <- function(data, xVarNames, responses, covariateList.java = NULL){ rowList <- .jcall(.class_RUtils, makeResponse(.class_List), "importDataWithResponses", responses$javaObject, covariateList.java, textData) - return(list(covariateList=covariateList.java, dataset=rowList)) + return(list(covariateList = covariateList.java, dataset = rowList, responses = responses)) } @@ -54,15 +54,7 @@ getCovariateList <- function(data, xvarNames){ loadPredictionData <- function(newData, covariateList.java){ - xVarNames <- character(.jcall(covariateList.java, "I", "size")) - for(j in 1:length(xVarNames)){ - covariate.java <- .jcast( - .jcall(covariateList.java, makeResponse(.class_Object), "get", as.integer(j-1)), - .class_Covariate - ) - - xVarNames[j] <- .jcall(covariate.java, makeResponse(.class_String), "getName") - } + xVarNames <- extractCovariateNamesFromJavaList(covariateList.java) if(any(!(xVarNames %in% names(newData)))){ varsMissing = xVarNames[!(xVarNames %in% names(newData))] @@ -84,3 +76,16 @@ loadPredictionData <- function(newData, covariateList.java){ return(rowList) } +extractCovariateNamesFromJavaList <- function(covariateList.java){ + xVarNames <- character(.jcall(covariateList.java, "I", "size")) + for(j in 1:length(xVarNames)){ + covariate.java <- .jcast( + .jcall(covariateList.java, makeResponse(.class_Object), "get", as.integer(j-1)), + .class_Covariate + ) + + xVarNames[j] <- .jcall(covariate.java, makeResponse(.class_String), "getName") + } + + return(xVarNames) +} diff --git a/R/misc.R b/R/misc.R index dc4f040..6bb24e0 100644 --- a/R/misc.R +++ b/R/misc.R @@ -14,6 +14,23 @@ convertRListToJava <- function(lst){ return(javaList) } +#Internal function +convertJavaListToR <- function(javaList, class = .class_Object){ + lst <- list() + + javaList.length <- .jcall(javaList, "I", "size") + + for(i in 0:(javaList.length - 1)){ + object <- .jcall(javaList, makeResponse(.class_Object), "get", as.integer(i)) + object <- .jcast(object, class) + + lst[[i+1]] <- object + } + + return(lst) + +} + #' @export print.SplitFinder = function(x, ...) print(x$call) diff --git a/R/processCensoringDistribution.R b/R/processCensoringDistribution.R new file mode 100644 index 0000000..7e57048 --- /dev/null +++ b/R/processCensoringDistribution.R @@ -0,0 +1,39 @@ + + +# Internal function. Takes a censoring distribution and turns it into a +# RightContinuousStepFunction Java object. +processCensoringDistribution <- function(censoringDistribution){ + + if(is.numeric(censoringDistribution)){ + # estimate ECDF + censoringTimes <- .jarray(censoringDistribution, "D") + java.censoringDistribution <- .jcall(.class_Utils, makeResponse(.class_RightContinuousStepFunction), "estimateOneMinusECDF", censoringTimes) + + } else if(is.list(censoringDistribution)){ + # First check that censoringDistribution fits the correct format + if(is.null(censoringDistribution$x) | is.null(censoringDistribution$y)){ + stop("If the censoringDistribution is provided as a list, it must have an x and a y item that are numeric.") + } + + if(length(censoringDistribution$x) != length(censoringDistribution$y)){ + stop("x and y in censoringDistribution must have the same length.") + } + + if(!is.numeric(censoringDistribution$x) | !is.numeric(censoringDistribution$y)){ + stop("x and y in censoringDistribution must both be numeric.") + } + + java.censoringDistribution <- createRightContinuousStepFunction(censoringDistribution$x, censoringDistribution$y, defaultY = 1.0) + + } else if("stepfun" %in% class(censoringDistribution)){ + x <- stats::knots(censoringDistribution) + y <- censoringDistribution(x) + + java.censoringDistribution <- createRightContinuousStepFunction(x, y, defaultY = 1.0) + } + else{ + stop("Invalid censoringDistribution") + } + + return(java.censoringDistribution) +} \ No newline at end of file diff --git a/R/processFormula.R b/R/processFormula.R new file mode 100644 index 0000000..26d1097 --- /dev/null +++ b/R/processFormula.R @@ -0,0 +1,59 @@ + +# 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){ + + # 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 + # after being imported into Java + if(class(data) == "environment"){ + if(is.null(data$data)){ + stop("When providing an environment with the dataset, the environment must contain an item called 'data'") + } + + env <- data + data <- env$data + env$data <- NULL + gc() + } + + yVar <- formula[[2]] + + responses <- NULL + variablesToDrop <- character(0) + + # yVar is a call object; as.character(yVar) will be the different components, including the parameters. + # if the length of yVar is > 1 then it's a function call. If the length is 1, and it's not in data, + # then we also need to explicitly evaluate it + if(class(yVar) == "call" || !(as.character(yVar) %in% colnames(data))){ + # yVar is a function like CR_Response + responses <- eval(expr=yVar, envir=data) + + if(class(formula[[3]]) == "name" && as.character(formula[[3]])=="."){ + # do any of the variables match data in data? We need to track that so we can drop them later + variablesToDrop <- as.character(yVar)[as.character(yVar) %in% names(data)] + } + + formula[[2]] <- NULL + + } else if(class(yVar) == "name"){ # and implicitly yVar is contained in data + variablesToDrop <- as.character(yVar) + } + + # Includes responses which we may need to later cut out if `.` was used on the + # right-hand-side + filteredData <- stats::model.frame(formula=formula, data=data, na.action=stats::na.pass) + + if(is.null(responses)){ # If this if-statement runs then we have a simple (i.e. numeric) response + responses <- stats::model.response(filteredData) + } + + # remove any response variables on the right-hand-side + covariateData <- filteredData[, !(names(filteredData) %in% variablesToDrop), drop=FALSE] + + + dataset <- loadData(covariateData, colnames(covariateData), responses, covariateList.java = covariateList.java) + + return(dataset) +} \ No newline at end of file diff --git a/R/train.R b/R/train.R index 2cfa379..116bc09 100644 --- a/R/train.R +++ b/R/train.R @@ -14,7 +14,7 @@ getCores <- function(){ return(cores) } -train.internal <- function(responses, covariateData, splitFinder, +train.internal <- function(dataset, splitFinder, nodeResponseCombiner, forestResponseCombiner, ntree, numberOfSplits, mtry, nodeSize, maxNodeDepth, splitPureNodes, savePath, savePath.overwrite, @@ -52,15 +52,15 @@ train.internal <- function(responses, covariateData, splitFinder, } if(is.null(splitFinder)){ - splitFinder <- splitFinderDefault(responses) + splitFinder <- splitFinderDefault(dataset$responses) } if(is.null(nodeResponseCombiner)){ - nodeResponseCombiner <- nodeResponseCombinerDefault(responses) + nodeResponseCombiner <- nodeResponseCombinerDefault(dataset$responses) } if(is.null(forestResponseCombiner)){ - forestResponseCombiner <- forestResponseCombinerDefault(responses) + forestResponseCombiner <- forestResponseCombinerDefault(dataset$responses) } @@ -75,20 +75,6 @@ train.internal <- function(responses, covariateData, splitFinder, stop("forestResponseCombiner must be a ResponseCombiner") } - if(class(covariateData)=="environment"){ - if(is.null(covariateData$data)){ - stop("When providing an environment with the dataset, the environment must contain an item called 'data'") - } - dataset <- loadData(covariateData$data, colnames(covariateData$data), responses) - covariateData$data <- NULL # save memory, hopefully - gc() # explicitly try to save memory - } - else{ - dataset <- loadData(covariateData, colnames(covariateData), responses) - } - - - treeTrainer <- createTreeTrainer(responseCombiner=nodeResponseCombiner, splitFinder=splitFinder, covariateList=dataset$covariateList, @@ -188,7 +174,7 @@ train.internal <- function(responses, covariateData, splitFinder, #' #' @param formula You may specify the response and covariates as a formula #' instead; make sure the response in the formula is still properly -#' constructed; see \code{responses} +#' constructed. #' @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 @@ -314,74 +300,16 @@ train <- function(formula, data, splitFinder = NULL, nodeResponseCombiner = NULL savePath.overwrite=c("warn", "delete", "merge"), cores = getCores(), randomSeed = NULL, displayProgress = TRUE){ - # 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 - # after being imported into Java - env <- NULL - if(class(data) == "environment"){ - if(is.null(data$data)){ - stop("When providing an environment with the dataset, the environment must contain an item called 'data'") - } - - env <- data - data <- env$data - } - - yVar <- formula[[2]] - - responses <- NULL - variablesToDrop <- character(0) + dataset <- processFormula(formula, data) - # yVar is a call object; as.character(yVar) will be the different components, including the parameters. - # if the length of yVar is > 1 then it's a function call. If the length is 1, and it's not in data, - # then we also need to explicitly evaluate it - if(class(yVar)=="call" || !(as.character(yVar) %in% colnames(data))){ - # yVar is a function like CompetingRiskResponses - responses <- eval(expr=yVar, envir=data) - - if(class(formula[[3]]) == "name" && as.character(formula[[3]])=="."){ - # do any of the variables match data in data? We need to track that so we can drop them later - variablesToDrop <- as.character(yVar)[as.character(yVar) %in% names(data)] - } - - formula[[2]] <- NULL - - } else if(class(yVar)=="name"){ # and implicitly yVar is contained in data - variablesToDrop <- as.character(yVar) - } - - # Includes responses which we may need to later cut out - mf <- stats::model.frame(formula=formula, data=data, na.action=stats::na.pass) - - if(is.null(responses)){ - responses <- stats::model.response(mf) - } - - # remove any response variables - mf <- mf[,!(names(mf) %in% variablesToDrop), drop=FALSE] - - # If environment was provided instead of data - if(!is.null(env)){ - env$data <- mf - rm(data) - forest <- train.internal(responses, env, splitFinder = splitFinder, - nodeResponseCombiner = nodeResponseCombiner, - forestResponseCombiner = forestResponseCombiner, - ntree = ntree, numberOfSplits = numberOfSplits, - mtry = mtry, nodeSize = nodeSize, maxNodeDepth = maxNodeDepth, - splitPureNodes = splitPureNodes, savePath = savePath, - savePath.overwrite = savePath.overwrite, cores = cores, - randomSeed = randomSeed, displayProgress = displayProgress) - } else{ - forest <- train.internal(responses, mf, splitFinder = splitFinder, - nodeResponseCombiner = nodeResponseCombiner, - forestResponseCombiner = forestResponseCombiner, - ntree = ntree, numberOfSplits = numberOfSplits, - mtry = mtry, nodeSize = nodeSize, maxNodeDepth = maxNodeDepth, - splitPureNodes = splitPureNodes, savePath = savePath, - savePath.overwrite = savePath.overwrite, cores = cores, - randomSeed = randomSeed, displayProgress = displayProgress) - } + forest <- train.internal(dataset, splitFinder = splitFinder, + nodeResponseCombiner = nodeResponseCombiner, + forestResponseCombiner = forestResponseCombiner, + ntree = ntree, numberOfSplits = numberOfSplits, + mtry = mtry, nodeSize = nodeSize, maxNodeDepth = maxNodeDepth, + splitPureNodes = splitPureNodes, savePath = savePath, + savePath.overwrite = savePath.overwrite, cores = cores, + randomSeed = randomSeed, displayProgress = displayProgress) forest$call <- match.call() forest$formula <- formula diff --git a/R/vimp.R b/R/vimp.R new file mode 100644 index 0000000..27211e1 --- /dev/null +++ b/R/vimp.R @@ -0,0 +1,175 @@ + + +#' Variable Importance +#' +#' Calculate variable importance by recording the increase in error when a given +#' predictor is randomly permuted. Regression forests uses mean squared error; +#' competing risks uses integrated Brier score. +#' +#' @param forest The forest that was trained. +#' @param newData A test set of the data if available. If not, then out of bag +#' errors will be attempted on the training set. +#' @param randomSeed The source of randomness used to permute the values. Can be +#' left blank. +#' @param events If using competing risks forest, the events that the error +#' measure used for VIMP should be calculated on. +#' @param time If using competing risks forest, the upper bound of the +#' integrated Brier score. +#' @param censoringDistribution (Optional) If using competing risks forest, the +#' censoring distribution. See \code{\link{integratedBrierScore} for details.} +#' @param eventWeights (Optional) If using competing risks forest, weights to be +#' applied to the error for each of the \code{events}. +#' +#' @return A named numeric vector of importance values. +#' @export +#' +#' @examples +#' data(wihs) +#' +#' forest <- train(CR_Response(status, time) ~ ., wihs, +#' ntree = 100, numberOfSplits = 0, mtry=3, nodeSize = 5) +#' +#' vimp(forest, events = 1:2, time = 8.0) +#' +vimp <- function( + forest, + newData = NULL, + randomSeed = NULL, + type = c("mean", "z", "raw"), + events = NULL, + time = NULL, + censoringDistribution = NULL, + eventWeights = NULL){ + + if(is.null(newData) & is.null(forest$dataset)){ + stop("forest doesn't have a copy of the training data loaded (this happens if you just loaded it); please manually specify newData and possibly out.of.bag") + } + + # Basically we check if type is either null, length 0, or one of the invalid values. + # We can't include the last statement in the same statement as length(tyoe) < 1, + # because R checks both cases and a different error would display if length(type) == 0 + typeError = is.null(type) | length(type) < 1 + if(!typeError){ + typeError = !(type[1] %in% c("mean", "z", "raw")) + } + if(typeError){ + stop("A valid response type must be provided.") + } + + if(is.null(newData)){ + data.java <- forest$dataset + out.of.bag <- TRUE + + } + else{ # newData is provided + data.java <- processFormula(forest$formula, newData, forest$covariateList)$dataset + out.of.bag <- FALSE + } + + predictionClass <- forest$params$forestResponseCombiner$outputClass + + if(predictionClass == "CompetingRiskFunctions"){ + if(is.null(time) | length(time) != 1){ + stop("time must be set at length 1") + } + + errorCalculator.java <- ibsCalculatorWrapper( + events = events, + time = time, + censoringDistribution = censoringDistribution, + eventWeights = eventWeights) + + } else if(predictionClass == "numeric"){ + errorCalculator.java <- .jnew(.class_RegressionErrorCalculator) + errorCalculator.java <- .jcast(errorCalculator.java, .class_ErrorCalculator) + + } else{ + stop(paste0("VIMP not yet supported for ", predictionClass, ". If you're just using a non-custom version of largeRCRF then this is a bug and should be reported.")) + + } + + forest.trees.java <- .jcall(forest$javaObject, makeResponse(.class_List), "getTrees") + + vimp.calculator <- .jnew(.class_VariableImportanceCalculator, + errorCalculator.java, + forest.trees.java, + data.java, + out.of.bag # isTrainingSet parameter + ) + + random.java <- NULL + if(!is.null(randomSeed)){ + random.java <- .jnew(.class_Random, .jlong(as.integer(randomSeed))) + } + random.java <- .object_Optional(random.java) + + covariateRList <- convertJavaListToR(forest$covariateList, class = .class_Covariate) + importanceValues <- matrix(nrow = forest$params$ntree, ncol = length(covariateRList)) + colnames(importanceValues) <- extractCovariateNamesFromJavaList(forest$covariateList) + + for(j in 1:length(covariateRList)){ + covariateJava <- covariateRList[[j]] + covariateJava <- + + importanceValues[, j] <- .jcall(vimp.calculator, "[D", "calculateVariableImportanceRaw", covariateJava, random.java) + } + + if(type[1] == "raw"){ + return(importanceValues) + } else if(type[1] == "mean"){ + meanImportanceValues <- apply(importanceValues, 2, mean) + return(meanImportanceValues) + } else if(type[1] == "z"){ + zImportanceValues <- apply(importanceValues, 2, function(x){ + meanValue <- mean(x) + standardError <- sd(x)/sqrt(length(x)) + return(meanValue / standardError) + }) + return(zImportanceValues) + + } else{ + stop("A valid response type must be provided.") + } + + + return(importance) + +} + +# Internal function +ibsCalculatorWrapper <- function(events, time, censoringDistribution = NULL, eventWeights = NULL){ + if(is.null(events)){ + stop("events must be specified if using vimp on competing risks data") + } + + if(is.null(time)){ + stop("time must be specified if using vimp on competing risks data") + } + + + java.censoringDistribution <- NULL + if(!is.null(censoringDistribution)){ + java.censoringDistribution <- processCensoringDistribution(censoringDistribution) + java.censoringDistribution <- .object_Optional(java.censoringDistribution) + } + else{ + java.censoringDistribution <- .object_Optional(NULL) + } + + ibsCalculator.java <- .jnew(.class_IBSCalculator, java.censoringDistribution) + + if(is.null(eventWeights)){ + eventWeights <- rep(1, times = length(events)) + } + + ibsCalculatorWrapper.java <- .jnew(.class_IBSErrorCalculatorWrapper, + ibsCalculator.java, + .jarray(as.integer(events)), + as.numeric(time), + .jarray(as.numeric(eventWeights))) + + ibsCalculatorWrapper.java <- .jcast(ibsCalculatorWrapper.java, .class_ErrorCalculator) + return(ibsCalculatorWrapper.java) + + +} \ No newline at end of file diff --git a/inst/java/largeRCRF-library-1.0-SNAPSHOT.jar b/inst/java/largeRCRF-library-1.0-SNAPSHOT.jar index f7ce8af48216751df4011f4df244270d6896c1fe..ad8f858f7978f7eba45e90d37eccc2deeee26475 100644 GIT binary patch delta 50619 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 LZ<`^WAL{=Bb?rj~ delta 44200 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 diff --git a/man/train.Rd b/man/train.Rd index faa2542..a07e47c 100644 --- a/man/train.Rd +++ b/man/train.Rd @@ -13,7 +13,7 @@ train(formula, data, splitFinder = NULL, nodeResponseCombiner = NULL, \arguments{ \item{formula}{You may specify the response and covariates as a formula instead; make sure the response in the formula is still properly -constructed; see \code{responses}} +constructed.} \item{data}{A data.frame containing the columns of the predictors and responses.} diff --git a/man/vimp.Rd b/man/vimp.Rd new file mode 100644 index 0000000..21ce486 --- /dev/null +++ b/man/vimp.Rd @@ -0,0 +1,48 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/vimp.R +\name{vimp} +\alias{vimp} +\title{Variable Importance} +\usage{ +vimp(forest, newData = NULL, randomSeed = NULL, type = c("mean", "z", + "raw"), events = NULL, time = NULL, censoringDistribution = NULL, + eventWeights = NULL) +} +\arguments{ +\item{forest}{The forest that was trained.} + +\item{newData}{A test set of the data if available. If not, then out of bag +errors will be attempted on the training set.} + +\item{randomSeed}{The source of randomness used to permute the values. Can be +left blank.} + +\item{events}{If using competing risks forest, the events that the error +measure used for VIMP should be calculated on.} + +\item{time}{If using competing risks forest, the upper bound of the +integrated Brier score.} + +\item{censoringDistribution}{(Optional) If using competing risks forest, the +censoring distribution. See \code{\link{integratedBrierScore} for details.}} + +\item{eventWeights}{(Optional) If using competing risks forest, weights to be +applied to the error for each of the \code{events}.} +} +\value{ +A named numeric vector of importance values. +} +\description{ +Calculate variable importance by recording the increase in error when a given +predictor is randomly permuted. Regression forests uses mean squared error; +competing risks uses integrated Brier score. +} +\examples{ +data(wihs) + +forest <- train(CR_Response(status, time) ~ ., wihs, + ntree = 100, numberOfSplits = 0, mtry=3, nodeSize = 5) + +vimp(forest, events = 1:2, time = 8.0) + +} diff --git a/tests/testthat/test_vimp.R b/tests/testthat/test_vimp.R new file mode 100644 index 0000000..b6115d5 --- /dev/null +++ b/tests/testthat/test_vimp.R @@ -0,0 +1,102 @@ +context("Use VIMP without error") + +test_that("VIMP doesn't crash; no test dataset", { + + data(wihs) + + forest <- train(CR_Response(status, time) ~ ., wihs, ntree=50, numberOfSplits=0, mtry=1, nodeSize=5, displayProgress=FALSE) + + # Run VIMP several times under different scenarios + importance <- vimp(forest, type="raw", events=1:2, time=5.0) + vimp(forest, type="raw", events=1, time=5.0) + vimp(forest, type="raw", events=1:2, time=5.0, eventWeights = c(0.2, 0.8)) + + # Not much of a test, but the Java code tests more for correctness. This just + # tests that the R code runs without error. + expect_equal(ncol(importance), 4) # 4 predictors + +}) + + +test_that("VIMP doesn't crash; test dataset", { + + data(wihs) + + trainingData <- wihs[1:1000,] + testData <- wihs[1001:nrow(wihs),] + + forest <- train(CR_Response(status, time) ~ ., trainingData, ntree=50, numberOfSplits=0, mtry=1, nodeSize=5, displayProgress=FALSE, cores=1) + + # Run VIMP several times under different scenarios + importance <- vimp(forest, newData=testData, type="raw", events=1:2, time=5.0) + vimp(forest, newData=testData, type="raw", events=1, time=5.0) + vimp(forest, newData=testData, type="raw", events=1:2, time=5.0, eventWeights = c(0.2, 0.8)) + + # Not much of a test, but the Java code tests more for correctness. This just + # tests that the R code runs without error. + expect_equal(ncol(importance), 4) # 4 predictors + +}) + + +test_that("VIMP doesn't crash; censoring distribution; all methods equal", { + + sampleData <- data.frame(x=rnorm(100)) + sampleData$T <- sample(0:4, size=100, replace = TRUE) # the censor distribution we provide needs to conform to the data or we can get NaNs + sampleData$delta <- sample(0:2, size = 100, replace = TRUE) + + testData <- sampleData[1:5,] + trainingData <- sampleData[6:100,] + + forest <- train(CR_Response(delta, T) ~ x, trainingData, ntree=50, numberOfSplits=0, mtry=1, nodeSize=5, cores=2, displayProgress=FALSE) + + importance1 <- vimp(forest, type="raw", events=1:2, time=4.0, randomSeed=50, + censoringDistribution = c(0,1,1,2,3,4)) + importance2 <- vimp(forest, type="raw", events=1:2, time=4.0, randomSeed=50, + censoringDistribution = list(x = 0:4, y = 1 - c(1/6, 3/6, 4/6, 5/6, 6/6))) + importance3 <- vimp(forest, type="raw", events=1:2, time=4.0, randomSeed=50, + censoringDistribution = stepfun(x=0:4, y=1 - c(0, 1/6, 3/6, 4/6, 5/6, 6/6))) + + expect_equal(importance1, importance2) + expect_equal(importance1, importance3) + +}) + +test_that("VIMP doesn't crash; regression dataset", { + + data <- data.frame(x1=rnorm(1000), x2=rnorm(1000), x3=rnorm(1000)) + data$y <- data$x1 + 3*data$x2 + 0.05*data$x3 + rnorm(1000) + + forest <- train(y ~ ., data, ntree=50, numberOfSplits=100, mtry=2, nodeSize=5, displayProgress=FALSE) + + importance <- vimp(forest, type="mean") + + expect_true(importance["x2"] > importance["x3"]) + + # Not much of a test, but the Java code tests more for correctness. This just + # tests that the R code runs without error. + expect_equal(length(importance), 3) # 3 predictors + +}) + +test_that("VIMP produces mean and z scores correctly", { + + data <- data.frame(x1=rnorm(1000), x2=rnorm(1000), x3=rnorm(1000)) + data$y <- data$x1 + 3*data$x2 + 0.05*data$x3 + rnorm(1000) + + forest <- train(y ~ ., data, ntree=50, numberOfSplits=100, mtry=2, nodeSize=5, displayProgress=FALSE) + + actual.importance.raw <- vimp(forest, type="raw", randomSeed=5) + actual.importance.mean <- vimp(forest, type="mean", randomSeed=5) + actual.importance.z <- vimp(forest, type="z", randomSeed=5) + + expected.importance.mean <- apply(actual.importance.raw, 2, mean) + expected.importance.z <- apply(actual.importance.raw, 2, function(x){ + mn <- mean(x) + return( mn / (sd(x) / sqrt(length(x))) ) + }) + + expect_equal(expected.importance.mean, actual.importance.mean) + expect_equal(expected.importance.z, actual.importance.z) + +}) \ No newline at end of file