From 2af232d4f87f12381c6b287114bbc5c8ff6a3134 Mon Sep 17 00:00:00 2001 From: HeleneBlt Date: Fri, 16 Feb 2024 13:54:27 +0100 Subject: [PATCH 01/22] Seed.val + stop Formating Data - Add seed.val to bm_PseudoAbsences and BIOMOD_FormatingData - Change the message if the PA selection cannot be done --> stop --- R/BIOMOD_FormatingData.R | 8 ++++++-- R/biomod2_classes_1.R | 18 +++++++++++------- R/bm_PseudoAbsences.R | 13 ++++++++++--- 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/R/BIOMOD_FormatingData.R b/R/BIOMOD_FormatingData.R index d97aabb7..26d73c85 100644 --- a/R/BIOMOD_FormatingData.R +++ b/R/BIOMOD_FormatingData.R @@ -93,6 +93,8 @@ ##' @param filter.raster (\emph{optional, default} \code{FALSE}) \cr ##' If \code{expl.var} is of raster type, a \code{logical} value defining whether \code{resp.var} ##' is to be filtered when several points occur in the same raster cell +##' @param seed.val (\emph{optional, default} \code{NULL}) \cr +##' An \code{integer} value corresponding to the new seed value to be set ##' ##' ##' @return @@ -345,7 +347,8 @@ BIOMOD_FormatingData <- function(resp.name, PA.sre.quant = 0.025, PA.user.table = NULL, na.rm = TRUE, - filter.raster = FALSE) + filter.raster = FALSE, + seed.val = NULL) { .bm_cat(paste0(resp.name, " Data Formating")) @@ -392,7 +395,8 @@ BIOMOD_FormatingData <- function(resp.name, PA.sre.quant = PA.sre.quant, PA.user.table = PA.user.table, na.rm = na.rm, - filter.raster = filter.raster) + filter.raster = filter.raster, + seed.val) } .bm_cat("Done") return(out) diff --git a/R/biomod2_classes_1.R b/R/biomod2_classes_1.R index dbb7d362..c61a5c99 100644 --- a/R/biomod2_classes_1.R +++ b/R/biomod2_classes_1.R @@ -1444,14 +1444,15 @@ setMethod('BIOMOD.formated.data.PA', signature(sp = 'numeric', env = 'data.frame , PA.nb.rep = 1, PA.strategy = 'random', PA.nb.absences = NULL , PA.dist.min = 0, PA.dist.max = NULL , PA.sre.quant = 0.025, PA.user.table = NULL - , na.rm = TRUE, filter.raster = FALSE) { + , na.rm = TRUE, filter.raster = FALSE, seed.val = NULL) { .BIOMOD.formated.data.PA(sp, env, xy, dir.name, sp.name , eval.sp, eval.env, eval.xy , PA.nb.rep, PA.strategy, PA.nb.absences , PA.dist.min, PA.dist.max , PA.sre.quant, PA.user.table , na.rm - , filter.raster = filter.raster) + , filter.raster = filter.raster + , seed.val) }) ### BIOMOD.formated.data.PA(sp = numeric, env = SpatRaster) ------------------- @@ -1466,14 +1467,15 @@ setMethod('BIOMOD.formated.data.PA', signature(sp = 'numeric', env = 'SpatRaster , PA.nb.rep = 1, PA.strategy = 'random', PA.nb.absences = NULL , PA.dist.min = 0, PA.dist.max = NULL , PA.sre.quant = 0.025, PA.user.table = NULL - , na.rm = TRUE, filter.raster = FALSE) { + , na.rm = TRUE, filter.raster = FALSE,seed.val = NULL) { .BIOMOD.formated.data.PA(sp, env, xy, dir.name, sp.name , eval.sp, eval.env, eval.xy , PA.nb.rep, PA.strategy, PA.nb.absences , PA.dist.min, PA.dist.max , PA.sre.quant, PA.user.table , na.rm - , filter.raster = filter.raster) + , filter.raster = filter.raster + , seed.val) }) ### .BIOMOD.formated.data.PA --------------------------------------------------- @@ -1482,7 +1484,7 @@ setMethod('BIOMOD.formated.data.PA', signature(sp = 'numeric', env = 'SpatRaster , PA.nb.rep = 1, PA.strategy = 'random', PA.nb.absences = NULL , PA.dist.min = 0, PA.dist.max = NULL , PA.sre.quant = 0.025, PA.user.table = NULL - , na.rm = TRUE, filter.raster = FALSE) + , na.rm = TRUE, filter.raster = FALSE, seed.val = NULL) { args <- .BIOMOD.formated.data.check.args(sp, env, xy, eval.sp, eval.env, eval.xy, filter.raster) for (argi in names(args)) { assign(x = argi, value = args[[argi]]) } @@ -1529,7 +1531,9 @@ setMethod('BIOMOD.formated.data.PA', signature(sp = 'numeric', env = 'SpatRaster sre.quant = PA.sre.quant, dist.min = PA.dist.min, dist.max = PA.dist.max, - user.table = PA.user.table) + user.table = PA.user.table, + seed.val = seed.val) + if (!is.null(pa.data.tmp)) { ## Keep same env variable for eval than calib (+ check for factor) @@ -1581,7 +1585,7 @@ setMethod('BIOMOD.formated.data.PA', signature(sp = 'numeric', env = 'SpatRaster rm(list = 'BFD') } else { - cat("\n ! PA selection not done", fill = .Options$width) + stop("\n ! PA selection not done : \n The PA selection is not possible with the parameters selected." ) BFDP <- BIOMOD.formated.data(sp = as.vector(values(sp)[,1]), env = env, xy = xy, diff --git a/R/bm_PseudoAbsences.R b/R/bm_PseudoAbsences.R index b022fffc..bb1528a8 100644 --- a/R/bm_PseudoAbsences.R +++ b/R/bm_PseudoAbsences.R @@ -46,6 +46,8 @@ ##' ##' @param \ldots (\emph{optional, one or several of the above arguments depending on the selected ##' method}) +##' @param seed.val (\emph{optional, default} \code{NULL}) \cr +##' An \code{integer} value corresponding to the new seed value to be set ##' ##' ##' @return @@ -197,11 +199,11 @@ bm_PseudoAbsences <- function(resp.var, expl.var, nb.rep = 1, strategy = 'random', nb.absences = NULL - , sre.quant = 0, dist.min = 0, dist.max = NULL, user.table = NULL) + , sre.quant = 0, dist.min = 0, dist.max = NULL, user.table = NULL, seed.val= NULL) { ## 0. Check arguments --------------------------------------------------------------------------- args <- .bm_PseudoAbsences.check.args(resp.var, expl.var, nb.rep, strategy, nb.absences - , sre.quant, dist.min, dist.max, user.table) + , sre.quant, dist.min, dist.max, user.table,seed.val) for (argi in names(args)) { assign(x = argi, value = args[[argi]]) } rm(args) @@ -323,7 +325,7 @@ bm_PseudoAbsences <- function(resp.var, expl.var, nb.rep = 1, strategy = 'random # Argument Check -------------------------------------------------------------- -.bm_PseudoAbsences.check.args <- function(resp.var, expl.var, nb.rep, strategy, nb.absences, sre.quant, dist.min, dist.max, user.table) +.bm_PseudoAbsences.check.args <- function(resp.var, expl.var, nb.rep, strategy, nb.absences, sre.quant, dist.min, dist.max, user.table,seed.val) { cat('\n\nChecking Pseudo-absence selection arguments...\n') ## 1. Check resp.var argument ----------------------------------------------- @@ -421,6 +423,11 @@ bm_PseudoAbsences <- function(resp.var, expl.var, nb.rep = 1, strategy = 'random } } + ## 8. Set the seed (if needed) --------------------------------------------- + if (!is.null(seed.val)) { + set.seed(seed.val) + } + return(list(resp.var = resp.var, expl.var = expl.var, nb.rep = nb.rep, From 0e61ad24014331c00951f501888f69577f8331d4 Mon Sep 17 00:00:00 2001 From: HeleneBlt Date: Mon, 19 Feb 2024 09:15:12 +0100 Subject: [PATCH 02/22] Merge branch 'master' into devel_current --- R/bm_Tuning.R | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/R/bm_Tuning.R b/R/bm_Tuning.R index c8c25cf7..47036f72 100644 --- a/R/bm_Tuning.R +++ b/R/bm_Tuning.R @@ -72,7 +72,7 @@ ##' \item{GAM}{\code{select}, \code{method}} ##' \item{GBM}{\code{n.trees}, \code{interaction.depth}, \code{shrinkage}, \code{n.minobsinnode}} ##' \item{MARS}{\code{degree}, \code{nprune}} -##' \item{MAXENT}{\code{algorithm}} +##' \item{MAXENT}{\code{algorithm}, \code{parallel}} ##' \item{RF}{\code{mtry}} ##' \item{SRE}{\code{quant}} ##' \item{XGBOOST}{\code{nrounds}, \code{max_depth}, \code{eta}, \code{gamma}, @@ -211,6 +211,7 @@ bm_Tuning <- function(model, MARS.degree = 1:2, MARS.nprune = 2:max(38, 2 * ncol(bm.format@data.env.var) + 1), MAXENT.algorithm = 'maxnet', + MAXENT.parallel = 'TRUE', RF.mtry = 1:min(10, ncol(bm.format@data.env.var)), SRE.quant = c(0, 0.0125, 0.025, 0.05, 0.1), XGBOOST.nrounds = 50, @@ -315,7 +316,7 @@ bm_Tuning <- function(model, partitions = "randomkfold", partition.settings = list(kfolds = 10), doClamp = TRUE, ## allow to change or not ? - parallel = TRUE, + parallel = params.train$MAXENT.parallel, numCores = NULL, ## default to 1 or NULL (all available cores used then) ? categoricals = NULL)) From 2f395c853133c97cea0b5f845f49b59ef45e33df Mon Sep 17 00:00:00 2001 From: HeleneBlt Date: Tue, 20 Feb 2024 10:21:38 +0100 Subject: [PATCH 03/22] fact.aggr in bm_PseudoAbsences add a parameter to reduce the resolution for the disk method --- R/biomod2_classes_1.R | 16 ++++++++-------- R/bm_PseudoAbsences.R | 19 ++++++++++++++----- vignettes/news.Rmd | 10 ++++++++++ 3 files changed, 32 insertions(+), 13 deletions(-) diff --git a/R/biomod2_classes_1.R b/R/biomod2_classes_1.R index c61a5c99..01bddc86 100644 --- a/R/biomod2_classes_1.R +++ b/R/biomod2_classes_1.R @@ -1586,14 +1586,14 @@ setMethod('BIOMOD.formated.data.PA', signature(sp = 'numeric', env = 'SpatRaster rm(list = 'BFD') } else { stop("\n ! PA selection not done : \n The PA selection is not possible with the parameters selected." ) - BFDP <- BIOMOD.formated.data(sp = as.vector(values(sp)[,1]), - env = env, - xy = xy, - dir.name = dir.name, - sp.name = sp.name, - eval.sp = eval.sp, - eval.env = eval.env, - eval.xy = eval.xy) + # BFDP <- BIOMOD.formated.data(sp = as.vector(values(sp)[,1]), + # env = env, + # xy = xy, + # dir.name = dir.name, + # sp.name = sp.name, + # eval.sp = eval.sp, + # eval.env = eval.env, + # eval.xy = eval.xy) } rm(list = "pa.data.tmp" ) return(BFDP) diff --git a/R/bm_PseudoAbsences.R b/R/bm_PseudoAbsences.R index bb1528a8..ad91bb07 100644 --- a/R/bm_PseudoAbsences.R +++ b/R/bm_PseudoAbsences.R @@ -38,6 +38,8 @@ ##' @param dist.max (\emph{optional, default} \code{NULL}) \cr ##' If \code{strategy = 'disk'}, a \code{numeric} defining the maximal distance to presence points ##' used to make the \code{disk} pseudo-absence selection (in meters) +##' @param fact.aggr (\emph{optional, default} \code{NULL}) \cr +##' If \code{strategy = 'disk'}, a \code{integer} defining the factor of aggregation to reduce the resolution ##' @param user.table (\emph{optional, default} \code{NULL}) \cr ##' If \code{strategy = 'user.defined'}, a \code{matrix} or \code{data.frame} with as many rows as ##' \code{resp.var} values, as many columns as \code{nb.rep}, and containing \code{TRUE} or @@ -199,7 +201,7 @@ bm_PseudoAbsences <- function(resp.var, expl.var, nb.rep = 1, strategy = 'random', nb.absences = NULL - , sre.quant = 0, dist.min = 0, dist.max = NULL, user.table = NULL, seed.val= NULL) + , sre.quant = 0, dist.min = 0, dist.max = NULL,fact.aggr = NULL, user.table = NULL, seed.val= NULL) { ## 0. Check arguments --------------------------------------------------------------------------- args <- .bm_PseudoAbsences.check.args(resp.var, expl.var, nb.rep, strategy, nb.absences @@ -216,7 +218,7 @@ bm_PseudoAbsences <- function(resp.var, expl.var, nb.rep = 1, strategy = 'random user.defined = bm_PseudoAbsences_user.defined(resp.var, expl.var, user.table), random = bm_PseudoAbsences_random(resp.var, expl.var, nb.absences, nb.rep), sre = bm_PseudoAbsences_sre(resp.var, expl.var, sre.quant, nb.absences, nb.rep), - disk = bm_PseudoAbsences_disk(resp.var, expl.var, dist.min, dist.max, nb.absences, nb.rep)) + disk = bm_PseudoAbsences_disk(resp.var, expl.var, dist.min, dist.max, nb.absences, nb.rep,fact.aggr)) } else if (length(nb.absences) == nb.rep) { out.list = foreach(i.abs = unique(nb.absences)) %do% { @@ -227,7 +229,7 @@ bm_PseudoAbsences <- function(resp.var, expl.var, nb.rep = 1, strategy = 'random user.defined = bm_PseudoAbsences_user.defined(resp.var, expl.var, user.table), random = bm_PseudoAbsences_random(resp.var, expl.var, i.abs, length(i.rep)), sre = bm_PseudoAbsences_sre(resp.var, expl.var, sre.quant, i.abs, length(i.rep)), - disk = bm_PseudoAbsences_disk(resp.var, expl.var, dist.min, dist.max, i.abs, length(i.rep))) + disk = bm_PseudoAbsences_disk(resp.var, expl.var, dist.min, dist.max, i.abs, length(i.rep),fact.aggr)) ## CASE where all available cells have been selected : ## give back only one dataset, even if several were asked @@ -918,7 +920,7 @@ setMethod('bm_PseudoAbsences_disk', signature(expl.var = "SpatVector"), ##' setMethod('bm_PseudoAbsences_disk', signature(expl.var = "SpatRaster"), - function(resp.var, expl.var, dist.min, dist.max, nb.absences, nb.rep) + function(resp.var, expl.var, dist.min, dist.max, nb.absences, nb.rep,fact.aggr) { cat("\n > Disk pseudo absences selection") @@ -932,8 +934,10 @@ setMethod('bm_PseudoAbsences_disk', signature(expl.var = "SpatRaster"), nb.absences, nb.rep) ) } else { - cat("\n > Pseudo absences are selected in explanatory variables") + + cat("\n > Pseudo absences are selected in explanatory variables") + cat("\n") # create a mask dist.mask <- subset(expl.var, 1) dist.mask[] <- NA @@ -944,6 +948,11 @@ setMethod('bm_PseudoAbsences_disk', signature(expl.var = "SpatRaster"), dist.mask <- distance(dist.mask) dist.mask <- mask(dist.mask, subset(expl.var, 1)) + if (!is.null(fact.aggr)){ + dist.mask <- aggregate(dist.mask,fact= fact.aggr) + expl.var <- aggregate(expl.var,fact = fact.aggr) + } + if (is.null(dist.max)) { dist.max <- Inf } diff --git a/vignettes/news.Rmd b/vignettes/news.Rmd index c6e8866d..6c87a262 100644 --- a/vignettes/news.Rmd +++ b/vignettes/news.Rmd @@ -13,6 +13,16 @@ vignette: > ## Development updates +### 2024 + +#### 4.2-6 Devel actuel + +- Add _seed.val_ for bm_pseudoAbsences and BIOMOD_FormatingData +- Stop dans BIOMOD_FormatingData (càd biomod2_classes_1) si selection de PA à échouer. (Message okay ?) +- Add an argument _fact.agg_ (factor.aggregate à changer au besoin) for PseudoAbsences selection with the disk method. It allows to reduce the resolution of the environnement. NULL par défaut, donné à aggregate pour modifier résolution. **à faire remonter à BIOMOD_FormatingData ou laisser à bm_PseudoAbsences** + + + ### 2023 #### 4.2-5 Modeling options and Tuning (2023-09-12) From 3ddc303289f739be9c15ac763223997468757a59 Mon Sep 17 00:00:00 2001 From: HeleneBlt Date: Wed, 21 Feb 2024 16:13:41 +0100 Subject: [PATCH 04/22] Change xgboost max_depth --- data/OptionsBigboss.rda | Bin 8532 -> 13922 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/data/OptionsBigboss.rda b/data/OptionsBigboss.rda index 13d9bb62944f3aca05a9b8a2c7b5e6989ce83cd5..8961e290c7eb0b5f4e7e8130be6172374db4c65e 100644 GIT binary patch literal 13922 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 VZKmZPGWADN29?&^W&*@#{|9HIFRlOp literal 8532 zcmZX(cTf{d^e&tbO%zhFpwt9Jks=rn>Gj1IETE`_jsyfjgb)b5CPoP;h@c=+6kY@* zp+uzDgwT5t=@3AAmEO7B-#6d)-I@FB%>Hq9cIV8Vea_iu_aAddWm#=AvBze6wef?% zG@GOU3oCj=^c~^q%Z&g-68>&LE?ZGE5ReSm0oYy&1>7~E0|0O$;C}$h%;GZp;M^k) z0LmjtjHw@KbVC40OET*A*((npofSVT9`y(#A^c4OgSq>W*Z}~@o_>@M(l~{Il0~%~ zJ7eI#t_IN1AP2Ak2?Lgm20ru2@+AZ196M~}ZTQg<^6~&M zS)U9bcGv-+;kqHDbRxj<(nrniU*G>9fByd-q^ku00L5a?+Ljv;@}DEb5taE{}-T9|-D>RA{4=kj%786VXR_2+t3h30h7&s#ZL<3VSq0+go4u8Rh)TV#Lr zuG~}2xTmtM;BevQZjRU|0bw_LS>)qK6@WRtee$J+D;6);b$qZ68K!x1ie&5vg!>5* z>sRBgep78;V&L>&Qn4y?1GJ@s z57NR0-~(1BU}FuFwPwaw5aCGSbsg*s1g|nytiT1*PWC4ew^*U_2oEI)QA6AhNMgtU zN#*ho9}O)Wj7&v3;!pP@qEX=}B@KL_@FYasjZ%BOioF$MO(#^JzTwhn` z%o}SmV2{tFp{DACxNCS?Xif0_%llaZx|bVlt!94N1#tgz;S)3u2_5hFWq<8mLvXHZ zO^w&X&4={@qHH@g{5rW6A+JvS3ue0_!i84;l3Jw}(Q3ns80)vB6!O|?<`{LmfNSoL zMlfeKVu&3~5FVg1H}C;NIvK*{J{LbhD#&|#1#pb11~lwfBc`+Xrt$u{gv*J(H$UL9 zXgL}iYYwFj#{@|e$NN&X-w#UW&Nihl1&-0N_K$O^G@W)*O81*=c%o2iNC?(z*F%AN zV4yR7s5_U=dI!VUoBV_r!})OD-5{7L_sA;gq8WCQI&`Vb%*_m@F8NbwtW+ z?DcM@b!ON)T69hBQ87z+!w%#BV&>@lzZ#?BkI~OWbg?b3rQ}{e`={k{%e8AUb0^!* z{f2U^v&O*eKC}cW*`G-_M}%AiYzS)Yh>&)*S9HpeL_d*DP`O}Ab8l&~RF*`Hh>Fw* z97sxLBpG%D(EC)F0mQ4FaA86aS^<%d(o%w~P`(MUR>{~YIB<#LqngqOgAk=X%Q(I6 zTA{^C89OO$LdhLIV|{S!;>lu}9uMXkYmKGdBB))NblM{{=@#^335%#<{a~oM&9x`1 z!!i!#tN>>aC`JOT*Trg#MToPaH)vEU!ekgxMxCeTq)ZCb69cuEBWakGNNnqVF>b8> zQ?&+v)=DH`17c;unPfPEGSiU;=IaM%JUeG<*)W4^8*%eYJOiEwpl8)COjHufQ3GndTZ&_q68Te8=;I zxqxiS<=&R8U?l>8+yIVOttSHHL^$=Y-OzP#2)n4HpZQ<yCUse)royi?z%qs)w) zQ742tX323%U?!Vu5RRXK&0S#U!-bvU!k!>)*W=9uyGZsaS0AyatiJxYtNXRLvZq{_W?Lh5my4?onh>4ku}hP$RENg zMF@@HRVEF?4QIiSLhf}|mH-R%UNM9`h`6oktZ~~N_-oExq6zt02D?W5Iv@m`2mv!( z;lN^5o4F8XGGhV?k#_?hQ;OSz?7yb-QC={moLA`mJS7h$s2BptLw0zuCcx|^ik834 z6y=N1`wk6mZ&nMu(^uPv>!UI`h7XZ<4k)N@vWH1H(I;tD zcwB^qrK{}`W~{^`@F3ChaItb*C}i(-7eWb%$HCbikVg25GknDr-sfx6ggTE_*CIf? z87mNy3~>_SaZwm+oyChVRMzeL_K`VN7ZH!Q7C9bswh_-V`wU^B*PI0`d zuR=QP=m;@R;FVbYh;j%Xeen+%(f~c(#0$p{@t>ZjBq9b7 zK8ldz6uArr_CSw$A|t#B@^QYn3kgPkg3W=pdHc^JhpwRMaN4M~5KvRZ%A)C}Hyu7S+lpkm~5Fo8&cN z@R|P|PgKzmZh$|QU|rkkpl4z}zwPO{v+cT|Fc?)^=G;CtRr)hUImo`cX=l9#!e7VBmlThh~SiMs5F9c|NUjX$e^W)?D*d+@2lkRylaA7L^95s_rWn+W(&E)8B5qIZ(Ra_1u2Y z3i{lrC(YF0aoGKkp=t9C^Dcgs%dvP>>DTVg?o&ex%(f|m(=qb3Ar7_)(n>rV46&7OC~ zBhrjqBvYSb1nzzxuxvBzA>GTkMt%L7@7A5-o6;g;_s(Np+os8(4Qp!d)-=5_1xEej z@%L^!cBa)CH{FeF}GQgXH~paZKL zmE0kbCx1>$~#+a0x4yJav@b@X4VlW~w zMCWiYlVl))bwpo-axxhDTpU;|hD7W_AJ5Okn$ti|G!9d``~_-0pE1Wk>`D5u#yFj+ z4+Ed*LJMH%ju&D<+QjErdERp%4p=HMk73K;69bDHcGyV6z;_(&&@>5oK3G$S3$LJ; zai2lVn~86iE-H4g6K;vP)n3w*c(LY*_pE58HAfaMd+z6Q30*{lo#l5PXs8!`-CYlr z!*;_aBtF5soV)mhMY7~`X$pZCs0(dRWqnTv^a>cdO)~O0hj2PtGg_zu8&Ajzw#G2ujJ3# zHzz%F$0vBFAAYFLsgm+ccTfCaI!!3-Rhl0xt~JFg78PjddDv)?E(z+t;?n`og++1t z8j4w_Tz)Ofz9n`nP0z>GpISZz1n|t_T*uU}-*EMv^4r9_<2IKzimj2u(E7BWxYzD@ z4@L8PD1*c#FY2ck50+JV8Y@~_+?=w!jN2%%13~K^PZf)pHr5m^($fs*ov<^QbhEM$ zb<*Pp^VdX0dg-85c6Qg#NhK*0q}S%=yup%;bnoffYUliJJ69%Y6Vz zkltjX<>aCavpM2;`OZ9vGmYbBV2>lqLyC^3qdAvCFh=WSj%om1R}yV{P21+o2`yW3 zZo`L|+uHw%@ceTrOt2+0?%A!Ml0RO5zQF^=qU``8o7$wyO*Gy(Y5GIkm#iB%Zipy> zIT&^y)0w2(SldS~SH$$Gax}@$M%8kUL6T6gk#We$tk?Ep&`h$VQ?~f?YdS%EZ?tJ= zA1dZOq+@Rn&;|aU`i%|Yz9F7q4|L;ArWP{l|5#lF5MR0DczSW zvma5;FsEiHD=7P#ePv^r2%S+1IwrF;`HC1bOf=@DGw=7jT3oFw1Ji2!Xo&Z_-kUyt zdl*fOEUkM}R}7540Yb}uOkv8sH2#5kdq(Wo7duHt?Y{+Pm#y7v9=j30j$u!iU%QQl z-dYu{j^t32-HDpgixHT3I9Xp4DJ>Y)D4^%0CO)7nS|TVqt~V6H9v2M=@R^KAjh98@ zl`j!Mu{Q-KGLZQmdb^^z_kNsgmuf9A96ZZNKaIX{`AdsaHpHDVOe}=wI%XGTMZE;KZSKk}wDx2IMb=dP;^Ic4xX2Ju{}*TLKy z@8}9Y8Dq3J6%xvfjs;2PMgleaW30?LRZLN?l&9$tn3C(mTk>ZXQt^&f5Cv*nEDK|B z%b2{Gk8v?-h~t^r&TF2Rnm#z#j0|^ok7?tBun#=lWqwp(%3B`Rn8sWV`p!;g7S+7M@@ex7Ii8t7tiIOkA~6b zqPJXn3|_9{ukJ~%aAfy9#zJWvP3fXPNuw2!#-o^GL_~e$pSrl`+edlxPe5Dz^>?$Y z%uTdrsB6mQ_dku$D#xTkO;d+7LF*LH-`h$(mU`JS)@Ik!G(KPxSdyiqDeD)O`*7uV z2WUjSH*3Mq_U^y^iGT7G)VjRo7tjBEs8ov$g&M`n@>A`MF~lH;f}Y6ceFIBLHr!it zq)*iA5~C@L4^uQWm-%d@9QK-5j#}Bc88sF8ZLxa+x%u_+Y@yHKSO3!S{taYAS?p?W z=hm_tu6Q}q^P}e+T_v&f^gEi+)NHE0Q(UTmb>Q9oGqmf&turIOdyi9l=R7~Kdn(m8 zSd&)s4@<}VDUxn_x?8IpRX(du1qPZz<4y)mYlMK0ZcmY%Y|}NB)x73Z$GuPHv9syZ zVWXb+8l^l+C3E(2t5l{m?K7e#On$dlZXZQfTPiCl?f56i=_|^#UM<6!aMyPFIQ{Gm zNh!TorkpT6?c#ASy7P}3!A-h?+>cpolB^oN`f^}r>;7)wVAYt<%wH6BuP9`q@^1Ho z_#C;4pepaG>hEg@^l{IL_VUB7>5+~}vz~Fb?DDFwUfbXZwaC)!K>08LmYWZQhGSpJiS1jA$(^Ky`+=q-9D)P#I!N+PWwA?Y5&Tgp9Q;qHYJk>Yf`){=O zqE!7dg z93#Z%&E`tIbjyj^xGu9{g4=2xpN^mY^l0`A1(Eo)Zdz^mch%jC}oF?VmXf>}(@K0iyeDRcC8Y*{HePGckk>O`Ik~4q*APwgw zRovX21fRI#oIM!U6VoeoMdwG%h)>SLSgB_6-DAD?Njb|zwooeHKST9DPo9w+qyAE5 zoJ}#0+mr8-3xp@;5nlORzb35`SV9m~*yKo}BcGtu&x+Q1-e3Lr-urcX4@AE_HrT~Sb@GG<8_tx< zEaYssDz&N>Ojy<}QCGIsd41fJvm%9DpE$d`cv0YIT(9G6?#}-Kc}GBbdI*_|`MugB z<3wmqitx3Mke#l)Dxq{i1Xs(yjn3t9xMI<4xAgN2-KK2Svfs(9R{2Md zE7Lx%#N@3B>iCNPyRS$__e$l$;L>#im7XCO{bs(P%#~hJtXhnBUxrK99%rGZb!E)2 z<*%~Vq7LH^xH2h$Um#96p*K?|s^^OfhrRE<2=NP0DbKRB8ftxB7}0EB@{=fQ{QGw| z(l-}j!pJ?p?)$`S+JO{#F6M2k(;@DOf{MgQ>8_HBDSzRdl8|cr%<1Z@XNN1Qey~1H zs7Vf(SPSs_zps+%a+Q>n)|$4LEjh#ajr-0y>Fn?M9ImzjIN&kvec%+hSi*&Qh`KW zv#tVfne5msQ;SqlQD9Wsd)t-4I_cgh7njm)+)mG04&;M<@1%@cmkcFOfjNrq}t^o%P(v5c2GEWM`&yU%mu*{&;%4*%i4xp%LnR3?2& za7$CoPR2Q=pkOFu#(w)T?Ke8^WSC-luluxY`01@E<3R!Gv0Lw zx%IV-?{jUL&W{|Ky2XN&sAh#{1qH^gEuGWu@$vXX6qj3L$nW`^w#}lJv6xz%yP2!I z#b8_w0c2^c@Ki8>A6J~c#1g&MWCqQXl?_jyDd3McU0?b&l(w3M|5*PswB$4HofIWw zYMnr5#V+ZE%sy=LS|}TCPO4ZPaj;kQdoraerkcxR5aVNhgt+mcfVq;N>+5SVAMIT- z;61m~+PabWMYpXHhk80q(EuMTd8QYBc=f#3%TFd{^2zyV2|Earv zcO>aWS>F?r^X?gv%`%Dn<*h|S9lybMs@0L_+9xP73>sTcZa@y{*)-|5sCe$pf4PWD zWonh)-gsM|n6gJNOi-acJ$h61r`X4DJ=Rh$-W&&G)FfV}CYK&R-O!RcY3KQm5Zjwo zEJWY$Sl3yh?2zM4ZhVw6oYMWu-Y-Y38t4;|mqqqic{g_(GWKpy`$tWHbZ1)a+SjbRv`^7jsn#)JMJmMVr_ej??PyC2avr!2&2tC1I_-m6^SlA9- zCJ{ykT--6%w#a+nD*0(gu1PNJPO_i&dnlA^Cgfz0lKmqb6bxWI<*QbjxN~1WoHs2h znueDVW@G>u<4_nF6Z6bA6L*4Pms-taMo-wKFFX|&1B1av-*MshJZx$1veLSe-J%aa z7KTTp3ftM?oDy_@xx7TQP|IS1wXE@|6&l8ae1zTyl6IJza zdU)_4Vzi1^a{`sbC)Bt9#@bV`Gpgp@?V3RCJVjegUzCTlMvdlu{&&&J6B|)o5uLka z8Vp_&I2P5R46#MUAPNK@_6v%xhjiwQ zM3c}M!<`?sL}ikKI`*0Ld6baJJff32b==sf?`j*?ebj?9yR5bPHbK4Ls85)b0}R$b zWp5)G@2JigHaWz2P!ENuO(l{|<=Ab~9HhtuSXEKDvH%H37Fa-pJ;?aLxpIt8j|X`X z(~W81-IA5P%|SLXe?kA{IwfEnrV-!N3#|U`>0m4=bMHj=$yvequGE959UZ#2 zQzdZ}L(RqRKVtN$-VC@~6vE#1bX4E13^cv2v|rSDVBL!xJBSI6kh4!&Zkji#$(0Le z*y*fP7he~xAJ9m&!$nYvZd|pmD6}#^AB~)$0Brfp#4&;?LW{g&y zds^XfTNcvJ|7NhtliLBr-IN)~ZI!W&BhAGb_^-8xx*1=_qWyn9(|2<(+~WS^00Z-( z8?i5TV&?{3=K6SiEe8=(rrCBaE!UcPTYic?mHnCwW3Gb!Kuk3l0Udk5KE!*WP#M+zk9J(b%?HrEEHA&(TMnt?DI<* zf*USV(Ec{%8pS~oCg>n7cZildWr%ioxM-TW5JEbVET6`%hpj$e{=7X+bJ^ zF?&Ls2N$OnpKr{~#4xSLH=mmsZ;580u{)gynmKW|(r3kKzK)?`FM|I%6wT33RRd0( z0s!v5N)i8<<|1+81K@ Date: Thu, 22 Feb 2024 13:38:47 +0100 Subject: [PATCH 05/22] Add BRF (without Tuning) Add Balanced Random Forest (aka down sampling) No tuning for BRF yet --- R/BIOMOD_Modeling.R | 5 ++- R/biomod2_classes_0.R | 7 +++- R/biomod2_classes_4.R | 80 ++++++++++++++++++++++++++++++++++++++++ R/biomod2_data.R | 2 +- R/bm_ModelingOptions.R | 4 +- R/bm_RunModelsLoop.R | 21 ++++++++--- R/bm_Tuning.R | 4 +- data/ModelsTable.rda | Bin 402 -> 412 bytes data/OptionsBigboss.rda | Bin 13922 -> 13946 bytes vignettes/news.Rmd | 1 + 10 files changed, 110 insertions(+), 14 deletions(-) diff --git a/R/BIOMOD_Modeling.R b/R/BIOMOD_Modeling.R index a952c275..eaa2f0df 100644 --- a/R/BIOMOD_Modeling.R +++ b/R/BIOMOD_Modeling.R @@ -16,7 +16,7 @@ ##' (\emph{a random number by default}) ##' @param models a \code{vector} containing model names to be computed, must be among ##' \code{ANN}, \code{CTA}, \code{FDA}, \code{GAM}, \code{GBM}, \code{GLM}, \code{MARS}, -##' \code{MAXENT}, \code{MAXNET}, \code{RF}, \code{SRE}, \code{XGBOOST} +##' \code{MAXENT}, \code{MAXNET}, \code{RF}, \code{BRF}, \code{SRE}, \code{XGBOOST} ##' @param models.pa (\emph{optional, default} \code{NULL}) \cr ##' A \code{list} containing for each model a \code{vector} defining which pseudo-absence datasets ##' are to be used, must be among \code{colnames(bm.format@PA.table)} @@ -139,6 +139,7 @@ ##' (\url{https://biodiversityinformatics.amnh.org/open_source/maxent/}) ##' \item \code{MAXNET} : Maximum Entropy (\code{\link[maxnet]{maxnet}}) ##' \item \code{RF} : Random Forest (\code{\link[randomForest]{randomForest}}) +##' \item \code{BRF} : Balanced Random Forest (\code{\link[randomForest]{randomForest}}) ##' \item \code{SRE} : Surface Range Envelop or usually called BIOCLIM (\code{\link{bm_SRE}}) ##' \item \code{XGBOOST} : eXtreme Gradient Boosting Training (\code{\link[xgboost]{xgboost}}) ##' }} @@ -603,7 +604,7 @@ BIOMOD_Modeling <- function(bm.format, models.switch.off <- NULL ## check if model is supported - avail.models.list <- c('ANN', 'CTA', 'FDA', 'GAM', 'GBM', 'GLM', 'MARS', 'MAXENT', 'MAXNET', 'RF', 'SRE', 'XGBOOST') + avail.models.list <- c('ANN', 'CTA', 'FDA', 'GAM', 'GBM', 'GLM', 'MARS', 'MAXENT', 'MAXNET', 'RF','BRF', 'SRE', 'XGBOOST') .fun_testIfIn(TRUE, "models", models, avail.models.list) ## Specific case of one variable with GBM / MAXNET diff --git a/R/biomod2_classes_0.R b/R/biomod2_classes_0.R index 13fcd79e..de5c0f35 100644 --- a/R/biomod2_classes_0.R +++ b/R/biomod2_classes_0.R @@ -75,7 +75,7 @@ setGeneric("BIOMOD.options.default", def = function(mod, typ, pkg, fun) { standa .BIOMOD.options.default.check.args <- function(mod, typ, pkg, fun) { ## check if model is supported - avail.models.list <- c('ANN', 'CTA', 'FDA', 'GAM', 'GBM', 'GLM', 'MARS', 'MAXENT', 'MAXNET', 'RF', 'SRE', 'XGBOOST') + avail.models.list <- c('ANN', 'CTA', 'FDA', 'GAM', 'GBM', 'GLM', 'MARS', 'MAXENT', 'MAXNET', 'RF','BRF', 'SRE', 'XGBOOST') .fun_testIfIn(TRUE, "mod", mod, avail.models.list) ## check if type is supported @@ -444,6 +444,11 @@ setMethod('BIOMOD.options.dataset', signature(strategy = 'character'), argstmp$mtry = 1 argstmp$type <- "classification" } + if (mod == "BRF") { + argstmp[["x"]] = NULL + argstmp$mtry = 1 + argstmp$type <- "classification" + } if (mod == "XGBOOST") { argstmp$nrounds = 4 } BOM@args.default <- argstmp ## SHOULD BE MOVED to place when testing values !! ?? diff --git a/R/biomod2_classes_4.R b/R/biomod2_classes_4.R index b78ec2bf..fd246c40 100644 --- a/R/biomod2_classes_4.R +++ b/R/biomod2_classes_4.R @@ -76,6 +76,7 @@ NULL ##' @aliases MAXENT_biomod2_model-class ##' @aliases MAXNET_biomod2_model-class ##' @aliases RF_biomod2_model-class +##' @aliases BRF_biomod2_model-class ##' @aliases SRE_biomod2_model-class ##' @aliases XGBOOST_biomod2_model-class ##' @author Damien Georges @@ -117,6 +118,7 @@ NULL ##' \item \code{MAXNET_biomod2_model} : \code{model_class} is ##' \code{MAXNET} ##' \item \code{RF_biomod2_model} : \code{model_class} is \code{RF} +##' \item \code{BRF_biomod2_model} : \code{model_class} is \code{BRF} ##' \item \code{SRE_biomod2_model} : \code{model_class} is \code{SRE} ##' } ##' @@ -138,6 +140,7 @@ NULL ##' showClass("MAXENT_biomod2_model") ##' showClass("MAXNET_biomod2_model") ##' showClass("RF_biomod2_model") +##' showClass("BRF_biomod2_model") ##' showClass("SRE_biomod2_model") ##' NULL @@ -275,6 +278,8 @@ setMethod('predict', signature(object = 'biomod2_model'), ##' @aliases predict2.MAXNET_biomod2_model.data.frame ##' @aliases predict2.RF_biomod2_model.SpatRaster ##' @aliases predict2.RF_biomod2_model.data.frame +##' @aliases predict2.BRF_biomod2_model.SpatRaster +##' @aliases predict2.BRF_biomod2_model.data.frame ##' @aliases predict2.SRE_biomod2_model.SpatRaster ##' @aliases predict2.SRE_biomod2_model.data.frame ##' @author Remi Patin @@ -1112,6 +1117,81 @@ setMethod('predict2', signature(object = 'RF_biomod2_model', newdata = "data.fra } ) +#----------------------------------------------------------------------------- # +## 8.10_bis BRF_biomod2_model ----------------------------------------------------- +#----------------------------------------------------------------------------- # +##' @name BRF_biomod2_model-class +##' @rdname biomod2_model +##' @export + +setClass('BRF_biomod2_model', + representation(), + contains = 'biomod2_model', + prototype = list(model_class = 'BRF'), + validity = function(object) { # check model class + if (!inherits(object@model, "randomForest")) { return(FALSE)} else { return(TRUE) } + }) + +##' +##' @rdname predict2.bm +##' + + +setMethod('predict2', signature(object = 'BRF_biomod2_model', newdata = "SpatRaster"), + function(object, newdata, ...) { + pa <- .extract_modelNamesInfo(object@model_name, obj.type = "mod", info = "PA") + run <- .extract_modelNamesInfo(object@model_name, obj.type = "mod", info = "run") + dataset <- paste0("_", pa, "_", run) + + if (!is.null(object@model_options@args.values[[dataset]]$type) && object@model_options@args.values[[dataset]]$type == "classification") { + predfun <- function(object, newdata, mod.name){ + # new predict command used with terra + subset(predict(newdata, model = get_formal_model(object), + type = 'prob', + wopt = list(names = rep(mod.name,2))), + 2) + # old predict function used with raster + # predict(newdata, model = get_formal_model(object), type = 'prob', index = 2) + } + } else { #regression case + predfun <- function(object, newdata, mod.name){ + predict(newdata, model = get_formal_model(object), + type = 'response', + wopt = list(names = rep(mod.name,2))) + } + } + + # old predict function used with raster + # predict(newdata, model = get_formal_model(object), type = 'prob', index = 2) + # redirect to predict2.biomod2_model.SpatRaster + + callNextMethod(object, newdata, predfun = predfun, ...) + + } +) + +##' @rdname predict2.bm +setMethod('predict2', signature(object = 'BRF_biomod2_model', newdata = "data.frame"), + function(object, newdata, ...) { + pa <- .extract_modelNamesInfo(object@model_name, obj.type = "mod", info = "PA") + run <- .extract_modelNamesInfo(object@model_name, obj.type = "mod", info = "run") + dataset <- paste0("_", pa, "_", run) + + if (!is.null(object@model_options@args.values[[dataset]]$type) && object@model_options@args.values[[dataset]]$type == "classification") { + predfun <- function(object, newdata, not_na_rows) { + as.numeric(predict(get_formal_model(object), as.data.frame(newdata[not_na_rows, , drop = FALSE]), type = 'prob')[, '1']) + } + } else { # regression case + predfun <- function(object, newdata, not_na_rows) { + as.numeric(predict(get_formal_model(object), as.data.frame(newdata[not_na_rows, , drop = FALSE]), type = 'response')) + } + } + # redirect to predict2.biomod2_model.data.frame + callNextMethod(object, newdata, predfun = predfun, ...) + } +) + + #----------------------------------------------------------------------------- # ## 8.11 SRE_biomod2_model ---------------------------------------------------- diff --git a/R/biomod2_data.R b/R/biomod2_data.R index d628707f..3f09ba96 100644 --- a/R/biomod2_data.R +++ b/R/biomod2_data.R @@ -141,7 +141,7 @@ #' } #' \item{\code{XGBOOST.binary.xgboost.xgboost}}{ #' \itemize{ -#' \item \code{max.depth = 2} +#' \item \code{max_depth = 2} #' \item \code{eta = 1} #' \item \code{nthread = 2} #' \item \code{nrounds = 4} diff --git a/R/bm_ModelingOptions.R b/R/bm_ModelingOptions.R index 5f19fa26..04df40e3 100644 --- a/R/bm_ModelingOptions.R +++ b/R/bm_ModelingOptions.R @@ -11,7 +11,7 @@ ##' \code{binary}, \code{binary.PA}, \code{abundance}, \code{compositional} ##' @param models a \code{vector} containing model names to be computed, must be among ##' \code{ANN}, \code{CTA}, \code{FDA}, \code{GAM}, \code{GBM}, \code{GLM}, \code{MARS}, -##' \code{MAXENT}, \code{MAXNET}, \code{RF}, \code{SRE}, \code{XGBOOST} +##' \code{MAXENT}, \code{MAXNET}, \code{RF}, \code{BRF}, \code{SRE}, \code{XGBOOST} ##' @param strategy a \code{character} corresponding to the method to select models' parameters ##' values, must be either \code{default}, \code{bigboss}, \code{user.defined}, \code{tuned} ##' @param user.val (\emph{optional, default} \code{NULL}) \cr @@ -321,7 +321,7 @@ bm_ModelingOptions <- function(data.type ## check if model is supported avail.models.list <- c('ANN', 'CTA', 'FDA', 'GAM', 'GAM.gam.gam', 'GAM.mgcv.bam', 'GAM.mgcv.gam' - , 'GBM', 'GLM', 'MARS', 'MAXENT', 'MAXNET', 'RF', 'SRE', 'XGBOOST') + , 'GBM', 'GLM', 'MARS', 'MAXENT', 'MAXNET', 'RF','BRF', 'SRE', 'XGBOOST') .fun_testIfIn(TRUE, "models", models, avail.models.list) if (length(grep('GAM', models)) > 1) { stop("Only one GAM model can be activated. Please choose betwen 'GAM', 'GAM.gam.gam', 'GAM.mgcv.bam' or 'GAM.mgcv.gam'") diff --git a/R/bm_RunModelsLoop.R b/R/bm_RunModelsLoop.R index 5f3fe6fb..a720614b 100644 --- a/R/bm_RunModelsLoop.R +++ b/R/bm_RunModelsLoop.R @@ -22,7 +22,7 @@ ##' (\emph{a random number by default}) ##' @param models a \code{vector} containing model names to be computed, must be among ##' \code{ANN}, \code{CTA}, \code{FDA}, \code{GAM}, \code{GBM}, \code{GLM}, \code{MARS}, -##' \code{MAXENT}, \code{MAXNET}, \code{RF}, \code{SRE}, \code{XGBOOST} +##' \code{MAXENT}, \code{MAXNET}, \code{RF}, \code{BRF}, \code{SRE}, \code{XGBOOST} ##' @param models.pa (\emph{optional, default} \code{NULL}) \cr ##' A \code{list} containing for each model a \code{vector} defining which pseudo-absence datasets ##' are to be used, must be among \code{colnames(bm.format@PA.table)} @@ -215,7 +215,8 @@ bm_RunModel <- function(model, run.name, dir.name = '.' opt_name <- grep(model, names(bm.options@options), value = TRUE) if (length(opt_name) == 1) { bm.opt <- bm.options@options[[opt_name]] - } else { stop("pitiprobleum") } ## Should not happen now + } else if (model == 'RF'){bm.opt <- bm.options@options[["RF.binary.randomForest.randomForest"]] } + else { stop("pitiprobleum") } ## Should not happen now if (length(grep("GAM", model)) == 1) { subclass_name <- paste0(bm.opt@model, "_", bm.opt@type, "_", bm.opt@package) @@ -234,7 +235,7 @@ bm_RunModel <- function(model, run.name, dir.name = '.' if (model != "MAXENT") { ## ANY MODEL BUT MAXENT ------------------------------------------------ ## PRELIMINAR --------------------------------------------------- - if (model %in% c("ANN", "MARS", "RF")) { + if (model %in% c("ANN", "MARS", "RF","BRF")) { bm.opt.val$formula <- bm_MakeFormula(resp.name = resp_name , expl.var = head(data_env) , type = 'simple' @@ -247,9 +248,17 @@ bm_RunModel <- function(model, run.name, dir.name = '.' bm.opt.val$strata <- data_mod[calib.lines.vec, , drop = FALSE][ , resp_name] bm.opt.val$sampsize <- unlist(ifelse(!is.null(bm.opt.val$sampsize), list(bm.opt.val$sampsize), length(data_sp[calib.lines.vec]))) ## TOCHECK !! } + if (model == "BRF" && !is.null(bm.opt.val$type) && bm.opt.val$type == "classification") { + # defining occurrences as factor for doing classification and not regression in RF + data_mod <- data_mod %>% mutate_at(resp_name, factor) + bm.opt.val$strata <- data_mod[calib.lines.vec, , drop = FALSE][ , resp_name] + nb_presences <- summary(data_mod[calib.lines.vec,resp_name])[["1"]] + bm.opt.val$sampsize <- unlist(ifelse(!is.null(bm.opt.val$sampsize), list(bm.opt.val$sampsize), list(c("0" =nb_presences,"1" =nb_presences)))) + bm.opt.val$replace <- unlist(ifelse(!is.null(bm.opt.val$replace), list(bm.opt.val$replace), TRUE)) + } ## FILL data parameter ------------------------------------------ - if (model %in% c("ANN", "CTA", "FDA", "GAM", "GBM", "MARS", "RF")) { + if (model %in% c("ANN", "CTA", "FDA", "GAM", "GBM", "MARS", "RF","BRF")) { bm.opt.val$data <- data_mod[calib.lines.vec, , drop = FALSE] } else if (model == "GLM") { bm.opt.val$data <- cbind(data_mod[calib.lines.vec, , drop = FALSE], @@ -281,7 +290,7 @@ bm_RunModel <- function(model, run.name, dir.name = '.' } ## REORGANIZE order of parameters ------------------------------- - if (model %in% c("ANN", "MARS", "RF")) { + if (model %in% c("ANN", "MARS", "RF","BRF")) { bm.opt.val <- bm.opt.val[c("formula", "data", names(bm.opt.val)[which(!(names(bm.opt.val) %in% c("formula", "data")))])] } if (model %in% c("FDA")) { @@ -333,7 +342,7 @@ bm_RunModel <- function(model, run.name, dir.name = '.' } ## POSTLIMINAR -------------------------------------------------- - if (model == "RF" && !is.null(bm.opt.val$type) && bm.opt.val$type == "classification") { + if (model %in% c("RF","BRF") && !is.null(bm.opt.val$type) && bm.opt.val$type == "classification") { # canceling occurences class modifications data_mod <- data_mod %>% mutate_at(resp_name, function(.x) { .x %>% as.character() %>% as.numeric() diff --git a/R/bm_Tuning.R b/R/bm_Tuning.R index 47036f72..7436402f 100644 --- a/R/bm_Tuning.R +++ b/R/bm_Tuning.R @@ -284,7 +284,7 @@ bm_Tuning <- function(model, cat(paste0("\n\t\t> Dataset ", dataset.i)) argstmp <- bm.options@args.default - if (model == "MAXNET") { + if (model == "MAXNET" | model == "BRF") { warning("No tuning available for that model. Sorry.") } else { ## 1. SPECIFIC CASE OF MAXENT OR SRE ------------------------------------------------------------ @@ -505,7 +505,7 @@ bm_Tuning <- function(model, { ## check model -------------------------------------------------------------- .fun_testIfIn(TRUE, "model", model, c("ANN", "CTA", "FDA", "GAM", "GBM", "GLM" - , "MARS", "MAXENT", "MAXNET", "RF", "SRE", "XGBOOST")) + , "MARS", "MAXENT", "MAXNET", "RF","BRF", "SRE", "XGBOOST")) ## check namespace ---------------------------------------------------------- if (!isNamespaceLoaded("caret")) { diff --git a/data/ModelsTable.rda b/data/ModelsTable.rda index dc6ccac8bff6170cb06d4298f160ac1fe5690081..84e282fe8c98a28e8c0dff5d40c7ebe41c2358b4 100644 GIT binary patch literal 412 zcmV;N0b~9jiwFP!000002HliVPr@(|$IH5n04AFFIV28H@o^~Q#f=1J!kf9VGKuR( zx`FWJjV0M_I2JK6zWC7W_rG25`fr;~9%tR=tVsx=M5PL$nna>KyVg~o5LJ<)MpV*} z-F*}AukK;Xi4_PGl>2}f0LOG5%r_NG z0}oTQB!x6V!DPkP>Vx61Eqb2`i2Rsav0%w}vAVa6dF*#kZUZll<=>yWT2#5BUV#VE z!V?Wb{#TB4kG~vTz-mJ}Y#isLrG{MmbQLZm_FH4Ep<}ZRglkAyr8`9|j_BBlD;O(1 z5?TbDC7C@9gM9yT;Nhja6*jG}VEzUHN_DZ0<~S!6u#8I88zO#hA9lbEtQiP+b!uIN z9>NX6Ey5i_AK@Nt8`n7*Ibm^Xbc$d%r(St8<{>1wR17wKNTIzD(uGtX`|$~&xGQ6Y G1polna=z>U literal 402 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 literal 13922 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 VZKmZPGWADN29?&^W&*@#{|9HIFRlOp diff --git a/vignettes/news.Rmd b/vignettes/news.Rmd index 6c87a262..f2c059dd 100644 --- a/vignettes/news.Rmd +++ b/vignettes/news.Rmd @@ -20,6 +20,7 @@ vignette: > - Add _seed.val_ for bm_pseudoAbsences and BIOMOD_FormatingData - Stop dans BIOMOD_FormatingData (càd biomod2_classes_1) si selection de PA à échouer. (Message okay ?) - Add an argument _fact.agg_ (factor.aggregate à changer au besoin) for PseudoAbsences selection with the disk method. It allows to reduce the resolution of the environnement. NULL par défaut, donné à aggregate pour modifier résolution. **à faire remonter à BIOMOD_FormatingData ou laisser à bm_PseudoAbsences** +- Change max.depth into max_depth in OptionsBigboss (automatic in default) From 619626444a61a7435ea9367ad725e7c873f2c0f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=89L=C3=88NE=20BLANCHETEAU?= Date: Mon, 26 Feb 2024 14:17:58 +0100 Subject: [PATCH 06/22] Tuning of BRF Take in account the master modification for Maxent tuning --- R/biomod2_data.R | 14 ++++++++--- R/bm_ModelingOptions.R | 2 +- R/bm_Tuning.R | 54 ++++++++++++++++++++++++++++++++++++----- data/ModelsTable.rda | Bin 412 -> 405 bytes vignettes/news.Rmd | 3 ++- 5 files changed, 61 insertions(+), 12 deletions(-) diff --git a/R/biomod2_data.R b/R/biomod2_data.R index 3f09ba96..2df004c1 100644 --- a/R/biomod2_data.R +++ b/R/biomod2_data.R @@ -32,14 +32,14 @@ "ModelsTable" # ModelsTable <- data.frame(model = c('ANN', 'CTA', 'FDA', 'GAM', 'GAM', 'GAM', 'GBM', 'GLM' -# , 'MARS', 'MAXENT', 'MAXNET', 'RF', 'SRE', 'XGBOOST') +# , 'MARS', 'MAXENT', 'MAXNET', 'RF','BRF', 'SRE', 'XGBOOST') # , type = 'binary' # , package = c('nnet', 'rpart', 'mda', 'gam', 'mgcv', 'mgcv', 'gbm', 'stats' -# , 'earth', 'MAXENT', 'maxnet', 'randomForest', 'biomod2', 'xgboost') +# , 'earth', 'MAXENT', 'maxnet', 'randomForest','randomForest', 'biomod2', 'xgboost') # , func = c('nnet', 'rpart', 'fda', 'gam', 'bam', 'gam', 'gbm', 'glm' -# , 'earth', 'MAXENT', 'maxnet', 'randomForest', 'bm_SRE', 'xgboost') +# , 'earth', 'MAXENT', 'maxnet', 'randomForest','randomForest', 'bm_SRE', 'xgboost') # , train = c('avNNet', 'rpart', 'fda', 'gamSpline', 'bam', 'gam', 'gbm', 'glm' -# , 'earth', 'ENMevaluate', 'maxnet', 'rf', 'bm_SRE', 'xgbTree')) +# , 'earth', 'ENMevaluate', 'maxnet', 'rf', 'rf', 'bm_SRE', 'xgbTree')) # usethis::use_data(ModelsTable, overwrite = TRUE) @@ -198,6 +198,12 @@ # bm.opt@options$RF.binary.randomForest.randomForest@args.values[['_allData_allRun']]$sampsize = NULL # bm.opt@options$RF.binary.randomForest.randomForest@args.values[['_allData_allRun']]$nodesize = 5 # bm.opt@options$RF.binary.randomForest.randomForest@args.values[['_allData_allRun']]$maxnodes = NULL +# bm.opt@options$BRF.binary.randomForest.randomForest@args.values[['_allData_allRun']]$type = 'classification' +# bm.opt@options$BRF.binary.randomForest.randomForest@args.values[['_allData_allRun']]$ntree = 500 +# bm.opt@options$BRF.binary.randomForest.randomForest@args.values[['_allData_allRun']]$mtry = NULL +# bm.opt@options$BRF.binary.randomForest.randomForest@args.values[['_allData_allRun']]$strata = factor(c(0, 1)) +# bm.opt@options$BRF.binary.randomForest.randomForest@args.values[['_allData_allRun']]$nodesize = 5 +# bm.opt@options$BRF.binary.randomForest.randomForest@args.values[['_allData_allRun']]$maxnodes = NULL # bm.opt@options$SRE.binary.biomod2.bm_SRE@args.values[['_allData_allRun']]$do.extrem = TRUE # bm.opt@options$XGBOOST.binary.xgboost.xgboost@args.values[['_allData_allRun']]$max.depth = 2 # bm.opt@options$XGBOOST.binary.xgboost.xgboost@args.values[['_allData_allRun']]$eta = 1 diff --git a/R/bm_ModelingOptions.R b/R/bm_ModelingOptions.R index 04df40e3..6cd877bb 100644 --- a/R/bm_ModelingOptions.R +++ b/R/bm_ModelingOptions.R @@ -239,7 +239,7 @@ bm_ModelingOptions <- function(data.type , models = c('ANN', 'CTA', 'FDA', 'GAM', 'GBM', 'GLM' - , 'MARS', 'MAXENT', 'MAXNET', 'RF', 'SRE', 'XGBOOST') + , 'MARS', 'MAXENT', 'MAXNET', 'RF','BRF', 'SRE', 'XGBOOST') , strategy, user.val = NULL, user.base = "bigboss" , bm.format = NULL, calib.lines = NULL) { diff --git a/R/bm_Tuning.R b/R/bm_Tuning.R index 7436402f..e033acf6 100644 --- a/R/bm_Tuning.R +++ b/R/bm_Tuning.R @@ -10,7 +10,7 @@ ##' ##' @param model a \code{character} corresponding to the algorithm to be tuned, must be either ##' \code{ANN}, \code{CTA}, \code{FDA}, \code{GAM}, \code{GBM}, \code{GLM}, \code{MARS}, -##' \code{MAXENT}, \code{MAXNET}, \code{RF}, \code{SRE}, \code{XGBOOST} +##' \code{MAXENT}, \code{MAXNET}, \code{RF}, \code{BRF}, \code{SRE}, \code{XGBOOST} ##' @param tuning.fun a \code{character} corresponding to the model function name to be called ##' through \code{\link[caret]{train}} function for tuning parameters (see \code{\link{ModelsTable}} ##' dataset) @@ -74,6 +74,7 @@ ##' \item{MARS}{\code{degree}, \code{nprune}} ##' \item{MAXENT}{\code{algorithm}, \code{parallel}} ##' \item{RF}{\code{mtry}} +##' \item{BRF}{\code{mtry}} ##' \item{SRE}{\code{quant}} ##' \item{XGBOOST}{\code{nrounds}, \code{max_depth}, \code{eta}, \code{gamma}, ##' \code{colsampl_bytree}, \code{min_child_weight}, \code{subsample}} @@ -213,6 +214,7 @@ bm_Tuning <- function(model, MAXENT.algorithm = 'maxnet', MAXENT.parallel = 'TRUE', RF.mtry = 1:min(10, ncol(bm.format@data.env.var)), + BRF.mtry = 1:min(10, ncol(bm.format@data.env.var)), SRE.quant = c(0, 0.0125, 0.025, 0.05, 0.1), XGBOOST.nrounds = 50, XGBOOST.max_depth = 1, @@ -284,7 +286,7 @@ bm_Tuning <- function(model, cat(paste0("\n\t\t> Dataset ", dataset.i)) argstmp <- bm.options@args.default - if (model == "MAXNET" | model == "BRF") { + if (model == "MAXNET") { warning("No tuning available for that model. Sorry.") } else { ## 1. SPECIFIC CASE OF MAXENT OR SRE ------------------------------------------------------------ @@ -305,6 +307,7 @@ bm_Tuning <- function(model, if (params.train$MAXENT.algorithm == "maxnet") { mySpExpl[["_allData_allRun"]] <- NULL mySpExpl[, 1] <- ifelse(mySpExpl[, 1] == 1 & !is.na(mySpExpl[, 1]), 1, 0) + mySpExpl <- mySpExpl[, 1:(3+ncol(bm.format@data.env.var))] } @@ -529,6 +532,40 @@ bm_Tuning <- function(model, ## check bm.format ---------------------------------------------------------- .fun_testIfInherits(TRUE, "bm.format", bm.format, c("BIOMOD.formated.data", "BIOMOD.formated.data.PA")) + ## check params.train ------------------------------------------------------- + params.train_init = list(ANN.size = c(2, 4, 6, 8), + ANN.decay = c(0.001, 0.01, 0.05, 0.1), + ANN.bag = FALSE, + FDA.degree = 1:2, + FDA.nprune = 2:38, + GAM.select = c(TRUE, FALSE), + GAM.method = c('GCV.Cp', 'GACV.Cp', 'REML', 'P-REML', 'ML', 'P-ML'), + GBM.n.trees = c(500, 1000, 2500), + GBM.interaction.depth = seq(2, 8, by = 3), + GBM.shrinkage = c(0.001, 0.01, 0.1), + GBM.n.minobsinnode = 10, + MARS.degree = 1:2, + MARS.nprune = 2:max(38, 2 * ncol(bm.format@data.env.var) + 1), + MAXENT.algorithm = 'maxnet', + MAXENT.parallel = TRUE, + RF.mtry = 1:min(10, ncol(bm.format@data.env.var)), + SRE.quant = c(0, 0.0125, 0.025, 0.05, 0.1), + XGBOOST.nrounds = 50, + XGBOOST.max_depth = 1, + XGBOOST.eta = c(0.3, 0.4), + XGBOOST.gamma = 0, + XGBOOST.colsample_bytree = c(0.6, 0.8), + XGBOOST.min_child_weight = 1, + XGBOOST.subsample = 0.5) + for (i in names(params.train)) { + if (i %in% names(params.train_init)) { + params.train_init[[i]] = params.train[[i]] + } + } + params.train = params.train_init + + + ## check evaluation metric -------------------------------------------------- if (model == "MAXENT") { .fun_testIfIn(TRUE, "metric.eval", metric.eval, c("auc.val.avg", "auc.diff.avg", "or.mtp.avg", "or.10p.avg", "AICc")) @@ -559,9 +596,13 @@ bm_Tuning <- function(model, ## get tuning grid through params.train ------------------------------------- tuning.grid <- NULL - if (model %in% c("ANN", "FDA", "GAM", "GBM", "MARS", "RF", "XGBOOST")) { + if (model %in% c("ANN", "FDA", "GAM", "GBM", "MARS", "RF","BRF", "XGBOOST")) { if (!(model == "GAM" && tuning.fun == "gamSpline")) { - params.train = params.train[grep(model, names(params.train))] + if (model == "BRF") { + params.train = params.train[grep("RF", names(params.train))] + names(params.train) <- "BRF.mtry" + } + else {params.train = params.train[grep(model, names(params.train))]} .fun_testIfIn(TRUE, "names(params.train)", names(params.train), paste0(model, ".", train.params$params)) names(params.train) = sub(model, "", names(params.train)) tuning.grid <- do.call(expand.grid, params.train) @@ -571,7 +612,7 @@ bm_Tuning <- function(model, ## get tuning length -------------------------------------------------------- tuning.length <- 1 if (model == "CTA") tuning.length <- 30 - if (model == "RF") tuning.length <- min(30, ncol(bm.format@data.env.var)) + if (model == "RF" | model == "BRF") tuning.length <- min(30, ncol(bm.format@data.env.var)) ## get criteria ------------------------------------------------------------- if (do.stepAIC && (model == "GLM" || @@ -590,6 +631,7 @@ bm_Tuning <- function(model, , tuning.fun = tuning.fun , train.params = train.params , tuning.length = tuning.length - , tuning.grid = tuning.grid)) + , tuning.grid = tuning.grid + , params.train = params.train)) } diff --git a/data/ModelsTable.rda b/data/ModelsTable.rda index 84e282fe8c98a28e8c0dff5d40c7ebe41c2358b4..22f21d20585f6baa346861d5e5744b49c244b776 100644 GIT binary patch literal 405 zcmV;G0c!q2T4*^jL0KkKS?+LefdB!t|G@vg$N&HV5CA`ioItG4@dwRq#6KaC#4^%c}JvrfChj7000D$BU4Q#(rpNK`E^;Oup!3u#@GzUHX#{glIhDt zD{A3&L*sV>nevG?DX5h7gdby5e4U~dhDJyhv>^;6m^<81gP|msyzU5=?@ke;cJ*^Q z9CAm2$%V=la)5v>E4cNZ_b?%9K^rwxD}no^ITp*7=nT5Xw9&V;@x)$`i43{DQ|}!y z1OZb70rfr07C2hI*$v0NJe`aeG*Ja5s36AP7F%yLfI^=Fow`{N*5An!}n0Y&*JV#rwS4s&JFM&J=wG^ literal 412 zcmV;N0b~9jiwFP!000002HliVPr@(|$IH5n04AFFIV28H@o^~Q#f=1J!kf9VGKuR( zx`FWJjV0M_I2JK6zWC7W_rG25`fr;~9%tR=tVsx=M5PL$nna>KyVg~o5LJ<)MpV*} z-F*}AukK;Xi4_PGl>2}f0LOG5%r_NG z0}oTQB!x6V!DPkP>Vx61Eqb2`i2Rsav0%w}vAVa6dF*#kZUZll<=>yWT2#5BUV#VE z!V?Wb{#TB4kG~vTz-mJ}Y#isLrG{MmbQLZm_FH4Ep<}ZRglkAyr8`9|j_BBlD;O(1 z5?TbDC7C@9gM9yT;Nhja6*jG}VEzUHN_DZ0<~S!6u#8I88zO#hA9lbEtQiP+b!uIN z9>NX6Ey5i_AK@Nt8`n7*Ibm^Xbc$d%r(St8<{>1wR17wKNTIzD(uGtX`|$~&xGQ6Y G1polna=z>U diff --git a/vignettes/news.Rmd b/vignettes/news.Rmd index f2c059dd..e880f6fe 100644 --- a/vignettes/news.Rmd +++ b/vignettes/news.Rmd @@ -21,7 +21,8 @@ vignette: > - Stop dans BIOMOD_FormatingData (càd biomod2_classes_1) si selection de PA à échouer. (Message okay ?) - Add an argument _fact.agg_ (factor.aggregate à changer au besoin) for PseudoAbsences selection with the disk method. It allows to reduce the resolution of the environnement. NULL par défaut, donné à aggregate pour modifier résolution. **à faire remonter à BIOMOD_FormatingData ou laisser à bm_PseudoAbsences** - Change max.depth into max_depth in OptionsBigboss (automatic in default) - +- Add BRF Balenced Random Forest (down-sampling) +- Tuning for BRF: similar to RF (mtry only) ### 2023 From c19991fffef4deab48742baeb71b632833a4053b Mon Sep 17 00:00:00 2001 From: HeleneBlt Date: Wed, 28 Feb 2024 09:50:09 +0100 Subject: [PATCH 07/22] Minor corrections Miss a fact.aggr for disk method --- R/bm_PseudoAbsences.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/bm_PseudoAbsences.R b/R/bm_PseudoAbsences.R index ad91bb07..e4aaaa52 100644 --- a/R/bm_PseudoAbsences.R +++ b/R/bm_PseudoAbsences.R @@ -879,7 +879,7 @@ setGeneric("bm_PseudoAbsences_disk", ##' setMethod('bm_PseudoAbsences_disk', signature(expl.var = "SpatVector"), - function(resp.var, expl.var, dist.min, dist.max, nb.absences, nb.rep) { + function(resp.var, expl.var, dist.min, dist.max, nb.absences, nb.rep, fact.aggr) { cat("\n > Disk pseudo absences selection") # 1. determining area which can be selected coor <- crds(resp.var) From 92a90950483ccf246522676f1b3669ddf1b111c9 Mon Sep 17 00:00:00 2001 From: HeleneBlt Date: Wed, 13 Mar 2024 09:49:18 +0100 Subject: [PATCH 08/22] Update sysdata.rda --- R/sysdata.rda | Bin 8536 -> 8572 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/R/sysdata.rda b/R/sysdata.rda index c360dbc49bebae58f9ae0881de4d9c434fc1ab02..e1327d3b25ae4ff2332c4ea5b147624fea2a35ee 100644 GIT binary patch literal 8572 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 literal 8536 zcmZ8{XH*kR&~9QdK_v-TFth|k5D_#Wodn2>!YiVp7(yo?B|vCWrI`>VNE4(82nr&I z2_+!C8H^xZPyzX) zDgpp}i<}uGg#SywtTBLe(2$XIM*4WN?19(DProyAkK>PCG-F)Oy|dr)^wC^D-9A1! znNx|!j_JqH^l*`)qCx3^maj&7`a-c z(?tOwTpo_1OHu-W^`-Q5zv=>%1rpx8y`q|zj?AOy|3Aq90I=?U4NMVL0sw$niH1=m z7lX(7z(idD2>=xZ0HA<IQl5&TH{dJ26^D4dk~;yUzD`kVAOld2}) zei@N&Ue>41-Pe=CmA=fyG9JiE|LJY}D_O-nf!pxXQNTx)7MC;bkmS!Wflu?j4c8AW zJ;butL49x{ma;Rt2besur_+pjz76>K!;@+HL`$3+r;FZ$fcTn`X$kp`Z8OUv&36Ya_ zaziIyiE%(!xu%4KIx+CFdiXC8h$}^G`YCM$9gV`0noSfM1)fNvE)k#Sgi$v*sTdr& zm?CcXcC0ir>jh5@5~zdGUiN_JAy5J+d38?UJq>SD{A0Z#I0h@&uL&H2Re3?t}RGkz<3Rc{i~22U5ynuMXZaEp*M zf)}QH4A$?j7bCxFOE;};HnHecN-C2DnweRc>Ixk+mt^3s2*t~t6jsNx%@3S-`ZpF` zJzG$r81qqRi15<5Ab%=3+XGZPMavCc480`r)lGK#~P4y`f67cC0>W#xu@ToGFW1zy1W%bI zsSuDLTyn?|W4jj2=mk@DMVTMcbY9BoAg}#!y#1aoByL!OpRlJjX~XC4yxKCmW1j3} z7}dd4ye0BT-#*V#I?Ytr@YjdwLvsXxn|LFiq>Uy^5E~?qt?5OI|2QKC>4m3?gSI%s z;N?Gp{Teh%Fm41k;}62|j#zs%-Dtg*$Jb|ulGNaoiNeLTfE^N9l?MlkQnk&(@<|%B zNVTuo7m^Qs(`~($p$;1N-2>am{ITdf*h*dJ5a%K4ez-byOIio4+n*EQr5#krwT;rQ zC&)2okf-wJQL^jsa{L0aBsO5-d!_$h(gyc#nLk|j9%Inpjv76Ykc89?0A*pK>P72L z-0xX^!h_51N^O8vKjkq;8B6#Fe8IFeNI__Np@Ab|2qn0i^Yh6o9ao))+POByVJsiH zB`{=rZmphC0cNb6m`A1;hXixn2?ar)ikJ=9wqoMGO^XBo|8WY}77=_TBP^10>D|ZZ z44FGUCem>aDOJ4BsF(lzd*%4>0a4pqoVNA#J71I(ZySY}BAd6D##XY89xriz(4Kd| zywGS2km?Jmh2PQ4?h?o@M6!P45^flly020)5>OvM4MUG)dmPan1GC2<#>&FW zQ?PEQFNL&>i@zH%Lp8@<9d>^wokncFe40jv3PNJ2U(hPuuy{YtBAo%t_XqAavi22T za4aqnxX4Ko2Ue+qmxH^vM)%@ZHMaHQQXw(o>_xh)FAem4|9td9N2x7h9Nav;2F`;= ziBtSEGotR%v#+IMbZ;)eC@UNgQH>55l3=Zah}}f*2vE8@4L3!9At5>P2R#Xe$a;by z4w|Ds>74zZe$rVI=uMDUfL<0hegzV#bt)^Ew?t2sc(oe7d{Wj2avp@1*uHV|R+@|0 ziznN`VhPnMA4ST@0Sk?_2Zr?PwJbNmIi`JLz3;h!9@Z!y=aV|+p7qmq4Wquak8nW` z7|$2d1Y0J`#HFcPBDM749OgNA6dFIJEo1 z*e{TRlS3wNz8u4A2Hyi?(XC$XYoH3zXCc}E*KO)EE*#*qev{9z0$wL>*NtMs`F+5k z8QQaFDMiNPu=r3wsNmR`H~yzL1mRgfL&6IF(u*4}VxJp_09L{$1fVn?L^crQ6{6ei zOKXM$LYGHG;j(D)&e35ANsIELKLCWoE(hUSVB7%>P6tGnsM$C{!+nRvhXDE|h(95K z4bA|ZjAboD5L#4f;OKY+?Gv1zj5PCrb@Z#ziP{M4vcFyx5*dxBJbzl180Rw#z~0|0fGxYd ztY3lKnXEs8Y@Rr^TLSn6{z8n_0d4FMg|x%6f~YJj>Q4ximOlkEzCXGL9{x4l zH+UQZh1T3Z@B3U2zM;AhCOav?s5TBVuIg})Zh9ys(Bmi3@Y8O6Wv0BC0K8*%hrd?2j|*%F{vAjVnO4L-HY z>wYjKvAhS^6Z~zrK#xQnM_=6B*M}_zw_3KzkkJFbUAPiyf!PyAj9_te?Ggh( zz)&=Mi%Qkd19pkgaM=Dp>h9=51aCK+8p>ktPwO7|;726O6B@odO4-6u)WJNi?Heiy zAaW5#7!ucBmg&Mb%P9=PtMB$up4K$=o( zzLGCg3=MaB%+3#3@IGE{NzqP7i#S~Ut z)|SZJ*@VdCJ$l$4ljzMIzV!M_Yu?nj;oO&~53U)mzW$S%)6V&Ndb&@$P!IYDmuwTY z0^UK+XQaJ5?P1T+=o{}`(C2;!E;REw=SIuTGue4gPDZePbOfG=8BS?SWqx|$!c|V} zXw0w=iZMTulXLM&^7G=(=PBsaq*svxc>OO7)#O`cjJUF1XL%Lk?b-Gd|Fr6#J~Jem z5}zm?CHJA^c7e=60U4q5hoYj)03T0WFcY-dJ)TQqKTZ4ax>*|WQN}BaiO8pa2A{sp zbH^(m@iXC1XUYoW5m%EPu2!1^Tu{0TZ0P=n)+C z+5t8+l3fU-u+R#4Gognh(Zk<}P%xj1DD=Q{DV&nBC{!9PbBH8`qqvJgK|o3>LNtl3 zEC4LWXOUF!`|L#5LU2zZjTj@q&ou+Lu=oA3FDYQ!{xhOLfRD|R0UtC&K&3!9ifhV2 z21}K}l8y%9T$#9JqQYCECHNqflAg5hlwFqsmRo|UE<|MnI0b~GqS2BAXfb)PJn$*e zUIhw1+THDt5}|jvG!Yj+R0!tCRgwzP*H1k1XcIa@|1yw%N3hcV--HJ9y*T%xn|BRY z?AEpF>PLFT8;OsJSKLH(OI(!gELLJ(bqm#J<=l95;Buq@c*Mne_QSn<)YsE3@AR$t zIew`pO^D=kDJ}_-GwzONxk0KT>f<*;2L51`Yf3D=-g~sy&3UJDyo+DHAP>!@_4Rgk zZzxTT#43=}l` z@iZ5vsa?jgS7w4y2s>@QHqp!Zk*wRV`Jc+-fd6DjU+xC3NQ<7m?8kRef{Brd>jH zWc}y~>kzpFtZ_6j>IyYVn6K3oe4FTqR>aGI^^e~A)3Z6N((Be_eY~TIT&lhy(Gf>! zJTC=w7A&|;w9f;}Ik@OuwHI6NI4)WueJog749pkH1ilxHbvj%is2C-anx()we3)r; zRYvit!-r8rupQa+@^1!l2%%hj&8+9iHWZ!&iJ9@)0?WnB1H1sHkFGp9-jQ^oo)b|A2 z5~@M@W383&gVm9q>_kB7k^i3FM4~D93XzCLBM>nHht$C!T!M+yB|w|`0Y{NTy1)-+ zNzJO4^lxR0s@=Wq{M`A@VDjXQJoLqCC*YR?QB09yuxi62e3-=dhm$JV?j1tmcHcVyd%IuygMn7FJGO7cdSmhV6~Cb%w2l)SI~;J!i%Im;KlqVd z8x_poq}djV8k*gEykrfZTE_PTPi+=$e@-WFccQRsgQ^}rHtqHJU>jjEq(MfoU#O+! zvRa5K>M?%OYoTO8W0!zkQ`l9j?r-iaI`OsMjceKU+$ZwhzypJp!Q8@336Wmaj)jWv z&gr%~{wbBoHDR=C!8N>rp0x6>%46-B_~udnwv8Bku;QIqd~4R=7lVl(1SoGNETotn1Jy#SfHx7BwV%@3)Un}*-tVcs&wqmN9KD(QozXQH$okCMF`e>@RJOK@Fl4oEZ=pc4({rp{7U$0rU zsCbffBh5BReu>lkb%W8^#$`oIMvx#5H$+ucbx@AgIg=sK44dj*RPwq^^X6c{>Duh5q8A#BG(U5{g?2ns zLHKaHbF0)8H&5G}p;GMhh`Z{$DZSRr*mn9+w4ziPTm06_vD(_=eb|YO5%FG^XTt&C z6Yc9Vv^CYxoYIOEq=CGtyw!lgPw}J*qYACXwO3mCLmBLOYwZuS1@CLP!?g*&-c9Vh zv<&weuTl%F`DG_>+S-3@{dz)8!HqW=imP&Mg;Cb6jRn6KF1UD_W6p+?rQZ|;jgGMy ze;>X$;x;*~H67sb_tALHXC3zqPw1x*eBR4bR*u09?*ra{$X~0EAM+dUs$2XrJ<>g{ z*jG#9aO=lVdN(ETr9(~H&uJG`wB~DooxYZu=R0@m`KN1~jN%ycIi7=cwN~e|N4?44 zAA5TQ7Tpg$Ymh>SelE9I5gYfohHHat<>XmkNKb24v@`P`LR7ITSR)vrrt02)Wb9C- zf0>&Ir?tXr+d`qRrRjAs$e?<$B;ZEg(Uo^d4`;}e_illM(xD2wqQ3Z`-%tDU7!pR9 zbj&4uaO^6#!q4s7+RYRXg~CKwuT6!-#p4?b%lEM-U;Y@z2ZeeF&+m9wiVKj-oyF7o zE;TYU%Pp-H=9zf14{OHB?pYV1^?Yw(xoKfhP&>?oTVXk^w@@GOs-`?-q3aUHvAcRY zt#SqtD1P(&Fu8CwHTCY>wb$-%?ss+ibW9s{?5bg461L(iqv_v^OZvNJCkjSWUVJit z-mWQJRA2*1ewI6x)LyHoLhybT)K;O1?`@j?bg3}XU99r{Z|WQb*`0ju4VZOJ`mYO_x0V}n&>395A-zkXeEC8^5q=? zHlD23yFKci)NWPLG8M&vPi6F}3?&a2Ugt6k>fBO?_t$EV28W$hNfIm*nDp0YVOF<=%FmZ?yj-6_@8U*zcX*4d3_ zjfKX%bze2)#QeZIlspND{#3s}Hnn~rHO2HTT02~vQc~XObK05yXzKJtg^iJ#l~8Zh z*TY1)0jPC!lfTf?#Y^{o6~twJqqPq7*)0Ejn}N>*cX1rLXVKi;24E;Sjghir>?7w+UyiwIZ>WEV z8jv>JS>|SY+{z}SPn4C*d{|hNg7`R&t@fPquZ>kyy&-&t+t00?YOe~ED{C_KrO~1? zF^p#Gp8nDcbnIdT_ph_PfnHsR+}41OoPP~MtHWP2kvK~@=xt{bHRv~du1I9oYi_l~ zJHSUJZ$M2UWvUBkub`kHgEW6J^2FPEdouo0{ds)1pS=h%@SP) z^Lf5SZdqsf3%@!Q23ZDlel52!oUHj!V~bL4TPP+#9@B4fmac^oBuehx{-suTwC1yd zbx2+9uYkLUo)=1IwK7ktlvhh^4MoSbyA?Gl`}xOgtQ6gt?ONT~TS~WG2ed9`MyC zyEUi!*9>FEo#nMv?9Agx8lH?g(@E8u0K*#VcRsKik(p%ASbUFW(YNQnQ5Mrp%k>4< zW6+~poiz&IxX+&Yzfd#KOW3I#SKVEdTgArR6tkZgcFwI}NNhIQq%-@5)T-|MI62|i zzs#L;c@&gc*gZ6+)RoMv_9K_ue;5`KK?uak(@sW=D0B0s1YiUdx;o9NCr+o%@FOki@d@Glj zV^-h5?tNd>%+!)6XuZr-I;mMiE~$(Zpewe&ntqrP)u5pPi&cTu#G%%C&Ir<^}4ZB2=Z zC;#{{=<#zn&q80_;-ERWH_c%|>bj!CceP69$q8*jxVsl`vh{l-Gc9ZB`~)HT(eQdm zzyB_lH9fzP?m2|~ky$H})>NxkQgoqtp*+1rY$ZpeE7`0M(K_jwmgfH4rk4{8PH9&9 z$T|EO44!JIK|P@EDe{I>G%HipyW%0D9#w^l%})AqEshCM?eYq3E*2JPfdMWakEcp` z(HAd9R;PKyou}tc{qkXPQWgy&W^c9m&({ur(ju@|HC?z}8|c~80EwM+xdrFl-(thp zi{0c_ijP^0WRA$!aznw*<*`dg42&w^&nFGE!G9M0@+uM^y7c)6UC5raIbPki)D`AO zIQD(SOQGjJ^RQLrV7g+2*amaMd-j^EAFJpW*A_J5bHhSL>yTeqMU;dEr59;2>w~%-`34wJN{7LruI) zsmZY0cKH2xxOl0^{LkCA3u=GMS3Qf*a&LHzzoqV>`bgRf+vh`~f15QW7;InNHlbkS z*+v2o76SQO70O3O0Q%9uFpHM+{#WNGZ~rbRjd^vOgq%?VQmJ7iB4HYgm*KIA0${}q zsW|1NiI&DFa}l}917iY*y#!#A>~2SMQzy9;o)Op(qpq%GMNS%yape0iTbK;(dF&B` z_t2NlZ?bT3RZ8heD02{qiS0BY4aAn>Go(>95K36G$?9A&TS-&yeIL9Afyzgj=^#S0 z_KH8Eywo|w-@u*GKjrrzf@Cocv8^&>^=0&@eS*qDELbU(2fTfimGIQ|=ap2?#d??@RIgn8|7Mi@)*50~(DVW~qp z%^L8HSl9R8w3lZk+KOMRFggj(2tV;umcQ$kiYK&jjnN&l(_q#_ND6bC+k3eMVLiBR zJ7#2Lj(lsCJYx`xLTcafeBy_E7`SWD6%*UT+Ui-(3B5=|9man1F<8};N>_#J=Pu(h z<%IZ9#g(|8A%eR#V?pL|pcEtxS#SI0*;ACDHYEu71y%)nQ@TJB)9bt<`XV^OVbkeb z>ez();;9S0A_bm Date: Fri, 24 May 2024 13:05:03 +0200 Subject: [PATCH 09/22] BRF to RFd --- R/BIOMOD_Modeling.R | 6 +++--- R/biomod2_classes_0.R | 4 ++-- R/biomod2_data.R | 15 +++++++++++---- R/bm_ModelingOptions.R | 6 +++--- R/bm_RunModelsLoop.R | 12 ++++++------ R/bm_Tuning.R | 14 +++++++------- R/sysdata.rda | Bin 399 -> 8510 bytes data/ModelsTable.rda | Bin 399 -> 406 bytes data/OptionsBigboss.rda | Bin 8536 -> 8510 bytes 9 files changed, 32 insertions(+), 25 deletions(-) diff --git a/R/BIOMOD_Modeling.R b/R/BIOMOD_Modeling.R index 1e376686..f1443b15 100644 --- a/R/BIOMOD_Modeling.R +++ b/R/BIOMOD_Modeling.R @@ -16,7 +16,7 @@ ##' (\emph{a random number by default}) ##' @param models a \code{vector} containing model names to be computed, must be among ##' \code{ANN}, \code{CTA}, \code{FDA}, \code{GAM}, \code{GBM}, \code{GLM}, \code{MARS}, -##' \code{MAXENT}, \code{MAXNET}, \code{RF}, \code{BRF}, \code{SRE}, \code{XGBOOST} +##' \code{MAXENT}, \code{MAXNET}, \code{RF}, \code{RFd}, \code{SRE}, \code{XGBOOST} ##' @param models.pa (\emph{optional, default} \code{NULL}) \cr ##' A \code{list} containing for each model a \code{vector} defining which pseudo-absence datasets ##' are to be used, must be among \code{colnames(bm.format@PA.table)} @@ -139,7 +139,7 @@ ##' (\url{https://biodiversityinformatics.amnh.org/open_source/maxent/}) ##' \item \code{MAXNET} : Maximum Entropy (\code{\link[maxnet]{maxnet}}) ##' \item \code{RF} : Random Forest (\code{\link[randomForest]{randomForest}}) -##' \item \code{BRF} : Balanced Random Forest (\code{\link[randomForest]{randomForest}}) +##' \item \code{RFd} : Balanced Random Forest (\code{\link[randomForest]{randomForest}}) ##' \item \code{SRE} : Surface Range Envelop or usually called BIOCLIM (\code{\link{bm_SRE}}) ##' \item \code{XGBOOST} : eXtreme Gradient Boosting Training (\code{\link[xgboost]{xgboost}}) ##' }} @@ -623,7 +623,7 @@ BIOMOD_Modeling <- function(bm.format, models.switch.off <- NULL ## check if model is supported - avail.models.list <- c('ANN', 'CTA', 'FDA', 'GAM', 'GBM', 'GLM', 'MARS', 'MAXENT', 'MAXNET', 'RF','BRF', 'SRE', 'XGBOOST') + avail.models.list <- c('ANN', 'CTA', 'FDA', 'GAM', 'GBM', 'GLM', 'MARS', 'MAXENT', 'MAXNET', 'RF','RFd', 'SRE', 'XGBOOST') .fun_testIfIn(TRUE, "models", models, avail.models.list) ## Specific case of one variable with GBM / MAXNET diff --git a/R/biomod2_classes_0.R b/R/biomod2_classes_0.R index f99977e2..6a0172e4 100644 --- a/R/biomod2_classes_0.R +++ b/R/biomod2_classes_0.R @@ -75,7 +75,7 @@ setGeneric("BIOMOD.options.default", def = function(mod, typ, pkg, fun) { standa .BIOMOD.options.default.check.args <- function(mod, typ, pkg, fun) { ## check if model is supported - avail.models.list <- c('ANN', 'CTA', 'FDA', 'GAM', 'GBM', 'GLM', 'MARS', 'MAXENT', 'MAXNET', 'RF','BRF', 'SRE', 'XGBOOST') + avail.models.list <- c('ANN', 'CTA', 'FDA', 'GAM', 'GBM', 'GLM', 'MARS', 'MAXENT', 'MAXNET', 'RF','RFd', 'SRE', 'XGBOOST') .fun_testIfIn(TRUE, "mod", mod, avail.models.list) ## check if type is supported @@ -445,7 +445,7 @@ setMethod('BIOMOD.options.dataset', signature(strategy = 'character'), argstmp$mtry = 1 argstmp$type <- "classification" } - if (mod == "BRF") { + if (mod == "RFd") { argstmp[["x"]] = NULL argstmp$mtry = 1 argstmp$type <- "classification" diff --git a/R/biomod2_data.R b/R/biomod2_data.R index 94d15114..747468a6 100644 --- a/R/biomod2_data.R +++ b/R/biomod2_data.R @@ -32,14 +32,14 @@ "ModelsTable" # ModelsTable <- data.frame(model = c('ANN', 'CTA', 'FDA', 'GAM', 'GAM', 'GAM', 'GBM', 'GLM' -# , 'MARS', 'MAXENT', 'MAXNET', 'RF', 'SRE', 'XGBOOST') +# , 'MARS', 'MAXENT', 'MAXNET', 'RF','RFd', 'SRE', 'XGBOOST') # , type = 'binary' # , package = c('nnet', 'rpart', 'mda', 'gam', 'mgcv', 'mgcv', 'gbm', 'stats' -# , 'earth', 'MAXENT', 'maxnet', 'randomForest', 'biomod2', 'xgboost') +# , 'earth', 'MAXENT', 'maxnet', 'randomForest','randomForest', 'biomod2', 'xgboost') # , func = c('nnet', 'rpart', 'fda', 'gam', 'bam', 'gam', 'gbm', 'glm' -# , 'earth', 'MAXENT', 'maxnet', 'randomForest', 'bm_SRE', 'xgboost') +# , 'earth', 'MAXENT', 'maxnet', 'randomForest','randomForest', 'bm_SRE', 'xgboost') # , train = c('avNNet', 'rpart', 'fda', 'gamLoess', 'bam', 'gam', 'gbm', 'glm' -# , 'earth', 'ENMevaluate', 'maxnet', 'rf', 'bm_SRE', 'xgbTree')) +# , 'earth', 'ENMevaluate', 'maxnet', 'rf','rf', 'bm_SRE', 'xgbTree')) # usethis::use_data(ModelsTable, overwrite = TRUE) # usethis::use_data(ModelsTable, overwrite = TRUE, internal = TRUE) @@ -198,6 +198,13 @@ # bm.opt@options$RF.binary.randomForest.randomForest@args.values[['_allData_allRun']]$sampsize = NULL # bm.opt@options$RF.binary.randomForest.randomForest@args.values[['_allData_allRun']]$nodesize = 5 # bm.opt@options$RF.binary.randomForest.randomForest@args.values[['_allData_allRun']]$maxnodes = NULL +# bm.opt@options$RFd.binary.randomForest.randomForest@args.values[['_allData_allRun']]$type = 'classification' +# bm.opt@options$RFd.binary.randomForest.randomForest@args.values[['_allData_allRun']]$ntree = 500 +# bm.opt@options$RFd.binary.randomForest.randomForest@args.values[['_allData_allRun']]$mtry = NULL +# bm.opt@options$RFd.binary.randomForest.randomForest@args.values[['_allData_allRun']]$strata = factor(c(0, 1)) +# bm.opt@options$RFd.binary.randomForest.randomForest@args.values[['_allData_allRun']]$sampsize = NULL +# bm.opt@options$RFd.binary.randomForest.randomForest@args.values[['_allData_allRun']]$nodesize = 5 +# bm.opt@options$RFd.binary.randomForest.randomForest@args.values[['_allData_allRun']]$maxnodes = NULL # bm.opt@options$SRE.binary.biomod2.bm_SRE@args.values[['_allData_allRun']]$do.extrem = TRUE # bm.opt@options$XGBOOST.binary.xgboost.xgboost@args.values[['_allData_allRun']]$params = list(max_depth = 2, eta = 1) # bm.opt@options$XGBOOST.binary.xgboost.xgboost@args.values[['_allData_allRun']]$nthread = 2 diff --git a/R/bm_ModelingOptions.R b/R/bm_ModelingOptions.R index ad3ffffa..3122d281 100644 --- a/R/bm_ModelingOptions.R +++ b/R/bm_ModelingOptions.R @@ -11,7 +11,7 @@ ##' \code{binary}, \code{binary.PA}, \code{abundance}, \code{compositional} ##' @param models a \code{vector} containing model names to be computed, must be among ##' \code{ANN}, \code{CTA}, \code{FDA}, \code{GAM}, \code{GBM}, \code{GLM}, \code{MARS}, -##' \code{MAXENT}, \code{MAXNET}, \code{RF}, \code{BRF}, \code{SRE}, \code{XGBOOST} +##' \code{MAXENT}, \code{MAXNET}, \code{RF}, \code{RFd}, \code{SRE}, \code{XGBOOST} ##' @param strategy a \code{character} corresponding to the method to select models' parameters ##' values, must be either \code{default}, \code{bigboss}, \code{user.defined}, \code{tuned} ##' @param user.val (\emph{optional, default} \code{NULL}) \cr @@ -239,7 +239,7 @@ bm_ModelingOptions <- function(data.type , models = c('ANN', 'CTA', 'FDA', 'GAM', 'GBM', 'GLM' - , 'MARS', 'MAXENT', 'MAXNET', 'RF','BRF', 'SRE', 'XGBOOST') + , 'MARS', 'MAXENT', 'MAXNET', 'RF','RFd', 'SRE', 'XGBOOST') , strategy, user.val = NULL, user.base = "bigboss" , bm.format = NULL, calib.lines = NULL) { @@ -321,7 +321,7 @@ bm_ModelingOptions <- function(data.type ## check if model is supported avail.models.list <- c('ANN', 'CTA', 'FDA', 'GAM', 'GAM.gam.gam', 'GAM.mgcv.bam', 'GAM.mgcv.gam' - , 'GBM', 'GLM', 'MARS', 'MAXENT', 'MAXNET', 'RF','BRF', 'SRE', 'XGBOOST') + , 'GBM', 'GLM', 'MARS', 'MAXENT', 'MAXNET', 'RF','RFd', 'SRE', 'XGBOOST') .fun_testIfIn(TRUE, "models", models, avail.models.list) if (length(grep('GAM', models)) > 1) { stop("Only one GAM model can be activated. Please choose betwen 'GAM', 'GAM.gam.gam', 'GAM.mgcv.bam' or 'GAM.mgcv.gam'") diff --git a/R/bm_RunModelsLoop.R b/R/bm_RunModelsLoop.R index 45a67a9b..4c0f7e41 100644 --- a/R/bm_RunModelsLoop.R +++ b/R/bm_RunModelsLoop.R @@ -22,7 +22,7 @@ ##' (\emph{a random number by default}) ##' @param models a \code{vector} containing model names to be computed, must be among ##' \code{ANN}, \code{CTA}, \code{FDA}, \code{GAM}, \code{GBM}, \code{GLM}, \code{MARS}, -##' \code{MAXENT}, \code{MAXNET}, \code{RF}, \code{BRF}, \code{SRE}, \code{XGBOOST} +##' \code{MAXENT}, \code{MAXNET}, \code{RF}, \code{RFd}, \code{SRE}, \code{XGBOOST} ##' @param models.pa (\emph{optional, default} \code{NULL}) \cr ##' A \code{list} containing for each model a \code{vector} defining which pseudo-absence datasets ##' are to be used, must be among \code{colnames(bm.format@PA.table)} @@ -237,7 +237,7 @@ bm_RunModel <- function(model, run.name, dir.name = '.' ## PRELIMINAR --------------------------------------------------- - if (model %in% c("ANN", "MARS", "RF","BRF") & is.null(bm.opt.val$formula)) { + if (model %in% c("ANN", "MARS", "RF","RFd") & is.null(bm.opt.val$formula)) { bm.opt.val$formula <- bm_MakeFormula(resp.name = resp_name , expl.var = head(data_env) , type = 'simple' @@ -250,7 +250,7 @@ bm_RunModel <- function(model, run.name, dir.name = '.' bm.opt.val$strata <- data_mod[calib.lines.vec, , drop = FALSE][ , resp_name] bm.opt.val$sampsize <- unlist(ifelse(!is.null(bm.opt.val$sampsize), list(bm.opt.val$sampsize), length(data_sp[calib.lines.vec]))) ## TOCHECK !! } - if (model == "BRF" && !is.null(bm.opt.val$type) && bm.opt.val$type == "classification") { + if (model == "RFd" && !is.null(bm.opt.val$type) && bm.opt.val$type == "classification") { # defining occurrences as factor for doing classification and not regression in RF data_mod <- data_mod %>% mutate_at(resp_name, factor) bm.opt.val$strata <- data_mod[calib.lines.vec, , drop = FALSE][ , resp_name] @@ -260,7 +260,7 @@ bm_RunModel <- function(model, run.name, dir.name = '.' } ## FILL data parameter ------------------------------------------ - if (model %in% c("ANN", "CTA", "FDA", "GAM", "GBM", "MARS", "RF","BRF")) { + if (model %in% c("ANN", "CTA", "FDA", "GAM", "GBM", "MARS", "RF","RFd")) { bm.opt.val$data <- data_mod[calib.lines.vec, , drop = FALSE] } else if (model == "GLM") { bm.opt.val$data <- cbind(data_mod[calib.lines.vec, , drop = FALSE], @@ -292,7 +292,7 @@ bm_RunModel <- function(model, run.name, dir.name = '.' } ## REORGANIZE order of parameters ------------------------------- - if (model %in% c("ANN", "MARS", "RF","BRF")) { + if (model %in% c("ANN", "MARS", "RF","RFd")) { bm.opt.val <- bm.opt.val[c("formula", "data", names(bm.opt.val)[which(!(names(bm.opt.val) %in% c("formula", "data")))])] } if (model %in% c("FDA")) { @@ -344,7 +344,7 @@ bm_RunModel <- function(model, run.name, dir.name = '.' } ## POSTLIMINAR -------------------------------------------------- - if (model %in% c("RF","BRF") && !is.null(bm.opt.val$type) && bm.opt.val$type == "classification") { + if (model %in% c("RF","RFd") && !is.null(bm.opt.val$type) && bm.opt.val$type == "classification") { # canceling occurences class modifications data_mod <- data_mod %>% mutate_at(resp_name, function(.x) { .x %>% as.character() %>% as.numeric() diff --git a/R/bm_Tuning.R b/R/bm_Tuning.R index 7daba7b8..b12fa3eb 100644 --- a/R/bm_Tuning.R +++ b/R/bm_Tuning.R @@ -10,7 +10,7 @@ ##' ##' @param model a \code{character} corresponding to the algorithm to be tuned, must be either ##' \code{ANN}, \code{CTA}, \code{FDA}, \code{GAM}, \code{GBM}, \code{GLM}, \code{MARS}, -##' \code{MAXENT}, \code{MAXNET}, \code{RF}, \code{BRF}, \code{SRE}, \code{XGBOOST} +##' \code{MAXENT}, \code{MAXNET}, \code{RF}, \code{RFd}, \code{SRE}, \code{XGBOOST} ##' @param tuning.fun a \code{character} corresponding to the model function name to be called ##' through \code{\link[caret]{train}} function for tuning parameters (see \code{\link{ModelsTable}} ##' dataset) @@ -76,7 +76,7 @@ ##' \item{MARS}{\code{degree}, \code{nprune}} ##' \item{MAXENT}{\code{algorithm}, \code{parallel}} ##' \item{RF}{\code{mtry}} -##' \item{BRF}{\code{mtry}} +##' \item{RFd}{\code{mtry}} ##' \item{SRE}{\code{quant}} ##' \item{XGBOOST}{\code{nrounds}, \code{max_depth}, \code{eta}, \code{gamma}, ##' \code{colsampl_bytree}, \code{min_child_weight}, \code{subsample}} @@ -220,7 +220,7 @@ bm_Tuning <- function(model, MAXENT.algorithm = 'maxnet', MAXENT.parallel = TRUE, RF.mtry = 1:min(10, ncol(bm.format@data.env.var)), - BRF.mtry = 1:min(10, ncol(bm.format@data.env.var)), + RFd.mtry = 1:min(10, ncol(bm.format@data.env.var)), SRE.quant = c(0, 0.0125, 0.025, 0.05, 0.1), XGBOOST.nrounds = 50, XGBOOST.max_depth = 1, @@ -565,7 +565,7 @@ bm_Tuning <- function(model, { ## check model -------------------------------------------------------------- .fun_testIfIn(TRUE, "model", model, c("ANN", "CTA", "FDA", "GAM", "GBM", "GLM" - , "MARS", "MAXENT", "MAXNET", "RF","BRF", "SRE", "XGBOOST")) + , "MARS", "MAXENT", "MAXNET", "RF","RFd", "SRE", "XGBOOST")) ## check namespace ---------------------------------------------------------- if (!isNamespaceLoaded("caret")) { @@ -651,10 +651,10 @@ bm_Tuning <- function(model, ## get tuning grid through params.train ------------------------------------- tuning.grid <- NULL - if (model %in% c("ANN", "FDA", "GAM", "GBM", "MARS", "RF", "BRF", "XGBOOST")) { + if (model %in% c("ANN", "FDA", "GAM", "GBM", "MARS", "RF", "RFd", "XGBOOST")) { if (!(model == "GAM")) { params.train = params.train[grep(model, names(params.train))] - if (model == "BRF") {names(params.train) <- "BRF.mtry"} + if (model == "RFd") {names(params.train) <- "RFd.mtry"} .fun_testIfIn(TRUE, "names(params.train)", names(params.train), paste0(model, ".", train.params$params)) } else if (tuning.fun == "gamLoess"){ params.train = params.train[c('GAM.span', "GAM.degree")] @@ -668,7 +668,7 @@ bm_Tuning <- function(model, ## get tuning length -------------------------------------------------------- tuning.length <- 1 if (model == "CTA") tuning.length <- 30 - if (model == "RF" | model == "BRF") tuning.length <- min(30, ncol(bm.format@data.env.var)) + if (model == "RF" | model == "RFd") tuning.length <- min(30, ncol(bm.format@data.env.var)) ## Do formula --------------------------------------------------------------- if (model %in% c("MAXENT", "MAXNET", "SRE", "XGBOOST") && do.formula == TRUE) { diff --git a/R/sysdata.rda b/R/sysdata.rda index 61adfad39854662db8acdde8543b313410effc7a..dfb12f89c7cf9e425a9735265dc590d29ba8eccf 100644 GIT binary patch literal 8510 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 KQYsa->q+!>NnDo7NMFsi8qArTfQf&gvjbj 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 KQYsa->q+!>NnDo7NMFsi8qArTfQf&gvjbj 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%0D9#w^l%})AqEshCM?eYq3E*2JPfdMWakEcp` z(HAd9R;PKyou}tc{qkXPQWgy&W^c9m&({ur(ju@|HC?z}8|c~80EwM+xdrFl-(thp zi{0c_ijP^0WRA$!aznw*<*`dg42&w^&nFGE!G9M0@+uM^y7c)6UC5raIbPki)D`AO zIQD(SOQGjJ^RQLrV7g+2*amaMd-j^EAFJpW*A_J5bHhSL>yTeqMU;dEr59;2>w~%-`34wJN{7LruI) zsmZY0cKH2xxOl0^{LkCA3u=GMS3Qf*a&LHzzoqV>`bgRf+vh`~f15QW7;InNHlbkS z*+v2o76SQO70O3O0Q%9uFpHM+{#WNGZ~rbRjd^vOgq%?VQmJ7iB4HYgm*KIA0${}q zsW|1NiI&DFa}l}917iY*y#!#A>~2SMQzy9;o)Op(qpq%GMNS%yape0iTbK;(dF&B` z_t2NlZ?bT3RZ8heD02{qiS0BY4aAn>Go(>95K36G$?9A&TS-&yeIL9Afyzgj=^#S0 z_KH8Eywo|w-@u*GKjrrzf@Cocv8^&>^=0&@eS*qDELbU(2fTfimGIQ|=ap2?#d??@RIgn8|7Mi@)*50~(DVW~qp z%^L8HSl9R8w3lZk+KOMRFggj(2tV;umcQ$kiYK&jjnN&l(_q#_ND6bC+k3eMVLiBR zJ7#2Lj(lsCJYx`xLTcafeBy_E7`SWD6%*UT+Ui-(3B5=|9man1F<8};N>_#J=Pu(h z<%IZ9#g(|8A%eR#V?pL|pcEtxS#SI0*;ACDHYEu71y%)nQ@TJB)9bt<`XV^OVbkeb z>ez();;9S0A_bm Date: Fri, 24 May 2024 13:21:25 +0200 Subject: [PATCH 10/22] BRF to RFd bis --- R/biomod2_classes_4.R | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/R/biomod2_classes_4.R b/R/biomod2_classes_4.R index fd246c40..c199bf12 100644 --- a/R/biomod2_classes_4.R +++ b/R/biomod2_classes_4.R @@ -76,7 +76,7 @@ NULL ##' @aliases MAXENT_biomod2_model-class ##' @aliases MAXNET_biomod2_model-class ##' @aliases RF_biomod2_model-class -##' @aliases BRF_biomod2_model-class +##' @aliases RFd_biomod2_model-class ##' @aliases SRE_biomod2_model-class ##' @aliases XGBOOST_biomod2_model-class ##' @author Damien Georges @@ -118,7 +118,7 @@ NULL ##' \item \code{MAXNET_biomod2_model} : \code{model_class} is ##' \code{MAXNET} ##' \item \code{RF_biomod2_model} : \code{model_class} is \code{RF} -##' \item \code{BRF_biomod2_model} : \code{model_class} is \code{BRF} +##' \item \code{RFd_biomod2_model} : \code{model_class} is \code{RFd} ##' \item \code{SRE_biomod2_model} : \code{model_class} is \code{SRE} ##' } ##' @@ -140,7 +140,7 @@ NULL ##' showClass("MAXENT_biomod2_model") ##' showClass("MAXNET_biomod2_model") ##' showClass("RF_biomod2_model") -##' showClass("BRF_biomod2_model") +##' showClass("RFd_biomod2_model") ##' showClass("SRE_biomod2_model") ##' NULL @@ -278,8 +278,8 @@ setMethod('predict', signature(object = 'biomod2_model'), ##' @aliases predict2.MAXNET_biomod2_model.data.frame ##' @aliases predict2.RF_biomod2_model.SpatRaster ##' @aliases predict2.RF_biomod2_model.data.frame -##' @aliases predict2.BRF_biomod2_model.SpatRaster -##' @aliases predict2.BRF_biomod2_model.data.frame +##' @aliases predict2.RFd_biomod2_model.SpatRaster +##' @aliases predict2.RFd_biomod2_model.data.frame ##' @aliases predict2.SRE_biomod2_model.SpatRaster ##' @aliases predict2.SRE_biomod2_model.data.frame ##' @author Remi Patin @@ -1118,16 +1118,16 @@ setMethod('predict2', signature(object = 'RF_biomod2_model', newdata = "data.fra ) #----------------------------------------------------------------------------- # -## 8.10_bis BRF_biomod2_model ----------------------------------------------------- +## 8.10_bis RFd_biomod2_model ----------------------------------------------------- #----------------------------------------------------------------------------- # -##' @name BRF_biomod2_model-class +##' @name RFd_biomod2_model-class ##' @rdname biomod2_model ##' @export -setClass('BRF_biomod2_model', +setClass('RFd_biomod2_model', representation(), contains = 'biomod2_model', - prototype = list(model_class = 'BRF'), + prototype = list(model_class = 'RFd'), validity = function(object) { # check model class if (!inherits(object@model, "randomForest")) { return(FALSE)} else { return(TRUE) } }) @@ -1137,7 +1137,7 @@ setClass('BRF_biomod2_model', ##' -setMethod('predict2', signature(object = 'BRF_biomod2_model', newdata = "SpatRaster"), +setMethod('predict2', signature(object = 'RFd_biomod2_model', newdata = "SpatRaster"), function(object, newdata, ...) { pa <- .extract_modelNamesInfo(object@model_name, obj.type = "mod", info = "PA") run <- .extract_modelNamesInfo(object@model_name, obj.type = "mod", info = "run") @@ -1171,7 +1171,7 @@ setMethod('predict2', signature(object = 'BRF_biomod2_model', newdata = "SpatRas ) ##' @rdname predict2.bm -setMethod('predict2', signature(object = 'BRF_biomod2_model', newdata = "data.frame"), +setMethod('predict2', signature(object = 'RFd_biomod2_model', newdata = "data.frame"), function(object, newdata, ...) { pa <- .extract_modelNamesInfo(object@model_name, obj.type = "mod", info = "PA") run <- .extract_modelNamesInfo(object@model_name, obj.type = "mod", info = "run") From 4f3e1fb5ea850e76f6eb7295e40f4e97a6c7ce27 Mon Sep 17 00:00:00 2001 From: HeleneBlt Date: Mon, 27 May 2024 16:20:29 +0200 Subject: [PATCH 11/22] Tunning for RFd --- R/BIOMOD_Modeling.R | 2 +- R/bm_Tuning.R | 10 +++++----- vignettes/news.Rmd | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/R/BIOMOD_Modeling.R b/R/BIOMOD_Modeling.R index f1443b15..54cccbf9 100644 --- a/R/BIOMOD_Modeling.R +++ b/R/BIOMOD_Modeling.R @@ -139,7 +139,7 @@ ##' (\url{https://biodiversityinformatics.amnh.org/open_source/maxent/}) ##' \item \code{MAXNET} : Maximum Entropy (\code{\link[maxnet]{maxnet}}) ##' \item \code{RF} : Random Forest (\code{\link[randomForest]{randomForest}}) -##' \item \code{RFd} : Balanced Random Forest (\code{\link[randomForest]{randomForest}}) +##' \item \code{RFd} : Random Forest downsampled (\code{\link[randomForest]{randomForest}}) ##' \item \code{SRE} : Surface Range Envelop or usually called BIOCLIM (\code{\link{bm_SRE}}) ##' \item \code{XGBOOST} : eXtreme Gradient Boosting Training (\code{\link[xgboost]{xgboost}}) ##' }} diff --git a/R/bm_Tuning.R b/R/bm_Tuning.R index b12fa3eb..ed67a0d5 100644 --- a/R/bm_Tuning.R +++ b/R/bm_Tuning.R @@ -427,7 +427,7 @@ bm_Tuning <- function(model, tuning.form <- tuning.grid[which.max(tmp[, metric.eval]), ] - if (model == "RF") { + if (model %in% c("RF","RFd")) { tuning.form <- data.frame(mtry = tuning.grid[which.max(tmp[, metric.eval]), ]) } @@ -477,7 +477,7 @@ bm_Tuning <- function(model, } } } else { - if (model == "RF") { typ.vec = c('simple','quadratic', 'polynomial') } + if (model %in% c("RF","RFd")) { typ.vec = c('simple','quadratic', 'polynomial') } TMP <- foreach (typ = typ.vec, .combine = "rbind") %:% foreach (intlev = 0:max.intlev, .combine = "rbind") %do% @@ -496,7 +496,7 @@ bm_Tuning <- function(model, } } argstmp$formula <- TMP[which.max(TMP[, metric.eval]), "formula"] - if (model %in% c("ANN", "GAM", "GBM", "MARS", "RF")) { + if (model %in% c("ANN", "GAM", "GBM", "MARS", "RF","RFd")) { argstmp$formula <- formula(argstmp$formula) } } else { @@ -606,6 +606,7 @@ bm_Tuning <- function(model, MAXENT.algorithm = 'maxnet', MAXENT.parallel = TRUE, RF.mtry = 1:min(10, ncol(bm.format@data.env.var)), + RFd.mtry = 1:min(10, ncol(bm.format@data.env.var)), SRE.quant = c(0, 0.0125, 0.025, 0.05, 0.1), XGBOOST.nrounds = 50, XGBOOST.max_depth = 1, @@ -653,8 +654,7 @@ bm_Tuning <- function(model, if (model %in% c("ANN", "FDA", "GAM", "GBM", "MARS", "RF", "RFd", "XGBOOST")) { if (!(model == "GAM")) { - params.train = params.train[grep(model, names(params.train))] - if (model == "RFd") {names(params.train) <- "RFd.mtry"} + params.train = params.train[grep(paste0(model,"\\."), names(params.train))] .fun_testIfIn(TRUE, "names(params.train)", names(params.train), paste0(model, ".", train.params$params)) } else if (tuning.fun == "gamLoess"){ params.train = params.train[c('GAM.span', "GAM.degree")] diff --git a/vignettes/news.Rmd b/vignettes/news.Rmd index f3e7a331..5d3138ff 100644 --- a/vignettes/news.Rmd +++ b/vignettes/news.Rmd @@ -19,10 +19,10 @@ vignette: > - Add _seed.val_ for bm_pseudoAbsences and BIOMOD_FormatingData - Stop dans BIOMOD_FormatingData (càd biomod2_classes_1) si selection de PA à échouer. (Message okay ?) -- Add an argument _fact.agg_ (factor.aggregate à changer au besoin) for PseudoAbsences selection with the disk method. It allows to reduce the resolution of the environnement. NULL par défaut, donné à aggregate pour modifier résolution. **à faire remonter à BIOMOD_FormatingData ou laisser à bm_PseudoAbsences** +- Add an argument _fact.agg_ (factor.aggregate nom à changer au besoin) for PseudoAbsences selection with the disk method. It allows to reduce the resolution of the environnement. NULL par défaut, donné à aggregate pour modifier résolution. **à faire remonter à BIOMOD_FormatingData ou laisser à bm_PseudoAbsences** - Change max.depth into max_depth in OptionsBigboss (automatic in default) -- Add BRF Balenced Random Forest (down-sampling) -- Tuning for BRF: similar to RF (mtry only) +- Add RFd Random Forest down-sampling +- Tuning for RFd: similar to RF (mtry only) ### 2024 From 738849846c2b5e17bb394c8d80db05146965392b Mon Sep 17 00:00:00 2001 From: HeleneBlt Date: Tue, 28 May 2024 09:32:30 +0200 Subject: [PATCH 12/22] Fix import aggregate --- R/bm_PseudoAbsences.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/R/bm_PseudoAbsences.R b/R/bm_PseudoAbsences.R index ea0de159..77768283 100644 --- a/R/bm_PseudoAbsences.R +++ b/R/bm_PseudoAbsences.R @@ -596,7 +596,7 @@ setMethod('bm_PseudoAbsences_random', signature(expl.var = "SpatVector"), env = as.data.frame(expl.var), pa.tab = pa.tab)) } else { - cat("\nUnsupported case yet!") + cat("\n Unsupported case yet!") return(NULL) } }) @@ -917,7 +917,7 @@ setMethod('bm_PseudoAbsences_disk', signature(expl.var = "SpatVector"), ##' ##' @rdname bm_PseudoAbsences ##' @export -##' @importFrom terra rast distance subset mask crds cellFromXY extract +##' @importFrom terra rast distance subset mask crds cellFromXY extract aggregate ##' setMethod('bm_PseudoAbsences_disk', signature(expl.var = "SpatRaster"), From 07afe785936f58219adc01df5f4ae259d4f9821f Mon Sep 17 00:00:00 2001 From: HeleneBlt Date: Tue, 28 May 2024 09:39:47 +0200 Subject: [PATCH 13/22] FIx aggregate bis --- R/bm_PseudoAbsences.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/bm_PseudoAbsences.R b/R/bm_PseudoAbsences.R index 77768283..c6210d38 100644 --- a/R/bm_PseudoAbsences.R +++ b/R/bm_PseudoAbsences.R @@ -192,7 +192,7 @@ ##' ##' ##' @importFrom foreach foreach %do% -##' @importFrom terra rast vect freq spatSample values extract +##' @importFrom terra rast vect freq spatSample values extract aggregate ##' @importFrom utils packageVersion ##' ##' @export From 0c8f80f40a9f6e08ee9439c4c8407051c841ee31 Mon Sep 17 00:00:00 2001 From: HeleneBlt Date: Tue, 28 May 2024 09:43:58 +0200 Subject: [PATCH 14/22] Fix aggregate again --- R/bm_PseudoAbsences.R | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/R/bm_PseudoAbsences.R b/R/bm_PseudoAbsences.R index c6210d38..73e47213 100644 --- a/R/bm_PseudoAbsences.R +++ b/R/bm_PseudoAbsences.R @@ -950,8 +950,8 @@ setMethod('bm_PseudoAbsences_disk', signature(expl.var = "SpatRaster"), dist.mask <- mask(dist.mask, subset(expl.var, 1)) if (!is.null(fact.aggr)){ - dist.mask <- aggregate(dist.mask,fact= fact.aggr) - expl.var <- aggregate(expl.var,fact = fact.aggr) + dist.mask <- terra::aggregate(dist.mask,fact= fact.aggr) + expl.var <- terra::aggregate(expl.var,fact = fact.aggr) } if (is.null(dist.max)) { From 3bf81eca5f75f28c4edf55793b5029a6d08d932a Mon Sep 17 00:00:00 2001 From: MayaGueguen Date: Fri, 31 May 2024 11:56:20 +0200 Subject: [PATCH 15/22] Pass check (and space peace) --- NAMESPACE | 2 ++ R/biomod2_classes_1.R | 4 +++- R/bm_PseudoAbsences.R | 18 +++++++++-------- docs/reference/BIOMOD.formated.data.PA.html | 11 +++++++++-- docs/reference/BIOMOD_FormatingData.html | 8 +++++++- docs/reference/BIOMOD_Modeling.html | 3 ++- docs/reference/biomod2_model.html | 2 ++ docs/reference/bm_ModelingOptions.html | 4 ++-- docs/reference/bm_PseudoAbsences.html | 20 ++++++++++++++++--- docs/reference/bm_RunModelsLoop.html | 2 +- docs/reference/bm_Tuning.html | 14 ++++++++----- docs/reference/index.html | 22 ++++++++++----------- docs/reference/predict2.bm.html | 6 ++++++ man/BIOMOD.formated.data.PA.Rd | 9 +++++++-- man/BIOMOD_FormatingData.Rd | 6 +++++- man/BIOMOD_Modeling.Rd | 3 ++- man/biomod2_model.Rd | 3 +++ man/bm_ModelingOptions.Rd | 4 ++-- man/bm_PseudoAbsences.Rd | 16 ++++++++++++--- man/bm_RunModelsLoop.Rd | 2 +- man/bm_Tuning.Rd | 12 ++++++----- man/predict2.bm.Rd | 8 ++++++++ 22 files changed, 129 insertions(+), 50 deletions(-) diff --git a/NAMESPACE b/NAMESPACE index 81ae0d62..4ca9df7b 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -80,6 +80,7 @@ exportClasses(MARS_biomod2_model) exportClasses(MAXENT_biomod2_model) exportClasses(MAXNET_biomod2_model) exportClasses(RF_biomod2_model) +exportClasses(RFd_biomod2_model) exportClasses(SRE_biomod2_model) exportClasses(XGBOOST_biomod2_model) exportClasses(biomod2_ensemble_model) @@ -203,6 +204,7 @@ importFrom(stats,rnorm) importFrom(stats,runif) importFrom(stats,sd) importFrom(terra,`add<-`) +importFrom(terra,aggregate) importFrom(terra,app) importFrom(terra,as.matrix) importFrom(terra,as.points) diff --git a/R/biomod2_classes_1.R b/R/biomod2_classes_1.R index 01bddc86..2feb7e9c 100644 --- a/R/biomod2_classes_1.R +++ b/R/biomod2_classes_1.R @@ -1333,6 +1333,8 @@ setMethod('summary', signature(object = 'BIOMOD.formated.data'), ##' @param filter.raster (\emph{optional, default} \code{FALSE}) \cr ##' If \code{env} is of raster type, a \code{logical} value defining whether \code{sp} ##' is to be filtered when several points occur in the same raster cell +##' @param seed.val (\emph{optional, default} \code{NULL}) \cr +##' An \code{integer} value corresponding to the new seed value to be set ##' ##' @slot dir.name a \code{character} corresponding to the modeling folder ##' @slot sp.name a \code{character} corresponding to the species name @@ -1467,7 +1469,7 @@ setMethod('BIOMOD.formated.data.PA', signature(sp = 'numeric', env = 'SpatRaster , PA.nb.rep = 1, PA.strategy = 'random', PA.nb.absences = NULL , PA.dist.min = 0, PA.dist.max = NULL , PA.sre.quant = 0.025, PA.user.table = NULL - , na.rm = TRUE, filter.raster = FALSE,seed.val = NULL) { + , na.rm = TRUE, filter.raster = FALSE, seed.val = NULL) { .BIOMOD.formated.data.PA(sp, env, xy, dir.name, sp.name , eval.sp, eval.env, eval.xy , PA.nb.rep, PA.strategy, PA.nb.absences diff --git a/R/bm_PseudoAbsences.R b/R/bm_PseudoAbsences.R index 73e47213..fb1ea4d6 100644 --- a/R/bm_PseudoAbsences.R +++ b/R/bm_PseudoAbsences.R @@ -202,7 +202,8 @@ bm_PseudoAbsences <- function(resp.var, expl.var, nb.rep = 1, strategy = 'random', nb.absences = NULL - , sre.quant = 0, dist.min = 0, dist.max = NULL,fact.aggr = NULL, user.table = NULL, seed.val= NULL) + , sre.quant = 0, dist.min = 0, dist.max = NULL, fact.aggr = NULL + , user.table = NULL, seed.val = NULL) { ## 0. Check arguments --------------------------------------------------------------------------- args <- .bm_PseudoAbsences.check.args(resp.var, expl.var, nb.rep, strategy, nb.absences @@ -219,7 +220,7 @@ bm_PseudoAbsences <- function(resp.var, expl.var, nb.rep = 1, strategy = 'random user.defined = bm_PseudoAbsences_user.defined(resp.var, expl.var, user.table), random = bm_PseudoAbsences_random(resp.var, expl.var, nb.absences, nb.rep), sre = bm_PseudoAbsences_sre(resp.var, expl.var, sre.quant, nb.absences, nb.rep), - disk = bm_PseudoAbsences_disk(resp.var, expl.var, dist.min, dist.max, nb.absences, nb.rep,fact.aggr)) + disk = bm_PseudoAbsences_disk(resp.var, expl.var, dist.min, dist.max, nb.absences, nb.rep, fact.aggr)) } else if (length(nb.absences) == nb.rep) { out.list = foreach(i.abs = unique(nb.absences)) %do% { @@ -230,7 +231,7 @@ bm_PseudoAbsences <- function(resp.var, expl.var, nb.rep = 1, strategy = 'random user.defined = bm_PseudoAbsences_user.defined(resp.var, expl.var, user.table), random = bm_PseudoAbsences_random(resp.var, expl.var, i.abs, length(i.rep)), sre = bm_PseudoAbsences_sre(resp.var, expl.var, sre.quant, i.abs, length(i.rep)), - disk = bm_PseudoAbsences_disk(resp.var, expl.var, dist.min, dist.max, i.abs, length(i.rep),fact.aggr)) + disk = bm_PseudoAbsences_disk(resp.var, expl.var, dist.min, dist.max, i.abs, length(i.rep), fact.aggr)) ## CASE where all available cells have been selected : ## give back only one dataset, even if several were asked @@ -328,7 +329,8 @@ bm_PseudoAbsences <- function(resp.var, expl.var, nb.rep = 1, strategy = 'random # Argument Check -------------------------------------------------------------- -.bm_PseudoAbsences.check.args <- function(resp.var, expl.var, nb.rep, strategy, nb.absences, sre.quant, dist.min, dist.max, user.table,seed.val) +.bm_PseudoAbsences.check.args <- function(resp.var, expl.var, nb.rep, strategy, nb.absences + , sre.quant, dist.min, dist.max, user.table, seed.val) { cat('\n\nChecking Pseudo-absence selection arguments...\n') ## 1. Check resp.var argument ----------------------------------------------- @@ -921,7 +923,7 @@ setMethod('bm_PseudoAbsences_disk', signature(expl.var = "SpatVector"), ##' setMethod('bm_PseudoAbsences_disk', signature(expl.var = "SpatRaster"), - function(resp.var, expl.var, dist.min, dist.max, nb.absences, nb.rep,fact.aggr) + function(resp.var, expl.var, dist.min, dist.max, nb.absences, nb.rep, fact.aggr) { cat("\n > Disk pseudo absences selection") @@ -949,9 +951,9 @@ setMethod('bm_PseudoAbsences_disk', signature(expl.var = "SpatRaster"), dist.mask <- distance(dist.mask) dist.mask <- mask(dist.mask, subset(expl.var, 1)) - if (!is.null(fact.aggr)){ - dist.mask <- terra::aggregate(dist.mask,fact= fact.aggr) - expl.var <- terra::aggregate(expl.var,fact = fact.aggr) + if (!is.null(fact.aggr)) { + dist.mask <- terra::aggregate(dist.mask, fact = fact.aggr) + expl.var <- terra::aggregate(expl.var, fact = fact.aggr) } if (is.null(dist.max)) { diff --git a/docs/reference/BIOMOD.formated.data.PA.html b/docs/reference/BIOMOD.formated.data.PA.html index 8dc9fbe0..d0d342d7 100644 --- a/docs/reference/BIOMOD.formated.data.PA.html +++ b/docs/reference/BIOMOD.formated.data.PA.html @@ -134,7 +134,8 @@

BIOMOD_FormatingData() output object class (with pseudo-absence PA.sre.quant = 0.025, PA.user.table = NULL, na.rm = TRUE, - filter.raster = FALSE + filter.raster = FALSE, + seed.val = NULL ) # S4 method for numeric,SpatRaster @@ -155,7 +156,8 @@

BIOMOD_FormatingData() output object class (with pseudo-absence PA.sre.quant = 0.025, PA.user.table = NULL, na.rm = TRUE, - filter.raster = FALSE + filter.raster = FALSE, + seed.val = NULL ) @@ -287,6 +289,11 @@

Arguments

If env is of raster type, a logical value defining whether sp is to be filtered when several points occur in the same raster cell

+ +
seed.val
+

(optional, default NULL)
+An integer value corresponding to the new seed value to be set

+

Slots

diff --git a/docs/reference/BIOMOD_FormatingData.html b/docs/reference/BIOMOD_FormatingData.html index 54086129..733b50f7 100644 --- a/docs/reference/BIOMOD_FormatingData.html +++ b/docs/reference/BIOMOD_FormatingData.html @@ -135,7 +135,8 @@

Format input data, and select pseudo-absences if wanted, for usage in PA.sre.quant = 0.025, PA.user.table = NULL, na.rm = TRUE, - filter.raster = FALSE + filter.raster = FALSE, + seed.val = NULL )

@@ -268,6 +269,11 @@

Arguments

If expl.var is of raster type, a logical value defining whether resp.var is to be filtered when several points occur in the same raster cell

+ +
seed.val
+

(optional, default NULL)
+An integer value corresponding to the new seed value to be set

+

Value

diff --git a/docs/reference/BIOMOD_Modeling.html b/docs/reference/BIOMOD_Modeling.html index 03a3ea2b..16dd0605 100644 --- a/docs/reference/BIOMOD_Modeling.html +++ b/docs/reference/BIOMOD_Modeling.html @@ -169,7 +169,7 @@

Arguments

models

a vector containing model names to be computed, must be among ANN, CTA, FDA, GAM, GBM, GLM, MARS, -MAXENT, MAXNET, RF, SRE, XGBOOST

+MAXENT, MAXNET, RF, RFd, SRE, XGBOOST

models.pa
@@ -374,6 +374,7 @@

Details

(
https://biodiversityinformatics.amnh.org/open_source/maxent/)

  • MAXNET : Maximum Entropy (maxnet)

  • RF : Random Forest (randomForest)

  • +
  • RFd : Random Forest downsampled (randomForest)

  • SRE : Surface Range Envelop or usually called BIOCLIM (bm_SRE)

  • XGBOOST : eXtreme Gradient Boosting Training (xgboost)

  • diff --git a/docs/reference/biomod2_model.html b/docs/reference/biomod2_model.html index 939d3718..bc06a1e5 100644 --- a/docs/reference/biomod2_model.html +++ b/docs/reference/biomod2_model.html @@ -137,6 +137,7 @@

    Details

  • MAXNET_biomod2_model : model_class is MAXNET

  • RF_biomod2_model : model_class is RF

  • +
  • RFd_biomod2_model : model_class is RFd

  • SRE_biomod2_model : model_class is SRE

  • @@ -226,6 +227,7 @@

    Examples

    showClass("MAXENT_biomod2_model") showClass("MAXNET_biomod2_model") showClass("RF_biomod2_model") +showClass("RFd_biomod2_model") showClass("SRE_biomod2_model")
    diff --git a/docs/reference/bm_ModelingOptions.html b/docs/reference/bm_ModelingOptions.html index 676b5c0b..70c4aeb9 100644 --- a/docs/reference/bm_ModelingOptions.html +++ b/docs/reference/bm_ModelingOptions.html @@ -115,7 +115,7 @@

    Configure the modeling options for each selected model

    bm_ModelingOptions(
       data.type,
       models = c("ANN", "CTA", "FDA", "GAM", "GBM", "GLM", "MARS", "MAXENT", "MAXNET", "RF",
    -    "SRE", "XGBOOST"),
    +    "RFd", "SRE", "XGBOOST"),
       strategy,
       user.val = NULL,
       user.base = "bigboss",
    @@ -134,7 +134,7 @@ 

    Arguments

    models

    a vector containing model names to be computed, must be among ANN, CTA, FDA, GAM, GBM, GLM, MARS, -MAXENT, MAXNET, RF, SRE, XGBOOST

    +MAXENT, MAXNET, RF, RFd, SRE, XGBOOST

    strategy
    diff --git a/docs/reference/bm_PseudoAbsences.html b/docs/reference/bm_PseudoAbsences.html index 825e2d27..013447c8 100644 --- a/docs/reference/bm_PseudoAbsences.html +++ b/docs/reference/bm_PseudoAbsences.html @@ -123,7 +123,9 @@

    Select pseudo-absences

    sre.quant = 0, dist.min = 0, dist.max = NULL, - user.table = NULL + fact.aggr = NULL, + user.table = NULL, + seed.val = NULL ) bm_PseudoAbsences_user.defined(resp.var, expl.var, ...) @@ -159,7 +161,8 @@

    Select pseudo-absences

    dist.min, dist.max, nb.absences, - nb.rep + nb.rep, + fact.aggr ) # S4 method for ANY,SpatRaster @@ -169,7 +172,8 @@

    Select pseudo-absences

    dist.min, dist.max, nb.absences, - nb.rep + nb.rep, + fact.aggr )
    @@ -223,6 +227,11 @@

    Arguments

    used to make the disk pseudo-absence selection (in meters)

    +
    fact.aggr
    +

    (optional, default NULL)
    +If strategy = 'disk', a integer defining the factor of aggregation to reduce the resolution

    + +
    user.table

    (optional, default NULL)
    If strategy = 'user.defined', a matrix or data.frame with as many rows as @@ -231,6 +240,11 @@

    Arguments

    model(s) for each repetition

    +
    seed.val
    +

    (optional, default NULL)
    +An integer value corresponding to the new seed value to be set

    + +
    ...

    (optional, one or several of the above arguments depending on the selected method)

    diff --git a/docs/reference/bm_RunModelsLoop.html b/docs/reference/bm_RunModelsLoop.html index 3c7c1690..fef22601 100644 --- a/docs/reference/bm_RunModelsLoop.html +++ b/docs/reference/bm_RunModelsLoop.html @@ -175,7 +175,7 @@

    Arguments

    models

    a vector containing model names to be computed, must be among ANN, CTA, FDA, GAM, GBM, GLM, MARS, -MAXENT, MAXNET, RF, SRE, XGBOOST

    +MAXENT, MAXNET, RF, RFd, SRE, XGBOOST

    models.pa
    diff --git a/docs/reference/bm_Tuning.html b/docs/reference/bm_Tuning.html index 612c88df..b216249f 100644 --- a/docs/reference/bm_Tuning.html +++ b/docs/reference/bm_Tuning.html @@ -134,10 +134,11 @@

    Tune models parameters

    GBM.n.minobsinnode = 10, MARS.degree = 1:2, MARS.nprune = 2:max(38, 2 * ncol(bm.format@data.env.var) + 1), MAXENT.algorithm = "maxnet", MAXENT.parallel - = TRUE, RF.mtry = 1:min(10, ncol(bm.format@data.env.var)), SRE.quant = c(0, 0.0125, - 0.025, 0.05, 0.1), XGBOOST.nrounds = 50, XGBOOST.max_depth = 1, XGBOOST.eta = c(0.3, - 0.4), XGBOOST.gamma = 0, XGBOOST.colsample_bytree = c(0.6, 0.8), - XGBOOST.min_child_weight = 1, XGBOOST.subsample = 0.5) + = TRUE, RF.mtry = 1:min(10, ncol(bm.format@data.env.var)), RFd.mtry = 1:min(10, + ncol(bm.format@data.env.var)), SRE.quant = c(0, 0.0125, 0.025, 0.05, 0.1), + XGBOOST.nrounds = 50, XGBOOST.max_depth = 1, XGBOOST.eta = c(0.3, 0.4), XGBOOST.gamma + = 0, XGBOOST.colsample_bytree = c(0.6, 0.8), XGBOOST.min_child_weight = 1, + XGBOOST.subsample = 0.5) ) @@ -146,7 +147,7 @@

    Arguments

    model

    a character corresponding to the algorithm to be tuned, must be either ANN, CTA, FDA, GAM, GBM, GLM, MARS, -MAXENT, MAXNET, RF, SRE, XGBOOST

    +MAXENT, MAXNET, RF, RFd, SRE, XGBOOST

    tuning.fun
    @@ -255,6 +256,9 @@

    Details

    RF

    mtry

    +
    RFd
    +

    mtry

    +
    SRE

    quant

    diff --git a/docs/reference/index.html b/docs/reference/index.html index 3afd6b3c..9752a45f 100644 --- a/docs/reference/index.html +++ b/docs/reference/index.html @@ -232,27 +232,27 @@

    Objects

    plot(<BIOMOD.formated.data>,<missing>)

    -

    plot method for BIOMOD.formated.data object class

    +

    plot method for BIOMOD.formated.data object class

    summary(<BIOMOD.formated.data>)

    -

    summary method for BIOMOD.formated.data object class

    +

    summary method for BIOMOD.formated.data object class

    BIOMOD.options.default(<character>,<character>)

    -

    bm_ModelingOptions output object class

    +

    bm_ModelingOptions output object class

    BIOMOD.options.dataset(<character>) show(<BIOMOD.options.dataset>) print(<BIOMOD.options.dataset>)

    -

    bm_ModelingOptions output object class

    +

    bm_ModelingOptions output object class

    show(<BIOMOD.models.options>) print(<BIOMOD.models.options>)

    -

    bm_ModelingOptions output object class

    +

    bm_ModelingOptions output object class

    BIOMOD.stored.data BIOMOD.stored.data-class BIOMOD.stored.data.frame-class BIOMOD.stored.SpatRaster-class BIOMOD.stored.files-class BIOMOD.stored.formated.data-class BIOMOD.stored.options-class BIOMOD.stored.models.out-class

    -

    BIOMOD_Modeling and BIOMOD_EnsembleModeling output object class

    +

    BIOMOD_Modeling and BIOMOD_EnsembleModeling output object class

    show(<biomod2_model>)

    @@ -280,23 +280,23 @@

    Getters

    load_stored_object()

    -

    Functions to load BIOMOD.stored.data objects

    +

    Functions to load BIOMOD.stored.data objects

    get_formal_model(<biomod2_model>) get_scaling_model(<biomod2_model>)

    -

    Functions to extract informations from biomod2_model objects

    +

    Functions to extract informations from biomod2_model objects

    get_species_data(<BIOMOD.formated.data>) get_species_data(<BIOMOD.formated.data.PA>) get_eval_data(<BIOMOD.formated.data>) get_options(<BIOMOD.models.out>) get_calib_lines(<BIOMOD.models.out>) get_formal_data(<BIOMOD.models.out>) get_predictions(<BIOMOD.models.out>) get_built_models(<BIOMOD.models.out>) get_evaluations(<BIOMOD.models.out>) get_variables_importance(<BIOMOD.models.out>) get_projected_models(<BIOMOD.projection.out>) free(<BIOMOD.projection.out>) get_predictions(<BIOMOD.projection.out>) get_formal_data(<BIOMOD.ensemble.models.out>) get_built_models(<BIOMOD.ensemble.models.out>) get_kept_models(<BIOMOD.ensemble.models.out>) get_predictions(<BIOMOD.ensemble.models.out>) get_evaluations(<BIOMOD.ensemble.models.out>) get_variables_importance(<BIOMOD.ensemble.models.out>)

    -

    Functions to extract informations from BIOMOD.models.out, BIOMOD.projection.out or BIOMOD.ensemble.models.out objects

    +

    Functions to extract informations from BIOMOD.models.out, BIOMOD.projection.out or BIOMOD.ensemble.models.out objects

    predict(<biomod2_model>)

    -

    Functions to get predictions from biomod2_model objects

    +

    Functions to get predictions from biomod2_model objects

    predict.em

    -

    Functions to get predictions from biomod2_ensemble_model objects

    +

    Functions to get predictions from biomod2_ensemble_model objects

    Data

    diff --git a/docs/reference/predict2.bm.html b/docs/reference/predict2.bm.html index 0b931c3b..8060b610 100644 --- a/docs/reference/predict2.bm.html +++ b/docs/reference/predict2.bm.html @@ -188,6 +188,12 @@

    Functions to get predictions from biomod2 # S4 method for RF_biomod2_model,data.frame predict2(object, newdata, ...) +# S4 method for RFd_biomod2_model,SpatRaster +predict2(object, newdata, ...) + +# S4 method for RFd_biomod2_model,data.frame +predict2(object, newdata, ...) + # S4 method for SRE_biomod2_model,SpatRaster predict2(object, newdata, ...) diff --git a/man/BIOMOD.formated.data.PA.Rd b/man/BIOMOD.formated.data.PA.Rd index e79be0eb..34a5e5e2 100644 --- a/man/BIOMOD.formated.data.PA.Rd +++ b/man/BIOMOD.formated.data.PA.Rd @@ -25,7 +25,8 @@ PA.sre.quant = 0.025, PA.user.table = NULL, na.rm = TRUE, - filter.raster = FALSE + filter.raster = FALSE, + seed.val = NULL ) \S4method{BIOMOD.formated.data.PA}{numeric,SpatRaster}( @@ -45,7 +46,8 @@ PA.sre.quant = 0.025, PA.user.table = NULL, na.rm = TRUE, - filter.raster = FALSE + filter.raster = FALSE, + seed.val = NULL ) } \arguments{ @@ -141,6 +143,9 @@ values for explanatory variables should be removed from the analysis or not} \item{filter.raster}{(\emph{optional, default} \code{FALSE}) \cr If \code{env} is of raster type, a \code{logical} value defining whether \code{sp} is to be filtered when several points occur in the same raster cell} + +\item{seed.val}{(\emph{optional, default} \code{NULL}) \cr +An \code{integer} value corresponding to the new seed value to be set} } \description{ Class returned by \code{\link{BIOMOD_FormatingData}}, and used by diff --git a/man/BIOMOD_FormatingData.Rd b/man/BIOMOD_FormatingData.Rd index f7c6f2cd..c888fedc 100644 --- a/man/BIOMOD_FormatingData.Rd +++ b/man/BIOMOD_FormatingData.Rd @@ -21,7 +21,8 @@ BIOMOD_FormatingData( PA.sre.quant = 0.025, PA.user.table = NULL, na.rm = TRUE, - filter.raster = FALSE + filter.raster = FALSE, + seed.val = NULL ) } \arguments{ @@ -118,6 +119,9 @@ explanatory variables should be removed from the analysis or not} \item{filter.raster}{(\emph{optional, default} \code{FALSE}) \cr If \code{expl.var} is of raster type, a \code{logical} value defining whether \code{resp.var} is to be filtered when several points occur in the same raster cell} + +\item{seed.val}{(\emph{optional, default} \code{NULL}) \cr +An \code{integer} value corresponding to the new seed value to be set} } \value{ A \code{\link{BIOMOD.formated.data}} object that can be used to build species distribution diff --git a/man/BIOMOD_Modeling.Rd b/man/BIOMOD_Modeling.Rd index 2d510f80..6673e2d9 100644 --- a/man/BIOMOD_Modeling.Rd +++ b/man/BIOMOD_Modeling.Rd @@ -48,7 +48,7 @@ object returned by the \code{\link{BIOMOD_FormatingData}} function} \item{models}{a \code{vector} containing model names to be computed, must be among \code{ANN}, \code{CTA}, \code{FDA}, \code{GAM}, \code{GBM}, \code{GLM}, \code{MARS}, -\code{MAXENT}, \code{MAXNET}, \code{RF}, \code{SRE}, \code{XGBOOST}} +\code{MAXENT}, \code{MAXNET}, \code{RF}, \code{RFd}, \code{SRE}, \code{XGBOOST}} \item{models.pa}{(\emph{optional, default} \code{NULL}) \cr A \code{list} containing for each model a \code{vector} defining which pseudo-absence datasets @@ -198,6 +198,7 @@ metrics (see Details). (\url{https://biodiversityinformatics.amnh.org/open_source/maxent/}) \item \code{MAXNET} : Maximum Entropy (\code{\link[maxnet]{maxnet}}) \item \code{RF} : Random Forest (\code{\link[randomForest]{randomForest}}) + \item \code{RFd} : Random Forest downsampled (\code{\link[randomForest]{randomForest}}) \item \code{SRE} : Surface Range Envelop or usually called BIOCLIM (\code{\link{bm_SRE}}) \item \code{XGBOOST} : eXtreme Gradient Boosting Training (\code{\link[xgboost]{xgboost}}) }} diff --git a/man/biomod2_model.Rd b/man/biomod2_model.Rd index 25add197..e690b50f 100644 --- a/man/biomod2_model.Rd +++ b/man/biomod2_model.Rd @@ -14,6 +14,7 @@ \alias{MAXENT_biomod2_model-class} \alias{MAXNET_biomod2_model-class} \alias{RF_biomod2_model-class} +\alias{RFd_biomod2_model-class} \alias{SRE_biomod2_model-class} \alias{XGBOOST_biomod2_model-class} \alias{show,biomod2_model-method} @@ -43,6 +44,7 @@ Class created by \code{\link{BIOMOD_Modeling}} and \code{\link{bm_RunModel}} \item \code{MAXNET_biomod2_model} : \code{model_class} is \code{MAXNET} \item \code{RF_biomod2_model} : \code{model_class} is \code{RF} + \item \code{RFd_biomod2_model} : \code{model_class} is \code{RFd} \item \code{SRE_biomod2_model} : \code{model_class} is \code{SRE} } } @@ -87,6 +89,7 @@ showClass("MARS_biomod2_model") showClass("MAXENT_biomod2_model") showClass("MAXNET_biomod2_model") showClass("RF_biomod2_model") +showClass("RFd_biomod2_model") showClass("SRE_biomod2_model") } diff --git a/man/bm_ModelingOptions.Rd b/man/bm_ModelingOptions.Rd index 1cfbf8cf..89faa71b 100644 --- a/man/bm_ModelingOptions.Rd +++ b/man/bm_ModelingOptions.Rd @@ -7,7 +7,7 @@ bm_ModelingOptions( data.type, models = c("ANN", "CTA", "FDA", "GAM", "GBM", "GLM", "MARS", "MAXENT", "MAXNET", "RF", - "SRE", "XGBOOST"), + "RFd", "SRE", "XGBOOST"), strategy, user.val = NULL, user.base = "bigboss", @@ -21,7 +21,7 @@ bm_ModelingOptions( \item{models}{a \code{vector} containing model names to be computed, must be among \code{ANN}, \code{CTA}, \code{FDA}, \code{GAM}, \code{GBM}, \code{GLM}, \code{MARS}, -\code{MAXENT}, \code{MAXNET}, \code{RF}, \code{SRE}, \code{XGBOOST}} +\code{MAXENT}, \code{MAXNET}, \code{RF}, \code{RFd}, \code{SRE}, \code{XGBOOST}} \item{strategy}{a \code{character} corresponding to the method to select models' parameters values, must be either \code{default}, \code{bigboss}, \code{user.defined}, \code{tuned}} diff --git a/man/bm_PseudoAbsences.Rd b/man/bm_PseudoAbsences.Rd index 561e1d1f..017b37aa 100644 --- a/man/bm_PseudoAbsences.Rd +++ b/man/bm_PseudoAbsences.Rd @@ -25,7 +25,9 @@ bm_PseudoAbsences( sre.quant = 0, dist.min = 0, dist.max = NULL, - user.table = NULL + fact.aggr = NULL, + user.table = NULL, + seed.val = NULL ) bm_PseudoAbsences_user.defined(resp.var, expl.var, ...) @@ -54,7 +56,8 @@ bm_PseudoAbsences_disk(resp.var, expl.var, ...) dist.min, dist.max, nb.absences, - nb.rep + nb.rep, + fact.aggr ) \S4method{bm_PseudoAbsences_disk}{ANY,SpatRaster}( @@ -63,7 +66,8 @@ bm_PseudoAbsences_disk(resp.var, expl.var, ...) dist.min, dist.max, nb.absences, - nb.rep + nb.rep, + fact.aggr ) } \arguments{ @@ -99,12 +103,18 @@ used to make the \code{disk} pseudo-absence selection (in meters)} If \code{strategy = 'disk'}, a \code{numeric} defining the maximal distance to presence points used to make the \code{disk} pseudo-absence selection (in meters)} +\item{fact.aggr}{(\emph{optional, default} \code{NULL}) \cr +If \code{strategy = 'disk'}, a \code{integer} defining the factor of aggregation to reduce the resolution} + \item{user.table}{(\emph{optional, default} \code{NULL}) \cr If \code{strategy = 'user.defined'}, a \code{matrix} or \code{data.frame} with as many rows as \code{resp.var} values, as many columns as \code{nb.rep}, and containing \code{TRUE} or \code{FALSE} values defining which points will be used to build the species distribution model(s) for each repetition} +\item{seed.val}{(\emph{optional, default} \code{NULL}) \cr +An \code{integer} value corresponding to the new seed value to be set} + \item{\ldots}{(\emph{optional, one or several of the above arguments depending on the selected method})} } diff --git a/man/bm_RunModelsLoop.Rd b/man/bm_RunModelsLoop.Rd index 023b1922..1dddde7a 100644 --- a/man/bm_RunModelsLoop.Rd +++ b/man/bm_RunModelsLoop.Rd @@ -55,7 +55,7 @@ obtained with the \code{\link{bm_CrossValidation}} function} \item{models}{a \code{vector} containing model names to be computed, must be among \code{ANN}, \code{CTA}, \code{FDA}, \code{GAM}, \code{GBM}, \code{GLM}, \code{MARS}, -\code{MAXENT}, \code{MAXNET}, \code{RF}, \code{SRE}, \code{XGBOOST}} +\code{MAXENT}, \code{MAXNET}, \code{RF}, \code{RFd}, \code{SRE}, \code{XGBOOST}} \item{models.pa}{(\emph{optional, default} \code{NULL}) \cr A \code{list} containing for each model a \code{vector} defining which pseudo-absence datasets diff --git a/man/bm_Tuning.Rd b/man/bm_Tuning.Rd index c9a4d5dc..b7a3f52d 100644 --- a/man/bm_Tuning.Rd +++ b/man/bm_Tuning.Rd @@ -24,16 +24,17 @@ bm_Tuning( GBM.n.minobsinnode = 10, MARS.degree = 1:2, MARS.nprune = 2:max(38, 2 * ncol(bm.format@data.env.var) + 1), MAXENT.algorithm = "maxnet", MAXENT.parallel - = TRUE, RF.mtry = 1:min(10, ncol(bm.format@data.env.var)), SRE.quant = c(0, 0.0125, - 0.025, 0.05, 0.1), XGBOOST.nrounds = 50, XGBOOST.max_depth = 1, XGBOOST.eta = c(0.3, - 0.4), XGBOOST.gamma = 0, XGBOOST.colsample_bytree = c(0.6, 0.8), - XGBOOST.min_child_weight = 1, XGBOOST.subsample = 0.5) + = TRUE, RF.mtry = 1:min(10, ncol(bm.format@data.env.var)), RFd.mtry = 1:min(10, + ncol(bm.format@data.env.var)), SRE.quant = c(0, 0.0125, 0.025, 0.05, 0.1), + XGBOOST.nrounds = 50, XGBOOST.max_depth = 1, XGBOOST.eta = c(0.3, 0.4), XGBOOST.gamma + = 0, XGBOOST.colsample_bytree = c(0.6, 0.8), XGBOOST.min_child_weight = 1, + XGBOOST.subsample = 0.5) ) } \arguments{ \item{model}{a \code{character} corresponding to the algorithm to be tuned, must be either \code{ANN}, \code{CTA}, \code{FDA}, \code{GAM}, \code{GBM}, \code{GLM}, \code{MARS}, -\code{MAXENT}, \code{MAXNET}, \code{RF}, \code{SRE}, \code{XGBOOST}} +\code{MAXENT}, \code{MAXNET}, \code{RF}, \code{RFd}, \code{SRE}, \code{XGBOOST}} \item{tuning.fun}{a \code{character} corresponding to the model function name to be called through \code{\link[caret]{train}} function for tuning parameters (see \code{\link{ModelsTable}} @@ -110,6 +111,7 @@ Currently, the available parameters to be tuned are the following : \item{MARS}{\code{degree}, \code{nprune}} \item{MAXENT}{\code{algorithm}, \code{parallel}} \item{RF}{\code{mtry}} + \item{RFd}{\code{mtry}} \item{SRE}{\code{quant}} \item{XGBOOST}{\code{nrounds}, \code{max_depth}, \code{eta}, \code{gamma}, \code{colsampl_bytree}, \code{min_child_weight}, \code{subsample}} diff --git a/man/predict2.bm.Rd b/man/predict2.bm.Rd index fe235ca1..b1912b35 100644 --- a/man/predict2.bm.Rd +++ b/man/predict2.bm.Rd @@ -24,6 +24,8 @@ \alias{predict2.MAXNET_biomod2_model.data.frame} \alias{predict2.RF_biomod2_model.SpatRaster} \alias{predict2.RF_biomod2_model.data.frame} +\alias{predict2.RFd_biomod2_model.SpatRaster} +\alias{predict2.RFd_biomod2_model.data.frame} \alias{predict2.SRE_biomod2_model.SpatRaster} \alias{predict2.SRE_biomod2_model.data.frame} \alias{predict2,biomod2_model,SpatRaster-method} @@ -48,6 +50,8 @@ \alias{predict2,MAXNET_biomod2_model,data.frame-method} \alias{predict2,RF_biomod2_model,SpatRaster-method} \alias{predict2,RF_biomod2_model,data.frame-method} +\alias{predict2,RFd_biomod2_model,SpatRaster-method} +\alias{predict2,RFd_biomod2_model,data.frame-method} \alias{predict2,SRE_biomod2_model,SpatRaster-method} \alias{predict2,SRE_biomod2_model,data.frame-method} \alias{predict2,XGBOOST_biomod2_model,SpatRaster-method} @@ -100,6 +104,10 @@ predict2(object, newdata, ...) \S4method{predict2}{RF_biomod2_model,data.frame}(object, newdata, ...) +\S4method{predict2}{RFd_biomod2_model,SpatRaster}(object, newdata, ...) + +\S4method{predict2}{RFd_biomod2_model,data.frame}(object, newdata, ...) + \S4method{predict2}{SRE_biomod2_model,SpatRaster}(object, newdata, ...) \S4method{predict2}{SRE_biomod2_model,data.frame}(object, newdata, ...) From 398ba5f40809e62cf21055a1eb23e0611493f928 Mon Sep 17 00:00:00 2001 From: HeleneBlt Date: Mon, 3 Jun 2024 14:51:16 +0200 Subject: [PATCH 16/22] Fact_aggr and 'for_all_datasets" fact_aggr for random method and for BIOMOD_FormatingData "for_all_datasets" allows to change all the options for all the datasets --- R/BIOMOD_FormatingData.R | 4 ++++ R/biomod2_classes_0.R | 11 ++++++++++- R/biomod2_classes_1.R | 16 +++++++++++----- R/bm_ModelingOptions.R | 5 ++++- R/bm_PseudoAbsences.R | 25 +++++++++++++++---------- vignettes/news.Rmd | 9 ++++----- 6 files changed, 48 insertions(+), 22 deletions(-) diff --git a/R/BIOMOD_FormatingData.R b/R/BIOMOD_FormatingData.R index fb8379a0..bd1479ef 100644 --- a/R/BIOMOD_FormatingData.R +++ b/R/BIOMOD_FormatingData.R @@ -81,6 +81,8 @@ ##' If pseudo-absence selection and \code{PA.strategy = 'disk'}, a \code{numeric} defining the ##' maximal distance to presence points used to make the \code{disk} pseudo-absence selection ##' (in meters, see Details) +##' @param PA.fact.aggr (\emph{optional, default} \code{NULL}) \cr +##' If \code{strategy = 'random'} or \code{strategy = 'disk'}, a \code{integer} defining the factor of aggregation to reduce the resolution ##' @param PA.user.table (\emph{optional, default} \code{NULL}) \cr ##' If pseudo-absence selection and \code{PA.strategy = 'user.defined'}, a \code{matrix} or ##' \code{data.frame} with as many rows as \code{resp.var} values, as many columns as @@ -346,6 +348,7 @@ BIOMOD_FormatingData <- function(resp.name, PA.dist.min = 0, PA.dist.max = NULL, PA.sre.quant = 0.025, + PA.fact.aggr = NULL, PA.user.table = NULL, na.rm = TRUE, filter.raster = FALSE, @@ -394,6 +397,7 @@ BIOMOD_FormatingData <- function(resp.name, PA.dist.min = PA.dist.min, PA.dist.max = PA.dist.max, PA.sre.quant = PA.sre.quant, + PA.fact.aggr = PA.fact.aggr, PA.user.table = PA.user.table, na.rm = na.rm, filter.raster = filter.raster, diff --git a/R/biomod2_classes_0.R b/R/biomod2_classes_0.R index 6a0172e4..a2eedb0a 100644 --- a/R/biomod2_classes_0.R +++ b/R/biomod2_classes_0.R @@ -305,6 +305,14 @@ setGeneric("BIOMOD.options.dataset", } } if (strategy == "user.defined" && !is.null(user.val)) { + if ("for_all_datasets" %in% names(user.val)){ + if (length(names(user.val)) > 1 ){ + user.val <- user.val[["for_all_datasets"]] + cat("\n\t\t> Only the options defined for 'for_all_datasets' will be taken into account") + } + user.val <- rep(user.val, length(expected_CVnames)) + names(user.val) <- expected_CVnames + } .fun_testIfIn(TRUE, "names(user.val)", names(user.val), expected_CVnames) if (length(names(user.val)) != length(expected_CVnames)) { warning(paste0("Options will be changed only for a subset of datasets (" @@ -316,7 +324,8 @@ setGeneric("BIOMOD.options.dataset", } return(list(strategy = strategy, - expected_CVnames = expected_CVnames)) + expected_CVnames = expected_CVnames, + user.val = user.val)) } # .BIOMOD.options.dataset.test <- function(bm.opt) diff --git a/R/biomod2_classes_1.R b/R/biomod2_classes_1.R index 2feb7e9c..0e5f4fa4 100644 --- a/R/biomod2_classes_1.R +++ b/R/biomod2_classes_1.R @@ -1321,6 +1321,8 @@ setMethod('summary', signature(object = 'BIOMOD.formated.data'), ##' If pseudo-absence selection and \code{PA.strategy = 'disk'}, a \code{numeric} defining the ##' maximal distance to presence points used to make the \code{disk} pseudo-absence selection ##' (in meters, see Details) +##' @param PA.fact.aggr (\emph{optional, default} \code{NULL}) \cr +##' If \code{strategy = 'random'} or \code{strategy = 'disk'}, a \code{integer} defining the factor of aggregation to reduce the resolution ##' @param PA.user.table (\emph{optional, default} \code{NULL}) \cr ##' If pseudo-absence selection and \code{PA.strategy = 'user.defined'}, a \code{matrix} or ##' \code{data.frame} with as many rows as \code{resp.var} values, as many columns as @@ -1445,13 +1447,14 @@ setMethod('BIOMOD.formated.data.PA', signature(sp = 'numeric', env = 'data.frame , eval.sp = NULL, eval.env = NULL, eval.xy = NULL , PA.nb.rep = 1, PA.strategy = 'random', PA.nb.absences = NULL , PA.dist.min = 0, PA.dist.max = NULL - , PA.sre.quant = 0.025, PA.user.table = NULL + , PA.sre.quant = 0.025, PA.fact.aggr = NULL + , PA.user.table = NULL , na.rm = TRUE, filter.raster = FALSE, seed.val = NULL) { .BIOMOD.formated.data.PA(sp, env, xy, dir.name, sp.name , eval.sp, eval.env, eval.xy , PA.nb.rep, PA.strategy, PA.nb.absences , PA.dist.min, PA.dist.max - , PA.sre.quant, PA.user.table + , PA.sre.quant, PA.fact.aggr, PA.user.table , na.rm , filter.raster = filter.raster , seed.val) @@ -1468,13 +1471,14 @@ setMethod('BIOMOD.formated.data.PA', signature(sp = 'numeric', env = 'SpatRaster , eval.sp = NULL, eval.env = NULL, eval.xy = NULL , PA.nb.rep = 1, PA.strategy = 'random', PA.nb.absences = NULL , PA.dist.min = 0, PA.dist.max = NULL - , PA.sre.quant = 0.025, PA.user.table = NULL + , PA.sre.quant = 0.025, PA.fact.aggr = NULL + , PA.user.table = NULL , na.rm = TRUE, filter.raster = FALSE, seed.val = NULL) { .BIOMOD.formated.data.PA(sp, env, xy, dir.name, sp.name , eval.sp, eval.env, eval.xy , PA.nb.rep, PA.strategy, PA.nb.absences , PA.dist.min, PA.dist.max - , PA.sre.quant, PA.user.table + , PA.sre.quant, PA.fact.aggr, PA.user.table , na.rm , filter.raster = filter.raster , seed.val) @@ -1485,7 +1489,8 @@ setMethod('BIOMOD.formated.data.PA', signature(sp = 'numeric', env = 'SpatRaster , eval.sp = NULL, eval.env = NULL, eval.xy = NULL , PA.nb.rep = 1, PA.strategy = 'random', PA.nb.absences = NULL , PA.dist.min = 0, PA.dist.max = NULL - , PA.sre.quant = 0.025, PA.user.table = NULL + , PA.sre.quant = 0.025, PA.fact.aggr = NULL + , PA.user.table = NULL , na.rm = TRUE, filter.raster = FALSE, seed.val = NULL) { args <- .BIOMOD.formated.data.check.args(sp, env, xy, eval.sp, eval.env, eval.xy, filter.raster) @@ -1533,6 +1538,7 @@ setMethod('BIOMOD.formated.data.PA', signature(sp = 'numeric', env = 'SpatRaster sre.quant = PA.sre.quant, dist.min = PA.dist.min, dist.max = PA.dist.max, + fact.aggr = PA.fact.aggr, user.table = PA.user.table, seed.val = seed.val) diff --git a/R/bm_ModelingOptions.R b/R/bm_ModelingOptions.R index 3122d281..c21e4ef5 100644 --- a/R/bm_ModelingOptions.R +++ b/R/bm_ModelingOptions.R @@ -54,6 +54,9 @@ ##' function} ##' } ##' +##' To define the same options for all datasets of a model, you can provide these options as a list in +##' user.val with the names "for_all_datasets". +##' ##' @note \code{MAXENT} being the only external model (not called through a \code{R} package), ##' default parameters, and their values, are the following : ##' @@ -357,7 +360,7 @@ bm_ModelingOptions <- function(data.type } .fun_testIfInherits(TRUE, "calib.lines", calib.lines, c("matrix")) - expected_CVnames <- c(paste0("_allData_RUN", seq_len(ncol(calib.lines))), "_allData_allRun") + expected_CVnames <- c(paste0("_allData_RUN", seq_len(ncol(calib.lines))), "_allData_allRun", "for_all_datasets") if (inherits(bm.format, "BIOMOD.formated.data.PA")) { expected_CVnames <- c(expected_CVnames , sapply(1:ncol(bm.format@PA.table) diff --git a/R/bm_PseudoAbsences.R b/R/bm_PseudoAbsences.R index fb1ea4d6..0d05fa4a 100644 --- a/R/bm_PseudoAbsences.R +++ b/R/bm_PseudoAbsences.R @@ -39,7 +39,7 @@ ##' If \code{strategy = 'disk'}, a \code{numeric} defining the maximal distance to presence points ##' used to make the \code{disk} pseudo-absence selection (in meters) ##' @param fact.aggr (\emph{optional, default} \code{NULL}) \cr -##' If \code{strategy = 'disk'}, a \code{integer} defining the factor of aggregation to reduce the resolution +##' If \code{strategy = 'random'} or \code{strategy = 'disk'}, a \code{integer} defining the factor of aggregation to reduce the resolution ##' @param user.table (\emph{optional, default} \code{NULL}) \cr ##' If \code{strategy = 'user.defined'}, a \code{matrix} or \code{data.frame} with as many rows as ##' \code{resp.var} values, as many columns as \code{nb.rep}, and containing \code{TRUE} or @@ -218,7 +218,7 @@ bm_PseudoAbsences <- function(resp.var, expl.var, nb.rep = 1, strategy = 'random if (length(nb.absences) == 1) { out <- switch(strategy, user.defined = bm_PseudoAbsences_user.defined(resp.var, expl.var, user.table), - random = bm_PseudoAbsences_random(resp.var, expl.var, nb.absences, nb.rep), + random = bm_PseudoAbsences_random(resp.var, expl.var, nb.absences, nb.rep, fact.aggr), sre = bm_PseudoAbsences_sre(resp.var, expl.var, sre.quant, nb.absences, nb.rep), disk = bm_PseudoAbsences_disk(resp.var, expl.var, dist.min, dist.max, nb.absences, nb.rep, fact.aggr)) } else if (length(nb.absences) == nb.rep) { @@ -229,7 +229,7 @@ bm_PseudoAbsences <- function(resp.var, expl.var, nb.rep = 1, strategy = 'random out <- switch(strategy, user.defined = bm_PseudoAbsences_user.defined(resp.var, expl.var, user.table), - random = bm_PseudoAbsences_random(resp.var, expl.var, i.abs, length(i.rep)), + random = bm_PseudoAbsences_random(resp.var, expl.var, i.abs, length(i.rep), fact.aggr), sre = bm_PseudoAbsences_sre(resp.var, expl.var, sre.quant, i.abs, length(i.rep)), disk = bm_PseudoAbsences_disk(resp.var, expl.var, dist.min, dist.max, i.abs, length(i.rep), fact.aggr)) @@ -611,7 +611,7 @@ setMethod('bm_PseudoAbsences_random', signature(expl.var = "SpatVector"), ##' setMethod('bm_PseudoAbsences_random', signature(expl.var = "SpatRaster"), - function(resp.var, expl.var, nb.absences, nb.rep) + function(resp.var, expl.var, nb.absences, nb.rep, fact.aggr) { cat("\n > random pseudo absences selection") # 1. Check if NA are present in resp.var observations or not to determine which dataset to use @@ -646,6 +646,10 @@ setMethod('bm_PseudoAbsences_random', signature(expl.var = "SpatRaster"), cat("\n > Pseudo absences are selected in explanatory variables") # create a mask containing all not already sampled points (presences and absences) + if (!is.null(fact.aggr)) { + expl.var <- terra::aggregate(expl.var, fact = fact.aggr) + } + ## the area we want to sample mask.out <- mask.env <- .get_data_mask(expl.var, value.out = -1) # add presences and true absences in our mask @@ -653,6 +657,7 @@ setMethod('bm_PseudoAbsences_random', signature(expl.var = "SpatRaster"), mask.env[in.cells] <- NA mask.out[in.cells] <- 1 + # checking of nb candidates nb.cells <- .get_nb_available_pa_cells(mask.env, PA.flag = -1) @@ -941,6 +946,11 @@ setMethod('bm_PseudoAbsences_disk', signature(expl.var = "SpatRaster"), cat("\n > Pseudo absences are selected in explanatory variables") cat("\n") + + if (!is.null(fact.aggr)) { + expl.var <- terra::aggregate(expl.var, fact = fact.aggr) + } + # create a mask dist.mask <- subset(expl.var, 1) dist.mask[] <- NA @@ -951,11 +961,6 @@ setMethod('bm_PseudoAbsences_disk', signature(expl.var = "SpatRaster"), dist.mask <- distance(dist.mask) dist.mask <- mask(dist.mask, subset(expl.var, 1)) - if (!is.null(fact.aggr)) { - dist.mask <- terra::aggregate(dist.mask, fact = fact.aggr) - expl.var <- terra::aggregate(expl.var, fact = fact.aggr) - } - if (is.null(dist.max)) { dist.max <- Inf } @@ -969,7 +974,7 @@ setMethod('bm_PseudoAbsences_disk', signature(expl.var = "SpatRaster"), names(mask.in) = names(expl.var) # 2. selecting randomly pseudo absences - return(bm_PseudoAbsences_random(resp.var, expl.var = mask.in, nb.absences, nb.rep)) + return(bm_PseudoAbsences_random(resp.var, expl.var = mask.in, nb.absences, nb.rep, fact.aggr = NULL)) } }) diff --git a/vignettes/news.Rmd b/vignettes/news.Rmd index 0cec22e8..af19fda1 100644 --- a/vignettes/news.Rmd +++ b/vignettes/news.Rmd @@ -17,12 +17,11 @@ vignette: > #### 4.2-6 Devel actuel +- Add *RFd*: Random Forest down-sampling - Add _seed.val_ for bm_pseudoAbsences and BIOMOD_FormatingData -- Stop dans BIOMOD_FormatingData (càd biomod2_classes_1) si selection de PA à échouer. (Message okay ?) -- Add an argument _fact.agg_ (factor.aggregate nom à changer au besoin) for PseudoAbsences selection with the disk method. It allows to reduce the resolution of the environnement. NULL par défaut, donné à aggregate pour modifier résolution. **à faire remonter à BIOMOD_FormatingData ou laisser à bm_PseudoAbsences** -- Change max.depth into max_depth in OptionsBigboss (automatic in default) -- Add RFd Random Forest down-sampling -- Tuning for RFd: similar to RF (mtry only) +- Add _fact.aggr_ argument for pseudoabsences selection with the random and disk method. It allows to reduce the resolution of the environnement. +- Possibility to give the same options for all datasets with _"for_all_datasets"_ in bm_ModelingOptions. + ### 2024 From 1f078e57adc41dd373935c7ada678a54237d7928 Mon Sep 17 00:00:00 2001 From: HeleneBlt Date: Mon, 3 Jun 2024 15:45:42 +0200 Subject: [PATCH 17/22] Change for bigboss and tuning + change download message and news --- R/biomod2-package.R | 2 +- R/biomod2_classes_0.R | 4 +++- R/biomod2_data.R | 10 +++++----- R/bm_Tuning.R | 12 ++++++------ R/sysdata.rda | Bin 8510 -> 8489 bytes data/OptionsBigboss.rda | Bin 8510 -> 8489 bytes vignettes/news.Rmd | 6 ++++-- 7 files changed, 19 insertions(+), 15 deletions(-) diff --git a/R/biomod2-package.R b/R/biomod2-package.R index 040e71e3..0d2cc38b 100644 --- a/R/biomod2-package.R +++ b/R/biomod2-package.R @@ -10,7 +10,7 @@ { RFver <- read.dcf(file = system.file("DESCRIPTION", package = pkgname), fields = "Version") mess <- paste(pkgname, RFver, "loaded.\n") - mess <- paste(mess, "/!\\ New set up for modeling options. We apologize for the trouble ^[*.*]^") + mess <- paste(mess, "/!\\ Please note that some BigBoss options have been changed between biomod2 v4.2-6 and previous versions.") packageStartupMessage(mess) toLoad <- unique(ModelsTable$package[-which(ModelsTable$package %in% c("MAXENT", "biomod2"))]) diff --git a/R/biomod2_classes_0.R b/R/biomod2_classes_0.R index a2eedb0a..0dd40197 100644 --- a/R/biomod2_classes_0.R +++ b/R/biomod2_classes_0.R @@ -305,14 +305,16 @@ setGeneric("BIOMOD.options.dataset", } } if (strategy == "user.defined" && !is.null(user.val)) { + if ("for_all_datasets" %in% names(user.val)){ if (length(names(user.val)) > 1 ){ - user.val <- user.val[["for_all_datasets"]] + user.val <- user.val["for_all_datasets"] cat("\n\t\t> Only the options defined for 'for_all_datasets' will be taken into account") } user.val <- rep(user.val, length(expected_CVnames)) names(user.val) <- expected_CVnames } + .fun_testIfIn(TRUE, "names(user.val)", names(user.val), expected_CVnames) if (length(names(user.val)) != length(expected_CVnames)) { warning(paste0("Options will be changed only for a subset of datasets (" diff --git a/R/biomod2_data.R b/R/biomod2_data.R index 747468a6..7b508726 100644 --- a/R/biomod2_data.R +++ b/R/biomod2_data.R @@ -161,12 +161,12 @@ # bm.opt@options <- c(bm.opt@options, bm.opt_gam2@options, bm.opt_gam3@options) # bm.opt@options <- bm.opt@options[bm.opt@models] # bm.opt@options$ANN.binary.nnet.nnet@args.values[['_allData_allRun']]$size = 5 #NULL -# bm.opt@options$ANN.binary.nnet.nnet@args.values[['_allData_allRun']]$decay = 5 +# bm.opt@options$ANN.binary.nnet.nnet@args.values[['_allData_allRun']]$decay = 0.1 # bm.opt@options$ANN.binary.nnet.nnet@args.values[['_allData_allRun']]$trace = FALSE # bm.opt@options$ANN.binary.nnet.nnet@args.values[['_allData_allRun']]$rang = 0.1 # bm.opt@options$ANN.binary.nnet.nnet@args.values[['_allData_allRun']]$maxit = 200 # bm.opt@options$CTA.binary.rpart.rpart@args.values[['_allData_allRun']]$method = "class" -# bm.opt@options$CTA.binary.rpart.rpart@args.values[['_allData_allRun']]$control = list(xval = 5, minbucket = 5, minsplit = 5, cp = 0.001, maxdepth = 25) +# bm.opt@options$CTA.binary.rpart.rpart@args.values[['_allData_allRun']]$control = list(xval = 5, minbucket = 5, minsplit = 5, cp = 0.001, maxdepth = 10) # bm.opt@options$CTA.binary.rpart.rpart@args.values[['_allData_allRun']]$cost = NULL # bm.opt@options$FDA.binary.mda.fda@args.values[['_allData_allRun']]$method = "mars" # bm.opt@options$GAM.binary.mgcv.gam@args.values[['_allData_allRun']]$family = binomial(link = 'logit') @@ -193,14 +193,14 @@ # bm.opt@options$MAXENT.binary.MAXENT.MAXENT@args.values[['_allData_allRun']]$path_to_maxent.jar = '.' # bm.opt@options$RF.binary.randomForest.randomForest@args.values[['_allData_allRun']]$type = 'classification' # bm.opt@options$RF.binary.randomForest.randomForest@args.values[['_allData_allRun']]$ntree = 500 -# bm.opt@options$RF.binary.randomForest.randomForest@args.values[['_allData_allRun']]$mtry = NULL +# bm.opt@options$RF.binary.randomForest.randomForest@args.values[['_allData_allRun']]$mtry = 2 # bm.opt@options$RF.binary.randomForest.randomForest@args.values[['_allData_allRun']]$strata = factor(c(0, 1)) # bm.opt@options$RF.binary.randomForest.randomForest@args.values[['_allData_allRun']]$sampsize = NULL # bm.opt@options$RF.binary.randomForest.randomForest@args.values[['_allData_allRun']]$nodesize = 5 # bm.opt@options$RF.binary.randomForest.randomForest@args.values[['_allData_allRun']]$maxnodes = NULL # bm.opt@options$RFd.binary.randomForest.randomForest@args.values[['_allData_allRun']]$type = 'classification' # bm.opt@options$RFd.binary.randomForest.randomForest@args.values[['_allData_allRun']]$ntree = 500 -# bm.opt@options$RFd.binary.randomForest.randomForest@args.values[['_allData_allRun']]$mtry = NULL +# bm.opt@options$RFd.binary.randomForest.randomForest@args.values[['_allData_allRun']]$mtry = 2 # bm.opt@options$RFd.binary.randomForest.randomForest@args.values[['_allData_allRun']]$strata = factor(c(0, 1)) # bm.opt@options$RFd.binary.randomForest.randomForest@args.values[['_allData_allRun']]$sampsize = NULL # bm.opt@options$RFd.binary.randomForest.randomForest@args.values[['_allData_allRun']]$nodesize = 5 @@ -212,7 +212,7 @@ # bm.opt@options$XGBOOST.binary.xgboost.xgboost@args.values[['_allData_allRun']]$objective = "binary:logistic" # OptionsBigboss <- bm.opt -# usethis::use_data(OptionsBigboss, overwrite = TRUE, internal = TRUE) +# usethis::use_data(OptionsBigboss, overwrite = TRUE, internal = T) # usethis::use_data(OptionsBigboss, ModelsTable, overwrite = TRUE, internal = TRUE) diff --git a/R/bm_Tuning.R b/R/bm_Tuning.R index ed67a0d5..d73aeeda 100644 --- a/R/bm_Tuning.R +++ b/R/bm_Tuning.R @@ -203,10 +203,10 @@ bm_Tuning <- function(model, weights = NULL, ctrl.train = NULL, params.train = list(ANN.size = c(2, 4, 6, 8), - ANN.decay = c(0.001, 0.01, 0.05, 0.1), + ANN.decay = c(0.01, 0.05, 0.1), ANN.bag = FALSE, FDA.degree = 1:2, - FDA.nprune = 2:38, + FDA.nprune = 2:25, GAM.select = c(TRUE, FALSE), GAM.method = c('GCV.Cp', 'GACV.Cp', 'REML', 'P-REML', 'ML', 'P-ML'), GAM.span = c(0.3, 0.5, 0.7), @@ -216,7 +216,7 @@ bm_Tuning <- function(model, GBM.shrinkage = c(0.001, 0.01, 0.1), GBM.n.minobsinnode = 10, MARS.degree = 1:2, - MARS.nprune = 2:max(38, 2 * ncol(bm.format@data.env.var) + 1), + MARS.nprune = 2:max(21, 2 * ncol(bm.format@data.env.var) + 1), MAXENT.algorithm = 'maxnet', MAXENT.parallel = TRUE, RF.mtry = 1:min(10, ncol(bm.format@data.env.var)), @@ -589,10 +589,10 @@ bm_Tuning <- function(model, .fun_testIfInherits(TRUE, "bm.format", bm.format, c("BIOMOD.formated.data", "BIOMOD.formated.data.PA")) ## check params.train ------------------------------------------------------- params.train_init = list(ANN.size = c(2, 4, 6, 8), - ANN.decay = c(0.001, 0.01, 0.05, 0.1), + ANN.decay = c(0.01, 0.05, 0.1), ANN.bag = FALSE, FDA.degree = 1:2, - FDA.nprune = 2:38, + FDA.nprune = 2:25, GAM.select = c(TRUE, FALSE), GAM.method = c('GCV.Cp', 'GACV.Cp', 'REML', 'P-REML', 'ML', 'P-ML'), GAM.span = c(0.3, 0.5, 0.7), @@ -602,7 +602,7 @@ bm_Tuning <- function(model, GBM.shrinkage = c(0.001, 0.01, 0.1), GBM.n.minobsinnode = 10, MARS.degree = 1:2, - MARS.nprune = 2:max(38, 2 * ncol(bm.format@data.env.var) + 1), + MARS.nprune = 2:max(21, 2 * ncol(bm.format@data.env.var) + 1), MAXENT.algorithm = 'maxnet', MAXENT.parallel = TRUE, RF.mtry = 1:min(10, ncol(bm.format@data.env.var)), diff --git a/R/sysdata.rda b/R/sysdata.rda index dfb12f89c7cf9e425a9735265dc590d29ba8eccf..ca3d04d5618d404b688a31bb8b69a5790a30497e 100644 GIT binary patch literal 8489 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 BS$6;c literal 8510 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 KQYsa->q+!>NnDo7NMFsi8qArTfQf&gvjbj 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 BS$6;c literal 8510 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 KQYsa->q+!>NnDo7NMFsi8qArTfQf&gvjbj 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 #### 4.2-6 Devel actuel -- Add *RFd*: Random Forest down-sampling -- Add _seed.val_ for bm_pseudoAbsences and BIOMOD_FormatingData +- Warning ! New options for OptionsBigboss have been modified ( concern only ANN, CTA and RF models) +- Some changes for the tuning ranges. +- Add *RFd*: Random Forest with down-sampling method. +- Add _seed.val_ for bm_pseudoAbsences and BIOMOD_FormatingData. - Add _fact.aggr_ argument for pseudoabsences selection with the random and disk method. It allows to reduce the resolution of the environnement. - Possibility to give the same options for all datasets with _"for_all_datasets"_ in bm_ModelingOptions. From 7edd26dd6a889dbfb5ad28049ab817fd94f163ec Mon Sep 17 00:00:00 2001 From: HeleneBlt Date: Thu, 13 Jun 2024 10:17:57 +0200 Subject: [PATCH 18/22] Modif docs + update from master --- R/biomod2_data.R | 17 ++++++++++++++--- R/bm_PseudoAbsences.R | 2 +- R/bm_RunModelsLoop.R | 2 +- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/R/biomod2_data.R b/R/biomod2_data.R index 7b508726..84b6150a 100644 --- a/R/biomod2_data.R +++ b/R/biomod2_data.R @@ -55,7 +55,7 @@ #' \item{\code{ANN.binary.nnet.nnet}}{ #' \itemize{ #' \item \code{size = 5} -#' \item \code{decay = 5} +#' \item \code{decay = 0.1} #' \item \code{trace = FALSE} #' \item \code{rang = 0.1} #' \item \code{maxit = 200} @@ -64,7 +64,7 @@ #' \item{\code{CTA.binary.rpart.rpart}}{ #' \itemize{ #' \item \code{method = 'class'} -#' \item \code{control = list(xval = 5, minbucket = 5, minsplit = 5, cp = 0.001, maxdepth = 25)} +#' \item \code{control = list(xval = 5, minbucket = 5, minsplit = 5, cp = 0.001, maxdepth = 10)} #' \item \code{cost = NULL} #' } #' } @@ -128,7 +128,18 @@ #' \itemize{ #' \item \code{type = 'classification'} #' \item \code{ntree = 500} -#' \item \code{mtry = NULL} +#' \item \code{mtry = 2} +#' \item \code{strata = factor(c(0, 1))} +#' \item \code{sampsize = NULL} +#' \item \code{nodesize = 5} +#' \item \code{maxnodes = NULL} +#' } +#' } +#' \item{\code{RFd.binary.randomForest.randomForest}}{ +#' \itemize{ +#' \item \code{type = 'classification'} +#' \item \code{ntree = 500} +#' \item \code{mtry = 2} #' \item \code{strata = factor(c(0, 1))} #' \item \code{sampsize = NULL} #' \item \code{nodesize = 5} diff --git a/R/bm_PseudoAbsences.R b/R/bm_PseudoAbsences.R index 0d05fa4a..88aadb3a 100644 --- a/R/bm_PseudoAbsences.R +++ b/R/bm_PseudoAbsences.R @@ -557,7 +557,7 @@ setGeneric("bm_PseudoAbsences_random", ##' setMethod('bm_PseudoAbsences_random', signature(expl.var = "SpatVector"), - function(resp.var, expl.var, nb.absences, nb.rep) + function(resp.var, expl.var, nb.absences, nb.rep, fact.aggr) { cat("\n > random pseudo absences selection") diff --git a/R/bm_RunModelsLoop.R b/R/bm_RunModelsLoop.R index 4c0f7e41..88490e45 100644 --- a/R/bm_RunModelsLoop.R +++ b/R/bm_RunModelsLoop.R @@ -49,7 +49,7 @@ ##' ##' @param model a \code{character} corresponding to the model name to be computed, must be either ##' \code{ANN}, \code{CTA}, \code{FDA}, \code{GAM}, \code{GBM}, \code{GLM}, \code{MARS}, -##' \code{MAXENT}, \code{MAXNET}, \code{RF}, \code{SRE}, \code{XGBOOST} +##' \code{MAXENT}, \code{MAXNET}, \code{RF}, \code{RFd}, \code{SRE}, \code{XGBOOST} ##' @param run.name a \code{character} corresponding to the model to be run (sp.name + pa.id + ##' run.id) ##' @param dir.name (\emph{optional, default} \code{.}) \cr From ae5307d804fb437282e77b9bf8d0832d28bbe196 Mon Sep 17 00:00:00 2001 From: HeleneBlt Date: Tue, 18 Jun 2024 14:41:13 +0200 Subject: [PATCH 19/22] Switch to 4.2-6 Update message Update ReadMe Update docs --- DESCRIPTION | 4 +- R/biomod2-package.R | 3 +- README.md | 39 +++-- docs/404.html | 2 +- docs/articles/index.html | 2 +- docs/articles/news.html | 136 ++++++++++-------- docs/articles/vignette_presentation.html | 2 +- docs/authors.html | 6 +- docs/index.html | 63 +++++--- docs/reference/BIOMOD.formated.data.PA.html | 9 +- .../reference/BIOMOD_EnsembleForecasting.html | 2 +- docs/reference/BIOMOD_EnsembleModeling.html | 2 +- docs/reference/BIOMOD_FormatingData.html | 8 +- docs/reference/BIOMOD_LoadModels.html | 2 +- docs/reference/BIOMOD_Modeling.html | 2 +- docs/reference/BIOMOD_Projection.html | 2 +- docs/reference/OptionsBigboss.html | 18 ++- docs/reference/bm_ModelingOptions.html | 6 +- docs/reference/bm_PlotEvalMean.html | 2 +- docs/reference/bm_PseudoAbsences.html | 8 +- docs/reference/bm_RunModelsLoop.html | 4 +- docs/reference/bm_Tuning.html | 27 ++-- docs/reference/getters.out.html | 2 +- docs/reference/index.html | 2 +- man/BIOMOD.formated.data.PA.Rd | 5 + man/BIOMOD_FormatingData.Rd | 4 + man/OptionsBigboss.Rd | 17 ++- man/bm_ModelingOptions.Rd | 3 + man/bm_PseudoAbsences.Rd | 6 +- man/bm_RunModelsLoop.Rd | 2 +- man/bm_Tuning.Rd | 25 ++-- vignettes/news.Rmd | 10 +- 32 files changed, 269 insertions(+), 156 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index d9930599..ce4c6794 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,8 +1,8 @@ Package: biomod2 Type: Package Title: Ensemble Platform for Species Distribution Modeling -Version: 4.2-5-2 -Date: 2024-05-31 +Version: 4.2-6 +Date: 2024-06-18 Authors@R: c(person("Wilfried", "Thuiller", role = c("aut") , email = "wilfried.thuiller@univ-grenoble-alpes.fr"), person("Damien", "Georges", role = c("aut")), diff --git a/R/biomod2-package.R b/R/biomod2-package.R index 0d2cc38b..1053bd02 100644 --- a/R/biomod2-package.R +++ b/R/biomod2-package.R @@ -10,7 +10,8 @@ { RFver <- read.dcf(file = system.file("DESCRIPTION", package = pkgname), fields = "Version") mess <- paste(pkgname, RFver, "loaded.\n") - mess <- paste(mess, "/!\\ Please note that some BigBoss options have been changed between biomod2 v4.2-6 and previous versions.") + mess <- paste(mess, "/!\\ Be careful : note that some BigBoss options have been changed between biomod2 v4.2-6 and previous versions./!\\ + \n\n Please welcome a new model : RFd. This is a random forest model with a automatic down sampling to make your life easier.") packageStartupMessage(mess) toLoad <- unique(ModelsTable$package[-which(ModelsTable$package %in% c("MAXENT", "biomod2"))]) diff --git a/README.md b/README.md index 0c0dec2b..e1daaf00 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ [![Cran Version](https://www.r-pkg.org/badges/version/biomod2?color=yellow)](https://cran.r-project.org/package=biomod2) -[![Github Version](https://img.shields.io/badge/devel%20version-4.2--5--2-blue.svg)](https://github.com/biomodhub/biomod2) +[![Github Version](https://img.shields.io/badge/devel%20version-4.2--6-blue.svg)](https://github.com/biomodhub/biomod2) [![Last Commit](https://img.shields.io/github/last-commit/biomodhub/biomod2.svg)](https://github.com/biomodhub/biomod2/commits/master) [![R-CMD-check](https://github.com/biomodhub/biomod2/actions/workflows/R-CMD-check.yml/badge.svg)](https://github.com/biomodhub/biomod2/actions/workflows/R-CMD-check.yml) @@ -49,7 +49,7 @@ install.packages("biomod2", dependencies = TRUE)
    -- **Development version** [![v](https://img.shields.io/badge/devel%20version-4.2--5--2-blue.svg)](https://github.com/biomodhub/biomod2) from [biomodhub](https://github.com/biomodhub/biomod2) : +- **Development version** [![v](https://img.shields.io/badge/devel%20version-4.2--6-blue.svg)](https://github.com/biomodhub/biomod2) from [biomodhub](https://github.com/biomodhub/biomod2) : ```R library(devtools) @@ -58,7 +58,7 @@ devtools::install_github("biomodhub/biomod2", dependencies = TRUE)

    -### `biomod 4.2-5` - Modeling options & Tuning Update +### `biomod 4.2-6` - Improved OptionsBigBoss and new model **! `biomod2 4.2-5` is now available on CRAN !** @@ -66,17 +66,15 @@ devtools::install_github("biomodhub/biomod2", dependencies = TRUE) #### What is changed ? -- modeling options are now automatically retrieved from single models functions, normally allowing the use of all arguments taken into account by these functions -- tuning has been cleaned up, but keep in mind that it is still a quite long running process -- in consequence, `BIOMOD_ModelingOptions` and `BIOMOD_Tuning` functions become secundary functions (`bm_ModelingOptions` and `bm_Tuning`), and modeling options can be directly built through `BIOMOD_Modeling` function +- To improve the models, we made some change in the options for **`OptionsBigboss`**. (This only affects the ANN, CTA and RF models.) You can check all your options with the `get_options()` function. +- To reduce the tuning calculation time, we update the tuning ranges for ANN, FDA and MARS models. #### What is new ? -- `ModelsTable` and `OptionsBigboss` datasets (*note that improvement of bigboss modeling options is planned in near future*) -- 3 new vignettes have been created : - - [data preparation](https://biomodhub.github.io/biomod2/articles/vignette_dataPreparation.html) (*questions you should ask yourself before modeling*) - - [cross-validation](https://biomodhub.github.io/biomod2/articles/vignette_crossValidation.html) (*to prepare your own calibration / validation datasets*) - - [modeling options](https://biomodhub.github.io/biomod2/articles/vignette_dataPreparation.html) (*to help you navigate through the new way of parameterizing single models*) +- We add a new model : **RFd**. It's a Random Forest model with a down-sampling method. +- You can now define _seed.val_ for `bm_PseudoAbsences()` and `BIOMOD_FormatingData()`. +- We have added _fact.aggr_ argument for pseudo-absences selection with the random and disk methods. It allows to reduce the resolution of the environment. +- Possibility to give the same options for all datasets with _"for_all_datasets"_ in `bm_ModelingOptions()`.
    @@ -86,7 +84,26 @@ devtools::install_github("biomodhub/biomod2", dependencies = TRUE)


    +

    + + +### `biomod 4.2-5` - Modeling options & Tuning Update + +#### What is changed ? + +- modeling options are now automatically retrieved from single models functions, normally allowing the use of all arguments taken into account by these functions +- tuning has been cleaned up, but keep in mind that it is still a quite long running process +- in consequence, `BIOMOD_ModelingOptions` and `BIOMOD_Tuning` functions become secundary functions (`bm_ModelingOptions` and `bm_Tuning`), and modeling options can be directly built through `BIOMOD_Modeling` function + +#### What is new ? +- `ModelsTable` and `OptionsBigboss` datasets (*note that improvement of bigboss modeling options is planned in near future*) +- 3 new vignettes have been created : + - [data preparation](https://biomodhub.github.io/biomod2/articles/vignette_dataPreparation.html) (*questions you should ask yourself before modeling*) + - [cross-validation](https://biomodhub.github.io/biomod2/articles/vignette_crossValidation.html) (*to prepare your own calibration / validation datasets*) + - [modeling options](https://biomodhub.github.io/biomod2/articles/vignette_dataPreparation.html) (*to help you navigate through the new way of parameterizing single models*) + +
    ### `biomod 4.2` - Terra Update diff --git a/docs/404.html b/docs/404.html index dd978977..7fe67438 100644 --- a/docs/404.html +++ b/docs/404.html @@ -32,7 +32,7 @@
    biomod2 - 4.2-5-2 + 4.2-6 diff --git a/docs/articles/index.html b/docs/articles/index.html index 4d0a2198..f5edf5d5 100644 --- a/docs/articles/index.html +++ b/docs/articles/index.html @@ -17,7 +17,7 @@ biomod2 - 4.2-5-2 + 4.2-6 diff --git a/docs/articles/news.html b/docs/articles/news.html index 945f6212..0c2cf331 100644 --- a/docs/articles/news.html +++ b/docs/articles/news.html @@ -33,7 +33,7 @@ biomod2 - 4.2-5-2 + 4.2-6 @@ -145,7 +145,29 @@

    - 2024 + 2024 +

    +
    +

    4.2-6 Devel actuel +

    +
      +
    • Warning ! Some options for OptionsBigboss have been +modified (concern only ANN, CTA and RF models)
    • +
    • Some changes for the tuning ranges.
    • +
    • Add RFd: Random Forest with a down-sampling method.
    • +
    • Add seed.val for bm_pseudoAbsences and +BIOMOD_FormatingData.
    • +
    • Add fact.aggr argument for pseudo-absences selection with +the random and disk methods. It allows to reduce the resolution of the +environment.
    • +
    • Possibility to give the same options for all datasets with +“for_all_datasets” in bm_ModelingOptions.
    • +
    +
    +
    +
    +

    + 2024

    Bugfix @@ -240,8 +262,8 @@
    Bugfix<
    -

    - 2023 +

    + 2023

    4.2-5 Modeling options and Tuning (2023-09-12) @@ -588,8 +610,8 @@

    Internal Changes
    -

    - 2022 +

    + 2022

    4.2-1 Bugfix patch @@ -781,7 +803,7 @@

    Internal Changes -

    4.1-3 +

    4.1-3

    Bugfix @@ -810,7 +832,7 @@

    Internal Changes -

    4.1-2 (2022-09-29) +

    4.1-2 (2022-09-29)

    Major changes @@ -906,7 +928,7 @@
    Miscellaneous -

    4.1-1 (2022-08-30) +

    4.1-1 (2022-08-30)

    • add do.progress parameter (to render or not progress @@ -918,14 +940,14 @@

      4.1-1 (2022-08-30)

    -

    4.1 (2022-07-12) +

    4.1 (2022-07-12)

    • fix bugs following major release 4.0
    -

    4.0 (2022-03-01) +

    4.0 (2022-03-01)

    • MAJOR RELEASE
    • @@ -940,11 +962,11 @@

      4.0 (2022-03-01) -

      - 2021 +

      + 2021

      -

      3.5-3 (2021-11-02) +

      3.5-3 (2021-11-02)

      • clean BIOMOD classes definitions and functions @@ -959,7 +981,7 @@

        3.5-3 (2021-11-02)

      -

      3.5-2 (2021-10-18) +

      3.5-2 (2021-10-18)

      • fix BIOMOD_PresenceOnly function (previously @@ -972,11 +994,11 @@

        3.5-2 (2021-10-18)

      -

      - 2018-2019 +

      + 2018-2019

      -

      3.3-20 (2019-03-05) +

      3.3-20 (2019-03-05)

      • Remove maxent Tsurukoa because not maintained anymore (required by @@ -984,14 +1006,14 @@

        3.3-20 (2019-03-05)

      -

      3.3-18 (2018-07-04) +

      3.3-18 (2018-07-04)

      • fix the gbm multicore issue
      -

      3.3-17 (2018-04-23) +

      3.3-17 (2018-04-23)

      • correct the single presence pseudo-absences generation bug @@ -1000,18 +1022,18 @@

        3.3-17 (2018-04-23)

      -

      - 2016 +

      + 2016

      -

      3.3-6 (2016-01-14) +

      3.3-6 (2016-01-14)

      • add get_predictions function for ensemble models
      -

      3.3-5 (2016-01-04) +

      3.3-5 (2016-01-04)

      • MARS models are now computed throw earth package (was @@ -1023,11 +1045,11 @@

        3.3-5 (2016-01-04)

      -

      - 2015 +

      + 2015

      -

      3.3-4 (2015-11-04) +

      3.3-4 (2015-11-04)

      • update BIOMOD_tuning function (Frank @@ -1035,7 +1057,7 @@

        3.3-4 (2015-11-04)

      -

      3.3-3 (2015-10-27) +

      3.3-3 (2015-10-27)

      • force sampling of each level of factorial variables
      • @@ -1044,7 +1066,7 @@

        3.3-3 (2015-10-27)

      -

      3.3-00 (2015-10-05) +

      3.3-00 (2015-10-05)

      • MAJOR RELEASE
      • @@ -1060,7 +1082,7 @@

        3.3-00 (2015-10-05)

      -

      3.2-00 (2015-07-28) +

      3.2-00 (2015-07-28)

      • add 3 new functions in biomod2 (Frank B. @@ -1078,11 +1100,11 @@

        3.2-00 (2015-07-28)

      -

      - 2014 +

      + 2014

      -

      3.1-59 (2014-10-23) +

      3.1-59 (2014-10-23)

      • add model evaluation scores plotting function
      • @@ -1091,7 +1113,7 @@

        3.1-59 (2014-10-23)

      -

      3.1-53 (2014-08-06) +

      3.1-53 (2014-08-06)

      • new ensemble models names to be more coherent with formal models @@ -1099,7 +1121,7 @@

        3.1-53 (2014-08-06)

      -

      3.1-44 (2014-05-20) +

      3.1-44 (2014-05-20)

      • possibility to use user defined function to influence the way models @@ -1108,7 +1130,7 @@

        3.1-44 (2014-05-20)

      -

      3.1-43 (2014-05-20) +

      3.1-43 (2014-05-20)

      • add of as.data.frame argument for @@ -1117,7 +1139,7 @@

        3.1-43 (2014-05-20)

      -

      3.1-42 (2014-05-19) +

      3.1-42 (2014-05-19)

      • enable ensemble forecasting models selection (thanks to @@ -1126,11 +1148,11 @@

        3.1-42 (2014-05-19)

      -

      - 2013 +

      + 2013

      -

      3.1-17 (2013-10-23) +

      3.1-17 (2013-10-23)

      • add parameter to control amount of memory reserved for @@ -1143,7 +1165,7 @@

        3.1-17 (2013-10-23)

      -

      3.1-1 (2013-09-04) +

      3.1-1 (2013-09-04)

      • limitation of package dependencies
      • @@ -1153,7 +1175,7 @@

        3.1-1 (2013-09-04)

      -

      3.0.2 (2013-07-23) +

      3.0.2 (2013-07-23)

      • new functions to evaluate a-posteriori models quality
      • @@ -1162,7 +1184,7 @@

        3.0.2 (2013-07-23)

      -

      3.0.0 (2013-07-01) +

      3.0.0 (2013-07-01)

      • MAJOR RELEASES
      • @@ -1181,7 +1203,7 @@

        3.0.0 (2013-07-01)

      -

      2.1.37 (2013-06-12) +

      2.1.37 (2013-06-12)

      • change (temporally?) gam default package from mgcv to @@ -1192,7 +1214,7 @@

        2.1.37 (2013-06-12)

      -

      2.1.32 (2013-05-30) +

      2.1.32 (2013-05-30)

      • weights for user defined pseudo-absences are now supported @@ -1202,7 +1224,7 @@

        2.1.32 (2013-05-30)

      -

      2.1.13 (2013-03-06) +

      2.1.13 (2013-03-06)

      • Add ProbDensFunc() function to package to produce nice @@ -1210,7 +1232,7 @@

        2.1.13 (2013-03-06)

      -

      2.1.12 (2013-03-04) +

      2.1.12 (2013-03-04)

      • add rasterVis dependency for nicer biomod2 @@ -1222,7 +1244,7 @@

        2.1.12 (2013-03-04)

      -

      2.1.9 (2013-02-28) +

      2.1.9 (2013-02-28)

      • possibility to indicate manually which data should be used for @@ -1232,7 +1254,7 @@

        2.1.9 (2013-02-28)

      -

      2.1.9 (2013-02-27) +

      2.1.9 (2013-02-27)

      • one var modeling supported (thanks Anne O.)
      • @@ -1241,14 +1263,14 @@

        2.1.9 (2013-02-27)

      -

      2.1.8 (2013-02-25) +

      2.1.8 (2013-02-25)

      • response plot supports now formal models
      -

      2.1.0 (2013-02-21) +

      2.1.0 (2013-02-21)

      • MAJOR RELEASE
      • @@ -1267,7 +1289,7 @@

        2.1.0 (2013-02-21)

      -

      2.0.11 (2013-02-18) +

      2.0.11 (2013-02-18)

      • possibility to consider a user.defined pseudo absences selection @@ -1277,7 +1299,7 @@

        2.0.11 (2013-02-18)

      -

      2.0.9 (2013-02-15) +

      2.0.9 (2013-02-15)

      • automatic save on hard drive of BIOMOD_Projection @@ -1285,7 +1307,7 @@

        2.0.9 (2013-02-15)

      -

      2.0.8 (2013-02-14) +

      2.0.8 (2013-02-14)

      • @@ -1295,14 +1317,14 @@

        2.0.8 (2013-02-14)

      -

      2.0.7 (2013-02-12) +

      2.0.7 (2013-02-12)

      • bug on weights corrected (thanks to Lugi M.)
      -

      2.0.3 (2013-01-18) +

      2.0.3 (2013-01-18)

      • deal with MAXENT categorical variables and categorical @@ -1310,7 +1332,7 @@

        2.0.3 (2013-01-18)

      -

      2.0.0 (2013-01-17) +

      2.0.0 (2013-01-17)

      • MAJOR RELEASE
      • diff --git a/docs/articles/vignette_presentation.html b/docs/articles/vignette_presentation.html index 7275a891..dc3874b8 100644 --- a/docs/articles/vignette_presentation.html +++ b/docs/articles/vignette_presentation.html @@ -33,7 +33,7 @@ biomod2 - 4.2-5-2 + 4.2-6
      diff --git a/docs/authors.html b/docs/authors.html index f5958c24..f6e1cdc4 100644 --- a/docs/authors.html +++ b/docs/authors.html @@ -17,7 +17,7 @@ biomod2 - 4.2-5-2 + 4.2-6
      @@ -150,13 +150,13 @@

      Citation

      Thuiller W, Georges D, Gueguen M, Engler R, Breiner F, Lafourcade B, Patin R, Blancheteau H (2024). biomod2: Ensemble Platform for Species Distribution Modeling. -R package version 4.2-5-2, https://biomodhub.github.io/biomod2/. +R package version 4.2-6, https://biomodhub.github.io/biomod2/.

      @Manual{,
         title = {biomod2: Ensemble Platform for Species Distribution Modeling},
         author = {Wilfried Thuiller and Damien Georges and Maya Gueguen and Robin Engler and Frank Breiner and Bruno Lafourcade and Remi Patin and Helene Blancheteau},
         year = {2024},
      -  note = {R package version 4.2-5-2},
      +  note = {R package version 4.2-6},
         url = {https://biomodhub.github.io/biomod2/},
       }
      diff --git a/docs/index.html b/docs/index.html index 6ed272d6..5a2f77bf 100644 --- a/docs/index.html +++ b/docs/index.html @@ -33,7 +33,7 @@ biomod2 - 4.2-5-2 + 4.2-6
      @@ -166,7 +166,7 @@


       library(devtools)
      @@ -174,8 +174,8 @@ 



      -

      - biomod 4.2-5 - Modeling options & Tuning Update +

      + biomod 4.2-6 - Improved OptionsBigBoss and new model

      ! biomod2 4.2-5 is now available on CRAN !

      /!\ Please feel free to indicate if you notice some strange new behaviors !

      @@ -184,14 +184,46 @@

      What is changed ?

        +
      • To improve the models, we made some change in the options for OptionsBigboss. (This only affects the ANN, CTA and RF models.) You can check all your options with the get_options() function.
      • +
      • To reduce the tuning calculation time, we update the tuning ranges for ANN, FDA and MARS models.
      • +
      +
      +
      +

      + What is new ? +

      +
        +
      • We add a new model : RFd. It’s a Random Forest model with a down-sampling method.
      • +
      • You can now define seed.val for bm_PseudoAbsences() and BIOMOD_FormatingData().
      • +
      • We have added fact.aggr argument for pseudo-absences selection with the random and disk methods. It allows to reduce the resolution of the environment.
      • +
      • Possibility to give the same options for all datasets with “for_all_datasets” in bm_ModelingOptions().
      • +
      +


      +
      +

      +Main workflow

      +
      +




      +



      +
      +

      +
      +

      + biomod 4.2-5 - Modeling options & Tuning Update +

      +
      +

      + What is changed ? +

      +
      • modeling options are now automatically retrieved from single models functions, normally allowing the use of all arguments taken into account by these functions
      • tuning has been cleaned up, but keep in mind that it is still a quite long running process
      • in consequence, BIOMOD_ModelingOptions and BIOMOD_Tuning functions become secundary functions (bm_ModelingOptions and bm_Tuning), and modeling options can be directly built through BIOMOD_Modeling function
      -

      - What is new ? +

      + What is new ?

      • @@ -208,11 +240,6 @@


      -
      -

      -Main workflow

      -
      -




      @@ -220,8 +247,8 @@

      biomod 4.2 - Terra Update

      -

      - What is changed ? +

      + What is changed ?

      • @@ -240,8 +267,8 @@

        /!\ Package fresh start… meaning some changes in function names and parameters. We apologize for the trouble >{o.o}<
        Sorry for the inconvenience, and please feel free to indicate if you notice some strange new behaviors !

        -

        - What is changed ? +

        + What is changed ?

        • all code functions have been cleaned, and old / unused functions have been removed
        • @@ -251,8 +278,8 @@

        -

        - What is new ? +

        + What is new ?

        • plot functions have been re-written with ggplot2 @@ -324,7 +351,7 @@

          Developers

          Dev status

          • Cran Version
          • -
          • Github Version
          • +
          • Github Version
          • Last Commit
          • R-CMD-check
          diff --git a/docs/reference/BIOMOD.formated.data.PA.html b/docs/reference/BIOMOD.formated.data.PA.html index ec4f126b..e7d3dd83 100644 --- a/docs/reference/BIOMOD.formated.data.PA.html +++ b/docs/reference/BIOMOD.formated.data.PA.html @@ -19,7 +19,7 @@ biomod2 - 4.2-5-2 + 4.2-6
        @@ -132,6 +132,7 @@

        BIOMOD_FormatingData() output object class (with pseudo-absence PA.dist.min = 0, PA.dist.max = NULL, PA.sre.quant = 0.025, + PA.fact.aggr = NULL, PA.user.table = NULL, na.rm = TRUE, filter.raster = FALSE, @@ -154,6 +155,7 @@

        BIOMOD_FormatingData() output object class (with pseudo-absence PA.dist.min = 0, PA.dist.max = NULL, PA.sre.quant = 0.025, + PA.fact.aggr = NULL, PA.user.table = NULL, na.rm = TRUE, filter.raster = FALSE, @@ -270,6 +272,11 @@

        Arguments

        (see Details)

        +
        PA.fact.aggr
        +

        (optional, default NULL)
        +If strategy = 'random' or strategy = 'disk', a integer defining the factor of aggregation to reduce the resolution

        + +
        PA.user.table

        (optional, default NULL)
        If pseudo-absence selection and PA.strategy = 'user.defined', a matrix or diff --git a/docs/reference/BIOMOD_EnsembleForecasting.html b/docs/reference/BIOMOD_EnsembleForecasting.html index 897229f0..52f14091 100644 --- a/docs/reference/BIOMOD_EnsembleForecasting.html +++ b/docs/reference/BIOMOD_EnsembleForecasting.html @@ -19,7 +19,7 @@ biomod2 - 4.2-5-2 + 4.2-6

      diff --git a/docs/reference/BIOMOD_EnsembleModeling.html b/docs/reference/BIOMOD_EnsembleModeling.html index 8296f0e2..1e315305 100644 --- a/docs/reference/BIOMOD_EnsembleModeling.html +++ b/docs/reference/BIOMOD_EnsembleModeling.html @@ -21,7 +21,7 @@ biomod2 - 4.2-5-2 + 4.2-6
      diff --git a/docs/reference/BIOMOD_FormatingData.html b/docs/reference/BIOMOD_FormatingData.html index 5a2e3366..f07247fe 100644 --- a/docs/reference/BIOMOD_FormatingData.html +++ b/docs/reference/BIOMOD_FormatingData.html @@ -20,7 +20,7 @@ biomod2 - 4.2-5-2 + 4.2-6
      @@ -133,6 +133,7 @@

      Format input data, and select pseudo-absences if wanted, for usage in PA.dist.min = 0, PA.dist.max = NULL, PA.sre.quant = 0.025, + PA.fact.aggr = NULL, PA.user.table = NULL, na.rm = TRUE, filter.raster = FALSE, @@ -250,6 +251,11 @@

      Arguments

      (see Details)

      +
      PA.fact.aggr
      +

      (optional, default NULL)
      +If strategy = 'random' or strategy = 'disk', a integer defining the factor of aggregation to reduce the resolution

      + +
      PA.user.table

      (optional, default NULL)
      If pseudo-absence selection and PA.strategy = 'user.defined', a matrix or diff --git a/docs/reference/BIOMOD_LoadModels.html b/docs/reference/BIOMOD_LoadModels.html index d95012ae..681e688b 100644 --- a/docs/reference/BIOMOD_LoadModels.html +++ b/docs/reference/BIOMOD_LoadModels.html @@ -18,7 +18,7 @@ biomod2 - 4.2-5-2 + 4.2-6

      diff --git a/docs/reference/BIOMOD_Modeling.html b/docs/reference/BIOMOD_Modeling.html index 4796bc13..5e207f2e 100644 --- a/docs/reference/BIOMOD_Modeling.html +++ b/docs/reference/BIOMOD_Modeling.html @@ -20,7 +20,7 @@ biomod2 - 4.2-5-2 + 4.2-6

    diff --git a/docs/reference/BIOMOD_Projection.html b/docs/reference/BIOMOD_Projection.html index 628aa5bd..ac9228cd 100644 --- a/docs/reference/BIOMOD_Projection.html +++ b/docs/reference/BIOMOD_Projection.html @@ -19,7 +19,7 @@ biomod2 - 4.2-5-2 + 4.2-6

    diff --git a/docs/reference/OptionsBigboss.html b/docs/reference/OptionsBigboss.html index 7f2c46b7..a494a14b 100644 --- a/docs/reference/OptionsBigboss.html +++ b/docs/reference/OptionsBigboss.html @@ -18,7 +18,7 @@ biomod2 - 4.2-5-2 + 4.2-6
    @@ -122,7 +122,7 @@

    Format

    A BIOMOD.models.options object with some changed values :

    ANN.binary.nnet.nnet

    • size = 5

    • -
    • decay = 5

    • +
    • decay = 0.1

    • trace = FALSE

    • rang = 0.1

    • maxit = 200

    • @@ -130,7 +130,7 @@

      Format

      CTA.binary.rpart.rpart

      • method = 'class'

      • -
      • control = list(xval = 5, minbucket = 5, minsplit = 5, cp = 0.001, maxdepth = 25)

      • +
      • control = list(xval = 5, minbucket = 5, minsplit = 5, cp = 0.001, maxdepth = 10)

      • cost = NULL

      @@ -183,7 +183,17 @@

      Format

      RF.binary.randomForest.randomForest

      • type = 'classification'

      • ntree = 500

      • -
      • mtry = NULL

      • +
      • mtry = 2

      • +
      • strata = factor(c(0, 1))

      • +
      • sampsize = NULL

      • +
      • nodesize = 5

      • +
      • maxnodes = NULL

      • +

      + +
      RFd.binary.randomForest.randomForest
      +

      • type = 'classification'

      • +
      • ntree = 500

      • +
      • mtry = 2

      • strata = factor(c(0, 1))

      • sampsize = NULL

      • nodesize = 5

      • diff --git a/docs/reference/bm_ModelingOptions.html b/docs/reference/bm_ModelingOptions.html index 81243bb9..db5a473f 100644 --- a/docs/reference/bm_ModelingOptions.html +++ b/docs/reference/bm_ModelingOptions.html @@ -17,7 +17,7 @@ biomod2 - 4.2-5-2 + 4.2-6
    @@ -195,7 +195,9 @@

    Details

    function

    -

    +

    To define the same options for all datasets of a model, you can provide these options as a list in +user.val with the names "for_all_datasets".

    +

    Note

    MAXENT being the only external model (not called through a R package), diff --git a/docs/reference/bm_PlotEvalMean.html b/docs/reference/bm_PlotEvalMean.html index 0d7a6595..51461704 100644 --- a/docs/reference/bm_PlotEvalMean.html +++ b/docs/reference/bm_PlotEvalMean.html @@ -22,7 +22,7 @@ biomod2 - 4.2-5-2 + 4.2-6

    diff --git a/docs/reference/bm_PseudoAbsences.html b/docs/reference/bm_PseudoAbsences.html index d696a4b2..4d74768f 100644 --- a/docs/reference/bm_PseudoAbsences.html +++ b/docs/reference/bm_PseudoAbsences.html @@ -18,7 +18,7 @@ biomod2 - 4.2-5-2 + 4.2-6 @@ -139,10 +139,10 @@

    Select pseudo-absences

    bm_PseudoAbsences_random(resp.var, expl.var, ...) # S4 method for ANY,SpatVector -bm_PseudoAbsences_random(resp.var, expl.var, nb.absences, nb.rep) +bm_PseudoAbsences_random(resp.var, expl.var, nb.absences, nb.rep, fact.aggr) # S4 method for ANY,SpatRaster -bm_PseudoAbsences_random(resp.var, expl.var, nb.absences, nb.rep) +bm_PseudoAbsences_random(resp.var, expl.var, nb.absences, nb.rep, fact.aggr) bm_PseudoAbsences_sre(resp.var, expl.var, ...) @@ -229,7 +229,7 @@

    Arguments

    fact.aggr

    (optional, default NULL)
    -If strategy = 'disk', a integer defining the factor of aggregation to reduce the resolution

    +If strategy = 'random' or strategy = 'disk', a integer defining the factor of aggregation to reduce the resolution

    user.table
    diff --git a/docs/reference/bm_RunModelsLoop.html b/docs/reference/bm_RunModelsLoop.html index 1f2439a1..38640d60 100644 --- a/docs/reference/bm_RunModelsLoop.html +++ b/docs/reference/bm_RunModelsLoop.html @@ -18,7 +18,7 @@ biomod2 - 4.2-5-2 + 4.2-6 @@ -227,7 +227,7 @@

    Arguments

    model

    a character corresponding to the model name to be computed, must be either ANN, CTA, FDA, GAM, GBM, GLM, MARS, -MAXENT, MAXNET, RF, SRE, XGBOOST

    +MAXENT, MAXNET, RF, RFd, SRE, XGBOOST

    run.name
    diff --git a/docs/reference/bm_Tuning.html b/docs/reference/bm_Tuning.html index 33d9ccb0..6ecc520c 100644 --- a/docs/reference/bm_Tuning.html +++ b/docs/reference/bm_Tuning.html @@ -18,7 +18,7 @@ biomod2 - 4.2-5-2 + 4.2-6 @@ -126,19 +126,18 @@

    Tune models parameters

    metric.AIC = "AIC", weights = NULL, ctrl.train = NULL, - params.train = list(ANN.size = c(2, 4, 6, 8), ANN.decay = c(0.001, 0.01, 0.05, 0.1), - ANN.bag = FALSE, FDA.degree = 1:2, FDA.nprune = 2:38, GAM.select = c(TRUE, FALSE), - GAM.method = c("GCV.Cp", "GACV.Cp", "REML", "P-REML", "ML", "P-ML"), GAM.span = - c(0.3, 0.5, 0.7), GAM.degree = 1, GBM.n.trees = c(500, 1000, 2500), - GBM.interaction.depth = seq(2, 8, by = 3), GBM.shrinkage = c(0.001, 0.01, 0.1), - GBM.n.minobsinnode = 10, MARS.degree = 1:2, MARS.nprune = 2:max(38, 2 * - ncol(bm.format@data.env.var) + 1), MAXENT.algorithm = "maxnet", - MAXENT.parallel - = TRUE, RF.mtry = 1:min(10, ncol(bm.format@data.env.var)), RFd.mtry = 1:min(10, - ncol(bm.format@data.env.var)), SRE.quant = c(0, 0.0125, 0.025, 0.05, 0.1), - XGBOOST.nrounds = 50, XGBOOST.max_depth = 1, XGBOOST.eta = c(0.3, 0.4), XGBOOST.gamma - = 0, XGBOOST.colsample_bytree = c(0.6, 0.8), XGBOOST.min_child_weight = 1, - XGBOOST.subsample = 0.5) + params.train = list(ANN.size = c(2, 4, 6, 8), ANN.decay = c(0.01, 0.05, 0.1), ANN.bag = + FALSE, FDA.degree = 1:2, FDA.nprune = 2:25, GAM.select = c(TRUE, FALSE), GAM.method = + c("GCV.Cp", "GACV.Cp", "REML", "P-REML", "ML", "P-ML"), GAM.span = c(0.3, 0.5, 0.7), + GAM.degree = 1, GBM.n.trees = c(500, 1000, 2500), GBM.interaction.depth = seq(2, 8, + by = 3), GBM.shrinkage = c(0.001, 0.01, 0.1), GBM.n.minobsinnode = 10, MARS.degree = + 1:2, MARS.nprune = 2:max(21, 2 * ncol(bm.format@data.env.var) + 1), MAXENT.algorithm + = "maxnet", + MAXENT.parallel = TRUE, RF.mtry = 1:min(10, + ncol(bm.format@data.env.var)), RFd.mtry = 1:min(10, ncol(bm.format@data.env.var)), + SRE.quant = c(0, 0.0125, 0.025, 0.05, 0.1), XGBOOST.nrounds = 50, XGBOOST.max_depth = + 1, XGBOOST.eta = c(0.3, 0.4), XGBOOST.gamma = 0, XGBOOST.colsample_bytree = c(0.6, + 0.8), XGBOOST.min_child_weight = 1, XGBOOST.subsample = 0.5) )
    diff --git a/docs/reference/getters.out.html b/docs/reference/getters.out.html index 93eb0ef0..69428cfb 100644 --- a/docs/reference/getters.out.html +++ b/docs/reference/getters.out.html @@ -19,7 +19,7 @@ biomod2 - 4.2-5-2 + 4.2-6 diff --git a/docs/reference/index.html b/docs/reference/index.html index 0f9a04c8..8829a8ae 100644 --- a/docs/reference/index.html +++ b/docs/reference/index.html @@ -17,7 +17,7 @@ biomod2 - 4.2-5-2 + 4.2-6 diff --git a/man/BIOMOD.formated.data.PA.Rd b/man/BIOMOD.formated.data.PA.Rd index 34a5e5e2..d2a1d533 100644 --- a/man/BIOMOD.formated.data.PA.Rd +++ b/man/BIOMOD.formated.data.PA.Rd @@ -23,6 +23,7 @@ PA.dist.min = 0, PA.dist.max = NULL, PA.sre.quant = 0.025, + PA.fact.aggr = NULL, PA.user.table = NULL, na.rm = TRUE, filter.raster = FALSE, @@ -44,6 +45,7 @@ PA.dist.min = 0, PA.dist.max = NULL, PA.sre.quant = 0.025, + PA.fact.aggr = NULL, PA.user.table = NULL, na.rm = TRUE, filter.raster = FALSE, @@ -130,6 +132,9 @@ If pseudo-absence selection and \code{PA.strategy = 'sre'}, a \code{numeric} bet and \code{0.5} defining the half-quantile used to make the \code{sre} pseudo-absence selection (see Details)} +\item{PA.fact.aggr}{(\emph{optional, default} \code{NULL}) \cr +If \code{strategy = 'random'} or \code{strategy = 'disk'}, a \code{integer} defining the factor of aggregation to reduce the resolution} + \item{PA.user.table}{(\emph{optional, default} \code{NULL}) \cr If pseudo-absence selection and \code{PA.strategy = 'user.defined'}, a \code{matrix} or \code{data.frame} with as many rows as \code{resp.var} values, as many columns as diff --git a/man/BIOMOD_FormatingData.Rd b/man/BIOMOD_FormatingData.Rd index c888fedc..a74825d4 100644 --- a/man/BIOMOD_FormatingData.Rd +++ b/man/BIOMOD_FormatingData.Rd @@ -19,6 +19,7 @@ BIOMOD_FormatingData( PA.dist.min = 0, PA.dist.max = NULL, PA.sre.quant = 0.025, + PA.fact.aggr = NULL, PA.user.table = NULL, na.rm = TRUE, filter.raster = FALSE, @@ -106,6 +107,9 @@ If pseudo-absence selection and \code{PA.strategy = 'sre'}, a \code{numeric} bet and \code{0.5} defining the half-quantile used to make the \code{sre} pseudo-absence selection (see Details)} +\item{PA.fact.aggr}{(\emph{optional, default} \code{NULL}) \cr +If \code{strategy = 'random'} or \code{strategy = 'disk'}, a \code{integer} defining the factor of aggregation to reduce the resolution} + \item{PA.user.table}{(\emph{optional, default} \code{NULL}) \cr If pseudo-absence selection and \code{PA.strategy = 'user.defined'}, a \code{matrix} or \code{data.frame} with as many rows as \code{resp.var} values, as many columns as diff --git a/man/OptionsBigboss.Rd b/man/OptionsBigboss.Rd index 8549fa4e..0a7b5582 100644 --- a/man/OptionsBigboss.Rd +++ b/man/OptionsBigboss.Rd @@ -11,7 +11,7 @@ A \code{\link{BIOMOD.models.options}} object with some changed values : \item{\code{ANN.binary.nnet.nnet}}{ \itemize{ \item \code{size = 5} - \item \code{decay = 5} + \item \code{decay = 0.1} \item \code{trace = FALSE} \item \code{rang = 0.1} \item \code{maxit = 200} @@ -20,7 +20,7 @@ A \code{\link{BIOMOD.models.options}} object with some changed values : \item{\code{CTA.binary.rpart.rpart}}{ \itemize{ \item \code{method = 'class'} - \item \code{control = list(xval = 5, minbucket = 5, minsplit = 5, cp = 0.001, maxdepth = 25)} + \item \code{control = list(xval = 5, minbucket = 5, minsplit = 5, cp = 0.001, maxdepth = 10)} \item \code{cost = NULL} } } @@ -78,7 +78,18 @@ A \code{\link{BIOMOD.models.options}} object with some changed values : \itemize{ \item \code{type = 'classification'} \item \code{ntree = 500} - \item \code{mtry = NULL} + \item \code{mtry = 2} + \item \code{strata = factor(c(0, 1))} + \item \code{sampsize = NULL} + \item \code{nodesize = 5} + \item \code{maxnodes = NULL} + } + } + \item{\code{RFd.binary.randomForest.randomForest}}{ + \itemize{ + \item \code{type = 'classification'} + \item \code{ntree = 500} + \item \code{mtry = 2} \item \code{strata = factor(c(0, 1))} \item \code{sampsize = NULL} \item \code{nodesize = 5} diff --git a/man/bm_ModelingOptions.Rd b/man/bm_ModelingOptions.Rd index 89faa71b..8b113963 100644 --- a/man/bm_ModelingOptions.Rd +++ b/man/bm_ModelingOptions.Rd @@ -66,6 +66,9 @@ argument : \item{tuned}{default parameter values are updated by calling \code{\link{bm_Tuning}} function} } + +To define the same options for all datasets of a model, you can provide these options as a list in +user.val with the names "for_all_datasets". } \note{ \code{MAXENT} being the only external model (not called through a \code{R} package), diff --git a/man/bm_PseudoAbsences.Rd b/man/bm_PseudoAbsences.Rd index 017b37aa..d9c1b75d 100644 --- a/man/bm_PseudoAbsences.Rd +++ b/man/bm_PseudoAbsences.Rd @@ -38,9 +38,9 @@ bm_PseudoAbsences_user.defined(resp.var, expl.var, ...) bm_PseudoAbsences_random(resp.var, expl.var, ...) -\S4method{bm_PseudoAbsences_random}{ANY,SpatVector}(resp.var, expl.var, nb.absences, nb.rep) +\S4method{bm_PseudoAbsences_random}{ANY,SpatVector}(resp.var, expl.var, nb.absences, nb.rep, fact.aggr) -\S4method{bm_PseudoAbsences_random}{ANY,SpatRaster}(resp.var, expl.var, nb.absences, nb.rep) +\S4method{bm_PseudoAbsences_random}{ANY,SpatRaster}(resp.var, expl.var, nb.absences, nb.rep, fact.aggr) bm_PseudoAbsences_sre(resp.var, expl.var, ...) @@ -104,7 +104,7 @@ If \code{strategy = 'disk'}, a \code{numeric} defining the maximal distance to p used to make the \code{disk} pseudo-absence selection (in meters)} \item{fact.aggr}{(\emph{optional, default} \code{NULL}) \cr -If \code{strategy = 'disk'}, a \code{integer} defining the factor of aggregation to reduce the resolution} +If \code{strategy = 'random'} or \code{strategy = 'disk'}, a \code{integer} defining the factor of aggregation to reduce the resolution} \item{user.table}{(\emph{optional, default} \code{NULL}) \cr If \code{strategy = 'user.defined'}, a \code{matrix} or \code{data.frame} with as many rows as diff --git a/man/bm_RunModelsLoop.Rd b/man/bm_RunModelsLoop.Rd index fc763484..99ca370a 100644 --- a/man/bm_RunModelsLoop.Rd +++ b/man/bm_RunModelsLoop.Rd @@ -89,7 +89,7 @@ A \code{logical} value defining whether the progress bar is to be rendered or no \item{model}{a \code{character} corresponding to the model name to be computed, must be either \code{ANN}, \code{CTA}, \code{FDA}, \code{GAM}, \code{GBM}, \code{GLM}, \code{MARS}, -\code{MAXENT}, \code{MAXNET}, \code{RF}, \code{SRE}, \code{XGBOOST}} +\code{MAXENT}, \code{MAXNET}, \code{RF}, \code{RFd}, \code{SRE}, \code{XGBOOST}} \item{run.name}{a \code{character} corresponding to the model to be run (sp.name + pa.id + run.id)} diff --git a/man/bm_Tuning.Rd b/man/bm_Tuning.Rd index b7a3f52d..eb6a7209 100644 --- a/man/bm_Tuning.Rd +++ b/man/bm_Tuning.Rd @@ -16,19 +16,18 @@ bm_Tuning( metric.AIC = "AIC", weights = NULL, ctrl.train = NULL, - params.train = list(ANN.size = c(2, 4, 6, 8), ANN.decay = c(0.001, 0.01, 0.05, 0.1), - ANN.bag = FALSE, FDA.degree = 1:2, FDA.nprune = 2:38, GAM.select = c(TRUE, FALSE), - GAM.method = c("GCV.Cp", "GACV.Cp", "REML", "P-REML", "ML", "P-ML"), GAM.span = - c(0.3, 0.5, 0.7), GAM.degree = 1, GBM.n.trees = c(500, 1000, 2500), - GBM.interaction.depth = seq(2, 8, by = 3), GBM.shrinkage = c(0.001, 0.01, 0.1), - GBM.n.minobsinnode = 10, MARS.degree = 1:2, MARS.nprune = 2:max(38, 2 * - ncol(bm.format@data.env.var) + 1), MAXENT.algorithm = "maxnet", - MAXENT.parallel - = TRUE, RF.mtry = 1:min(10, ncol(bm.format@data.env.var)), RFd.mtry = 1:min(10, - ncol(bm.format@data.env.var)), SRE.quant = c(0, 0.0125, 0.025, 0.05, 0.1), - XGBOOST.nrounds = 50, XGBOOST.max_depth = 1, XGBOOST.eta = c(0.3, 0.4), XGBOOST.gamma - = 0, XGBOOST.colsample_bytree = c(0.6, 0.8), XGBOOST.min_child_weight = 1, - XGBOOST.subsample = 0.5) + params.train = list(ANN.size = c(2, 4, 6, 8), ANN.decay = c(0.01, 0.05, 0.1), ANN.bag = + FALSE, FDA.degree = 1:2, FDA.nprune = 2:25, GAM.select = c(TRUE, FALSE), GAM.method = + c("GCV.Cp", "GACV.Cp", "REML", "P-REML", "ML", "P-ML"), GAM.span = c(0.3, 0.5, 0.7), + GAM.degree = 1, GBM.n.trees = c(500, 1000, 2500), GBM.interaction.depth = seq(2, 8, + by = 3), GBM.shrinkage = c(0.001, 0.01, 0.1), GBM.n.minobsinnode = 10, MARS.degree = + 1:2, MARS.nprune = 2:max(21, 2 * ncol(bm.format@data.env.var) + 1), MAXENT.algorithm + = "maxnet", + MAXENT.parallel = TRUE, RF.mtry = 1:min(10, + ncol(bm.format@data.env.var)), RFd.mtry = 1:min(10, ncol(bm.format@data.env.var)), + SRE.quant = c(0, 0.0125, 0.025, 0.05, 0.1), XGBOOST.nrounds = 50, XGBOOST.max_depth = + 1, XGBOOST.eta = c(0.3, 0.4), XGBOOST.gamma = 0, XGBOOST.colsample_bytree = c(0.6, + 0.8), XGBOOST.min_child_weight = 1, XGBOOST.subsample = 0.5) ) } \arguments{ diff --git a/vignettes/news.Rmd b/vignettes/news.Rmd index 8cbe9718..b0ae8dd1 100644 --- a/vignettes/news.Rmd +++ b/vignettes/news.Rmd @@ -17,12 +17,12 @@ vignette: > #### 4.2-6 Devel actuel -- Warning ! New options for OptionsBigboss have been modified ( concern only ANN, CTA and RF models) +- Warning ! Some options for `OptionsBigboss` have been modified (concern only ANN, CTA and RF models) - Some changes for the tuning ranges. -- Add *RFd*: Random Forest with down-sampling method. -- Add _seed.val_ for bm_pseudoAbsences and BIOMOD_FormatingData. -- Add _fact.aggr_ argument for pseudoabsences selection with the random and disk method. It allows to reduce the resolution of the environnement. -- Possibility to give the same options for all datasets with _"for_all_datasets"_ in bm_ModelingOptions. +- Add *RFd*: Random Forest with a down-sampling method. +- Add _seed.val_ for `bm_pseudoAbsences` and `BIOMOD_FormatingData`. +- Add _fact.aggr_ argument for pseudo-absences selection with the random and disk methods. It allows to reduce the resolution of the environment. +- Possibility to give the same options for all datasets with _"for_all_datasets"_ in `bm_ModelingOptions`. ### 2024 From 94d80bb16c56960334614de2aad229e49839b0b2 Mon Sep 17 00:00:00 2001 From: HeleneBlt Date: Tue, 18 Jun 2024 14:53:19 +0200 Subject: [PATCH 20/22] Update ReadME --- README.md | 4 ++-- docs/index.html | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index e1daaf00..e02307eb 100644 --- a/README.md +++ b/README.md @@ -71,9 +71,9 @@ devtools::install_github("biomodhub/biomod2", dependencies = TRUE) #### What is new ? -- We add a new model : **RFd**. It's a Random Forest model with a down-sampling method. +- `biomod2` has a new model: **RFd**. It's a Random Forest model with a down-sampling method. - You can now define _seed.val_ for `bm_PseudoAbsences()` and `BIOMOD_FormatingData()`. -- We have added _fact.aggr_ argument for pseudo-absences selection with the random and disk methods. It allows to reduce the resolution of the environment. +- New _fact.aggr_ argument, for pseudo-absences selection with the random and disk methods, allows to reduce the resolution of the environment. - Possibility to give the same options for all datasets with _"for_all_datasets"_ in `bm_ModelingOptions()`.
    diff --git a/docs/index.html b/docs/index.html index 5a2f77bf..c8179846 100644 --- a/docs/index.html +++ b/docs/index.html @@ -193,9 +193,10 @@

    What is new ?

      -
    • We add a new model : RFd. It’s a Random Forest model with a down-sampling method.
    • +
    • +biomod2 has a new model: RFd. It’s a Random Forest model with a down-sampling method.
    • You can now define seed.val for bm_PseudoAbsences() and BIOMOD_FormatingData().
    • -
    • We have added fact.aggr argument for pseudo-absences selection with the random and disk methods. It allows to reduce the resolution of the environment.
    • +
    • New fact.aggr argument, for pseudo-absences selection with the random and disk methods, allows to reduce the resolution of the environment.
    • Possibility to give the same options for all datasets with “for_all_datasets” in bm_ModelingOptions().


    From 5b17022d3b954b13971a930dc3973bae677284b3 Mon Sep 17 00:00:00 2001 From: HeleneBlt Date: Tue, 18 Jun 2024 14:59:33 +0200 Subject: [PATCH 21/22] ReadMe again --- README.md | 3 +-- docs/index.html | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index e02307eb..6dca2476 100644 --- a/README.md +++ b/README.md @@ -60,13 +60,12 @@ devtools::install_github("biomodhub/biomod2", dependencies = TRUE) ### `biomod 4.2-6` - Improved OptionsBigBoss and new model -**! `biomod2 4.2-5` is now available on CRAN !** `/!\` Please **feel free to indicate if you notice some strange new behaviors** ! #### What is changed ? -- To improve the models, we made some change in the options for **`OptionsBigboss`**. (This only affects the ANN, CTA and RF models.) You can check all your options with the `get_options()` function. +- To improve the models, we made some change in the options for [**`OptionsBigboss`**](https://biomodhub.github.io/biomod2/reference/OptionsBigboss.html). (This only affects the ANN, CTA and RF models.) You can check all your options with the `get_options()` function. - To reduce the tuning calculation time, we update the tuning ranges for ANN, FDA and MARS models. #### What is new ? diff --git a/docs/index.html b/docs/index.html index c8179846..c86e0a05 100644 --- a/docs/index.html +++ b/docs/index.html @@ -177,14 +177,13 @@

    biomod 4.2-6 - Improved OptionsBigBoss and new model

    -

    ! biomod2 4.2-5 is now available on CRAN !

    /!\ Please feel free to indicate if you notice some strange new behaviors !

    What is changed ?

      -
    • To improve the models, we made some change in the options for OptionsBigboss. (This only affects the ANN, CTA and RF models.) You can check all your options with the get_options() function.
    • +
    • To improve the models, we made some change in the options for OptionsBigboss. (This only affects the ANN, CTA and RF models.) You can check all your options with the get_options() function.
    • To reduce the tuning calculation time, we update the tuning ranges for ANN, FDA and MARS models.
    From 30352b73a9466679488b6a809b17613ab705ff59 Mon Sep 17 00:00:00 2001 From: HeleneBlt Date: Tue, 18 Jun 2024 15:52:48 +0200 Subject: [PATCH 22/22] Really little change in the message --- R/biomod2-package.R | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/R/biomod2-package.R b/R/biomod2-package.R index 1053bd02..f6a55170 100644 --- a/R/biomod2-package.R +++ b/R/biomod2-package.R @@ -11,7 +11,7 @@ RFver <- read.dcf(file = system.file("DESCRIPTION", package = pkgname), fields = "Version") mess <- paste(pkgname, RFver, "loaded.\n") mess <- paste(mess, "/!\\ Be careful : note that some BigBoss options have been changed between biomod2 v4.2-6 and previous versions./!\\ - \n\n Please welcome a new model : RFd. This is a random forest model with a automatic down sampling to make your life easier.") + \n\n Please welcome a new model : RFd. This is a random forest model with a automatic down sampling to make your life easier.\n") packageStartupMessage(mess) toLoad <- unique(ModelsTable$package[-which(ModelsTable$package %in% c("MAXENT", "biomod2"))])