From 548ec6a21e14de1f5c82136948aab9395e0be939 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20G=C3=A4rber?= <florian.gaerber@uni-hamburg.de> Date: Thu, 20 Jul 2023 11:48:34 +0200 Subject: [PATCH] Import v0.3.1 from GitHub --- .Rbuildignore | 2 + .gitignore | 37 +---- DESCRIPTION | 19 +++ LICENCE.txt | 7 + LICENSE.md | 22 --- NAMESPACE | 17 ++ R/SMD_example_data.R | 18 +++ R/addLayer.R | 38 +++++ R/addSurrogates.R | 146 +++++++++++++++++ R/build_clusters.R | 48 ++++++ R/count.surrogates.R | 50 ++++++ R/getTreeranger.R | 51 ++++++ R/meanAdjAgree.R | 151 ++++++++++++++++++ R/mindep.R | 90 +++++++++++ R/reduce.surrogates.R | 62 ++++++++ R/surrmindep.R | 128 +++++++++++++++ R/var.relations.R | 166 ++++++++++++++++++++ R/var.relations.mfi.R | 298 +++++++++++++++++++++++++++++++++++ R/variable_selection_md.R | 73 +++++++++ R/variable_selection_mir.R | 291 ++++++++++++++++++++++++++++++++++ R/variable_selection_smd.R | 160 +++++++++++++++++++ README.md | 192 ++++++++++++++++++++++- SurrogateMinimalDepth.Rproj | 20 +++ Version_info.txt | 43 ++++++ data/SMD_example_data.RData | Bin 0 -> 155664 bytes man/SMD_example_data.Rd | 23 +++ man/SurrTree.Rd | 12 ++ man/addLayer.Rd | 26 ++++ man/addSurrogates.Rd | 36 +++++ man/adj.mean.Rd | 12 ++ man/adj.mean.trees.Rd | 12 ++ man/adj.node.Rd | 12 ++ man/build.clusters.Rd | 42 +++++ man/calculate.mir.perm.Rd | 12 ++ man/count.surrogates.Rd | 22 +++ man/getSurrogate.Rd | 12 ++ man/getTreeranger.Rd | 27 ++++ man/getsingletree.Rd | 12 ++ man/mean.adj.node.Rd | 12 ++ man/mean.index.Rd | 12 ++ man/meanAdjAgree.Rd | 46 ++++++ man/mindep.Rd | 24 +++ man/name.adj.Rd | 12 ++ man/name.surr.Rd | 12 ++ man/p.relation.Rd | 12 ++ man/permute.variable.Rd | 12 ++ man/reduce.surrogates.Rd | 39 +++++ man/scount.Rd | 12 ++ man/select.related.Rd | 12 ++ man/surr.tree.Rd | 12 ++ man/surrmindep.Rd | 24 +++ man/var.relations.Rd | 95 ++++++++++++ man/var.relations.mfi.Rd | 103 ++++++++++++ man/var.select.md.Rd | 93 +++++++++++ man/var.select.mir.Rd | 115 ++++++++++++++ man/var.select.smd.Rd | 100 ++++++++++++ src/.gitignore | 4 + src/choose_surg.c | 301 ++++++++++++++++++++++++++++++++++++ src/free_tree.c | 29 ++++ src/get_surg.c | 261 +++++++++++++++++++++++++++++++ src/get_surg.h | 103 ++++++++++++ src/init.c | 23 +++ src/insert_split.c | 87 +++++++++++ src/node.h | 76 +++++++++ src/rpartproto.h | 23 +++ src/rpcountup.c | 27 ++++ src/rpmatrix.c | 64 ++++++++ src/sort_vec.c | 131 ++++++++++++++++ src/surrogate.c | 162 +++++++++++++++++++ 69 files changed, 4371 insertions(+), 56 deletions(-) create mode 100644 .Rbuildignore create mode 100644 DESCRIPTION create mode 100644 LICENCE.txt delete mode 100644 LICENSE.md create mode 100644 NAMESPACE create mode 100644 R/SMD_example_data.R create mode 100644 R/addLayer.R create mode 100644 R/addSurrogates.R create mode 100644 R/build_clusters.R create mode 100644 R/count.surrogates.R create mode 100644 R/getTreeranger.R create mode 100644 R/meanAdjAgree.R create mode 100644 R/mindep.R create mode 100644 R/reduce.surrogates.R create mode 100644 R/surrmindep.R create mode 100644 R/var.relations.R create mode 100644 R/var.relations.mfi.R create mode 100644 R/variable_selection_md.R create mode 100644 R/variable_selection_mir.R create mode 100644 R/variable_selection_smd.R create mode 100644 SurrogateMinimalDepth.Rproj create mode 100644 Version_info.txt create mode 100644 data/SMD_example_data.RData create mode 100644 man/SMD_example_data.Rd create mode 100644 man/SurrTree.Rd create mode 100644 man/addLayer.Rd create mode 100644 man/addSurrogates.Rd create mode 100644 man/adj.mean.Rd create mode 100644 man/adj.mean.trees.Rd create mode 100644 man/adj.node.Rd create mode 100644 man/build.clusters.Rd create mode 100644 man/calculate.mir.perm.Rd create mode 100644 man/count.surrogates.Rd create mode 100644 man/getSurrogate.Rd create mode 100644 man/getTreeranger.Rd create mode 100644 man/getsingletree.Rd create mode 100644 man/mean.adj.node.Rd create mode 100644 man/mean.index.Rd create mode 100644 man/meanAdjAgree.Rd create mode 100644 man/mindep.Rd create mode 100644 man/name.adj.Rd create mode 100644 man/name.surr.Rd create mode 100644 man/p.relation.Rd create mode 100644 man/permute.variable.Rd create mode 100644 man/reduce.surrogates.Rd create mode 100644 man/scount.Rd create mode 100644 man/select.related.Rd create mode 100644 man/surr.tree.Rd create mode 100644 man/surrmindep.Rd create mode 100644 man/var.relations.Rd create mode 100644 man/var.relations.mfi.Rd create mode 100644 man/var.select.md.Rd create mode 100644 man/var.select.mir.Rd create mode 100644 man/var.select.smd.Rd create mode 100644 src/.gitignore create mode 100644 src/choose_surg.c create mode 100644 src/free_tree.c create mode 100644 src/get_surg.c create mode 100644 src/get_surg.h create mode 100644 src/init.c create mode 100644 src/insert_split.c create mode 100644 src/node.h create mode 100644 src/rpartproto.h create mode 100644 src/rpcountup.c create mode 100644 src/rpmatrix.c create mode 100644 src/sort_vec.c create mode 100644 src/surrogate.c diff --git a/.Rbuildignore b/.Rbuildignore new file mode 100644 index 0000000..91114bf --- /dev/null +++ b/.Rbuildignore @@ -0,0 +1,2 @@ +^.*\.Rproj$ +^\.Rproj\.user$ diff --git a/.gitignore b/.gitignore index f5b98bb..56843bc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,36 +1,7 @@ -# History files +.Rproj.user .Rhistory -.Rapp.history - -# Session Data files .RData - -# User-specific files .Ruserdata - -# Example code in package build process -*-Ex.R - -# Output files from R CMD build -/*.tar.gz - -# Output files from R CMD check -/*.Rcheck/ - -# RStudio files -.Rproj.user/ - -# produced vignettes -vignettes/*.html -vignettes/*.pdf - -# OAuth2 token, see https://github.com/hadley/httr/releases/tag/v0.3 -.httr-oauth - -# knitr and R markdown default cache directories -*_cache/ -/cache/ - -# Temporary files created by R markdown -*.utf8.md -*.knit.md +src/*.o +src/*.so +src/*.dll diff --git a/DESCRIPTION b/DESCRIPTION new file mode 100644 index 0000000..bec91b9 --- /dev/null +++ b/DESCRIPTION @@ -0,0 +1,19 @@ +Package: RFSurrogates +Type: Package +Title: Surrogate minimal depth variable importance +Version: 0.3.1 +Author: Stephan Seifert, Sven Gundlach, Silke Szymczak +Maintainer: Stephan Seifert <seifert@medinfo.uni-kiel.de> +Description: This package provides functions to obtain surrogate splits applying ranger for random forests generation and using modified functions from the package rpart. Surrogate variables and corresponding adjusted agreement values are used for surrogate minimal depth variable importance and to investigate variable relations. +License: use_mit_license() +Encoding: UTF-8 +LazyData: true +Imports: + ranger (>= 0.12.1), + Rcpp, + randomForestSRC, + linkcomm, + parallel, + rlist +RoxygenNote: 7.1.2 +LinkingTo: Rcpp diff --git a/LICENCE.txt b/LICENCE.txt new file mode 100644 index 0000000..f628819 --- /dev/null +++ b/LICENCE.txt @@ -0,0 +1,7 @@ +Copyright 2023 Stephan Seifert + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/LICENSE.md b/LICENSE.md deleted file mode 100644 index 3123099..0000000 --- a/LICENSE.md +++ /dev/null @@ -1,22 +0,0 @@ - -The MIT License (MIT) - -Copyright (c) 2023 Florian Gärber - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/NAMESPACE b/NAMESPACE new file mode 100644 index 0000000..c2238d2 --- /dev/null +++ b/NAMESPACE @@ -0,0 +1,17 @@ +# Generated by roxygen2: do not edit by hand + +export(addLayer) +export(addSurrogates) +export(build.clusters) +export(count.surrogates) +export(getTreeranger) +export(meanAdjAgree) +export(mindep) +export(reduce.surrogates) +export(surrmindep) +export(var.relations) +export(var.relations.mfi) +export(var.select.md) +export(var.select.mir) +export(var.select.smd) +useDynLib(SurrogateMinimalDepth, .registration = TRUE, .fixes = "C_") diff --git a/R/SMD_example_data.R b/R/SMD_example_data.R new file mode 100644 index 0000000..ec046b1 --- /dev/null +++ b/R/SMD_example_data.R @@ -0,0 +1,18 @@ +#' Example data set for the package SurrogateMinimalDepth +#' +#' A dataset containing 100 individuals (rows), 1 dependent variable (first column, y), and 200 additional variables (columns 2 to 201): +#' For the simulation of the 200 additional variables nine variables X1,…,X9 called basic variables were simulated. X1 to X6 are causal +#' with constant effect sizes of 1 and X7 to X9 are noncausal with effect size of 0. The outcome y is a linear combination of the causal +#' predictor variables and a normally distributed error term. All basic variables were sampled from a normal distribution +#' (N(0,1)) just like the noise (N(0,0.2)). For each of the six basic variables X1, X2, X3, X7, X8, and X9 ten variables +#' with predefined correlations of 0.9 for X1 and X7, 0.6 for X2 and X8, and 0.3 for X3 and X9 were obtained by \link[WGCNA]{simulateModule} function of +#' the R package WGCNA. The ten variables of each basis variable are labeled: Cp_basicvariable_number. Additional non-correlated and +#' independent predictor variables (cgn) were simulated using the standard normal distribution to reach a total number of 200 variables. +#' +#' +#' @docType data +#' @keywords datasets +#' @name SMD_example_data +#' @usage data(SMD_example_data) +#' @format A matrix with 100 rows and 1001 columns +NULL diff --git a/R/addLayer.R b/R/addLayer.R new file mode 100644 index 0000000..91be0b1 --- /dev/null +++ b/R/addLayer.R @@ -0,0 +1,38 @@ +#'Add layer information to a forest that was created by getTreeranger +#' +#'This functions adds the layer information to each node in a list with trees that was obtained by getTreeranger. +#' +#' @param trees list of trees created by getTreeranger +#' @return a list with trees. Each row of the list elements corresponds to a node of the respective tree and the columns correspond to: +#' \itemize{ +#' \item nodeID: ID of the respective node (important for left and right daughters in the next columns) +#' \item leftdaughter: ID of the left daughter of this node +#' \item rightdaughter: ID of the right daughter of this node +#' \item splitvariable: ID of the split variable +#' \item splitpoint: splitpoint of the split variable +#' \item status: "0" for terminal and "1" for non-terminal +#' \item layer: layer information (0 means root node, 1 means 1 layer below root, etc) +#' } +#' @export + +addLayer=function(trees){ + #This function adds the respective layer to the different nodes in a tree. The tree has to be prepared by getTree function + tree.layer=list() + num.trees= length(trees) + for (i in 1:num.trees){ + tree=trees[[i]] + layer=rep(NA,nrow(tree)) + layer[1]=0 + t=1 + while (anyNA(layer)){ + r=unlist(tree[which(layer==(t-1)),2:3]) + layer[r]=t + t=t+1 + } + tree=cbind(tree,layer) + tree=tree[order(as.numeric(tree[,"layer"])),] + tree.layer[[i]]=tree + } + return(tree.layer) +} + diff --git a/R/addSurrogates.R b/R/addSurrogates.R new file mode 100644 index 0000000..97ec16c --- /dev/null +++ b/R/addSurrogates.R @@ -0,0 +1,146 @@ +#' Add surrogate information that was created by getTreeranger +#' +#' This function adds surrogate variables and adjusted agreement values to a forest that was created by getTreeranger. +#' +#' @useDynLib SurrogateMinimalDepth, .registration = TRUE, .fixes = "C_" +#' +#' @param RF random forest object created by ranger (with keep.inbag=TRUE). +#' @param trees list of trees created by getTreeranger. +#' @param s Predefined number of surrogate splits (it may happen that the actual number of surrogate splits differes in individual nodes). Default is 1 \% of no. of variables. +#' @param Xdata data without the dependent variable. +#' @param num.threads number of threads used for parallel execution. Default is number of CPUs available. +#' @return a list with trees containing of lists of nodes with the elements: +#' \itemize{ +#' \item nodeID: ID of the respective node (important for left and right daughters in the next columns) +#' \item leftdaughter: ID of the left daughter of this node +#' \item rightdaughter: ID of the right daughter of this node +#' \item splitvariable: ID of the split variable +#' \item splitpoint: splitpoint of the split variable +#' \item status: "0" for terminal and "1" for non-terminal +#' \item layer: layer information (0 means root node, 1 means 1 layer below root, etc) +#' \item surrogate_i: numbered surrogate variables (number depending on s) +#' \item adj_i: adjusted agreement of variable i +#' } +#' @export + +addSurrogates = function(RF,trees,s,Xdata,num.threads) { + + num.trees = length(trees) + ncat = sapply(sapply(Xdata,levels),length) # determine number of categories (o for continuous variables) + names(ncat) = colnames(Xdata) + + if (is.null(num.threads)) { + num.threads = parallel::detectCores() + } + + if (any(ncat) > 0) { + Xdata[,which(ncat > 0)] = sapply(Xdata[,which(ncat > 0)],unclass) + } + + #variables to find surrogates (control file similar as in rpart) + controls = list(maxsurrogate = as.integer(s), sur_agree = 0) + + trees.surr = parallel::mclapply(1:num.trees, + getSurrogate, + mc.cores = num.threads, + maxsurr = s, + surr.par = list(inbag.counts = RF$inbag.counts, + Xdata = Xdata, + controls = controls, + trees = trees, + ncat = ncat)) + return(trees.surr) +} + +#' getSurrogate +#' +#' This is an internal function +#' +#' @keywords internal +getSurrogate = function(surr.par, k = 1, maxsurr) { + #weights and trees are extracted + tree = surr.par$trees[[k]] + column.names = colnames(tree) + n.nodes = nrow(tree) + wt = surr.par$inbag.counts[[k]] + tree.surr = lapply(1:n.nodes, + SurrTree, + wt = wt, + Xdata = surr.par$Xdata, + controls = surr.par$controls, + column.names, tree,maxsurr, + ncat = surr.par$ncat) +} +#' SurrTree +#' +#' This is an internal function +#' +#' @keywords internal +SurrTree = function(j,wt,Xdata,controls,column.names,tree,maxsurr,ncat) { + node = tree[j,] + # for non-terminal nodes get surrogates + if (node["status"] == 1) { + #Handover to C + var = as.numeric(node[4]) # extract split variable + + if (ncat[var] == 0) { # extract split information: split point for continuous variables and directions for qualitative variables + split = as.numeric(node[5]) + } else { + right = as.numeric(strsplit(as.character(node[5]), ",")[[1]]) + directions = rep(-1,ncat[var]) + directions[right] = 1 + split = as.numeric(c(ncat[var],directions)) + } + + + surrogate.parameters = .Call(C_getSurrogates, + ncat = as.integer(ncat), + wt = as.numeric(wt), + X = as.matrix(Xdata), + controls = as.integer(unlist(controls)), + var = as.integer(var), # node variables + split = as.numeric(split)) # split info + + if (nrow(surrogate.parameters$isplit) > 1) { + surrogates = surrogate.parameters$isplit[2:nrow(surrogate.parameters$isplit),1] + surr.adj = round(surrogate.parameters$dsplit[2:nrow(surrogate.parameters$dsplit),1],2) + node.new = data.frame(matrix(nrow = 1, ncol = 7 + length(surrogates) + length(surr.adj))) + node.new[,1:7] = node[1:7] + node.new[,8:(7 + length(surrogates) + length(surr.adj))] = c(surrogates,surr.adj) + surrogate.names = NULL + adj.names = NULL + surrogate.names = sapply(1:length(surrogates),name.surr,surrogate.names) + adj.names = sapply(1:length(surrogates),name.adj,adj.names) + names(node.new) = c(column.names,surrogate.names,adj.names) + } + + if (nrow(surrogate.parameters$isplit) == 1) { + node.new = node + } + } + if (node["status"] == 0) { + node.new = node + } +return(node.new) +} + +#' name.surr +#' +#' This is an internal function +#' +#' @keywords internal +name.surr = function(i,surrogate.names){ +surrogate.names = c(surrogate.names,paste0("surrogate_",i)) +return(surrogate.names) +} + +#' name.adj +#' +#' This is an internal function +#' +#' @keywords internal +name.adj = function(i,adj.names){ + adj.names = c(adj.names,paste0("adj_",i)) + return(adj.names) +} + diff --git a/R/build_clusters.R b/R/build_clusters.R new file mode 100644 index 0000000..af66275 --- /dev/null +++ b/R/build_clusters.R @@ -0,0 +1,48 @@ +#' Apply cluster analysis to build variable groups +#' +#'This function generates variables groups of relation information that was obtained by \link[SurrogateMinimalDepth]{var.relations} function applying +#'\link[linkcomm]{getLinkCommunities}. +#' +#' @param rel a list containing variables, surr.res, threshold, and var. This is the output of \link[SurrogateMinimalDepth]{var.relations} function. +#' @param hcmethod the hierarchical clustering method that is used. (see \link[linkcomm]{getLinkCommunities}) +#' +#' @return a data frame containing the variable names and their associated clusters. +#' +#' @examples +#' # read data +#' data("SMD_example_data") +#' +#' \donttest{ +#' # get trees and variable names +#' x = SMD_example_data[,2:ncol(SMD_example_data)] +#' y = SMD_example_data[,1] +#' allvariables = colnames(x)# extract variables names +#' nvar = length(allvariables) # count number of variables +#' set.seed(42) +#' RF = ranger::ranger(data = SMD_example_data, dependent.variable.name = "y", num.trees = 10, keep.inbag = TRUE,mtry = floor(nvar^(3/4)), min.node.size = 1) +#' trees = getTreeranger(RF = RF, num.trees = 10) +#' trees.lay = addLayer(trees) +#' trees.surr = addSurrogates(RF = RF, trees = trees.lay, s = 10, Xdata = x, num.threads = NULL) +#' +#' # investigate variable relations +#' rel=var.relations(forest = list(trees = trees.surr, allvariables = allvariables), variables = allvariables, candidates = allvariables, t = 10) +#' groups = build.clusters(rel) +#' } +#' +#' @export + + +build.clusters = function(rel,hcmethod = "ward.D") { + + # create links matrix + links = matrix(nrow = length(unlist(rel$var)) ,ncol = 2) + links[,1] = unlist(sapply(1:length(rel$variables), function(x) {rep(rel$variables[x],length(rel$var[[x]]))})) + links[,2] = unlist(rel$var) + + # cluster analysis to identify clusters + link.comm = linkcomm::getLinkCommunities(links, + hcmethod = hcmethod, + plot = FALSE) + cluster.info = link.comm$nodeclusters + return(cluster.info) +} diff --git a/R/count.surrogates.R b/R/count.surrogates.R new file mode 100644 index 0000000..670c461 --- /dev/null +++ b/R/count.surrogates.R @@ -0,0 +1,50 @@ +#'Count surrogate variables +#' +#'This function counts surrogate variables and returns the total average number of surrogate variables and the average number of surrogate variables of the respective layers. +#'This is necessary since the actual number of surrogate splits can be lower than the predefined number (when less surrogate splits outperform the majority rule). +#' +#'@param trees list of trees that was generated by getTreeranger function and layers, surrogate variables, and adjusted agreement values were added by addLayer and getSurrogates functions +#' @return List with the following components: +#' \itemize{ +#' \item s.a: total average number of surrogate variables +#' \item s.l: average number of surrogate variables in the respective layers +#' } +#' @export +count.surrogates=function(trees){ + num.trees=length(trees) + surrogates.trees=lapply(1:num.trees,scount,trees) + + s.a=mean(sapply(surrogates.trees,"[[","s.a")) + s.l.list=lapply(surrogates.trees,"[[","s.l") + s.l.all <- matrix(NA, nrow = 1000, ncol = num.trees) + for (u in 1:num.trees){ + s.l.tree=s.l.list[[u]][,2] + s.l.all[1:length(s.l.tree),u]=s.l.tree + } + s.l=rowMeans(s.l.all,na.rm = TRUE) + names(s.l)=c(0:999) + + return(list(s.a=s.a,s.l=s.l)) +} + +#' scount +#' +#' This is an internal function +#' +#' @keywords internal +scount=function(i=1,trees){ + tree=trees[[i]] + nonterminal.nodes=tree[which(sapply(tree,"[[","status")==1)] + s.a=(mean(sapply((lapply(nonterminal.nodes,"[",-c(1:7))),length)))/2 + maxlayer=as.numeric(unlist(nonterminal.nodes[length(nonterminal.nodes)])["layer"]) + s.l=matrix(NA,maxlayer+1,2) + colnames(s.l)=c("layer","No. Surrogates") + s.l[,1]=0:maxlayer + for (u in 0:maxlayer){ + nodes.at.layer=nonterminal.nodes[which(sapply(nonterminal.nodes,"[[","layer")==u)] + surr=lapply(nodes.at.layer,"[",-c(1:7)) + s.u=(mean(sapply(surr,length)))/2 + s.l[u+1,2]=s.u + } + return(list(s.a=s.a,s.l=s.l)) +} diff --git a/R/getTreeranger.R b/R/getTreeranger.R new file mode 100644 index 0000000..e190c64 --- /dev/null +++ b/R/getTreeranger.R @@ -0,0 +1,51 @@ +#'Get a list of structured trees for ranger +#' +#'This functions creates a list of trees for ranger objects similar as getTree function does for random Forest objects. +#' +#' @param RF random forest object created by ranger (with keep.inbag=TRUE) +#' @param num.trees number of trees +#' @return a list with trees. Each row of the list elements corresponds to a node of the respective tree and the columns correspond to: +#' \itemize{ +#' \item nodeID: ID of the respective node (important for left and right daughters in the next columns) +#' \item leftdaughter: ID of the left daughter of this node +#' \item rightdaughter: ID of the right daughter of this node +#' \item splitvariable: ID of the split variable +#' \item splitpoint: splitpoint of the split variable (for categorical variables this is a comma separated lists of values, representing the factor levels (in the original order) going to the right) +#' \item status: "0" for terminal and "1" for non-terminal +#' } +#' @export + + + +getTreeranger=function(RF,num.trees) { + trees=lapply(1:num.trees,getsingletree,RF=RF) + + return(trees) +} + + +#' getsingletree +#' +#' This is an internal function +#' +#' @keywords internal +getsingletree=function(RF,k=1){ + # here we use the treeInfo function of the ranger package to create extract the trees, in an earlier version this was done with a self implemented function + tree.ranger = ranger::treeInfo(RF,tree = k) + ktree=data.frame(as.numeric(tree.ranger$nodeID+1), + as.numeric(tree.ranger$leftChild+1), + as.numeric(tree.ranger$rightChild+1), + as.numeric(tree.ranger$splitvarID+1), + tree.ranger$splitval, + tree.ranger$terminal) + if (is.factor(ktree[,5])) { + ktree[,5] = as.character(levels(ktree[,5] ))[ktree[,5]] + } + ktree[,6] = as.numeric(ktree[,6] == FALSE) + + for (i in 2:4) { + ktree[,i][is.na(ktree[,i])] = 0 + } + colnames(ktree)=c("nodeID","leftdaughter","rightdaughter","splitvariable","splitpoint","status") + return(ktree) +} diff --git a/R/meanAdjAgree.R b/R/meanAdjAgree.R new file mode 100644 index 0000000..fd14fb4 --- /dev/null +++ b/R/meanAdjAgree.R @@ -0,0 +1,151 @@ +#'Calculate mean adjusted agreement to investigate variables relations +#' +#'This is the main function of var.relations function. +#' +#' @param trees list of trees created by getTreeranger, addLayer and addSurrogate. +#' @param variables vector of variable names. +#' @param allvariables vector of all variable names (strings) +#' @param candidates vector of variable names (strings) that are candidates to be related to the variables (has to be contained in allvariables) +#' @param t variable to calculate threshold. Default is 3. +#' @param s.a average number of surrogate variables (ideally calculated by count.surrogates function). +#' @param select.var set False if only relations should be calculated and no related variables should be selected. +#' @param num.threads number of threads used for parallel execution. Default is number of CPUs available. +#' @return a list containing: +#' \itemize{ +#' \item variables: the variables to which relations are investigated +#' \item surr.res: matrix with mean adjusted agreement values and variables investigated in rows and candidate variables in columns +#' \item threshold: the threshold used to create surr.var from surr.res +#' \item surr.var: binary matrix showing if the variables are related (1) or non-related (0) with variables in rows and candidates in columns. +#' } +#' @export + + +meanAdjAgree=function(trees,variables,allvariables,candidates,t,s.a,select.var,num.threads = NULL){ + num.trees=length(trees) + index.variables=match(variables,allvariables) + index.candidates = match(candidates,allvariables) + if (is.null(num.threads)) { + num.threads = parallel::detectCores() + } + list.res = rlist::list.flatten(parallel::mclapply(trees, + surr.tree, + mc.cores = num.threads, + variables, + index.variables, + allvariables, + index.candidates)) + + results.allvar = matrix(unlist(lapply(1:length(index.variables), + mean.index, + list.res, + index.variables)), + ncol=length(candidates),nrow=length(variables),byrow = TRUE) + colnames(results.allvar)=candidates + rownames(results.allvar)=variables + + if(select.var) { + # calculate threshold and select variables according to it + adj.mean=mean(unlist(lapply((1:num.trees),adj.mean.trees,trees)),na.rm = TRUE) + threshold=((s.a*adj.mean)/(length(allvariables)-1))*t + SurrVar=ifelse(results.allvar>threshold, 1, 0) + result=list(surr.res=results.allvar,threshold=threshold,surr.var=SurrVar,variables=variables) + } else { + result=list(surr.res=results.allvar,variables=variables) + } + return(result) +} + +#' mean.index +#' +#' This is an internal function +#' +#' @keywords internal +mean.index=function(i, list.res,index.variables){ + list = list.res[which(names(list.res) == index.variables[i])] + mean.list = round(Reduce("+",list)/length(list),2) + if (length(mean.list) > 0) { + mean.list[index.variables[i]] = NA + return(mean.list) + } else { + return(rep(NA,length(index.variables))) + } +} + +#' surr.tree +#' +#' This is an internal function +#' +#' @keywords internal +surr.tree=function(tree,variables,index.variables,allvariables,index.candidates){ + allvar.num = length(allvariables) + nonterminal.nodes = tree[which(sapply(tree,"[[","status")==1)] + relevant.nodes = nonterminal.nodes[sapply(nonterminal.nodes,"[[","splitvariable") %in% index.variables] + if (length(relevant.nodes) > 0) { + list.nodes = lapply(1:length(relevant.nodes),adj.node,allvar.num,relevant.nodes,index.candidates) + splitvar = sapply(relevant.nodes,"[[","splitvariable") + names(list.nodes) = splitvar + return(list.nodes) + } +} + + +#' adj.node +#' +#' This is an internal function +#' +#' @keywords internal +adj.node = function(i,allvar.num,relevant.nodes,index.candidates) { + node = relevant.nodes[i] + adjnode = rep(0,allvar.num) + surr=unlist(sapply(node,"[",-c(1:7))) # extract surrogates + if ((length(node[[1]]))>7){ + s=(length(surr))/2 + adjnode[surr[1:s]]=surr[(s+1):(2*s)] + } + return(adjnode[index.candidates]) +} + + + +#' adj.mean +#' +#' This is an internal function +#' +#' @keywords internal +adj.mean=function(trees){ + adj.trees=sapply(1:length(trees),adj.mean.trees,trees) + +} + +#' adj.mean.trees +#' +#' This is an internal function +#' +#' @keywords internal +adj.mean.trees=function(t,trees){ + tree=trees[[t]] + nonterminal.nodes=tree[which(sapply(tree,"[[","status")==1)] + surr.nonterminal=lapply(nonterminal.nodes,"[",-c(1:7)) + adj.tree=mean(unlist(lapply(1:length(surr.nonterminal),mean.adj.node,surr.nonterminal)),na.rm = TRUE) + if (adj.tree == "NaN") { + adj.tree = NA + } + return(adj.tree) +} + +#' adj.node +#' +#' This is an internal function +#' +#' @keywords internal +mean.adj.node=function(m,surr.nonterminal){ + surr=surr.nonterminal[[m]] + if (length(surr)!=0){ + num.surr=length(surr)/2 + adj=surr[(num.surr+1):(2*num.surr)] + } + if (length(surr)==0){ + adj=NA + } + return(adj) +} diff --git a/R/mindep.R b/R/mindep.R new file mode 100644 index 0000000..45eed49 --- /dev/null +++ b/R/mindep.R @@ -0,0 +1,90 @@ +#'Execute minimal depth variable importance +#' +#'This function determines the minimal depth of variables from a forest that is created by getTreeranger, and addLayer functions. +#' +#' @param variables vector of variable names +#' @param trees list of trees that was generated by getTreeranger and layers functions +#' @return List with the following components: +#' \itemize{ +#' \item depth: mean minimal depth for each variable +#' \item selected: variables has been selected (1) or not (0), +#' \item threshold: the threshold that is used for the selection +#' } +#' @export + +mindep=function(variables,trees){ + + num.trees= length(trees) +# This function determines the minimal depth of variables from a tree with layers that is created by getTree and addLayer functions. +# It is based on this paper: Ishwaran et. al. Journal of the American Statistical Accociation 2010 and used the conservative marginal +# approximation to the minimal depth distribution + +var.num=length(variables) + +#prepare matrix for mindepth +mindepth=matrix(NA,nrow=num.trees,ncol=var.num) +colnames(mindepth)=variables + +MAX.DEPTH=10000 +#maximal Depth of trees and the number of nodes in every layer is saved to calculate treshold in a following step +maxdepth=rep(NA,num.trees) +nodesAtDepthMatrix <- matrix(NA, nrow = MAX.DEPTH, ncol = num.trees) +# get mindepth for every variable in every tree +for (i in 1:num.trees){ +nodesAtDepth <- rep(NA, MAX.DEPTH) +tree=trees[[i]] +tree=tree[order(as.numeric(tree[,"layer"])),] +# get layer information of the variables and save it in minimal depth file +depth.tree=rep(NA,length(variables)) + o=1 + while (anyNA(depth.tree) && o<=nrow(tree)){ + if (tree[o,"status"]==1){ + if (is.na(depth.tree[tree[o,"splitvariable"]])) { + depth.tree[tree[o,"splitvariable"]]=tree[o,"layer"] + } + } + o=o+1 + } + #variables with no split in the tree get maxdepth+1 as minimal depth + depth.tree[which(is.na(depth.tree))]=tree[nrow(tree),"layer"] + #save min and max depth information for every tree + mindepth[i,]=depth.tree + maxdepth[i]=tree[nrow(tree),"layer"] + #find the number of nodes in every layer + + for (u in 1:(maxdepth[i])){ + + nodesAtDepth[u]=nrow(subset(tree, tree[,"layer"] == u & tree[,"status"] == 1 )) + } + nodesAtDepthMatrix[,i]=nodesAtDepth +} + +# create mean values for the minimal depth of different variables +mean.depth=colMeans(mindepth) + +# determine the mean depth of an uninformative variable called D star in Ishwaran et. al. Journal of the American Statistical +# Accociation 2010 (treshhold for important variables) + +#the following determination of the treshold is taken from max.subtree of the randomForestSRC package +treeHeight =maxdepth +avgTreeHeight = mean(treeHeight, na.rm=TRUE) +maxTreeHeight = max(treeHeight, na.rm=TRUE) +nodes.at.depth.avg = apply(nodesAtDepthMatrix, 1, mean, na.rm = TRUE) +l = nodes.at.depth.avg[1:avgTreeHeight] +minDepthStatObj = randomForestSRC:::minDepthStat(var.num, l = l) +threshold <- minDepthStatObj$first.moment + + +# Decide if variables are important or unimportant +Importances=rep(NA,var.num) +for (p in 1:var.num){ +if (mean.depth[p]<threshold) { + Importances[p]=1} + else { + Importances[p]=0} +} +names(Importances)=variables +results=list(depth=mean.depth,selected=Importances,threshold=threshold) +return(results) +} + diff --git a/R/reduce.surrogates.R b/R/reduce.surrogates.R new file mode 100644 index 0000000..a5745eb --- /dev/null +++ b/R/reduce.surrogates.R @@ -0,0 +1,62 @@ +#' Reduce surrogate variables in a random forest. +#' +#'This function can be applied to reduce the surrogate variables in a forest that is created by getTreeranger, addLayer +#'and getSurrogates functions. Hence, it can be applied to the forests that were used for surrogate minimal depth variable importance. +#' +#' @param forest a list containing allvariables and trees. Allvariables is a vector of all variable names in the original data set (strings). Trees is a list of trees that was generated by getTreeranger, addLayer, and getSurrogates functions. +#' @param s number of surrogate variables in the new forest (have to be less than in the RF in trees) +#' +#' @return +#' forest with s surrogate variables. +#' +#' @examples +#' # read data +#' data("SMD_example_data") +#' \donttest{ +#' ###### use result of SMD variable importance and reduce surrogate variables to 10 +#' # select variables with smd variable importance (usually more trees are needed) +#' set.seed(42) +#' res = var.select.smd(x = SMD_example_data[,2:ncol(SMD_example_data)], y = SMD_example_data[,1], s = 100, num.trees = 10) +#' forest.new = reduce.surrogates(forest = res$forest, s = 10) +#' +#' # execute SMD on tree with reduced number of surrogates +#' res.new = var.select.smd(create.forest = FALSE, forest = forest.new) +#' res.new$var +#' +#' #' # investigate variable relations +#' rel = var.relations(forest = forest.new, variables=c("X1","X7"), candidates = res$forest[["allvariables"]][1:100], t = 5) +#' rel$var +#'} +#' @export + + +reduce.surrogates = function(forest, s = 10){ + + trees = forest[["trees"]] + num.trees = length(trees) + trees.new = lapply(1:num.trees, less.surrogates.trees, trees,s) + forest.new = list(trees = trees.new, allvariables = forest[["allvariables"]]) +return(forest.new) +} + +less.surrogates.trees = function(i = 1, trees,s){ + tree = trees[[i]] + n.nodes = length(tree) + surr.now = sapply((lapply(tree,"[",-c(1:7))),length)/2 + surr.next = surr.now + surr.next[which(surr.now >= s)] = s + tree.new = lapply(1:n.nodes, less.surrogates.node, tree, surr.next,surr.now) + return(tree.new) +} + + +less.surrogates.node = function(j=1, tree,surr.next, surr.now){ + node = tree[[j]] + if (length(node) == 7) { + node.new = node + } + if (length(node) > 7) { +node.new = node[c(1:(7 + surr.next[j]), (8 + surr.now[j]):(7 + surr.now[j] + surr.next[j]))] +} +return(node.new) +} diff --git a/R/surrmindep.R b/R/surrmindep.R new file mode 100644 index 0000000..3dd2ac7 --- /dev/null +++ b/R/surrmindep.R @@ -0,0 +1,128 @@ +#'Execute surrogate minimal depth variable importance +#' +#'This function determines the surrogate minimal depth of variables from a forest that is created by getTreeranger, addLayer and getSurrogates functions. +#' +#' @param forest a list containing allvariables and trees. Allvariables is a vector of all variable names in the original data set (strings). Trees is a list of trees that was generated by getTreeranger, addLayer, and getSurrogates functions. +#' @param s.l Number of average surrogate variables in the respective layers. (use count.surrogate function to get it) +#' @return List with the following components: +#' \itemize{ +#' \item depth: mean surrogate minimal depth for each variable +#' \item selected: variables has been selected (1) or not (0), +#' \item threshold: the threshold that is used for the selection +#' } +#' @export + +surrmindep = function(forest, s.l){ + +variables = forest[["allvariables"]] +trees = forest[["trees"]] + +num.trees = length(trees) +var.num = length(variables) + +#prepare matrix for mindepth +mindepth = matrix(NA, nrow = num.trees, ncol = var.num) +colnames(mindepth) = variables + +MAX.DEPTH = 10000 +#maximal Depth of trees and the number of nodes in every layer is saved to calculate treshold in a following step +maxdepth = rep(NA,num.trees) +nodesAtDepthMatrix <- matrix(NA, nrow = MAX.DEPTH, ncol = num.trees) +# get mindepth for every variable in every tree +for (i in 1:num.trees) { +nodesAtDepth <- rep(NA, MAX.DEPTH) +tree = trees[[i]] +# get layer information of the variables and save it in minimal depth file +depth.tree = rep(NA,length(variables)) + o = 1 + while (anyNA(depth.tree) && o <= length(tree)) { + node = unlist(tree[o]) + if (node["status"] == 1) { + if (is.na(depth.tree[node["splitvariable"]])) { + depth.tree[as.numeric(node["splitvariable"])] = as.numeric(node["layer"]) + } + if (length(node) > 7) { + for (r in 8:(7 + (length(node) - 7)/2)) { + if (is.na(depth.tree[as.numeric(node[r])])) { + depth.tree[as.numeric(node[r])] = as.numeric(node["layer"]) + } + } + } + } + o = o + 1 + } + #variables with no split in the tree get maxdepth as minimal depth + depth.tree[which(is.na(depth.tree))] = as.numeric(unlist(tree[length(tree)])["layer"]) + #save min and max depth information for every tree + mindepth[i,] = depth.tree + maxdepth[i] = as.numeric(unlist(tree[length(tree)])["layer"]) + #find the number of nodes in every layer + + laystat = cbind(sapply(tree,"[[","layer"),sapply(tree,"[[","status")) + colnames(laystat) = c("layer","status") + for (u in 1:(maxdepth[i])) { + + nodesAtDepth[u] = nrow(subset(laystat, laystat[,"layer"] == u & laystat[,"status"] == 1 )) + } + nodesAtDepthMatrix[,i] = nodesAtDepth +} + +# create mean values for the minimal depth of different variables +mean.depth = colMeans(mindepth) + +# determine the mean depth of an uninformative variable similarly as in Ishwaran et. al. Journal of the American Statistical +# Accociation 2010 + +treeHeight = maxdepth +avgTreeHeight = mean(treeHeight, na.rm = TRUE) +maxTreeHeight = max(treeHeight, na.rm = TRUE) + +# threshold has to be calculated different when trees are small +if ((avgTreeHeight) < 2) { + s.l.root = s.l[1] + p.root = (s.l.root + 1)/var.num + p.1 = 1 - p.root + threshold = p.root*0 + p.1*1 + warning("Trees are very small! Threshold is defined based on trees with only root nodes.") +} + + + +if ((avgTreeHeight) >= 2) { +nodes.at.depth.avg = apply(nodesAtDepthMatrix, 1, mean, na.rm = TRUE) +s.l.noroot = s.l[-1] +s.l.root = s.l[1] +p.root = (s.l.root + 1)/var.num +var.at.depth = nodes.at.depth.avg[1:(avgTreeHeight - 1)]*(s.l.noroot[1:(avgTreeHeight - 1)] + 1) # 1 time for the original tree and s-times for + # the surrogates + #-1 since the last layer will be added later +p.depth = var.at.depth/var.num +p.all = c(p.root,p.depth) +prob.sum = 0 +probs.used = NULL +for (u in 1:length(p.all)) { + p.u = p.all[u] + prob.sum = prob.sum + p.u + if (prob.sum >= 1) break + probs.used[u] = p.u +} +prob.last = 1 - sum(probs.used) # the last layer (that was excluded before) is now used as minimal depth when the variable doesnt appear before +probs.used = c(probs.used,prob.last) +layers = c(0:(length(probs.used) - 1)) +threshold = sum(layers*probs.used) +} + + +# Decide if variables are important or unimportant +Importances = rep(NA,var.num) +for (p in 1:var.num) { +if (mean.depth[p] < threshold) { + Importances[p] = 1} + else { + Importances[p] = 0} +} +names(Importances) = variables +results = list(depth = mean.depth,selected = Importances,threshold = threshold) +return(results) +} + diff --git a/R/var.relations.R b/R/var.relations.R new file mode 100644 index 0000000..75fee16 --- /dev/null +++ b/R/var.relations.R @@ -0,0 +1,166 @@ +#' Investigate variable relations of a specific variable with mean adjusted agreement +#' +#'This function uses the mean adjusted agreement to select variables that are related to a defined variable using a threshold T. +#'The parameter t is used to calculate T: t=1 means that every variable with higher probability than "by chance" is identified +#'as "important". t=2 means the probability has to be twice, etc. +#'Based on the threshold a vector is created containing the related variables. +#' +#' @param variables variable names (string) for which related variables should be searched for (has to be contained in allvariables) +#' @param candidates vector of variable names (strings) that are candidates to be related to the variables (has to be contained in allvariables) +#' @param t variable to calculate threshold. Default is 5. +#' @param select.rel set False if only relations should be calculated and no related variables should be selected. +#' @param num.threads number of threads used for determination of relations. Default is number of CPUs available. +#' @inheritParams var.select.smd +#' +#' @return a list containing: +#' \itemize{ +#' \item variables: the variables to which relations are investigated. +#' \item surr.res: a matrix with mean adjusted agreement values with variables in rows and candidates in columns. +#' \item threshold: the threshold used to select related variables. +#' \item var: a list with one vector for each variable containing related variables. +#' \item ranger: ranger object. +#' } +#' @examples +#' # read data +#' data("SMD_example_data") +#' x = SMD_example_data[,2:ncol(SMD_example_data)] +#' y = SMD_example_data[,1] +#' \donttest{ +#' # calculate variable relations +#' set.seed(42) +#' res = var.relations(x = x, y = y, s = 10, num.trees = 100, variables = c("X1","X7"), candidates = colnames(x)[1:100], t = 5) +#' res$var +#' } +#' +#' @export + +var.relations = function(x = NULL, y = NULL, num.trees = 500, type = "regression", s = NULL, mtry = NULL, min.node.size = 1, + num.threads = NULL, status = NULL, save.ranger = FALSE, create.forest = TRUE, forest = NULL, + save.memory = FALSE, case.weights = NULL, + variables, candidates, t = 5, select.rel = TRUE) { + if(!is.data.frame(x)){ + stop("x has to be a data frame") + } + if (create.forest) { + ## check data + if (length(y) != nrow(x)) { + stop("length of y and number of rows in x are different") + } + + if (any(is.na(x))) { + stop("missing values are not allowed") + } + + allvariables = colnames(x)# extract variables names + nvar = length(allvariables) # count number of variables + ## set global parameters + if (is.null(mtry)) { + mtry = floor((nvar)^(3/4)) + } + if (mtry == "sqrt") { + mtry = floor(sqrt(nvar)) + } + if (mtry == "0.5") { + mtry = floor(0.5*(nvar)) + } + if (mtry == "^3/4") { + mtry = floor((nvar)^(3/4)) + } + + + if (is.null(s)) { + s = ceiling(nvar*0.01) + } + + if (s > (nvar - 2)) { + s = nvar - 1 + warning("s was set to the maximum number that is reasonable (variables-1) ") + } + + if (type == "classification") { + y = as.factor(y) + if (length(levels(y)) > 15) { + stop("Too much classes defined, classification might be the wrong choice") + } + } + if (type == "regression" && class(y) == "factor") { + stop("use factor variable for y only for classification! ") + } + + data = data.frame(y, x) + + if (type == "survival") { + if (is.null(status)) { + stop("a status variable named status has to be given for survival analysis") + } + data$status = status + RF = ranger::ranger(data = data,dependent.variable.name = "y",num.trees = num.trees,mtry = mtry,min.node.size = min.node.size, + keep.inbag = TRUE, num.threads = num.threads, status.variable.name = "status", save.memory = save.memory, + case.weights = case.weights) + } + if (type == "classification" | type == "regression") { + RF = ranger::ranger(data = data,dependent.variable.name = "y",num.trees = num.trees,mtry = mtry,min.node.size = min.node.size, + keep.inbag = TRUE, num.threads = num.threads, case.weights = case.weights) + + } + + trees = getTreeranger(RF = RF,num.trees = num.trees) + trees.lay = addLayer(trees) + rm(trees) + ###AddSurrogates### + trees.surr = addSurrogates(RF = RF,trees = trees.lay,s = s,Xdata = data[,-1], num.threads = num.threads) + rm(trees.lay) + forest = list(trees = trees.surr, allvariables = colnames(data[,-1])) + + } + + if (!create.forest) { + if (is.null(forest)) { + stop("set create.forest to TRUE or analyze an existing random forest specified by parameter forest") + } + } + trees = forest[["trees"]] + allvariables = forest[["allvariables"]] + + if (all(candidates %in% allvariables)) { + if (all(variables %in% allvariables)) { + # count surrogates + s = count.surrogates(trees) + results.meanAdjAgree = meanAdjAgree(trees, variables, allvariables, candidates, t = t, s$s.a, select.var = select.rel,num.threads = num.threads) + } else { + stop("allvariables do not contain the chosen variables") + } + } else { + stop("allvariables do not contain the candidate variables") + } + if(select.rel) { + surr.var = results.meanAdjAgree$surr.var + varlist = list() + for (i in 1:nrow(surr.var)) { + surr.var.var = surr.var[i,] + if (anyNA(surr.var.var)) { + surr.var.var = surr.var.var[-which(is.na(surr.var.var))] + } + var = names(surr.var.var[surr.var.var == 1]) + name = variables[i] + varlist[[name]] = var + } + + var = names(surr.var[surr.var == 1]) + if (save.ranger) { + return(list(variables = results.meanAdjAgree$variables, surr.res = results.meanAdjAgree$surr.res, + threshold = results.meanAdjAgree$threshold, var = varlist, ranger = RF)) + } else { + return(list(variables = results.meanAdjAgree$variables, surr.res = results.meanAdjAgree$surr.res, + threshold = results.meanAdjAgree$threshold, var = varlist)) + } + + } else { + if (save.ranger) { + return(list(variables = results.meanAdjAgree$variables, surr.res = results.meanAdjAgree$surr.res,ranger = RF)) + + } else { + return(list(variables = results.meanAdjAgree$variables, surr.res = results.meanAdjAgree$surr.res)) + } + } +} diff --git a/R/var.relations.mfi.R b/R/var.relations.mfi.R new file mode 100644 index 0000000..bab78e8 --- /dev/null +++ b/R/var.relations.mfi.R @@ -0,0 +1,298 @@ +#' Investigate variable relations of a specific variable with mutual forest impact (corrected mean adjusted agreement). +#' +#'This function corrects the mean adjusted agreement by a permutation approach and generates the relation parameter mutual forest impact. Subsequently p-values are determined and related variables are selected. +#' +#' @param variables variable names (string) for which related variables should be searched for (has to be contained in allvariables) +#' @param candidates vector of variable names (strings) that are candidates to be related to the variables (has to be contained in allvariables) +#' @param p.t p.value threshold for selection of related variables. Default is 0.01. +#' @param select.rel set False if only relations should be calculated and no related variables should be selected. +#' @param method Method to compute p-values. Use "janitza" for the method by Janitza et al. (2016) or "permutation" to utilize permuted relations. +#' @param num.threads number of threads used for determination of relations. Default is number of CPUs available. +#' @inheritParams var.select.smd +#' +#' @return a list containing: +#' \itemize{ +#' \item variables: the variables to which relations are investigated. +#' \item surr.res: a matrix with the mutual forest impact values with variables in rows and candidates in columns. +#' \item surr.perm: a matrix with the mutual forest impact values of the permuted variables with variables in rows and candidates in columns. +#' \item p.rel: a list with the obtained p-values for the relation analysis of each variable. +#' \item var.rel: a list with vectors of related variables for each variable. +#' \item ranger: ranger objects. +#' \item method: Method to compute p-values: "janitza" or "permutation". +#' \item p.t: p.value threshold for selection of related variables +#' +#' +#' } +#' @examples +#' # read data +#' data("SMD_example_data") +#' x = SMD_example_data[,2:ncol(SMD_example_data)] +#' y = SMD_example_data[,1] +#' \donttest{ +#' # calculate variable relations +#' set.seed(42) +#' res = var.relations.mfi(x = x, y = y, s = 10, num.trees = 100, variables = c("X1","X7"), candidates = colnames(x)[1:100]) +#' res$var.rel[[1]] +#' } +#' +#' @export + +var.relations.mfi = function(x = NULL, y = NULL, num.trees = 500, type = "regression", s = NULL, mtry = NULL, min.node.size = 1, + num.threads = NULL, status = NULL, save.ranger = FALSE, create.forest = TRUE, forest = NULL, + save.memory = FALSE, case.weights = NULL, + variables, candidates, p.t = 0.01, select.rel = TRUE, method = "janitza") { + if(!is.data.frame(x)){ + stop("x has to be a data frame") + } + if (create.forest) { + ## check data + if (length(y) != nrow(x)) { + stop("length of y and number of rows in x are different") + } + + if (any(is.na(x))) { + stop("missing values are not allowed") + } + + allvariables = colnames(x)# extract variables names + nvar = length(allvariables) # count number of variables + ## set global parameters + if (is.null(mtry)) { + mtry = floor((nvar)^(3/4)) + } + if (mtry == "sqrt") { + mtry = floor(sqrt(nvar)) + } + if (mtry == "0.5") { + mtry = floor(0.5*(nvar)) + } + if (mtry == "^3/4") { + mtry = floor((nvar)^(3/4)) + } + + + if (is.null(s)) { + s = ceiling(nvar*0.01) + } + + if (s > (nvar - 2)) { + s = nvar - 1 + warning("s was set to the maximum number that is reasonable (variables-1) ") + } + + if (type == "classification") { + y = as.factor(y) + if (length(levels(y)) > 15) { + stop("Too much classes defined, classification might be the wrong choice") + } + } + if (type == "regression" && class(y) == "factor") { + stop("use factor variable for y only for classification! ") + } + + # create shadow variables to correct the relation + x_perm = data.frame(lapply(1:ncol(x),permute.variable,x=x)) + colnames(x_perm) = paste(allvariables,"_perm", sep = "") + + data = data.frame(y, x) + data_perm = data.frame(y, x_perm) + + if (type == "survival") { + if (is.null(status)) { + stop("a status variable named status has to be given for survival analysis") + } + data$status = status + RF = ranger::ranger(data = data,dependent.variable.name = "y",num.trees = num.trees,mtry = mtry, min.node.size = min.node.size, + keep.inbag = TRUE, num.threads = num.threads, status.variable.name = "status", save.memory = save.memory, + case.weights = case.weights, respect.unordered.factors = "partition") + data_perm$status = status + RF_perm = ranger::ranger(data = data_perm,dependent.variable.name = "y",num.trees = num.trees,mtry = mtry,min.node.size = min.node.size, + keep.inbag = TRUE, num.threads = num.threads, status.variable.name = "status", save.memory = save.memory, + case.weights = case.weights, respect.unordered.factors = "partition") + } + if (type == "classification" | type == "regression") { + RF = ranger::ranger(data = data,dependent.variable.name = "y",num.trees = num.trees,mtry = mtry,min.node.size = min.node.size, + keep.inbag = TRUE, num.threads = num.threads, case.weights = case.weights, respect.unordered.factors = "partition") + + RF_perm = ranger::ranger(data = data_perm,dependent.variable.name = "y",num.trees = num.trees,mtry = mtry,min.node.size = min.node.size, + keep.inbag = TRUE, num.threads = num.threads, case.weights = case.weights, respect.unordered.factors = "partition") + + } + trees = getTreeranger(RF = RF,num.trees = num.trees) + trees.lay = addLayer(trees) + rm(trees) + ###AddSurrogates### + trees.surr = addSurrogates(RF = RF,trees = trees.lay,s = s,Xdata = data[,-1], num.threads = num.threads) + rm(trees.lay) + forest = list(trees = trees.surr, allvariables = colnames(data[,-1])) + + # do the same for the permutation forrest + trees_perm = getTreeranger(RF = RF_perm,num.trees = num.trees) + trees.lay_perm = addLayer(trees_perm) + rm(trees_perm) + ###AddSurrogates### + trees.surr_perm = addSurrogates(RF = RF_perm,trees = trees.lay_perm,s = s,Xdata = data_perm[,-1], num.threads = num.threads) + rm(trees.lay_perm) + forest_perm = list(trees = trees.surr_perm, allvariables = colnames(data_perm[,-1])) + } + + if (!create.forest) { + if (is.null(forest)) { + stop("set create.forest to TRUE or analyze an existing random forest specified by parameter forest") + } + } + + if (all(candidates %in% allvariables)) { + if (all(variables %in% allvariables)) { + # count surrogates + s = count.surrogates(forest$trees) + rel = meanAdjAgree(forest$trees, variables = allvariables, allvariables = allvariables, candidates = allvariables, + t = t, s$s.a, select.var = FALSE, num.threads = num.threads) + + allvariables_perm = colnames(x_perm) + + rel_perm = meanAdjAgree(forest_perm$trees, variables = allvariables_perm , allvariables = allvariables_perm , candidates = allvariables_perm, + t = t, s$s.a, select.var = FALSE, num.threads = num.threads) + + } else { + stop("allvariables do not contain the chosen variables") + } + } else { + stop("allvariables do not contain the candidate variables") + } + + adj.agree = rel$surr.res + adj.agree.perm = rel_perm$surr.res + diag(adj.agree) = diag(adj.agree.perm) = 1 + + if(anyNA(adj.agree)) { + no.na = length(which(rowSums(is.na(adj.agree)) != 0 )) + warning(paste0("Relations for ", no.na, " original variables were not calculated because they were never used as a primary split. + Affected relations are set to 0. ")) + adj.agree[which(is.na(adj.agree))] = 0 + } + + if(anyNA(adj.agree.perm)) { + no.na = length(which(rowSums(is.na(adj.agree.perm)) != 0 )) + warning(paste0("Relations for ", no.na, " permuted variables were not calculated because they were not used as a primary split. + Affected relations are set to 0. ")) + adj.agree.perm[which(is.na(adj.agree.perm))] = 0 + } + adj.agree.corr = adj.agree - adj.agree.perm[1:nvar,1:nvar] + diag(adj.agree.corr) = diag(adj.agree) = diag(adj.agree.perm) = NA + + adj.agree.corr.var = adj.agree.corr[variables,candidates] + + if (select.rel) { + + if (method == "janitza") { + + adj.agree.1 = adj.agree.corr + diag(adj.agree.1) = 1 + ## Mirrored VIMP (# This part is taken from ranger function) + m1 = adj.agree.1[adj.agree.1 < 0] + m2 = adj.agree.1[adj.agree.1 == 0] + null.rel = c(m1, -m1, m2) + + if (length(m1) == 0) { + stop("No negative importance values found for selection of related variables. Consider the 'permutation' approach.") + } + if (length(m1) < 100) { + warning("Only few negative importance values found for selection of related variables, inaccurate p-values. Consider the 'permutation' approach.") + } + + rel.p = lapply(1:length(variables),p.relation, + null.rel = null.rel, + adj.agree.corr = adj.agree.corr.var, + candidates = candidates, + variables = variables) + sel.rel = lapply(1:length(variables),select.related, + rel.p, + p.t) + + names(rel.p) = names(sel.rel) = variables + + } + + if (method == "permutation") { + + null.rel.plus = as.vector(adj.agree.perm) + null.rel.plus = null.rel.plus[!is.na(null.rel.plus)] + + m1 = null.rel.plus[null.rel.plus > 0] + m2 = null.rel.plus[null.rel.plus == 0] + null.rel = c(m1, -m1, m2) + + + if (length(null.rel) < 100) { + warning("Only few null relations used. P-values could be inaccurate.") + } + + rel.p = lapply(1:length(variables),p.relation, + null.rel = null.rel, + adj.agree.corr = adj.agree.corr.var, + candidates = candidates, + variables = variables) + + sel.rel = lapply(1:length(variables),select.related, + rel.p, + p.t) + + names(rel.p) = names(sel.rel) = variables + } + + if (save.ranger) { + return(list(variables = variables, surr.res = adj.agree.corr.var, surr.perm = adj.agree.perm, + p.rel = rel.p, var.rel = sel.rel, ranger = list(RF = RF,RF_perm = RF_perm), method = method, p.t = p.t)) + } else { + return(list(variables = variables, surr.res = adj.agree.corr.var, surr.perm = adj.agree.perm, p.rel = rel.p, var.rel = sel.rel, method = method, p.t = p.t)) + } + } else { + if (save.ranger) { + return(list(variables = variables, surr.res = adj.agree.corr.var, surr.perm = adj.agree.perm, ranger = list(RF = RF,RF_perm = RF_perm))) + } else { + return(list(variables = variables, surr.res = adj.agree.corr.var, surr.perm = adj.agree.perm)) + } + } +} + + + +#' permute.variable +#' +#' This is an internal function +#' +#' @keywords internal +permute.variable=function(i=1,x){ + var.perm = sample(x[,i],nrow(x)) + return(var.perm) +} + +#' p.relation +#' +#' This is an internal function +#' +#' @keywords internal +p.relation = function(l = 1, + null.rel, + adj.agree.corr, + candidates, + variables) { + relations = adj.agree.corr[l,] + pval <- 1 - ranger:::numSmaller(relations, null.rel) / length(null.rel) + names(pval) = candidates + pval[variables[l]] = NA + return(pval) +} + +#' select.related +#' +#' This is an internal function +#' +#' @keywords internal +select.related = function(m=1, + rel.p, + p.t) { + rel.var = rel.p[[m]] + names(which(rel.var <= p.t)) +} diff --git a/R/variable_selection_md.R b/R/variable_selection_md.R new file mode 100644 index 0000000..42ec1fd --- /dev/null +++ b/R/variable_selection_md.R @@ -0,0 +1,73 @@ +#' Variable selection with Minimal Depth (MD) +#' +#' This function executes MD applying \link[ranger]{ranger} for random forests generation and is a reimplementation of \link[randomForestSRC]{var.select} from randomForestSRC package. +#' +#' @param x data.frame of predictor variables with variables in +#' columns and samples in rows. (Note: missing values are not allowed) +#' @param y vector with values of phenotype variable (Note: will be converted to factor if +#' classification mode is used). For survival forests this is the time variable. +#' @param num.trees Number of trees. Default is 500. +#' @param mtry Number of variables to possibly split at in each node. Default is no. of variables^(3/4) as recommended by Ishwaran. +#' @param type Mode of prediction ("regression","classification" or "survival"). Default is regression. +#' @param min.node.size Minimal node size. Default is 1. +#' @param num.threads number of threads used for parallel execution. Default is number of CPUs available. +#' @param status status variable, only applicable to survival data. Use 1 for event and 0 for censoring. +#' @param save.ranger Set TRUE if ranger object should be saved. Default is that ranger object is not saved (FALSE). +#' @param create.forest set FALSE if you want to analyze an existing forest. Default is TRUE. +#' @param forest the random forest that should be analyzed if create.forest is set to FALSE. (x and y still have to be given to obtain variable names) +#' @param save.memory Use memory saving (but slower) splitting mode. No effect for survival and GWAS data. Warning: This option slows down the tree growing, use only if you encounter memory problems. (This parameter is transfered to ranger) +#' @param case.weights Weights for sampling of training observations. Observations with larger weights will be selected with higher probability in the bootstrap (or subsampled) samples for the trees. +#' +#' @return List with the following components: +#' \itemize{ +#' \item info: list with results from mindep function: +#' \itemize{ +#' \item depth: mean minimal depth for each variable. +#' \item selected: variables has been selected (1) or not (0). +#' \item threshold: the threshold that is used for the selection. (deviates slightly from the original implimentation) +#' } +#' \item var: vector of selected variables. +#' +#' \item forest: a list containing: +#' #'\itemize{ +#' \item trees: list of trees that was created by getTreeranger, addLayer, and addSurrogates functions and that was used for surrogate minimal depth variable importance. +#' \item allvariables: all variable names of the predictor variables that are present in x. +#' } +#' +#' \item ranger: ranger object +#' +#'} +#' @examples +#' # read data +#' data("SMD_example_data") +#' +#' \donttest{ +#' # select variables (usually more trees are needed) +#' set.seed(42) +#' res = var.select.md(x = SMD_example_data[,2:ncol(SMD_example_data)], y = SMD_example_data[,1], num.trees = 10) +#' res$var +#' } +#' +#'@references +##' \itemize{ +##' \item Ishwaran, H. et al. (2011) Random survival forests for high-dimensional data. Stat Anal Data Min, 4, 115–132. \url{https://onlinelibrary.wiley.com/doi/abs/10.1002/sam.10103} +##' \item Ishwaran, H. et al. (2010) High-Dimensional Variable Selection for Survival Data. J. Am. Stat. Assoc., 105, 205–217. \url{http://www.ccs.miami.edu/~hishwaran/papers/IKGML.JASA.2010.pdf} +##' } +#' +#' @export + +var.select.md = function(x = NULL, y = NULL, num.trees = 500, type = "regression", mtry = NULL, min.node.size = 1, num.threads = NULL, + status = NULL, save.ranger = FALSE, create.forest = TRUE, forest = NULL, save.memory = FALSE, case.weights = NULL) { + + results.smd = var.select.smd(x = x, y = y ,num.trees = num.trees,type = type, mtry = mtry,min.node.size = min.node.size, num.threads = num.threads + ,status = status, save.ranger = save.ranger, s = 0, create.forest = create.forest, forest = forest, + save.memory = save.memory, case.weights = case.weights) + if (save.ranger) { + results = list(info = results.smd$info, var = results.smd$var, forest = results.smd$forest, ranger = results.smd$ranger) + } + else { + results = list(info = results.smd$info, var = results.smd$var, forest = results.smd$forest) + } + return(results) + +} diff --git a/R/variable_selection_mir.R b/R/variable_selection_mir.R new file mode 100644 index 0000000..93d65ae --- /dev/null +++ b/R/variable_selection_mir.R @@ -0,0 +1,291 @@ +#' Variable selection with mutual impurity reduction (MIR) +#' +#' This function executes MIR applying \link[ranger]{ranger} for random forests generation and actual impurity reduction and a modified version of \link[rpart]{rpart} to find surrogate variables. +#' +#' @param x data.frame of predictor variables with variables in +#' columns and samples in rows (Note: missing values are not allowed) +#' @param y vector with values of phenotype variable (Note: will be converted to factor if +#' classification mode is used). For survival forests this is the time variable. +#' @param num.trees number of trees. Default is 500. +#' @param mtry number of variables to possibly split at in each node. Default is no. of variables^(3/4) ("^3/4") as recommended by (Ishwaran 2011). Also possible is "sqrt" and "0.5" to use the square root or half of the no. of variables. +#' @param type mode of prediction ("regression", "classification" or "survival"). Default is regression. +#' @param min.node.size minimal node size. Default is 1. +#' @param num.threads number of threads used for parallel execution. Default is number of CPUs available. +#' @param s predefined number of surrogate splits (it may happen that the actual number of surrogate splits differs in individual nodes). Default is 1 \% of no. of variables. +#' @param p.t.sel p.value threshold for selection of important variables. Default is 0.01. +#' @param p.t.rel p.value threshold for selection of related variables. Default is 0.01. +#' @param num.permutations number of permutations to determine p-values. Default is 100. (the relations are determined once based on the permuted X data and the utilized AIR values are permuted again for each permutation ) +#' @param status status variable, only applicable to survival data. Use 1 for event and 0 for censoring. +#' @param save.ranger set TRUE if ranger object should be saved. Default is that ranger object is not saved (FALSE). +#' @param save.memory Use memory saving (but slower) splitting mode. No effect for survival and GWAS data. Warning: This option slows down the tree growing, use only if you encounter memory problems. (This parameter is transfered to ranger) +#' @param select.var set False if only importance should be calculated and no variables should be selected. +#' @param select.rel set False if only relations should be calculated and no variables should be selected. +#' @param case.weights Weights for sampling of training observations. Observations with larger weights will be selected with higher probability in the bootstrap (or subsampled) samples for the trees. +#' @param method.rel Method to compute p-values for selection of related variables with var.relations.corr. Use "janitza" for the method by Janitza et al. (2016) or "permutation" to utilize permuted variables. +#' @param method.sel Method to compute p-values for selection of important variables. Use "janitza" for the method by Janitza et al. (2016) (can only be used when corrected variable relations are utilized) or "permutation" to utilize permuted variables. +#' @param corr.rel set FALSE if non-corrected variable relations should be used for calculation of MIR. In this case the method "janitza" should not be used for selection of important variables +#' @param t variable to calculate threshold for non-corrected relation analysis. Default is 5. +#' @param save.rel set FALSE if relation information should not bet saved (default is TRUE) +#' +#' +#' @return list with the following components: +#' \itemize{ +#' \item info: list with results containing: +#' \itemize{ +#' \item MIR: the calculated variable importance for each variable based on mutual impurity reduction. +#' \item pvalue: the obtained p-values for each variable. +#' \item selected: variables has been selected (1) or not (0). +#' \item relations: a list containing the results of variable relation analysis. +#' \item parameters: a list that contains the parameters s, type, mtry, p.t.sel, p.t.rel and method.sel that were used. +#' } +#' \item var: vector of selected variables. +#' +#'\item ranger: ranger object. +#' +#' } +#' @examples +#' # read data +#' data("SMD_example_data") +#' +#' \donttest{ +#' # select variables (usually more trees are needed) +#' set.seed(42) +#' res = var.select.mir(x = SMD_example_data[,2:ncol(SMD_example_data)], y = SMD_example_data[,1],s = 10, num.trees = 10) +#' res$var +#' } +#'@references +##' \itemize{ +##' \item Nembrini, S. et al. (2018) The revival of the Gini importance? Bioinformatics, 34, 3711–3718. \url{https://academic.oup.com/bioinformatics/article/34/21/3711/4994791} +##' \item Seifert, S. et al. (2019) Surrogate minimal depth as an importance measure for variables in random forests. Bioinformatics, 35, 3663–3671. \url{https://academic.oup.com/bioinformatics/article/35/19/3663/5368013} +##' } +#' @export + +var.select.mir = function(x = NULL, y = NULL, num.trees = 500, type = "regression", s = NULL, mtry = NULL, min.node.size = 1, + num.threads = NULL, status = NULL, save.ranger = FALSE, + save.memory = FALSE, num.permutations = 100, p.t.sel = 0.01, p.t.rel = 0.01, select.var = TRUE, select.rel = FALSE, + case.weights = NULL, corr.rel = TRUE, t = 5, method.rel = "permutation", method.sel = "janitza", save.rel = TRUE) { + if(!is.data.frame(x)){ + stop("x has to be a data frame") + } + ## check data + if (length(y) != nrow(x)) { + stop("length of y and number of rows in x are different") + } + + if (any(is.na(x))) { + stop("missing values are not allowed") + } + + allvariables = colnames(x)# extract variables names + nvar = length(allvariables) # count number of variables + ## set global parameters + if (is.null(mtry)) { + mtry = floor((nvar)^(3/4)) + } + if (mtry == "sqrt") { + mtry = floor(sqrt(nvar)) + } + if (mtry == "0.5") { + mtry = floor(0.5*(nvar)) + } + if (mtry == "^3/4") { + mtry = floor((nvar)^(3/4)) + } + + + if (is.null(s)) { + s = ceiling(nvar*0.01) + } + + if (s > (nvar - 2)) { + s = nvar - 1 + warning("s was set to the maximum number that is reasonable (variables-1) ") + } + + if (type == "classification") { + y = as.factor(y) + if (length(levels(y)) > 15) { + stop("Too much classes defined, classification might be the wrong choice") + } + } + if (type == "regression" && class(y) == "factor") { + stop("use factor variable for y only for classification! ") + } + + data = data.frame(y, x) + + if (type == "survival") { + if (is.null(status)) { + stop("a status variable named status has to be given for survival analysis") + } + data$status = status + RF = ranger::ranger(data = data,dependent.variable.name = "y",num.trees = num.trees,mtry = mtry,min.node.size = min.node.size, + num.threads = num.threads, status.variable.name = "status", save.memory = save.memory, + importance ="impurity_corrected", case.weights = case.weights, respect.unordered.factors = "partition") + if (corr.rel) { + rel = var.relations.mfi(x = x, y = y, num.trees = num.trees, type = type, s = s, mtry = mtry, min.node.size = min.node.size, + num.threads = num.threads, status = status, case.weights = case.weights, variables = allvariables, + candidates = allvariables, p.t = p.t.rel, method = method.rel,select.rel = select.rel) + } else { + rel = var.relations(x = x, y = y, num.trees = num.trees, type = type, s = s, mtry = mtry, min.node.size = min.node.size, + num.threads = num.threads, status = status, case.weights = case.weights, variables = allvariables, + candidates = allvariables, t = t, select.rel = select.rel) + } + } + if (type == "classification" | type == "regression") { + RF = ranger::ranger(data = data,dependent.variable.name = "y",num.trees = num.trees,mtry = mtry,min.node.size = min.node.size, + num.threads = num.threads, importance ="impurity_corrected", case.weights = case.weights, respect.unordered.factors = "partition") + + if (corr.rel) { + rel = var.relations.mfi(x = x, y = y, num.trees = num.trees, type = type, s = s, mtry = mtry, min.node.size = min.node.size, + num.threads = num.threads, case.weights = case.weights, variables = allvariables, + candidates = allvariables, p.t = p.t.rel, method = method.rel,select.rel = select.rel) + } else { + rel = var.relations(x = x, y = y, num.trees = num.trees, type = type, s = s, mtry = mtry, min.node.size = min.node.size, + num.threads = num.threads, case.weights = case.weights, variables = allvariables, + candidates = allvariables, t = t,select.rel = select.rel) + } + + } + + + +adj.agree = rel$surr.res +diag(adj.agree) = 1 + + mir = colSums(adj.agree * RF$variable.importance) + + if (select.var) { + if (method.sel == "janitza") { + if (corr.rel) { + ## Mirrored VIMP (# This part is taken from ranger function) + m1 = mir[mir< 0] + m2 = mir[mir == 0] + null.rel = c(m1, -m1, m2) + + pval <- 1 - ranger:::numSmaller(mir, null.rel) / length(null.rel) + names(pval) = allvariables + selected = as.numeric(pval <= p.t.sel) + names(selected) = names(pval) + + if (length(m1) == 0) { + stop("No negative importance values found for selection of important variables. Consider the 'permutation' approach.") + } + if (length(m1) < 100) { + warning("Only few negative importance values found for selection of important variables, inaccurate p-values. Consider the 'permutation' approach.") + } + } else { + stop("Janitza approach should only be conducted with corrected relations") +} + } + + if (method.sel == "permutation") { + + if (corr.rel){ + adj.agree_perm = rel$surr.perm + } else { + x_perm = sapply(1:ncol(x),permute.variable,x=x) + colnames(x_perm) = paste(allvariables,"_perm", sep = "") + data_perm = data.frame(y, x_perm) + allvariables_perm = colnames(x_perm) + + if (type == "survival") { + if (is.null(status)) { + stop("a status variables has to be given for survival analysis") + } + + if (corr.rel) { + rel_perm = var.relations.mfi(x = data.frame(x_perm), y = y, num.trees = num.trees, type = type, s = s, mtry = mtry, min.node.size = min.node.size, + num.threads = num.threads, status = status, case.weights = case.weights, variables = allvariables, + candidates = allvariables, p.t = p.t.rel, method = method.rel, select.rel = select.rel) + } else { + rel_perm = var.relations(x = data.frame(x_perm), y = y, num.trees = num.trees, type = type, s = s, mtry = mtry, min.node.size = min.node.size, + num.threads = num.threads, status = status, case.weights = case.weights, variables = allvariables, + candidates = allvariables, t = t, select.rel = select.rel) + } + + } + if (type == "classification" | type == "regression") { + + if (corr.rel) { + rel_perm = var.relations.mfi(x = data.frame(x_perm), y = y, num.trees = num.trees, type = type, s = s, mtry = mtry, min.node.size = min.node.size, + num.threads = num.threads, case.weights = case.weights, variables = allvariables_perm, + candidates = allvariables_perm, p.t = p.t.rel, method = method.rel,select.rel = select.rel) + } else { + rel_perm = var.relations(x = data.frame(x_perm), y = y, num.trees = num.trees, type = type, s = s, mtry = mtry, min.node.size = min.node.size, + num.threads = num.threads, case.weights = case.weights, variables = allvariables_perm, + candidates = allvariables_perm, t = t,select.rel = select.rel) + } + } + + adj.agree_perm = rel_perm$surr.res + } + + diag(adj.agree_perm) = 0 + + null.rel = unlist(lapply(1:num.permutations,calculate.mir.perm, + adj.agree_perm = adj.agree_perm, + air = RF$variable.importance, + allvariables = allvariables)) + + + + pval <- 1 - ranger:::numSmaller(mir, null.rel) / length(null.rel) + names(pval) = allvariables + selected = as.numeric(pval <= p.t.sel) + names(selected) = names(pval) + + } +if(save.rel) { + info = list(MIR = mir, + pvalue = pval, + selected = selected, + relations = rel, + AIR = RF$variable.importance, + parameters = list(s = s, type = type, mtry = mtry, p.t.sel = p.t.sel, p.t.rel = p.t.rel, method.sel = method.sel)) +} else { + info = list(MIR = mir, + pvalue = pval, + selected = selected, + AIR = RF$variable.importance, + parameters = list(s = s, type = type, mtry = mtry, p.t.sel = p.t.sel, p.t.rel = p.t.rel, method.sel = method.sel)) +} + } else { + if(save.rel) { + info = list(MIR = mir, + relations = rel, + AIR = RF$variable.importance, + parameters = list(s = s, type = type, mtry = mtry)) + } else { + info = list(MIR = mir, + AIR = RF$variable.importance, + parameters = list(s = s, type = type, mtry = mtry)) + } + } + + if (save.ranger) { + results = list(info = info, + var = names(info$selected[info$selected == 1]), + ranger = RF) + } else { + if (select.var) { + results = list(info = info, + var = names(info$selected[info$selected == 1])) + } else { + results = list(info = info) + } + } + return(results) +} + + +#' +#' This is an internal function +#' +#' @keywords internal +calculate.mir.perm = function(r=1, adj.agree_perm, air, allvariables) { +mir.perm = colSums(adj.agree_perm * sample(air,length(air))) +return(mir.perm) +} + + diff --git a/R/variable_selection_smd.R b/R/variable_selection_smd.R new file mode 100644 index 0000000..e8c3ad4 --- /dev/null +++ b/R/variable_selection_smd.R @@ -0,0 +1,160 @@ +#' Variable selection with Surrogate Minimal Depth (SMD) (MAIN FUNCTION) +#' +#' This function executes SMD applying \link[ranger]{ranger} for random forests generation and a modified version of \link[rpart]{rpart} to find surrogate variables. +#' +#' @param x data.frame of predictor variables with variables in +#' columns and samples in rows (Note: missing values are not allowed) +#' @param y vector with values of phenotype variable (Note: will be converted to factor if +#' classification mode is used). For survival forests this is the time variable. +#' @param num.trees number of trees. Default is 500. +#' @param mtry number of variables to possibly split at in each node. Default is no. of variables^(3/4) ("^3/4") as recommended by (Ishwaran 2011). Also possible is "sqrt" and "0.5" to use the square root or half of the no. of variables. +#' @param type mode of prediction ("regression", "classification" or "survival"). Default is regression. +#' @param min.node.size minimal node size. Default is 1. +#' @param num.threads number of threads used for parallel execution. Default is number of CPUs available. +#' @param s predefined number of surrogate splits (it may happen that the actual number of surrogate splits differs in individual nodes). Default is 1 \% of no. of variables. +#' @param status status variable, only applicable to survival data. Use 1 for event and 0 for censoring. +#' @param save.ranger set TRUE if ranger object should be saved. Default is that ranger object is not saved (FALSE). +#' @param create.forest set FALSE if you want to analyze an existing forest. Default is TRUE. +#' @param forest the random forest that should be analyzed if create.forest is set to FALSE. (x and y still have to be given to obtain variable names) +#' @param save.memory Use memory saving (but slower) splitting mode. No effect for survival and GWAS data. Warning: This option slows down the tree growing, use only if you encounter memory problems. (This parameter is transfered to ranger) +#' @param case.weights Weights for sampling of training observations. Observations with larger weights will be selected with higher probability in the bootstrap (or subsampled) samples for the trees. +#' +#' @return list with the following components: +#' \itemize{ +#' \item info: list with results from surrmindep function: +#' \itemize{ +#' \item depth: mean surrogate minimal depth for each variable. +#' \item selected: variables has been selected (1) or not (0). +#' \item threshold: the threshold that is used for the selection. +#' } +#' \item var: vector of selected variables. +#' +#'\item s: list with the results of count.surrogate function: +#'\itemize{ +#' \item s.a: total average number of surrogate variables. +#' \item s.l: average number of surrogate variables in the respective layers. +#'} +#' \item forest: a list containing: +#' #'\itemize{ +#' \item trees: list of trees that was created by getTreeranger, addLayer, and addSurrogates functions and that was used for surrogate minimal depth variable importance. +#' \item allvariables: all variable names of the predictor variables that are present in x. +#' } +#'\item ranger: ranger object. +#' +#' } +#' @examples +#' # read data +#' data("SMD_example_data") +#' +#' \donttest{ +#' # select variables (usually more trees are needed) +#' set.seed(42) +#' res = var.select.smd(x = SMD_example_data[,2:ncol(SMD_example_data)], y = SMD_example_data[,1],s = 10, num.trees = 10) +#' res$var +#' } +#'@references +##' \itemize{ +##' \item Seifert, S. et al. (2019) Surrogate minimal depth as an importance measure for variables in random forests. Bioinformatics, 35, 3663–3671. \url{https://academic.oup.com/bioinformatics/article/35/19/3663/5368013} +##' \item Ishwaran, H. et al. (2011) Random survival forests for high-dimensional data. Stat Anal Data Min, 4, 115–132. \url{https://onlinelibrary.wiley.com/doi/abs/10.1002/sam.10103} +##' \item Ishwaran, H. et al. (2010) High-Dimensional Variable Selection for Survival Data. J. Am. Stat. Assoc., 105, 205–217. \url{http://www.ccs.miami.edu/~hishwaran/papers/IKGML.JASA.2010.pdf} +##' } +#' @export + +var.select.smd = function(x = NULL, y = NULL, num.trees = 500, type = "regression", s = NULL, mtry = NULL, min.node.size = 1, + num.threads = NULL, status = NULL, save.ranger = FALSE, create.forest = TRUE, forest = NULL, + save.memory = FALSE, case.weights = NULL) { + if(!is.data.frame(x)){ + stop("x has to be a data frame") + } + if (create.forest) { + ## check data + if (length(y) != nrow(x)) { + stop("length of y and number of rows in x are different") + } + + if (any(is.na(x))) { + stop("missing values are not allowed") + } + + variables = colnames(x) # extract variables names + nvar = length(variables) # count number of variables + + ## set global parameters + if (is.null(mtry)) { + mtry = floor((nvar)^(3/4)) + } + if (mtry == "sqrt") { + mtry = floor(sqrt(nvar)) + } + if (mtry == "0.5") { + mtry = floor(0.5*nvar) + } + if (mtry == "^3/4") { + mtry = floor((nvar)^(3/4)) + } + + + + if (is.null(s)) { + s = ceiling(nvar*0.01) + } + + if (s > (nvar - 1)) { + s = nvar - 1 + warning("s was set to the maximum number that is reasonable (variables-1) ") + } + + if (type == "classification") { + y = as.factor(y) + if (length(levels(y)) > 15) { + stop("Too much classes defined, classification might be the wrong choice") + } + } + if (type == "regression" && class(y) == "factor") { + stop("use factor variable for y only for classification! ") + } + data = data.frame(y, x) + if (type == "survival") { + if (is.null(status)) { + stop("a status variable named status has to be given for survival analysis") + } + data$status = status + RF = ranger::ranger(data = data, dependent.variable.name = "y",num.trees = num.trees,mtry = mtry,min.node.size = min.node.size, + keep.inbag = TRUE, num.threads = num.threads, status.variable.name = "status", save.memory = save.memory, + case.weights = case.weights, respect.unordered.factors = "partition") + } + if (type == "classification" | type == "regression") { + RF = ranger::ranger(data = data,dependent.variable.name = "y",num.trees = num.trees,mtry = mtry,min.node.size = min.node.size, + keep.inbag = TRUE, num.threads = num.threads, case.weights = case.weights, respect.unordered.factors = "partition") + } + trees = getTreeranger(RF = RF,num.trees = num.trees) + trees.lay = addLayer(trees) + rm(trees) + ###AddSurrogates### + trees.surr = addSurrogates(RF = RF,trees = trees.lay,s = s,Xdata = x, num.threads = num.threads) + rm(trees.lay) + # count surrogates + s = count.surrogates(trees.surr) + surrminimaldepth.s = surrmindep(forest = list(trees = trees.surr, allvariables = variables), s.l = s$s.l) + } + if (!create.forest) { + if (is.null(forest)) { + stop("set create.forest to TRUE or analyze an existing random forest specified by parameter forest") + } + allvariables = forest[["allvariables"]] + trees = forest[["trees"]] + s = count.surrogates(trees) + surrminimaldepth.s = surrmindep(forest, s.l = s$s.l) + trees.surr = forest[["trees"]] + variables = forest[["variables"]] + } + if (save.ranger) { + results = list(info = surrminimaldepth.s,var = names(surrminimaldepth.s$selected[surrminimaldepth.s$selected == 1]),s = s, + forest = list(trees = trees.surr, allvariables = variables), ranger = RF) + } + else { + results = list(info = surrminimaldepth.s,var = names(surrminimaldepth.s$selected[surrminimaldepth.s$selected == 1]),s = s, + forest = list(trees = trees.surr, allvariables = variables)) + } + return(results) +} diff --git a/README.md b/README.md index 76accea..557a10d 100644 --- a/README.md +++ b/README.md @@ -1 +1,191 @@ -rfsur +# RFSurrogates +In this R package, several functions are provided for applying approaches based on random forest. Minimal depth (MD), Surrogate minimal depth (SMD) and mutual impurity reduction (MIR), which is a corrected approach of SMD, can be applied to assess the importance of variables and to select important variables. In addition, the parameters mean adjusted agreement and mutual forest impact (MFI), a corrected approach of the previous, can be applied to investigate variable relations based on surrogate variables. + +Please cite the following manuscripts if you use the package: + +[1] S. Seifert, S. Gundlach, S. Szymczak, Surrogate minimal depth as an importance measure for variables in random forests, Bioinformatics 2019, 35, 3663-3671. + +[2] publication about MFI/MIR under preparation + +# Install +``` +library(devtools) +install_github("StephanSeifert/RFSurrogates") +``` + +# Example data +The package contains an example data set which consists of a single replicate of the simulation study 1 in our manuscript. Please refer to the paper and the documentation of the SMD_example_data for further details on the simulation scenario. + +# Usage +First the package and the example data are loaded: +``` +library(RFSurrogates +data("SMD_example_data") +dim(SMD_example_data) +[1] 100 201 + +head(SMD_example_data[, 1:5]) + y X1 X2 X3 X4 +1 1.8222421 -0.02768266 -1.1019154 2.2659401 0.008021516 +2 -1.0401813 0.73258486 -0.4107975 0.7587792 -0.718752746 +3 2.7139607 -0.05399936 1.1851261 0.9743160 -2.563176970 +4 -0.7081372 -0.84838121 -0.8975802 0.5247899 1.180683275 +5 -1.0264429 -0.42219003 0.5439467 -0.1626504 0.682333020 +6 3.1871209 0.91722598 0.1974106 0.9571554 0.351634641 + +``` +The data set has 100 observations in the rows and the columns contain the continuous outcome variable y and 200 continuous predictor variables in the columns. + +## Minimal depth + +First, we perform variable selection based on minimal depth using 1000 trees in the random forest. To make the analysis reproducible we set the seed first. +``` +set.seed(42) +res.md = var.select.md(x = SMD_example_data[,2:ncol(SMD_example_data)], y = SMD_example_data[,1], ntree=1000) +res.md$var +[1] "X2" "X3" "X4" "X5" "X6" "cp1_8" "cp2_6" "cp2_7" "cp3_4" "cp3_6" "cp8_10" "cgn_68" "cgn_72" "cgn_81" +``` + +The selected variables are stored in res.md$var. In this analysis the relevant basic variables X2 to X6, as well as the relevant variables cp2_6, cp2_7, cp3_4, and cp3_6, and the non-relevant variables cp8_10, cgn_68, cgn_72, and cgn_81 are selected. + +The MD values for each predictor variable and the threshold to select variables can be extracted as follows: +``` +md = res.md$info$depth +head(md) + X1 X2 X3 X4 X5 X6 +9.823 7.848 6.164 6.662 6.442 6.390 + +res.md$info$threshold +[1] 9.23097 +``` +We can see that variables X2, …, X6 have MD values smaller than the threshold in contrast to X1. + +## Surrogate Minimal depth (SMD) + +Now we would like to analyze the example data with surrogate minimal depth which works similarly. However, we need to specify an additional parameter s, i.e. the number of surrogate variables that should be considered. In this analysis we use s = 10. Based on our simulation studies we recommend to set this parameter to approximately 1% of the predictor variables in larger datasets. + +Variable selection with var.select.smd is conducted: +``` +set.seed(42) +res.smd = var.select.smd(x = SMD_example_data[,2:ncol(SMD_example_data)], y = SMD_example_data[,1], s = 10, ntree = 1000) +res.smd$var + [1] "X1" "X2" "X3" "X4" "X5" "X6" "cp1_1" "cp1_2" "cp1_3" "cp1_4" "cp1_5" "cp1_6" "cp1_7" "cp1_8" "cp1_9" +[16] "cp1_10" "cp2_4" "cp2_6" +``` + + +The selected variables are stored in res.smd$var. In this analysis the relevant basic variables X1 to X6, as well as the relevant variables cp1_1 to cp1_10, cp2_4, and cp2_6 are selected. Compared to MD more of the relevant variables and none of the non-relevant variables are selected. + + +The SMD values for each predictor variable and the threshold to select variables can be extracted as follows: + +``` +smd = res.smd$info$depth +head(smd) + X1 X2 X3 X4 X5 X6 +2.344 2.287 2.095 2.576 2.509 2.276 + +res.smd$info$threshold +[1] 2.690082 +``` + +We can see that variables X1, …, X6 have SMD values smaller than the threshold. + + + +## Variable relations based on the mean adjusted agreement of surrogate variables + +Now we want to investigate the relations of variables. We would like to identify which of the first 100 predictor variables are related to X1 and X7. We simulated 10 correlated predictor variables for each of these two basic variables. +One possibility to investigate variable relations is to use the results from var.select.smd. Hence, first SMD is conducted like in the previous section: + +``` +res.smd = var.select.smd(x = SMD_example_data[,2:ncol(SMD_example_data)], y = SMD_example_data[,1], s = 10, ntree = 1000) +``` +Subsequently, variable relations are analyzed with var.relations. The parameter t can be adapted to either focus on strongly related variables only (high numbers) or to include also moderately related variables (low numbers): + +``` +candidates = colnames(SMD_example_data )[2:101] +rel = var.relations(forest = res.smd$forest, variables = c("X1","X7"), candidates = candidates, t = 5) +rel$var +$X1 + [1] "cp1_1" "cp1_2" "cp1_3" "cp1_4" "cp1_5" "cp1_6" "cp1_7" "cp1_8" "cp1_9" "cp1_10" + +$X7 + [1] "cp7_1" "cp7_2" "cp7_3" "cp7_4" "cp7_5" "cp7_6" "cp7_7" "cp7_8" "cp7_9" "cp7_10" + +``` + +All of the variables that are correlated to X1 are correctly identified as related to X1 and all of the variables that are correlated to X7 are correcly identified as related to X7. + + +## Variable relations based on mutual forest impact (MFI) + +MFI is a corrected relation parameter calculated by the mean adjusted agreement of the variables and permuted versions of them. Related variables are selected by p-values obtained from a null distribution either determined by negative relation scores (based on the Janitza approach) or by permuted relations. +We use the default parameters for the selection here, which is a p-values threshold of 0.01 and the Janitza approach. + +``` +set.seed(42) +rel.mfi = var.relations.mfi(x = x, y = y, s = 10, ntree = 1000, variables = c("X1","X7"), candidates = colnames(x)[1:100], p.t = 0.01, method = "janitza" ) +rel.mfi$var.rel +$X1 + [1] "cp1_1" "cp1_2" "cp1_3" "cp1_4" "cp1_5" "cp1_6" "cp1_7" "cp1_8" "cp1_9" "cp1_10" + +$X7 + [1] "cp7_1" "cp7_2" "cp7_3" "cp7_4" "cp7_5" "cp7_6" "cp7_7" "cp7_8" "cp7_9" "cp7_10" +``` + +Also by MFI, all of the variables that are correlated to X1 are correctly identified as related to X1 and all of the variables that are correlated to X7 are correcly identified as related to X7. +Also the matrix of determined relation (surr.res), permuted relations (surr.perm) and determined p-values (p.rel) can be extracted as followes: + +``` +MFI = rel.mfi$surr.res +surr.perm = rel.mfi$surr.perm +p.rel = rel.mfi$p.rel +``` + +## Mutual impurity reduction (MIR) + +Now we would like to analyze the example data with MIR, which determines the variable importance by the actual impurity reduction combined with the relations determined by MFI. Different to MD and SMD, this approach calculates p-values for the selection of important variables. For this, the null distribution is obtained in a similar way as for MFI, either by negative importance scores called the Janitza approach or by permutation. Since this example dataset is comparatively small, we use the permutation approach. As a threshold for selection a value of 0.01 is applied (p.t.sel = 0.01). + +``` +set.seed(42) +res.mir = var.select.mir(x = SMD_example_data[,2:ncol(SMD_example_data)], y = SMD_example_data[,1], s = 10, ntree = 1000, method.sel = "permutation", p.t.sel = 0.01) +res.mir$var + [1] "X1" "X2" "X3" "X4" "X5" "X6" "cp1_1" "cp1_2" "cp1_3" "cp1_4" "cp1_5" "cp1_6" +[13] "cp1_7" "cp1_8" "cp1_9" "cp1_10" "cp2_1" "cp2_3" "cp2_4" "cp2_6" "cp2_7" "cp2_10" "cp3_1" "cp3_4" +[25] "cp3_5" "cgn_72" "cgn_81" +``` +The selected variables are stored in res.mir$var. Here, the relevant variables cp1_1 to cp1_10, cp2_1, cp2_3, cp2_4, cp2_6, cp2_7, cp2_10, cp3_1, cp3_4, cp3_5, as well as the non-relevant variables cgn_72 and cgn_81 are selected. + +The MIR values and p-values can be extracted as follows: + +``` +mir = res.mir$info$MIR +head(mir) + X1 X2 X3 X4 X5 X6 +10.68243 15.95674 27.09036 20.50233 23.16293 21.15731 + +pvalues = res.mir$info$pvalue +head(pvalues) +X1 X2 X3 X4 X5 X6 + 0 0 0 0 0 0 + +``` + + We can see that variables X1, …, X6 have a p-value of 0 and are selected. + + Since this approach is based on the actual impurity reduction combined with the relations determined by MFI, both of these can also be extracted from the results: + + +``` +air = res.mir$info$AIR +head(air) + X1 X2 X3 X4 X5 X6 + 1.072849 13.133904 26.444900 19.155187 22.718355 20.782305 + + res.mfi = res.mir$info$relations + +``` +res.mfi contains the results of var.relations.mfi conducted in MIR. + + diff --git a/SurrogateMinimalDepth.Rproj b/SurrogateMinimalDepth.Rproj new file mode 100644 index 0000000..398aa14 --- /dev/null +++ b/SurrogateMinimalDepth.Rproj @@ -0,0 +1,20 @@ +Version: 1.0 + +RestoreWorkspace: Default +SaveWorkspace: Default +AlwaysSaveHistory: Default + +EnableCodeIndexing: Yes +UseSpacesForTab: Yes +NumSpacesForTab: 2 +Encoding: UTF-8 + +RnwWeave: knitr +LaTeX: pdfLaTeX + +AutoAppendNewline: Yes +StripTrailingWhitespace: Yes + +BuildType: Package +PackageUseDevtools: Yes +PackageInstallArgs: --no-multiarch --with-keep.source diff --git a/Version_info.txt b/Version_info.txt new file mode 100644 index 0000000..953d35e --- /dev/null +++ b/Version_info.txt @@ -0,0 +1,43 @@ +Version 0.3.1 - changed the name of the parameter ntree to num.trees + + +Version 0.3.0 - round adjusted agreement and mean adjusted agreement to 2 digits + - speed up meanAdjAgree function + - changed that relations to variables not used as primary plit are set as NA (before it was 0) + - renamed var.relations.corr to var.relations.mfi (as named in the paper) + - bugfix for MFI and MIR + - permutation approach to determine p-values was optimized for the selection of important and related variables + - default approach for p-value calculation was set to "permutation" + +Version 0.2.1 - included possibility to analyze categorical variables + +Version 0.2.0 - added function var.sel.mir to select important variables based on mutual impurity reduction + - added function var.relations.corr to calculate unbiased relations + - added multicore calculation of variable relations + - expand function inputs for var.relations + - included possibility to only calculate relations and not select related variables for var.relations function + - included the possibility to set case weights + +Version 0.1.10 - fixed bug not including first and last surrogate + - added random selection of surrogates when adj_agree are the same + - fixed bug in var.relation example + - added build.clusters function to obtain variable groups + +Version 0.1.9 - some specifics to set s in var.select.smd were adapted + - added save.memory parameter (to build the forest with ranger) to var.select.smd and var.select.md + +Version 0.1.8 - MD now executes var.select.smd with s = 0 instead of using a separate function + - The function reduce.surrogates is included. + - Included parameters create.forest and forest to use var.select.smd for existing forests (e.g. created by reduce.surrogates) + - Changed the value "trees" to "forest" containing trees and variable names + - The C-code is updated to enable multicore analysis + +Version 0.1.7 - Included parameter save.ranger in var.select.md and var.select.smd to save ranger object + +Version 0.1.6 - Adapted threshold for low depth trees in var.select.smd + +Version 0.1.5 - Added s as value in var.select.smd + - Implemented survival function for var.select.smd and var.select.md + +Version 0.1.4 - All errors and comments from coauthors implemented: first version uploaded on github + diff --git a/data/SMD_example_data.RData b/data/SMD_example_data.RData new file mode 100644 index 0000000000000000000000000000000000000000..9d00d0fb02b60d93a31861cf8c8eeb949e36fde4 GIT binary patch literal 155664 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%0AKeJjU)*Sn5`uOHrnG+w^ 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 DKU%ko literal 0 HcmV?d00001 diff --git a/man/SMD_example_data.Rd b/man/SMD_example_data.Rd new file mode 100644 index 0000000..f982040 --- /dev/null +++ b/man/SMD_example_data.Rd @@ -0,0 +1,23 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/SMD_example_data.R +\docType{data} +\name{SMD_example_data} +\alias{SMD_example_data} +\title{Example data set for the package SurrogateMinimalDepth} +\format{ +A matrix with 100 rows and 1001 columns +} +\usage{ +data(SMD_example_data) +} +\description{ +A dataset containing 100 individuals (rows), 1 dependent variable (first column, y), and 200 additional variables (columns 2 to 201): +For the simulation of the 200 additional variables nine variables X1,…,X9 called basic variables were simulated. X1 to X6 are causal +with constant effect sizes of 1 and X7 to X9 are noncausal with effect size of 0. The outcome y is a linear combination of the causal +predictor variables and a normally distributed error term. All basic variables were sampled from a normal distribution +(N(0,1)) just like the noise (N(0,0.2)). For each of the six basic variables X1, X2, X3, X7, X8, and X9 ten variables +with predefined correlations of 0.9 for X1 and X7, 0.6 for X2 and X8, and 0.3 for X3 and X9 were obtained by \link[WGCNA]{simulateModule} function of +the R package WGCNA. The ten variables of each basis variable are labeled: Cp_basicvariable_number. Additional non-correlated and +independent predictor variables (cgn) were simulated using the standard normal distribution to reach a total number of 200 variables. +} +\keyword{datasets} diff --git a/man/SurrTree.Rd b/man/SurrTree.Rd new file mode 100644 index 0000000..33b8dfb --- /dev/null +++ b/man/SurrTree.Rd @@ -0,0 +1,12 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/addSurrogates.R +\name{SurrTree} +\alias{SurrTree} +\title{SurrTree} +\usage{ +SurrTree(j, wt, Xdata, controls, column.names, tree, maxsurr, ncat) +} +\description{ +This is an internal function +} +\keyword{internal} diff --git a/man/addLayer.Rd b/man/addLayer.Rd new file mode 100644 index 0000000..2ff2043 --- /dev/null +++ b/man/addLayer.Rd @@ -0,0 +1,26 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/addLayer.R +\name{addLayer} +\alias{addLayer} +\title{Add layer information to a forest that was created by getTreeranger} +\usage{ +addLayer(trees) +} +\arguments{ +\item{trees}{list of trees created by getTreeranger} +} +\value{ +a list with trees. Each row of the list elements corresponds to a node of the respective tree and the columns correspond to: +\itemize{ +\item nodeID: ID of the respective node (important for left and right daughters in the next columns) +\item leftdaughter: ID of the left daughter of this node +\item rightdaughter: ID of the right daughter of this node +\item splitvariable: ID of the split variable +\item splitpoint: splitpoint of the split variable +\item status: "0" for terminal and "1" for non-terminal +\item layer: layer information (0 means root node, 1 means 1 layer below root, etc) +} +} +\description{ +This functions adds the layer information to each node in a list with trees that was obtained by getTreeranger. +} diff --git a/man/addSurrogates.Rd b/man/addSurrogates.Rd new file mode 100644 index 0000000..95af49c --- /dev/null +++ b/man/addSurrogates.Rd @@ -0,0 +1,36 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/addSurrogates.R +\name{addSurrogates} +\alias{addSurrogates} +\title{Add surrogate information that was created by getTreeranger} +\usage{ +addSurrogates(RF, trees, s, Xdata, num.threads) +} +\arguments{ +\item{RF}{random forest object created by ranger (with keep.inbag=TRUE).} + +\item{trees}{list of trees created by getTreeranger.} + +\item{s}{Predefined number of surrogate splits (it may happen that the actual number of surrogate splits differes in individual nodes). Default is 1 \% of no. of variables.} + +\item{Xdata}{data without the dependent variable.} + +\item{num.threads}{number of threads used for parallel execution. Default is number of CPUs available.} +} +\value{ +a list with trees containing of lists of nodes with the elements: +\itemize{ +\item nodeID: ID of the respective node (important for left and right daughters in the next columns) +\item leftdaughter: ID of the left daughter of this node +\item rightdaughter: ID of the right daughter of this node +\item splitvariable: ID of the split variable +\item splitpoint: splitpoint of the split variable +\item status: "0" for terminal and "1" for non-terminal +\item layer: layer information (0 means root node, 1 means 1 layer below root, etc) +\item surrogate_i: numbered surrogate variables (number depending on s) +\item adj_i: adjusted agreement of variable i +} +} +\description{ +This function adds surrogate variables and adjusted agreement values to a forest that was created by getTreeranger. +} diff --git a/man/adj.mean.Rd b/man/adj.mean.Rd new file mode 100644 index 0000000..03aa379 --- /dev/null +++ b/man/adj.mean.Rd @@ -0,0 +1,12 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/meanAdjAgree.R +\name{adj.mean} +\alias{adj.mean} +\title{adj.mean} +\usage{ +adj.mean(trees) +} +\description{ +This is an internal function +} +\keyword{internal} diff --git a/man/adj.mean.trees.Rd b/man/adj.mean.trees.Rd new file mode 100644 index 0000000..7a16134 --- /dev/null +++ b/man/adj.mean.trees.Rd @@ -0,0 +1,12 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/meanAdjAgree.R +\name{adj.mean.trees} +\alias{adj.mean.trees} +\title{adj.mean.trees} +\usage{ +adj.mean.trees(t, trees) +} +\description{ +This is an internal function +} +\keyword{internal} diff --git a/man/adj.node.Rd b/man/adj.node.Rd new file mode 100644 index 0000000..b750c54 --- /dev/null +++ b/man/adj.node.Rd @@ -0,0 +1,12 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/meanAdjAgree.R +\name{adj.node} +\alias{adj.node} +\title{adj.node} +\usage{ +adj.node(i, allvar.num, relevant.nodes, index.candidates) +} +\description{ +This is an internal function +} +\keyword{internal} diff --git a/man/build.clusters.Rd b/man/build.clusters.Rd new file mode 100644 index 0000000..965c0c1 --- /dev/null +++ b/man/build.clusters.Rd @@ -0,0 +1,42 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/build_clusters.R +\name{build.clusters} +\alias{build.clusters} +\title{Apply cluster analysis to build variable groups} +\usage{ +build.clusters(rel, hcmethod = "ward.D") +} +\arguments{ +\item{rel}{a list containing variables, surr.res, threshold, and var. This is the output of \link[SurrogateMinimalDepth]{var.relations} function.} + +\item{hcmethod}{the hierarchical clustering method that is used. (see \link[linkcomm]{getLinkCommunities})} +} +\value{ +a data frame containing the variable names and their associated clusters. +} +\description{ +This function generates variables groups of relation information that was obtained by \link[SurrogateMinimalDepth]{var.relations} function applying +\link[linkcomm]{getLinkCommunities}. +} +\examples{ +# read data +data("SMD_example_data") + +\donttest{ + # get trees and variable names + x = SMD_example_data[,2:ncol(SMD_example_data)] + y = SMD_example_data[,1] + allvariables = colnames(x)# extract variables names + nvar = length(allvariables) # count number of variables + set.seed(42) + RF = ranger::ranger(data = SMD_example_data, dependent.variable.name = "y", num.trees = 10, keep.inbag = TRUE,mtry = floor(nvar^(3/4)), min.node.size = 1) + trees = getTreeranger(RF = RF, num.trees = 10) + trees.lay = addLayer(trees) + trees.surr = addSurrogates(RF = RF, trees = trees.lay, s = 10, Xdata = x, num.threads = NULL) + + # investigate variable relations + rel=var.relations(forest = list(trees = trees.surr, allvariables = allvariables), variables = allvariables, candidates = allvariables, t = 10) + groups = build.clusters(rel) +} + +} diff --git a/man/calculate.mir.perm.Rd b/man/calculate.mir.perm.Rd new file mode 100644 index 0000000..8001ca0 --- /dev/null +++ b/man/calculate.mir.perm.Rd @@ -0,0 +1,12 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/variable_selection_mir.R +\name{calculate.mir.perm} +\alias{calculate.mir.perm} +\title{This is an internal function} +\usage{ +calculate.mir.perm(r = 1, adj.agree_perm, air, allvariables) +} +\description{ +This is an internal function +} +\keyword{internal} diff --git a/man/count.surrogates.Rd b/man/count.surrogates.Rd new file mode 100644 index 0000000..50d91b0 --- /dev/null +++ b/man/count.surrogates.Rd @@ -0,0 +1,22 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/count.surrogates.R +\name{count.surrogates} +\alias{count.surrogates} +\title{Count surrogate variables} +\usage{ +count.surrogates(trees) +} +\arguments{ +\item{trees}{list of trees that was generated by getTreeranger function and layers, surrogate variables, and adjusted agreement values were added by addLayer and getSurrogates functions} +} +\value{ +List with the following components: +\itemize{ +\item s.a: total average number of surrogate variables +\item s.l: average number of surrogate variables in the respective layers +} +} +\description{ +This function counts surrogate variables and returns the total average number of surrogate variables and the average number of surrogate variables of the respective layers. +This is necessary since the actual number of surrogate splits can be lower than the predefined number (when less surrogate splits outperform the majority rule). +} diff --git a/man/getSurrogate.Rd b/man/getSurrogate.Rd new file mode 100644 index 0000000..83f310f --- /dev/null +++ b/man/getSurrogate.Rd @@ -0,0 +1,12 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/addSurrogates.R +\name{getSurrogate} +\alias{getSurrogate} +\title{getSurrogate} +\usage{ +getSurrogate(surr.par, k = 1, maxsurr) +} +\description{ +This is an internal function +} +\keyword{internal} diff --git a/man/getTreeranger.Rd b/man/getTreeranger.Rd new file mode 100644 index 0000000..bb103e8 --- /dev/null +++ b/man/getTreeranger.Rd @@ -0,0 +1,27 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/getTreeranger.R +\name{getTreeranger} +\alias{getTreeranger} +\title{Get a list of structured trees for ranger} +\usage{ +getTreeranger(RF, num.trees) +} +\arguments{ +\item{RF}{random forest object created by ranger (with keep.inbag=TRUE)} + +\item{num.trees}{number of trees} +} +\value{ +a list with trees. Each row of the list elements corresponds to a node of the respective tree and the columns correspond to: +\itemize{ +\item nodeID: ID of the respective node (important for left and right daughters in the next columns) +\item leftdaughter: ID of the left daughter of this node +\item rightdaughter: ID of the right daughter of this node +\item splitvariable: ID of the split variable +\item splitpoint: splitpoint of the split variable (for categorical variables this is a comma separated lists of values, representing the factor levels (in the original order) going to the right) +\item status: "0" for terminal and "1" for non-terminal +} +} +\description{ +This functions creates a list of trees for ranger objects similar as getTree function does for random Forest objects. +} diff --git a/man/getsingletree.Rd b/man/getsingletree.Rd new file mode 100644 index 0000000..1cf262f --- /dev/null +++ b/man/getsingletree.Rd @@ -0,0 +1,12 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/getTreeranger.R +\name{getsingletree} +\alias{getsingletree} +\title{getsingletree} +\usage{ +getsingletree(RF, k = 1) +} +\description{ +This is an internal function +} +\keyword{internal} diff --git a/man/mean.adj.node.Rd b/man/mean.adj.node.Rd new file mode 100644 index 0000000..7f2759f --- /dev/null +++ b/man/mean.adj.node.Rd @@ -0,0 +1,12 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/meanAdjAgree.R +\name{mean.adj.node} +\alias{mean.adj.node} +\title{adj.node} +\usage{ +\method{mean}{adj.node}(m, surr.nonterminal) +} +\description{ +This is an internal function +} +\keyword{internal} diff --git a/man/mean.index.Rd b/man/mean.index.Rd new file mode 100644 index 0000000..098eaf1 --- /dev/null +++ b/man/mean.index.Rd @@ -0,0 +1,12 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/meanAdjAgree.R +\name{mean.index} +\alias{mean.index} +\title{mean.index} +\usage{ +\method{mean}{index}(i, list.res, index.variables) +} +\description{ +This is an internal function +} +\keyword{internal} diff --git a/man/meanAdjAgree.Rd b/man/meanAdjAgree.Rd new file mode 100644 index 0000000..86fea4d --- /dev/null +++ b/man/meanAdjAgree.Rd @@ -0,0 +1,46 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/meanAdjAgree.R +\name{meanAdjAgree} +\alias{meanAdjAgree} +\title{Calculate mean adjusted agreement to investigate variables relations} +\usage{ +meanAdjAgree( + trees, + variables, + allvariables, + candidates, + t, + s.a, + select.var, + num.threads = NULL +) +} +\arguments{ +\item{trees}{list of trees created by getTreeranger, addLayer and addSurrogate.} + +\item{variables}{vector of variable names.} + +\item{allvariables}{vector of all variable names (strings)} + +\item{candidates}{vector of variable names (strings) that are candidates to be related to the variables (has to be contained in allvariables)} + +\item{t}{variable to calculate threshold. Default is 3.} + +\item{s.a}{average number of surrogate variables (ideally calculated by count.surrogates function).} + +\item{select.var}{set False if only relations should be calculated and no related variables should be selected.} + +\item{num.threads}{number of threads used for parallel execution. Default is number of CPUs available.} +} +\value{ +a list containing: +\itemize{ +\item variables: the variables to which relations are investigated +\item surr.res: matrix with mean adjusted agreement values and variables investigated in rows and candidate variables in columns +\item threshold: the threshold used to create surr.var from surr.res +\item surr.var: binary matrix showing if the variables are related (1) or non-related (0) with variables in rows and candidates in columns. +} +} +\description{ +This is the main function of var.relations function. +} diff --git a/man/mindep.Rd b/man/mindep.Rd new file mode 100644 index 0000000..44f05d5 --- /dev/null +++ b/man/mindep.Rd @@ -0,0 +1,24 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/mindep.R +\name{mindep} +\alias{mindep} +\title{Execute minimal depth variable importance} +\usage{ +mindep(variables, trees) +} +\arguments{ +\item{variables}{vector of variable names} + +\item{trees}{list of trees that was generated by getTreeranger and layers functions} +} +\value{ +List with the following components: +\itemize{ +\item depth: mean minimal depth for each variable +\item selected: variables has been selected (1) or not (0), +\item threshold: the threshold that is used for the selection +} +} +\description{ +This function determines the minimal depth of variables from a forest that is created by getTreeranger, and addLayer functions. +} diff --git a/man/name.adj.Rd b/man/name.adj.Rd new file mode 100644 index 0000000..11c5628 --- /dev/null +++ b/man/name.adj.Rd @@ -0,0 +1,12 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/addSurrogates.R +\name{name.adj} +\alias{name.adj} +\title{name.adj} +\usage{ +name.adj(i, adj.names) +} +\description{ +This is an internal function +} +\keyword{internal} diff --git a/man/name.surr.Rd b/man/name.surr.Rd new file mode 100644 index 0000000..c7295bd --- /dev/null +++ b/man/name.surr.Rd @@ -0,0 +1,12 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/addSurrogates.R +\name{name.surr} +\alias{name.surr} +\title{name.surr} +\usage{ +name.surr(i, surrogate.names) +} +\description{ +This is an internal function +} +\keyword{internal} diff --git a/man/p.relation.Rd b/man/p.relation.Rd new file mode 100644 index 0000000..e123f01 --- /dev/null +++ b/man/p.relation.Rd @@ -0,0 +1,12 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/var.relations.mfi.R +\name{p.relation} +\alias{p.relation} +\title{p.relation} +\usage{ +p.relation(l = 1, null.rel, adj.agree.corr, candidates, variables) +} +\description{ +This is an internal function +} +\keyword{internal} diff --git a/man/permute.variable.Rd b/man/permute.variable.Rd new file mode 100644 index 0000000..427d6b9 --- /dev/null +++ b/man/permute.variable.Rd @@ -0,0 +1,12 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/var.relations.mfi.R +\name{permute.variable} +\alias{permute.variable} +\title{permute.variable} +\usage{ +permute.variable(i = 1, x) +} +\description{ +This is an internal function +} +\keyword{internal} diff --git a/man/reduce.surrogates.Rd b/man/reduce.surrogates.Rd new file mode 100644 index 0000000..b21ab58 --- /dev/null +++ b/man/reduce.surrogates.Rd @@ -0,0 +1,39 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/reduce.surrogates.R +\name{reduce.surrogates} +\alias{reduce.surrogates} +\title{Reduce surrogate variables in a random forest.} +\usage{ +reduce.surrogates(forest, s = 10) +} +\arguments{ +\item{forest}{a list containing allvariables and trees. Allvariables is a vector of all variable names in the original data set (strings). Trees is a list of trees that was generated by getTreeranger, addLayer, and getSurrogates functions.} + +\item{s}{number of surrogate variables in the new forest (have to be less than in the RF in trees)} +} +\value{ +forest with s surrogate variables. +} +\description{ +This function can be applied to reduce the surrogate variables in a forest that is created by getTreeranger, addLayer +and getSurrogates functions. Hence, it can be applied to the forests that were used for surrogate minimal depth variable importance. +} +\examples{ +# read data +data("SMD_example_data") +\donttest{ +###### use result of SMD variable importance and reduce surrogate variables to 10 +# select variables with smd variable importance (usually more trees are needed) +set.seed(42) +res = var.select.smd(x = SMD_example_data[,2:ncol(SMD_example_data)], y = SMD_example_data[,1], s = 100, num.trees = 10) +forest.new = reduce.surrogates(forest = res$forest, s = 10) + +# execute SMD on tree with reduced number of surrogates +res.new = var.select.smd(create.forest = FALSE, forest = forest.new) +res.new$var + +#' # investigate variable relations +rel = var.relations(forest = forest.new, variables=c("X1","X7"), candidates = res$forest[["allvariables"]][1:100], t = 5) +rel$var +} +} diff --git a/man/scount.Rd b/man/scount.Rd new file mode 100644 index 0000000..40760d3 --- /dev/null +++ b/man/scount.Rd @@ -0,0 +1,12 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/count.surrogates.R +\name{scount} +\alias{scount} +\title{scount} +\usage{ +scount(i = 1, trees) +} +\description{ +This is an internal function +} +\keyword{internal} diff --git a/man/select.related.Rd b/man/select.related.Rd new file mode 100644 index 0000000..a1b3151 --- /dev/null +++ b/man/select.related.Rd @@ -0,0 +1,12 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/var.relations.mfi.R +\name{select.related} +\alias{select.related} +\title{select.related} +\usage{ +select.related(m = 1, rel.p, p.t) +} +\description{ +This is an internal function +} +\keyword{internal} diff --git a/man/surr.tree.Rd b/man/surr.tree.Rd new file mode 100644 index 0000000..142ae92 --- /dev/null +++ b/man/surr.tree.Rd @@ -0,0 +1,12 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/meanAdjAgree.R +\name{surr.tree} +\alias{surr.tree} +\title{surr.tree} +\usage{ +surr.tree(tree, variables, index.variables, allvariables, index.candidates) +} +\description{ +This is an internal function +} +\keyword{internal} diff --git a/man/surrmindep.Rd b/man/surrmindep.Rd new file mode 100644 index 0000000..27e6b06 --- /dev/null +++ b/man/surrmindep.Rd @@ -0,0 +1,24 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/surrmindep.R +\name{surrmindep} +\alias{surrmindep} +\title{Execute surrogate minimal depth variable importance} +\usage{ +surrmindep(forest, s.l) +} +\arguments{ +\item{forest}{a list containing allvariables and trees. Allvariables is a vector of all variable names in the original data set (strings). Trees is a list of trees that was generated by getTreeranger, addLayer, and getSurrogates functions.} + +\item{s.l}{Number of average surrogate variables in the respective layers. (use count.surrogate function to get it)} +} +\value{ +List with the following components: +\itemize{ +\item depth: mean surrogate minimal depth for each variable +\item selected: variables has been selected (1) or not (0), +\item threshold: the threshold that is used for the selection +} +} +\description{ +This function determines the surrogate minimal depth of variables from a forest that is created by getTreeranger, addLayer and getSurrogates functions. +} diff --git a/man/var.relations.Rd b/man/var.relations.Rd new file mode 100644 index 0000000..f056eae --- /dev/null +++ b/man/var.relations.Rd @@ -0,0 +1,95 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/var.relations.R +\name{var.relations} +\alias{var.relations} +\title{Investigate variable relations of a specific variable with mean adjusted agreement} +\usage{ +var.relations( + x = NULL, + y = NULL, + num.trees = 500, + type = "regression", + s = NULL, + mtry = NULL, + min.node.size = 1, + num.threads = NULL, + status = NULL, + save.ranger = FALSE, + create.forest = TRUE, + forest = NULL, + save.memory = FALSE, + case.weights = NULL, + variables, + candidates, + t = 5, + select.rel = TRUE +) +} +\arguments{ +\item{x}{data.frame of predictor variables with variables in +columns and samples in rows (Note: missing values are not allowed)} + +\item{y}{vector with values of phenotype variable (Note: will be converted to factor if +classification mode is used). For survival forests this is the time variable.} + +\item{num.trees}{number of trees. Default is 500.} + +\item{type}{mode of prediction ("regression", "classification" or "survival"). Default is regression.} + +\item{s}{predefined number of surrogate splits (it may happen that the actual number of surrogate splits differs in individual nodes). Default is 1 \% of no. of variables.} + +\item{mtry}{number of variables to possibly split at in each node. Default is no. of variables^(3/4) ("^3/4") as recommended by (Ishwaran 2011). Also possible is "sqrt" and "0.5" to use the square root or half of the no. of variables.} + +\item{min.node.size}{minimal node size. Default is 1.} + +\item{num.threads}{number of threads used for determination of relations. Default is number of CPUs available.} + +\item{status}{status variable, only applicable to survival data. Use 1 for event and 0 for censoring.} + +\item{save.ranger}{set TRUE if ranger object should be saved. Default is that ranger object is not saved (FALSE).} + +\item{create.forest}{set FALSE if you want to analyze an existing forest. Default is TRUE.} + +\item{forest}{the random forest that should be analyzed if create.forest is set to FALSE. (x and y still have to be given to obtain variable names)} + +\item{save.memory}{Use memory saving (but slower) splitting mode. No effect for survival and GWAS data. Warning: This option slows down the tree growing, use only if you encounter memory problems. (This parameter is transfered to ranger)} + +\item{case.weights}{Weights for sampling of training observations. Observations with larger weights will be selected with higher probability in the bootstrap (or subsampled) samples for the trees.} + +\item{variables}{variable names (string) for which related variables should be searched for (has to be contained in allvariables)} + +\item{candidates}{vector of variable names (strings) that are candidates to be related to the variables (has to be contained in allvariables)} + +\item{t}{variable to calculate threshold. Default is 5.} + +\item{select.rel}{set False if only relations should be calculated and no related variables should be selected.} +} +\value{ +a list containing: +\itemize{ +\item variables: the variables to which relations are investigated. +\item surr.res: a matrix with mean adjusted agreement values with variables in rows and candidates in columns. +\item threshold: the threshold used to select related variables. +\item var: a list with one vector for each variable containing related variables. +\item ranger: ranger object. +} +} +\description{ +This function uses the mean adjusted agreement to select variables that are related to a defined variable using a threshold T. +The parameter t is used to calculate T: t=1 means that every variable with higher probability than "by chance" is identified +as "important". t=2 means the probability has to be twice, etc. +Based on the threshold a vector is created containing the related variables. +} +\examples{ +# read data +data("SMD_example_data") +x = SMD_example_data[,2:ncol(SMD_example_data)] +y = SMD_example_data[,1] +\donttest{ +# calculate variable relations +set.seed(42) +res = var.relations(x = x, y = y, s = 10, num.trees = 100, variables = c("X1","X7"), candidates = colnames(x)[1:100], t = 5) +res$var +} + +} diff --git a/man/var.relations.mfi.Rd b/man/var.relations.mfi.Rd new file mode 100644 index 0000000..7757aa3 --- /dev/null +++ b/man/var.relations.mfi.Rd @@ -0,0 +1,103 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/var.relations.mfi.R +\name{var.relations.mfi} +\alias{var.relations.mfi} +\title{Investigate variable relations of a specific variable with mutual forest impact (corrected mean adjusted agreement).} +\usage{ +var.relations.mfi( + x = NULL, + y = NULL, + num.trees = 500, + type = "regression", + s = NULL, + mtry = NULL, + min.node.size = 1, + num.threads = NULL, + status = NULL, + save.ranger = FALSE, + create.forest = TRUE, + forest = NULL, + save.memory = FALSE, + case.weights = NULL, + min.var.p = 200, + variables, + candidates, + p.t = 0.01, + select.rel = TRUE, + method = "janitza" +) +} +\arguments{ +\item{x}{data.frame of predictor variables with variables in +columns and samples in rows (Note: missing values are not allowed)} + +\item{y}{vector with values of phenotype variable (Note: will be converted to factor if +classification mode is used). For survival forests this is the time variable.} + +\item{num.trees}{number of trees. Default is 500.} + +\item{type}{mode of prediction ("regression", "classification" or "survival"). Default is regression.} + +\item{s}{predefined number of surrogate splits (it may happen that the actual number of surrogate splits differs in individual nodes). Default is 1 \% of no. of variables.} + +\item{mtry}{number of variables to possibly split at in each node. Default is no. of variables^(3/4) ("^3/4") as recommended by (Ishwaran 2011). Also possible is "sqrt" and "0.5" to use the square root or half of the no. of variables.} + +\item{min.node.size}{minimal node size. Default is 1.} + +\item{num.threads}{number of threads used for determination of relations. Default is number of CPUs available.} + +\item{status}{status variable, only applicable to survival data. Use 1 for event and 0 for censoring.} + +\item{save.ranger}{set TRUE if ranger object should be saved. Default is that ranger object is not saved (FALSE).} + +\item{create.forest}{set FALSE if you want to analyze an existing forest. Default is TRUE.} + +\item{forest}{the random forest that should be analyzed if create.forest is set to FALSE. (x and y still have to be given to obtain variable names)} + +\item{save.memory}{Use memory saving (but slower) splitting mode. No effect for survival and GWAS data. Warning: This option slows down the tree growing, use only if you encounter memory problems. (This parameter is transfered to ranger)} + +\item{case.weights}{Weights for sampling of training observations. Observations with larger weights will be selected with higher probability in the bootstrap (or subsampled) samples for the trees.} + +\item{min.var.p}{minimum number of permuted variables used to determine p-value. Default is 200.} + +\item{variables}{variable names (string) for which related variables should be searched for (has to be contained in allvariables)} + +\item{candidates}{vector of variable names (strings) that are candidates to be related to the variables (has to be contained in allvariables)} + +\item{p.t}{p.value threshold for selection of related variables. Default is 0.01.} + +\item{select.rel}{set False if only relations should be calculated and no related variables should be selected.} + +\item{method}{Method to compute p-values. Use "janitza" for the method by Janitza et al. (2016) or "permutation" to utilize importance values of permuted variables.} +} +\value{ +a list containing: +\itemize{ +\item variables: the variables to which relations are investigated. +\item surr.res: a matrix with the mutual forest impact values with variables in rows and candidates in columns. +\item surr.perm: a matrix with the mutual forest impact values of the permuted variables with variables in rows and candidates in columns. +\item p.rel: a list with the obtained p-values for the relation analysis of each variable. +\item var.rel: a list with vectors of related variables for each variable. +\item ranger: ranger objects. +\item method: Method to compute p-values: "janitza" or "permutation". +\item p.t: p.value threshold for selection of related variables + + +} +} +\description{ +This function corrects the mean adjusted agreement by a permutation approach and generates the relation parameter mutual forest impact. Subsequently p-values are determined and related variables are selected. +} +\examples{ +# read data +data("SMD_example_data") +x = SMD_example_data[,2:ncol(SMD_example_data)] +y = SMD_example_data[,1] +\donttest{ +# calculate variable relations +set.seed(42) +res = var.relations.mfi(x = x, y = y, s = 10, num.trees = 100, variables = c("X1","X7"), candidates = colnames(x)[1:100]) +res$var.rel[[1]] +} + +} diff --git a/man/var.select.md.Rd b/man/var.select.md.Rd new file mode 100644 index 0000000..f0dcc70 --- /dev/null +++ b/man/var.select.md.Rd @@ -0,0 +1,93 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/variable_selection_md.R +\name{var.select.md} +\alias{var.select.md} +\title{Variable selection with Minimal Depth (MD)} +\usage{ +var.select.md( + x = NULL, + y = NULL, + num.trees = 500, + type = "regression", + mtry = NULL, + min.node.size = 1, + num.threads = NULL, + status = NULL, + save.ranger = FALSE, + create.forest = TRUE, + forest = NULL, + save.memory = FALSE, + case.weights = NULL +) +} +\arguments{ +\item{x}{data.frame of predictor variables with variables in +columns and samples in rows. (Note: missing values are not allowed)} + +\item{y}{vector with values of phenotype variable (Note: will be converted to factor if +classification mode is used). For survival forests this is the time variable.} + +\item{num.trees}{Number of trees. Default is 500.} + +\item{type}{Mode of prediction ("regression","classification" or "survival"). Default is regression.} + +\item{mtry}{Number of variables to possibly split at in each node. Default is no. of variables^(3/4) as recommended by Ishwaran.} + +\item{min.node.size}{Minimal node size. Default is 1.} + +\item{num.threads}{number of threads used for parallel execution. Default is number of CPUs available.} + +\item{status}{status variable, only applicable to survival data. Use 1 for event and 0 for censoring.} + +\item{save.ranger}{Set TRUE if ranger object should be saved. Default is that ranger object is not saved (FALSE).} + +\item{create.forest}{set FALSE if you want to analyze an existing forest. Default is TRUE.} + +\item{forest}{the random forest that should be analyzed if create.forest is set to FALSE. (x and y still have to be given to obtain variable names)} + +\item{save.memory}{Use memory saving (but slower) splitting mode. No effect for survival and GWAS data. Warning: This option slows down the tree growing, use only if you encounter memory problems. (This parameter is transfered to ranger)} + +\item{case.weights}{Weights for sampling of training observations. Observations with larger weights will be selected with higher probability in the bootstrap (or subsampled) samples for the trees.} +} +\value{ +List with the following components: +\itemize{ +\item info: list with results from mindep function: +\itemize{ +\item depth: mean minimal depth for each variable. +\item selected: variables has been selected (1) or not (0). +\item threshold: the threshold that is used for the selection. (deviates slightly from the original implimentation) +} +\item var: vector of selected variables. + +\item forest: a list containing: +#'\itemize{ +\item trees: list of trees that was created by getTreeranger, addLayer, and addSurrogates functions and that was used for surrogate minimal depth variable importance. +\item allvariables: all variable names of the predictor variables that are present in x. +} + +\item ranger: ranger object + +} +} +\description{ +This function executes MD applying \link[ranger]{ranger} for random forests generation and is a reimplementation of \link[randomForestSRC]{var.select} from randomForestSRC package. +} +\examples{ +# read data +data("SMD_example_data") + +\donttest{ +# select variables (usually more trees are needed) +set.seed(42) +res = var.select.md(x = SMD_example_data[,2:ncol(SMD_example_data)], y = SMD_example_data[,1], num.trees = 10) +res$var +} + +} +\references{ +\itemize{ + \item Ishwaran, H. et al. (2011) Random survival forests for high-dimensional data. Stat Anal Data Min, 4, 115–132. \url{https://onlinelibrary.wiley.com/doi/abs/10.1002/sam.10103} + \item Ishwaran, H. et al. (2010) High-Dimensional Variable Selection for Survival Data. J. Am. Stat. Assoc., 105, 205–217. \url{http://www.ccs.miami.edu/~hishwaran/papers/IKGML.JASA.2010.pdf} + } +} diff --git a/man/var.select.mir.Rd b/man/var.select.mir.Rd new file mode 100644 index 0000000..42f0406 --- /dev/null +++ b/man/var.select.mir.Rd @@ -0,0 +1,115 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/variable_selection_mir.R +\name{var.select.mir} +\alias{var.select.mir} +\title{Variable selection with mutual impurity reduction (MIR)} +\usage{ +var.select.mir( + x = NULL, + y = NULL, + num.trees = 500, + type = "regression", + s = NULL, + mtry = NULL, + min.node.size = 1, + num.threads = NULL, + status = NULL, + save.ranger = FALSE, + save.memory = FALSE, + num.permutations = 100, + p.t.sel = 0.01, + p.t.rel = 0.01, + select.var = TRUE, + select.rel = FALSE, + case.weights = NULL, + corr.rel = TRUE, + t = 5, + method.rel = "janitza", + method.sel = "janitza", + save.rel = TRUE +) +} +\arguments{ +\item{x}{data.frame of predictor variables with variables in +columns and samples in rows (Note: missing values are not allowed)} + +\item{y}{vector with values of phenotype variable (Note: will be converted to factor if +classification mode is used). For survival forests this is the time variable.} + +\item{num.trees}{number of trees. Default is 500.} + +\item{type}{mode of prediction ("regression", "classification" or "survival"). Default is regression.} + +\item{s}{predefined number of surrogate splits (it may happen that the actual number of surrogate splits differs in individual nodes). Default is 1 \% of no. of variables.} + +\item{mtry}{number of variables to possibly split at in each node. Default is no. of variables^(3/4) ("^3/4") as recommended by (Ishwaran 2011). Also possible is "sqrt" and "0.5" to use the square root or half of the no. of variables.} + +\item{min.node.size}{minimal node size. Default is 1.} + +\item{num.threads}{number of threads used for parallel execution. Default is number of CPUs available.} + +\item{status}{status variable, only applicable to survival data. Use 1 for event and 0 for censoring.} + +\item{save.ranger}{set TRUE if ranger object should be saved. Default is that ranger object is not saved (FALSE).} + +\item{save.memory}{Use memory saving (but slower) splitting mode. No effect for survival and GWAS data. Warning: This option slows down the tree growing, use only if you encounter memory problems. (This parameter is transfered to ranger)} + +\item{num.permutations}{number of permutations to determine p-values. Default is 100. (the relations are determined once based on the permuted X data and the utilized AIR values are permuted again for each permutation )} + +\item{p.t.sel}{p.value threshold for selection of important variables. Default is 0.01.} + +\item{p.t.rel}{p.value threshold for selection of related variables. Default is 0.01.} + +\item{select.var}{set False if only importance should be calculated and no variables should be selected.} + +\item{select.rel}{set False if only relations should be calculated and no variables should be selected.} + +\item{case.weights}{Weights for sampling of training observations. Observations with larger weights will be selected with higher probability in the bootstrap (or subsampled) samples for the trees.} + +\item{corr.rel}{set FALSE if non-corrected variable relations should be used for calculation of MIR. In this case the method "janitza" should not be used for selection of important variables} + +\item{t}{variable to calculate threshold for non-corrected relation analysis. Default is 5.} + +\item{method.rel}{Method to compute p-values for selection of related variables with var.relations.corr. Use "janitza" for the method by Janitza et al. (2016) or "permutation" to utilize permuted variables.} + +\item{method.sel}{Method to compute p-values for selection of important variables. Use "janitza" for the method by Janitza et al. (2016) (can only be used when corrected variable relations are utilized) or "permutation" to utilize permuted variables.} + +\item{save.rel}{set FALSE if relation information should not bet saved (default is TRUE)} +} +\value{ +list with the following components: +\itemize{ +\item info: list with results containing: +\itemize{ +\item MIR: the calculated variable importance for each variable based on mutual impurity reduction. +\item pvalue: the obtained p-values for each variable. +\item selected: variables has been selected (1) or not (0). +\item relations: a list containing the results of variable relation analysis. +\item parameters: a list that contains the parameters s, type, mtry, p.t.sel, p.t.rel and method.sel that were used. +} +\item var: vector of selected variables. + +\item ranger: ranger object. + +} +} +\description{ +This function executes MIR applying \link[ranger]{ranger} for random forests generation and actual impurity reduction and a modified version of \link[rpart]{rpart} to find surrogate variables. +} +\examples{ +# read data +data("SMD_example_data") + +\donttest{ +# select variables (usually more trees are needed) +set.seed(42) +res = var.select.mir(x = SMD_example_data[,2:ncol(SMD_example_data)], y = SMD_example_data[,1],s = 10, num.trees = 10) +res$var +} +} +\references{ +\itemize{ + \item Nembrini, S. et al. (2018) The revival of the Gini importance? Bioinformatics, 34, 3711–3718. \url{https://academic.oup.com/bioinformatics/article/34/21/3711/4994791} + \item Seifert, S. et al. (2019) Surrogate minimal depth as an importance measure for variables in random forests. Bioinformatics, 35, 3663–3671. \url{https://academic.oup.com/bioinformatics/article/35/19/3663/5368013} + } +} diff --git a/man/var.select.smd.Rd b/man/var.select.smd.Rd new file mode 100644 index 0000000..488d2a9 --- /dev/null +++ b/man/var.select.smd.Rd @@ -0,0 +1,100 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/variable_selection_smd.R +\name{var.select.smd} +\alias{var.select.smd} +\title{Variable selection with Surrogate Minimal Depth (SMD) (MAIN FUNCTION)} +\usage{ +var.select.smd( + x = NULL, + y = NULL, + num.trees = 500, + type = "regression", + s = NULL, + mtry = NULL, + min.node.size = 1, + num.threads = NULL, + status = NULL, + save.ranger = FALSE, + create.forest = TRUE, + forest = NULL, + save.memory = FALSE, + case.weights = NULL +) +} +\arguments{ +\item{x}{data.frame of predictor variables with variables in +columns and samples in rows (Note: missing values are not allowed)} + +\item{y}{vector with values of phenotype variable (Note: will be converted to factor if +classification mode is used). For survival forests this is the time variable.} + +\item{num.trees}{number of trees. Default is 500.} + +\item{type}{mode of prediction ("regression", "classification" or "survival"). Default is regression.} + +\item{s}{predefined number of surrogate splits (it may happen that the actual number of surrogate splits differs in individual nodes). Default is 1 \% of no. of variables.} + +\item{mtry}{number of variables to possibly split at in each node. Default is no. of variables^(3/4) ("^3/4") as recommended by (Ishwaran 2011). Also possible is "sqrt" and "0.5" to use the square root or half of the no. of variables.} + +\item{min.node.size}{minimal node size. Default is 1.} + +\item{num.threads}{number of threads used for parallel execution. Default is number of CPUs available.} + +\item{status}{status variable, only applicable to survival data. Use 1 for event and 0 for censoring.} + +\item{save.ranger}{set TRUE if ranger object should be saved. Default is that ranger object is not saved (FALSE).} + +\item{create.forest}{set FALSE if you want to analyze an existing forest. Default is TRUE.} + +\item{forest}{the random forest that should be analyzed if create.forest is set to FALSE. (x and y still have to be given to obtain variable names)} + +\item{save.memory}{Use memory saving (but slower) splitting mode. No effect for survival and GWAS data. Warning: This option slows down the tree growing, use only if you encounter memory problems. (This parameter is transfered to ranger)} + +\item{case.weights}{Weights for sampling of training observations. Observations with larger weights will be selected with higher probability in the bootstrap (or subsampled) samples for the trees.} +} +\value{ +list with the following components: +\itemize{ +\item info: list with results from surrmindep function: +\itemize{ +\item depth: mean surrogate minimal depth for each variable. +\item selected: variables has been selected (1) or not (0). +\item threshold: the threshold that is used for the selection. +} +\item var: vector of selected variables. + +\item s: list with the results of count.surrogate function: +\itemize{ +\item s.a: total average number of surrogate variables. +\item s.l: average number of surrogate variables in the respective layers. +} +\item forest: a list containing: +#'\itemize{ +\item trees: list of trees that was created by getTreeranger, addLayer, and addSurrogates functions and that was used for surrogate minimal depth variable importance. +\item allvariables: all variable names of the predictor variables that are present in x. +} +\item ranger: ranger object. + +} +} +\description{ +This function executes SMD applying \link[ranger]{ranger} for random forests generation and a modified version of \link[rpart]{rpart} to find surrogate variables. +} +\examples{ +# read data +data("SMD_example_data") + +\donttest{ +# select variables (usually more trees are needed) +set.seed(42) +res = var.select.smd(x = SMD_example_data[,2:ncol(SMD_example_data)], y = SMD_example_data[,1],s = 10, num.trees = 10) +res$var +} +} +\references{ +\itemize{ + \item Seifert, S. et al. (2019) Surrogate minimal depth as an importance measure for variables in random forests. Bioinformatics, 35, 3663–3671. \url{https://academic.oup.com/bioinformatics/article/35/19/3663/5368013} + \item Ishwaran, H. et al. (2011) Random survival forests for high-dimensional data. Stat Anal Data Min, 4, 115–132. \url{https://onlinelibrary.wiley.com/doi/abs/10.1002/sam.10103} + \item Ishwaran, H. et al. (2010) High-Dimensional Variable Selection for Survival Data. J. Am. Stat. Assoc., 105, 205–217. \url{http://www.ccs.miami.edu/~hishwaran/papers/IKGML.JASA.2010.pdf} + } +} diff --git a/src/.gitignore b/src/.gitignore new file mode 100644 index 0000000..a242c9c --- /dev/null +++ b/src/.gitignore @@ -0,0 +1,4 @@ +*.o +*.so +*.dll +.vscode diff --git a/src/choose_surg.c b/src/choose_surg.c new file mode 100644 index 0000000..3641214 --- /dev/null +++ b/src/choose_surg.c @@ -0,0 +1,301 @@ +/* + * This routine is from rpart + * + * A particular split routine, optimized for the surrogate variable + * search. The "goodness" of a split is the total weights of concordant + * observations between the surrogate and the primary split. + * Note that the CART folks use the %concordance, which factors missing + * values into the equations somewhat differently. + * + * y is coded as +1=left, -1=right, 0=missing + * + */ +#include "get_surg.h" +#include "rpartproto.h" + +void choose_surg(int n1, int n2, int *y, double *x, int *order, int ncat, double *agreement, double *split, int *csplit_for_cat, double tleft, double tright, double *adj) { + //printf("01: Hello from choose_surg()!\n"); + //printf("i: %d\n", i); + + /* sum of weights for each */ + double llwt, lrwt, rrwt, rlwt; + double agree, majority, total_wt; + + int *left = rp.left; + int *right = rp.right; + double *lwt = rp.lwt; + double *rwt = rp.rwt; + + + /* set to 1 when something worthwhile is found */ + int success = 0; + /* + * I enforce that at least 2 obs must go each way, to avoid having an + * uncorrelated surrogate beat the "null" surrogate too easily + * Observations with 0 weight don't count in this total + */ + /* continuous case */ + /* + * ll = y's that go left that are also sent left by my split + * lr = y's that go left that I send right + * rl = y's that go right that I send to the left + * rr = y's that go right that I send to the right + * + * The agreement is max(ll+rr, lr+rl), if weights were = 1; + * actually max(llwt + rrwt, lrwt + rlwt) / denominator + */ + if (ncat == 0) { + //printf("Hello from choose_surg() ncat == 0\n"); + + double lastx = 0.0; + int ll, lr, rr, rl; + ll = rl = 0; + llwt = 0; + rlwt = 0; + // printf("n2: %d\n", n2); -> 100 + // printf("n1: %d\n", n1); -> 0 + for (int i = n2 - 1; i >= n1; i--) { + /* start with me sending all to the left */ + int j = order[i]; + if (j >= 0) { + /* this is why I run the loop backwards */ + lastx = x[j]; + //printf("03: lastx: %f\n", lastx); + switch (y[j]) { + case LEFT: + if (rp.wt[j] > 0) + ll++; + llwt += rp.wt[j]; + break; + case RIGHT: + if (rp.wt[j] > 0) + rl++; + rlwt += rp.wt[j]; + break; + default: + ; + } + } + } + + // printf("ll: %d\n", ll); -> 13 + // printf("rl: %d\n", rl); -> 87 + + if (llwt > rlwt) + agree = llwt; + else + agree = rlwt; + + /* + * Now we have the total agreement. Calculate the %agreement and + * the adjusted agreement + * For both, do I use the total y vector as my denominator (my + * preference), or only the y's for non-missing x (CART book)? + * If the former, need to reset some totals. + */ + + /* worst possible agreement */ + majority = agree; + total_wt = llwt + rlwt; + + + lr = rr = 0; + lrwt = 0; + rrwt = 0; + /* + * March across, moving things from the right to the left + * the "lastx" code is caring for ties in the x var + * (The loop above sets it to the first unique x value). + */ + /* NB: might never set csplit or split */ + //*csplit = LEFT; + csplit_for_cat[0] = LEFT; + /* a valid splitting value */ + *split = lastx; + for (int i = n1; (ll + rl) >= 2; i++) { + int j = order[i]; + //length_of_order_i = length_of_order_i + 1; + //printf("order[i]: %d\n", order[i]); + if (j >= 0) { + /* not a missing value */ + if ((lr + rr) >= 2 && x[j] != lastx) { + /* new x found, evaluate the split */ + if ((llwt + rrwt) > agree) { + success = 1; + agree = llwt + rrwt; + /* < goes to the right */ + //*csplit = RIGHT; + csplit_for_cat[0] = RIGHT; + *split = (x[j] + lastx) / 2; + } else if ((lrwt + rlwt) > agree) { + success = 1; + agree = lrwt + rlwt; + //*csplit = LEFT; + csplit_for_cat[0] = LEFT; + *split = (x[j] + lastx) / 2; + } + } + + switch (y[j]) { + /* update numbers */ + case LEFT: + if (rp.wt[j] > 0) { + ll--; + lr++; + } + llwt -= rp.wt[j]; + lrwt += rp.wt[j]; + break; + case RIGHT: + if (rp.wt[j] > 0) { + rl--; + rr++; + } + rlwt -= rp.wt[j]; + rrwt += rp.wt[j]; + break; + default: + /* ignore missing y's */ + ; + } + lastx = x[j]; + } + } + } else { + + int defdir; + int lcount = 0; + int rcount = 0; + for (int i = 0; i < ncat; i++) { + left[i] = 0; + right[i] = 0; + lwt[i] = 0; + rwt[i] = 0; + } + + /* First step: + * left = table(x[y goes left]), right= table(x[y goes right]) + * so left[2] will be the number of x == 2's that went left, + * and lwt[2] the sum of the weights for those observations. + * Only those with weight > 0 count in the totals + */ + for (int i = n1; i < n2; i++) { + int j = order[i]; + if (j >= 0) { + int k = (int) x[j] - 1; + + + + switch (y[j]) { + case LEFT: + if (rp.wt[j] > 0) + left[k]++; + + lwt[k] += rp.wt[j]; + break; + case RIGHT: + if (rp.wt[j] > 0) + right[k]++; + rwt[k] += rp.wt[j]; + break; + default:; + } + } + } + + + + + + + + + /* + * Compute which is better: everyone to the right or left + */ + llwt = 0; + rrwt = 0; + for (int i = 0; i < ncat; i++) { + llwt += lwt[i]; + rrwt += rwt[i]; + } + if (llwt > rrwt) { + defdir = LEFT; + majority = llwt; + } else { + defdir = RIGHT; + majority = rrwt; + } + total_wt = llwt + rrwt; + + /* + * We can calculate the best split category by category--- send each + * x value individually to its better direction + */ + agree = 0.0; + for (int i = 0; i < ncat; i++) { + if (left[i] == 0 && right[i] == 0) + { + csplit_for_cat[i] = 0; + } + else { + if (lwt[i] < rwt[i] || (lwt[i] == rwt[i] && defdir == RIGHT)) { + agree += rwt[i]; + csplit_for_cat[i] = RIGHT; + lcount += left[i]; + rcount += right[i]; + } else { + agree += lwt[i]; + csplit_for_cat[i] = LEFT; + lcount += right[i]; + rcount += left[i]; + } + } + } + + + + //success = lcount > 1 && rcount > 1; /* sends at least 2 each way */ + success = lcount > 1 || rcount > 1; + + + + } + + + + /* + * success = 0 means no split was found that had at least 2 sent each + * way (not counting weights of zero), and for continuous splits also had + * an improvement in agreement. + * Due to round-off error such a split could still appear to have adj>0 + * in the calculation further below; avoid this. + */ + + if (!success) { + *agreement = 0.0; + *adj = 0.0; + return; + } + + + /* + * Now we have the total agreement. Calculate the %agreement and + * the adjusted agreement + * For both, do I use the total y vector as my denominator (my + * preference), or only the y's for non-missing x (CART book)? + * If the former, need to reset some totals. + */ + if (rp.sur_agree == 0) { /* use total table */ + total_wt = tleft + tright; + if (tleft > tright) + majority = tleft; + else + majority = tright; + } + + *agreement = agree / total_wt; + majority /= total_wt; + *adj = (*agreement - majority) / (1. - majority); + +} \ No newline at end of file diff --git a/src/free_tree.c b/src/free_tree.c new file mode 100644 index 0000000..d542578 --- /dev/null +++ b/src/free_tree.c @@ -0,0 +1,29 @@ +// This routine is from rpart +// +// free up all of the memory associated with a tree + +#include "get_surg.h" +#include "node.h" +#include "rpartproto.h" + +void free_split(pSplit spl) { + if (spl) { + free_split(spl->nextsplit); + free(spl); + } +} + +// use freenode if the tree was CALLOC-ed, from xval.c +void free_tree(pNode node, int freenode) { + free_split(node->surrogate); + free_split(node->primary); + + if (freenode == 1) + if (node) + free(node); + else { + // don't point to things I just freed + node->primary = (pSplit) NULL; + node->surrogate = (pSplit) NULL; + } +} \ No newline at end of file diff --git a/src/get_surg.c b/src/get_surg.c new file mode 100644 index 0000000..2789523 --- /dev/null +++ b/src/get_surg.c @@ -0,0 +1,261 @@ +// This routine is originally from rpart. +// +// The main entry point for R to find surrogate variables for a node. +// +// Input variables: +// wt = vector of case weights +// xmat = matrix of continuous variables +// opt = vector of options. Same order as get_surg.control, as a vector +// of doubles. +// node = primary node +// +// Returned: a list with elements +// dsplit = for each split, numeric variables (doubles) +// isplit = for each split, integer variables +// isplitcntSum = for each node, integer variables +// +// Naming convention: ... = pointer to an integer vector, ...R = the +// input R object (SEXP) containing that vector + +#define MAINRP +#include <math.h> +#include "get_surg.h" +#include "node.h" +#include "rpartproto.h" + +#ifdef DEBUG +#include <unistd.h> //for using the function sleep +#endif + +SEXP getSurrogates(SEXP ncat2, SEXP wt, SEXP xmat, SEXP opt, SEXP var, SEXP split) { + + + double *dptr; + int *iptr; + int i, j, k, n; + pNode tree; + + // LCJ + int *ncat; + int maxcat; + int *cat_direction; + + // return objects for R + // end in "3" to avoid overlap with internal names + + SEXP dsplit3, isplit3; + + + // output variables + int nsplit[2]; + double *ddsplit[3]; + int *iisplit[3]; + + + //cat_direction = INTEGER(cat_direction2); + + ncat = INTEGER(ncat2); + + int test2 = 5; + int *prim_var_num; + prim_var_num = INTEGER(var); + + double *splitpoint; + double *cat_dir_numeric; + + int *cat_dir_int = (int *) calloc(ncat[prim_var_num[0] - 1] + 1, sizeof(int)); + + if (ncat[prim_var_num[0] - 1] == 0) + { + splitpoint = REAL(split); + } + else + { + cat_dir_numeric = REAL(split); + for (i = 0; i < cat_dir_numeric[0] + 1; i++) + { + cat_dir_int[i] = (int) cat_dir_numeric[i]; + } + } + + // hand over arguments + + rp.numcat = INTEGER(ncat2); + rp.n = nrows(xmat); + n = rp.n; + rp.nvar = ncols(xmat); + rp.wt = REAL(wt); + iptr = INTEGER(opt); + rp.maxsur = (int) iptr[0]; + rp.sur_agree = (int) iptr[1]; + + + + + + // create pointers to the matrix + // x and missmat are in column major order + // y is in row major order + dptr = REAL(xmat); + rp.xdata = (double **) calloc(rp.nvar, sizeof(double *)); + + for (i = 0; i < rp.nvar; i++) { + rp.xdata[i] = dptr; + dptr += n; + } + + // create matrix of sort indices, for surrogate + // one for each continuous variable + // This sort is "once and for all". + // I don't have to sort the categories. + + rp.sorts = (int **) calloc(rp.nvar, sizeof(int *)); + rp.sorts[0] = (int *) calloc(n * rp.nvar, sizeof(int)); + + maxcat = 0; + + + int *tempvec = (int *) calloc(n, sizeof(int)); + double *xtemp = (double *) calloc(n, sizeof(double)); + + for (i = 0; i < rp.nvar; i++) { + rp.sorts[i] = rp.sorts[0] + i * n; + for (k = 0; k < n; k++) { + if (!R_FINITE(rp.xdata[i][k])) { + // this variable is missing (NA) + tempvec[k] = -(k + 1); + xtemp[k] = 0; + } else { + tempvec[k] = k; + xtemp[k] = rp.xdata[i][k]; + } + } + if(ncat[i] == 0) + { + sort_vec(0, n - 1, xtemp, tempvec, i); + } else if(ncat[i] > maxcat) + { + maxcat = ncat[i]; + } + for (k = 0; k < n; k++) + { + rp.sorts[i][k] = tempvec[k]; + + if (i == 8) + { + // printf("rp.sorts[i][k]: %d, xtemp[k]: %f\n", rp.sorts[i][k], xtemp[k]); + } + } + + } + //clear DMA + free(tempvec); + free(xtemp); + + + if (maxcat > 0) { + rp.csplit_for_cat = (int *) ALLOC(3 * maxcat, sizeof(int)); + rp.lwt = (double *) ALLOC(2 * maxcat, sizeof(double)); + rp.left = rp.csplit_for_cat + maxcat; + rp.right = rp.left + maxcat; + rp.rwt = rp.lwt + maxcat; + } else { + rp.csplit_for_cat = (int *) ALLOC(1, sizeof(int)); + } + + // finalize tree object + nodesize = sizeof(Node); + tree = (pNode) calloc(1, nodesize); + + //dptr = REAL(node); + // the split structure is sized for 2 categories. + int splitsize = sizeof(Split); + tree->primary = (pSplit) calloc(1, splitsize); + + + + tree->primary->var_num = prim_var_num[0] - 1; + + + if (rp.numcat[tree->primary->var_num] == 0) + { + tree->primary->csplit[0] = 1; + tree->primary->spoint = splitpoint[0]; + } else + { + for (i = 1; i < cat_dir_int[0]+1; i++) + { + tree->primary->csplit[i-1] = cat_dir_int[i]; + } + } + + // free(cat_dir_int); + + tree->primary->nextsplit = NULL; + + +/* + + if (rp.numcat[tree->primary->var_num] == 0) + { + tree->primary->spoint = splitpoint[0]; + } +*/ + + if (0 < rp.maxsur) + surrogate(tree, 0, n); + + + // Return the body of the tree + // For each component we first create a vector to hold the + // result, then a ragged array index into the vector. + // The rpmatrix routine then fills everything in. + + rpcountup(tree, nsplit); + int splitcnt = nsplit[0] + nsplit[1]; + + dsplit3 = PROTECT(allocMatrix(REALSXP, splitcnt, 2)); + dptr = REAL(dsplit3); + + for (i = 0; i < 2; i++) { + ddsplit[i] = dptr; + dptr += splitcnt; + for (j = 0; j < splitcnt; j++) { + ddsplit[i][j] = 0.0; + } + } + + + isplit3 = PROTECT(allocMatrix(INTSXP, splitcnt, 2)); + iptr = INTEGER(isplit3); + + for (i = 0; i < 2; i++) { + iisplit[i] = iptr; + iptr += splitcnt; + } + + rpmatrix(tree, rp.numcat, ddsplit, iisplit, nsplit); + + // Create the output list + int nout = 2; + SEXP rlist = PROTECT(allocVector(VECSXP, nout)); + SEXP rname = allocVector(STRSXP, nout); + setAttrib(rlist, R_NamesSymbol, rname); + SET_VECTOR_ELT(rlist, 0, dsplit3); + SET_STRING_ELT(rname, 0, mkChar("dsplit")); + SET_VECTOR_ELT(rlist, 1, isplit3); + SET_STRING_ELT(rname, 1, mkChar("isplit")); + + UNPROTECT(1 + nout); + + // let the memory go + free_tree(tree, 0); + + // clear DMA + free(rp.xdata); + free(rp.sorts[0]); + free(rp.sorts); + free(tree); + + return rlist; +} \ No newline at end of file diff --git a/src/get_surg.h b/src/get_surg.h new file mode 100644 index 0000000..231f15a --- /dev/null +++ b/src/get_surg.h @@ -0,0 +1,103 @@ +// This routine is originally from rpart. +// +// common variables for the rpart routine +// +// Start with things that depend on R.h + + +#include <R.h> +#include <Rinternals.h> + +#ifdef ENABLE_NLS +#include <libintl.h> +#define _(String) dgettext ("SurrogateMinimalDepth", String) +#else +#define _(String) (String) +#endif + +// Header for OpenMP +#include <omp.h> + +// Most compilers with openMP support supply a +// pre-defined compiler macro _OPENMP. Following +// facilitates selective turning off (by testing +// value or defining multiple versions OPENMP_ON1, +// OPENMP_ON2...) +// note also that there is no actual *need* to +// protect #pragmas with #ifdef OPENMP_ON, since C +// ignores undefined pragmas, but failing to do so +// may produce warnings if openMP is not supported. +// In contrast functions from omp.h must be protected. + + +// TODO DEBUG +//#define DEBUG +////#ifdef DEBUG +////Rprintf("Hello from thread %d, nthreads %d\n", omp_get_thread_num(), omp_get_num_threads()); +////#endif + + +#ifdef DEBUG +//for using the function sleep +#include <unistd.h> +// Header for measuring execution time +//#include "stopwatch.h" +#endif + +#if defined _OPENMP +#define OPENMP_ON 1 +#endif + + +// Memory defined with R_alloc is removed automatically +// That with "CALLOC" I have to remove myself. Use the +// latter for objects that need to persist between the +// s_to_rp1 and s_to_rp2 calls + +#define ALLOC(a,b) R_alloc(a,b) +#define CALLOC(a,b) R_chk_calloc((size_t)(a), b) + +// done with the R internals +// used for the variable "extra" in nodes +#define LEFT (-1) +#define RIGHT 1 + +#ifdef MAINRP +#define EXTERN +#else +#define EXTERN extern +#endif + + +// As a sop to S, I need to keep the total number of external symbols +// somewhat smaller. So, pack most of them all into a structure. + +EXTERN struct { + double **xdata; + double *wt; + // matrix of sort indices + int **sorts; + // total number of subjects + int n; + // number of predictors + int nvar; + // max # of primary or surrogate splits to use + int maxsur; + // 0 = my style, 1=CART style + int sur_agree; + // to be allocated by the mainline, of length n + int csplit; + int *csplit_for_cat; + double *lwt; + double *rwt; + int *left; + int *right; + int nthreads; + int *numcat; +} rp; + +EXTERN int nodesize; + + +// Categorical variables must be coded as 1,2,3, ...., and there may be +// missing categories. The upper limit is determined on the fly. diff --git a/src/init.c b/src/init.c new file mode 100644 index 0000000..7962977 --- /dev/null +++ b/src/init.c @@ -0,0 +1,23 @@ +// This routine export the c function for R +#include "get_surg.h" +#include "R_ext/Rdynload.h" +#include "node.h" +#include "rpartproto.h" + +SEXP getSurrogates(SEXP ncat2, SEXP wt, SEXP xmat, SEXP opt, SEXP var, SEXP split); + +static const R_CallMethodDef CallEntries[] = { + // registering native routines http://www.hep.by/gnu/r-patched/r-exts/R-exts_95.html + { "getSurrogates", (DL_FUNC) & getSurrogates, 6 }, { NULL, NULL, 0 } +}; + +#include <Rversion.h> +void +// registering native routines http://www.hep.by/gnu/r-patched/r-exts/R-exts_95.html +R_init_SurrogateMinimalDepth(DllInfo * dll) { + R_registerRoutines(dll, NULL, CallEntries, NULL, NULL); + R_useDynamicSymbols(dll, FALSE); +#if defined(R_VERSION) && R_VERSION >= R_Version(2, 16, 0) + R_forceSymbols(dll, TRUE); +#endif +} diff --git a/src/insert_split.c b/src/insert_split.c new file mode 100644 index 0000000..09bca80 --- /dev/null +++ b/src/insert_split.c @@ -0,0 +1,87 @@ + +// This routine is from rpart +// +// sort a new split into a linked list, based on its "improvement" +// +// allocates new memory as needed +// returns 0 if the new element isn't good enough, +// the address of the new element otherwise + +#include "get_surg.h" +#include "node.h" +#include "rpartproto.h" + +pSplit insert_split(pSplit *listhead, int ncat, double improve, int max) { + int nlist; + pSplit s1, s2, s3 = NULL, s4; + + if (ncat == 0) { + ncat = 1; + } + int splitsize = sizeof(Split) + (ncat - 20) * sizeof(int); + + // The Split structure is sized for 2 categories. + if (*listhead == 0) { + // first call to a new list + // csplit gets used even for continuous splits. + s3 = (pSplit) CALLOC(1, splitsize); + s3->nextsplit = NULL; + *listhead = s3; + return s3; + } + if (max < 2) { + // user asked for only 1 to be retained! + s3 = *listhead; + if (improve <= s3->improve) + return NULL; + if (ncat > 1) { + Free(s3); + s3 = (pSplit) CALLOC(1, splitsize); + s3->nextsplit = NULL; + *listhead = s3; + } + return s3; + } + // set up --- nlist = length of list, s4=last element, s3=next to last + nlist = 1; + for (s4 = *listhead; s4->nextsplit; s4 = s4->nextsplit) { + s3 = s4; + nlist++; + } + + // now set up so that the "to be added" is between s1 and s2 + s1 = *listhead; + for (s2 = *listhead; s2; s2 = s2->nextsplit) { + if (improve > s2->improve) + break; + s1 = s2; + } + if (nlist == max) { + if (s2 == 0) + // not good enough + return NULL; + if (ncat > 1) { + Free(s4); + s4 = (pSplit) CALLOC(1, splitsize); + } + + // redefine element s4 as new element + if (s1 == s3) { + s4->nextsplit = NULL; + } + else { + s3->nextsplit = NULL; + s4->nextsplit = s2; + } + } else { + // reuse pointer s4 for new element + // csplit gets used even for continuous splits. + s4 = (pSplit) CALLOC(1, splitsize); + s4->nextsplit = s2; + } + if (s2 == *listhead) + *listhead = s4; + else + s1->nextsplit = s4; + return s4; +} \ No newline at end of file diff --git a/src/node.h b/src/node.h new file mode 100644 index 0000000..1dc10d2 --- /dev/null +++ b/src/node.h @@ -0,0 +1,76 @@ +#ifndef RPART_NODE_H +#define RPART_NODE_H + +// This routine is originally from rpart. +// +// definition of a node in the tree +// +// The actual size of these structures when allocated in insert_split.c +// depends on the split. +// csplit[0] gets used even for continuous splits. + +typedef struct split { + double improve; + // for surrogates only, adjusted agreement + double adj; + // only used if it is continuous + double spoint; + struct split *nextsplit; + int var_num; + int count; + // the actual length depends on splitting rule + int csplit[20]; +} Split, *pSplit; + +typedef struct node { + // risk for the node + double risk; + pSplit primary, surrogate; + int lastsurrogate; +} Node, *pNode; + +// +// Split: +// variable number of the split; 0 = no more surrogates (or primaries) +// +// split point: the actual split point for a continuous +// +// improve: For primary splits, the improvement index returned by the +// bsplit routine. This is the measure that determines the +// winning split. +// For surrogate splits, this holds the error rate, i.e., the +// % incorrect guesses of the primary by using this surrogate. +// +// count: The number of observations split using this variable. For the +// first primary, this will = the number of non-missing values. +// For surrogates, it will be the number missing in the primary +// and all earlier surrogates but not missing on this one. (For +// all primaries but the first, the number is theoretical). +// +// adj: Let "maj" be the %agreement for going with the majority, +// and "agree" the %agreement for this surrogate. The +// adjusted value is (agree - maj)/(1-maj); the amount of +// the potential improvement actually realized. The denominator +// for both percents depends on the sur_agree option. +// +// csplit[0]: For a continuous variable, we also need to know the +// direction of the split. We use this "extra" variable +// as 1: <x to the left, -1: <x to the right. +// +// csplit[]: For a categorical, the labels are LEFT, RIGHT, and +// 0=missing. (Even if a particular category is not empty, +// there may be no subjects from that category present +// at a particular split further down the tree). +// +// +// Node: +// num_obs: Number of observations in the node. +// +// risk: From the eval routine. Estimate of risk, if this node were +// terminal. +// +// lastsurrogate: Which direction to send obs for which the primary and +// all the surrogates are missing. (The child with the greatest +// sum of weights). + +#endif diff --git a/src/rpartproto.h b/src/rpartproto.h new file mode 100644 index 0000000..f3fd1d1 --- /dev/null +++ b/src/rpartproto.h @@ -0,0 +1,23 @@ +// This routine is originally from rpart +// +// prototypes for all of the functions +// This helps the ansi compiler do tight checking. +// + +#include "node.h" + +void choose_surg(int n1, int n2, int *y, double *x, int *order, int ncat, double *agreement, double *split, int *csplit_for_cat, double ltot, double rtot, double *adj); + +void free_split(pSplit spl); + +void free_tree(pNode node, int freenode); + +pSplit insert_split(pSplit *listhead, int ncat, double improve, int max); + +void sort_vec(int start, int stop, double *x, int *cvec, int var); + +void rpcountup(pNode me, int *nsplit); + +void rpmatrix(pNode me, int *numcat, double **dsplit, int **isplit, int *splits); + +void surrogate(pNode me, int n1, int n2); \ No newline at end of file diff --git a/src/rpcountup.c b/src/rpcountup.c new file mode 100644 index 0000000..519f218 --- /dev/null +++ b/src/rpcountup.c @@ -0,0 +1,27 @@ +// This routine is originally from rpart. +// +// count up the number of nodes and splits in the final result +// + +#include "get_surg.h" +#include "node.h" +#include "rpartproto.h" + +void rpcountup(pNode me, int *nsplit) { + int i, j; + pSplit ss; + + i = 0; + j = 0; + + for (ss = me->primary; ss; ss = ss->nextsplit) { + i++; + } + + for (ss = me->surrogate; ss; ss = ss->nextsplit) { + j++; + } + + nsplit[0] = i; + nsplit[1] = j; +} \ No newline at end of file diff --git a/src/rpmatrix.c b/src/rpmatrix.c new file mode 100644 index 0000000..03a4e40 --- /dev/null +++ b/src/rpmatrix.c @@ -0,0 +1,64 @@ +// This routine is originally from rpart. +// +// For S's usage, convert the linked list data into matrix form + +#include "get_surg.h" +#include "node.h" +#include "rpartproto.h" + +void rpmatrix(pNode me, int *numcat, double **dsplit, int **isplit, int *nsplit) { + + // dsplit 0: improvement + // 1: split point for continuous + // 2: surrogate: adjusted agreement, primary: nothing + // isplit 0: variable # + // 1: count + // 2: continuous: direction -1=left, 1=right + + + int scnt; + int j; + pSplit spl; + + scnt = 0; + + + spl = me->primary; + for (scnt = 0; scnt < nsplit[0]; scnt++) { + j = spl->var_num; + + if (numcat[j] == 0) + { + dsplit[1][scnt] = spl->spoint; + isplit[1][scnt] = -1; + } else + { + isplit[1][scnt] = numcat[j]; + } + + isplit[0][scnt] = spl->var_num + 1; + + + spl = spl->nextsplit; + } + + spl = me->surrogate; + int splitcnt = nsplit[0] + nsplit[1]; + for (scnt = nsplit[0]; scnt < splitcnt; scnt++) { + j = spl->var_num; + + dsplit[0][scnt] = spl->adj; + if (numcat[j] == 0) { + dsplit[1][scnt] = spl->spoint; + isplit[1][scnt] = -1; + } else { + isplit[1][scnt] = numcat[j]; + } + isplit[0][scnt] = j + 1; + + + + spl = spl->nextsplit; + } + +} \ No newline at end of file diff --git a/src/sort_vec.c b/src/sort_vec.c new file mode 100644 index 0000000..8307df8 --- /dev/null +++ b/src/sort_vec.c @@ -0,0 +1,131 @@ +/* + * This routine is from rpart + * + * quick sort routine : sort a vector of floats, and carry along an int + * + * x: vector to sort on + * start: first element of x to sort + * stop: last element of x to sort + * cvec: a vector to carry along + */ +#include "get_surg.h" +#include "rpartproto.h" + +void sort_vec(int start, int stop, double *x, int *cvec, int var) { + int i, j, k; + double temp, median; + int tempd; + while (start < stop) { + /* + * first-- if the list is short, do an ordinary insertion sort + */ + if ((stop - start) < 11) { + for (i = start + 1; i <= stop; i++) { + temp = x[i]; + tempd = cvec[i]; + j = i - 1; + + while (j >= start && x[j] > temp) { + x[j + 1] = x[j]; + cvec[j + 1] = cvec[j]; + j--; + } + x[j + 1] = temp; + cvec[j + 1] = tempd; + } + return; + } + /* + * list is longer -- split it into two + * I use the median of 3 values as the split point + */ + i = start; + j = stop; + k = (start + stop) / 2; + + median = x[k]; + if (x[i] >= x[k]) { + /* one of j or k is smallest */ + if (x[j] > x[k]) { + /* k is smallest */ + if (x[i] > x[j]) + median = x[j]; + else + median = x[i]; + } + } else { + if (x[j] < x[k]) { + if (x[i] > x[j]) + median = x[i]; + else + median = x[j]; + } + } + + /* + * Now actually do the partitioning + * Because we must have at least one element >= median, "i" + * will never run over the end of the array. Similar logic + * applies to j. + * A note on the use of "<" rather than "<=". If a list has lots + * of identical elements, e.g. 80/100 are "3.5", then we will + * often go to the swap step with x[i]=x[j]=median. But we will + * get the pointers i and j to meet approximately in the middle of + * the list, and that is THE important condition for speed in a + * quicksort. + * + */ + while (i < j) { + /* top pointer down till it points at something too large */ + while (x[i] < median) + i++; + + /* bottom pointer up until it points at something too small */ + while (x[j] > median) + j--; + + if (i < j) { + if (x[i] > x[j]) { + /* swap */ + temp = x[i]; + x[i] = x[j]; + x[j] = temp; + tempd = cvec[i]; + cvec[i] = cvec[j]; + cvec[j] = tempd; + + } + i++; + j--; + } + } + + /* + * The while() step helps if there are lots of ties. It will break + * the list into 3 parts: < median, ==median, >=median, of which only + * the top and bottom ones need further attention. + * The ">=" is needed because i may be == to j + */ + while (x[i] >= median && i > start) + i--; + while (x[j] <= median && j < stop) + j++; + + /* + * list has been split, now do a recursive call + * always recur on the shorter list, as this keeps the total + * depth of nested calls to less than log_base2(n). + */ + if ((i - start) < (stop - j)) { + /* top list is shorter */ + if ((i - start) > 0) + sort_vec(start, i, x, cvec, var); + start = j; + } else { + /* bottom list is shorter */ + if ((stop - j) > 0) + sort_vec(j, stop, x, cvec, var); + stop = i; + } + } +} diff --git a/src/surrogate.c b/src/surrogate.c new file mode 100644 index 0000000..db2b4ca --- /dev/null +++ b/src/surrogate.c @@ -0,0 +1,162 @@ +// This routine is from rpart +// +// Calculate the surrogate splits for a node and its primary +// (This routine is an awful lot like bsplit) +// +// Input : node +// start and stop indices for the arrays (which obs apply) +// +// Output: Fills in the node's +// surrogate splits +// lastsurrogate value +// +// Uses: The global vector tempvec (integer) as a temporary, assumed +// to be of length n. + +#include "get_surg.h" +#include "node.h" +#include "rpartproto.h" + +void surrogate(pNode me, int n1, int n2) { + int i, j, k; + // the primary split variable + int var; + double split; + double improve; + // weight sent left and right by primary + double lcount, rcount; + int extra; + pSplit ss; + pSplit *ss_list; + int *index; + int *tempy; + int **sorts; + double **xdata; + double adj_agree; + int ncat; + + // DMA + tempy = (int *) calloc(rp.n, sizeof(int)); + sorts = rp.sorts; + xdata = rp.xdata; + + // First construct, in tempy, the "y" variable for this calculation. + // It will be LEFT:goes left, 0:missing, RIGHT:goes right. + // Count up the number of obs the primary sends to the left, as my + // last surrogate (or to the right, if larger). + + var = (me->primary)->var_num; + + // LCJ + // continuous variable + if (rp.numcat[var] == 0) + { + split = (me->primary)->spoint; + extra = (me->primary)->csplit[0]; + for (i = n1; i < n2; i++) + { + // lcj: j is the variable num out of the sorted matrix of variables "sorts", whereby "sorts" is sorted in ascending order + j = sorts[var][i]; + // printf("j (von primvar == 8): %d\n", j); + // -> vgl. j mit logfile branch_2_sorts.txt: variable numbers stimmen überein + if (j < 0) + { + tempy[-(j + 1)] = 0; + } else + { + tempy[j] = (xdata[var][j] < split) ? extra : -extra; + } + } + } else + { /* categorial variable */ + // lcj: index is a list of directions for the cats, whereby the index of "index" represents the categorial and the corresponding value the direction + // example: index = [1, -1, -1, 1]: cat 0 goes 1 (right), cat 1 goes -1 (left), cat 2 goes -1 (left), cat 3 goes 1 (right) + index = (me->primary)->csplit; + + for (i = n1; i < n2; i++) { + j = sorts[var][i]; + if (j < 0) { + tempy[-(j + 1)] = 0; + } + else { + tempy[j] = index[(int) xdata[var][j] - 1]; + } + + } + + } + + + lcount = 0; + rcount = 0; + // lcj: var: PrimVar (see line 48) + for (i = n1; i < n2; i++) { + j = sorts[var][i]; + //if (j < 0) + // j = -(j + 1); + j = j < 0 ? -(j + 1) : j; + switch (tempy[j]) { + case LEFT: + lcount += rp.wt[j]; + break; + case RIGHT: + rcount += rp.wt[j]; + break; + default: + break; + } + } + // end parallel section + + if (lcount < rcount) + me->lastsurrogate = RIGHT; + else { + if (lcount > rcount) + me->lastsurrogate = LEFT; + else + // no default + me->lastsurrogate = 0; + } + + // Now walk through the variables + me->surrogate = (pSplit) NULL; + //int splitLR = rp.csplit; + int nthreads; + + for (i = 0; i < rp.nvar; i++) { + if (var == i) + continue; + ncat = rp.numcat[i]; + + + + choose_surg(n1, n2, tempy, xdata[i], sorts[i], ncat, &improve, &split, rp.csplit_for_cat, lcount, rcount, &adj_agree); + + // org comment: was 0 + if (adj_agree <= 1e-10) + // no better than default + continue; + + + // sort it onto the list of surrogates + + ss = insert_split(&(me->surrogate), ncat, improve, rp.maxsur); + if (ss) { + ss->improve = improve; + ss->var_num = i; + // corrected by nodesplit() + ss->count = 0; + ss->adj = adj_agree; + if ( rp.numcat[i] == 0) { + ss->spoint = split; + ss->csplit[0] = rp.csplit_for_cat[0]; + } else { + for (k = 0; k < rp.numcat[i]; k++) { + ss->csplit[k] = rp.csplit_for_cat[k]; + } + } + + } + + } +} -- GitLab