From 2d39bbcaa8b94548c73a6d02f354b6446e07823e Mon Sep 17 00:00:00 2001 From: "Santiago J.E. Velazco" Date: Wed, 2 Oct 2024 09:50:04 -0700 Subject: [PATCH] website was updated --- NEWS.md | 18 ++++++++-- docs/404.html | 2 +- docs/articles/index.html | 2 +- docs/articles/v01_pre_modeling.html | 4 +-- .../geo occurrence filtering-1.png | Bin 349913 -> 350015 bytes docs/articles/v02_modeling.html | 2 +- docs/articles/v03_post_modeling.html | 2 +- docs/articles/v04_Red_fir_example.html | 2 +- docs/articles/v05_Rare_species_example.html | 2 +- docs/articles/v06_Extrapolation_example.html | 2 +- .../explore extrapolation thresholds-1.png | Bin 177829 -> 177760 bytes .../explore extrapolation thresholds-2.png | Bin 187174 -> 187107 bytes .../explore extrapolation thresholds-3.png | Bin 229656 -> 229607 bytes ...cal explore - uni_comb extrapolation-1.png | Bin 213456 -> 213422 bytes docs/authors.html | 2 +- docs/index.html | 4 +-- docs/news/index.html | 31 +++++++++++++++++- docs/pkgdown.js | 8 +++++ docs/pkgdown.yml | 6 ++-- docs/reference/abies.html | 2 +- docs/reference/backg.html | 2 +- docs/reference/calib_area.html | 2 +- docs/reference/correct_colinvar.html | 2 +- docs/reference/data_bpdp.html | 2 +- docs/reference/data_pdp.html | 2 +- docs/reference/env_outliers.html | 2 +- docs/reference/esm_gam.html | 2 +- docs/reference/esm_gau.html | 2 +- docs/reference/esm_gbm.html | 2 +- docs/reference/esm_glm.html | 2 +- docs/reference/esm_max.html | 2 +- docs/reference/esm_net.html | 2 +- docs/reference/esm_svm.html | 2 +- docs/reference/extra_eval.html | 2 +- docs/reference/extra_truncate.html | 2 +- docs/reference/fit_ensemble.html | 2 +- docs/reference/fit_gam.html | 2 +- docs/reference/fit_gau.html | 2 +- docs/reference/fit_gbm.html | 2 +- docs/reference/fit_glm.html | 2 +- docs/reference/fit_max.html | 2 +- docs/reference/fit_net.html | 2 +- docs/reference/fit_raf.html | 2 +- docs/reference/fit_svm.html | 2 +- docs/reference/get_block.html | 2 +- docs/reference/hespero.html | 2 +- docs/reference/homogenize_na.html | 2 +- docs/reference/index.html | 2 +- docs/reference/interp.html | 2 +- docs/reference/msdm_posteriori.html | 2 +- docs/reference/msdm_priori.html | 2 +- docs/reference/occfilt_env.html | 2 +- docs/reference/occfilt_geo.html | 2 +- docs/reference/p_bpdp.html | 2 +- docs/reference/p_extra.html | 2 +- docs/reference/p_pdp.html | 2 +- docs/reference/part_random.html | 2 +- docs/reference/part_sband.html | 2 +- docs/reference/part_sblock.html | 2 +- docs/reference/part_senv.html | 2 +- docs/reference/plot_res.html | 2 +- docs/reference/sample_background.html | 2 +- docs/reference/sample_pseudoabs.html | 2 +- docs/reference/sdm_directory.html | 2 +- docs/reference/sdm_eval.html | 2 +- docs/reference/sdm_extract.html | 2 +- docs/reference/sdm_predict.html | 2 +- docs/reference/sdm_summarize.html | 2 +- docs/reference/spp.html | 2 +- docs/reference/tune_gbm.html | 2 +- docs/reference/tune_max.html | 2 +- docs/reference/tune_net.html | 2 +- docs/reference/tune_raf.html | 2 +- docs/reference/tune_svm.html | 2 +- docs/search.json | 2 +- 75 files changed, 125 insertions(+), 74 deletions(-) diff --git a/NEWS.md b/NEWS.md index c5185236..0033c45e 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,7 +1,21 @@ +# flexsdm 1.3.5-5 + +- min change in `interp` function by @sjevelazco in [362](https://github.com/sjevelazco/flexsdm/pull/362) +- min change in `occfilt_geo` by @sjevelazco in [364](https://github.com/sjevelazco/flexsdm/pull/364) +- Rlof was removed from dependencies by @sjevelazco in [365](https://github.com/sjevelazco/flexsdm/pull/365) +- min change in `occfilt_geo` by @sjevelazco in [370](https://github.com/sjevelazco/flexsdm/pull/370) +- new argument in `occfilt_geo` by @sjevelazco in [371](https://github.com/sjevelazco/flexsdm/pull/371) +- `esm_` functions were improved improvements by @sjevelazco in [373](https://github.com/sjevelazco/flexsdm/pull/372) & [373](https://github.com/sjevelazco/flexsdm/pull/373) +- geographically constraint cell of env_var argument in `correct_colinvar` by @sjevelazco in [374](https://github.com/sjevelazco/flexsdm/pull/374) +- new argument in `correct_colinvar` by @sjevelazco in [375](https://github.com/sjevelazco/flexsdm/pull/375) +- `calib_area` was sped up by @sjevelazco in [377](https://github.com/sjevelazco/flexsdm/pull/377) +- `correct_colivar` was fixed and improved, FA method by @sjevelazco in [383](https://github.com/sjevelazco/flexsdm/pull/383) +- `occfilt_geo` 'defined' method was fixed by @sjevelazco in [384](https://github.com/sjevelazco/flexsdm/pull/384) + # flexsdm 1.3.5 -- it is possible to restrict the cell used to perform collinearity reduction analysis to a geographical area smaller than the full extent of environmental variables in [`correct_clinvar()`](https://sjevelazco.github.io/flexsdm/reference/correct_colinvar.html) -- esm_ family function was improved and debugged +- it is possible to restrict the cell used to perform collinearity reduction analysis to a geographical area smaller than the full extent of environmental variables in [`correct_clinvar()`](https://sjevelazco.github.io/flexsdm/reference/correct_colinvar.html) +- esm\_ family function was improved and debugged - `occfilt_geo` has a new argument "rep" to control number o repetition to filter occurrences # flexsdm 1.3.4 diff --git a/docs/404.html b/docs/404.html index f66ffdd8..e6b17639 100644 --- a/docs/404.html +++ b/docs/404.html @@ -76,7 +76,7 @@

Page not found (404)

diff --git a/docs/articles/index.html b/docs/articles/index.html index a692fe4e..4d7044d3 100644 --- a/docs/articles/index.html +++ b/docs/articles/index.html @@ -68,7 +68,7 @@

All vignettes

diff --git a/docs/articles/v01_pre_modeling.html b/docs/articles/v01_pre_modeling.html index 96cfb60f..9e6c46cc 100644 --- a/docs/articles/v01_pre_modeling.html +++ b/docs/articles/v01_pre_modeling.html @@ -654,7 +654,7 @@

Geographical filtering#> 16 records were removed because they have NAs for some variables #> Number of unfiltered records: 234 #> Distance threshold(km): 30 -#> Number of filtered records: 0 +#> Number of filtered records: 78 par(mfrow = c(2, 2)) somevar[[1]] %>% plot(main = "Original occurrence data") @@ -980,7 +980,7 @@

Extracting environmental values diff --git a/docs/articles/v01_pre_modeling_files/figure-html/geo occurrence filtering-1.png b/docs/articles/v01_pre_modeling_files/figure-html/geo occurrence filtering-1.png index fae124068e9bbafd6002a6bc1104a084761722de..31fd247ad385f616c8daef8a98b9a5446cff8e38 100644 GIT binary patch delta 91138 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 delta 91021 zcmYhCbx>Pf*SB#i?heJJxVyVM6qn-eevsns?%Lv7iaV52++9j>D=r~#dO!2cd}k(^ z{FhAjI%{A1`mNJfkGEQf7xEeUGfXQi=>vTz_;$(i>uW&l*3w=SDD{1@^(m~_XvRFlvmnCq& zGH?)Qa6R8}^%w*mDRJpuAq}3(809Y(kyv5HTBB^;6%2aF(37f_AI_}3dNI(E+seR=;y`h@Zpeh@;*p^{%T2|1qmZ8KpM1lzj z*udIf5Kmx|-lPj^yTvFEmTYSNp$G6p)YBYUScpVno1>N1u$up(Cj3jJ5)?p3wtt+3 zM0vWWfUUrC)f|1#c+R6JT)E$FavRE5fU@459-=$p9^X5$}R~a$k{25?5Lek9N0_KsOv=VSphf$AFDfQ zu508b07Ra$ICeT3a4obU`{7r2pfP96%gQ#zL zgmN{$HXXdS<$$Wtrs$Sca2)gyK-BS+#Z4ZBy-UFUD`arPz_ahvGfc;!nkAUkjXYa^ERnoL zk*SJ>cQ_LE9BxfgjMH#98xknABqqXaSdeJ_A(IEsKX9#pxs@(neD1~0sO1-9Qm6{b z2#}okU(1;j(9ztwdNzSN5-Tgi(s0#KZ^y3)G9*rUY5%U9Z_)COtsU`>5>Vo@VbYZ{ z#jX2t9czg(ZSrs(k&Qu;rTR3rIjxpB16CZe-*asjhV0~(^`aR=?Dz?{@x`Rgvf@5B zC{QW1X_zJDiGD(Ho=n|uz)Vh5+bxxf;N?KEm1XTEnbo!B1f*lEt=cpk(rfgit8rn& z#_8N6LWSyqayog(=j=TF;Uf~gk+1IZ}&Q(ql6+qa#IR!0RvZz zGue=|X$k)N2}ObYIvKpJo+e?koe7KWwpB!7hhwrz4Q&D`8`KZNQqA1I6%vtOT#~7i zOC*@mPK)yMfqXp?KSXu(m6S%Hzut++j71&C&b$INBb9SKO+iIYRQcTZKusDok>bt$ z^Y{YJu3GFB3F>XDi~Zb^LNengcP5)$=J|<6qeUId8xr(daOh}II3?U$VhiTiie|XZ zRcSuha?|3*pZRCKvjG(QKY%B?{uHR6s^7KcD^hy#0Gb{O;gnSya+PHXk82yX3U(Jn z!L3FN4>o}U0SaGOC?&SOG~3}sU%a(Zn@$zNmM23W&inN!tiqqS58cpTxC_X5O7*XY zo$`G5<_x19-fLmxkGvI$g+773L~r{1$mgeD0$z=+OKQ*%0AFT%$9GM-Ip$O=NXt{p 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

?Q{PgW#iHGM1Eiv9+FcJ& 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 diff --git a/docs/articles/v02_modeling.html b/docs/articles/v02_modeling.html index 36e12b1e..bf30f500 100644 --- a/docs/articles/v02_modeling.html +++ b/docs/articles/v02_modeling.html @@ -754,7 +754,7 @@

3. Fit an diff --git a/docs/articles/v03_post_modeling.html b/docs/articles/v03_post_modeling.html index b668a3d3..718657e1 100644 --- a/docs/articles/v03_post_modeling.html +++ b/docs/articles/v03_post_modeling.html @@ -967,7 +967,7 @@

-

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/articles/v04_Red_fir_example.html b/docs/articles/v04_Red_fir_example.html index 348f8dcc..d7f8905c 100644 --- a/docs/articles/v04_Red_fir_example.html +++ b/docs/articles/v04_Red_fir_example.html @@ -557,7 +557,7 @@

Constrain the model with msdm_p diff --git a/docs/articles/v05_Rare_species_example.html b/docs/articles/v05_Rare_species_example.html index a5a5aedf..bf7ee2f6 100644 --- a/docs/articles/v05_Rare_species_example.html +++ b/docs/articles/v05_Rare_species_example.html @@ -721,7 +721,7 @@

References -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/articles/v06_Extrapolation_example.html b/docs/articles/v06_Extrapolation_example.html index e179f1a0..a9956a03 100644 --- a/docs/articles/v06_Extrapolation_example.html +++ b/docs/articles/v06_Extrapolation_example.html @@ -611,7 +611,7 @@

Truncatin diff --git a/docs/articles/v06_Extrapolation_example_files/figure-html/explore extrapolation thresholds-1.png b/docs/articles/v06_Extrapolation_example_files/figure-html/explore extrapolation thresholds-1.png index 6f10585f73f08c212adcf46792710ab361d0e8b6..1366f707d208d276497a574df1f3abf27c22a33b 100644 GIT binary patch delta 25368 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�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 delta 25445 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 z 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 F1OVmrQ*HnN delta 20090 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 E05Q_M-2eap diff --git a/docs/articles/v06_Extrapolation_example_files/figure-html/explore extrapolation thresholds-3.png b/docs/articles/v06_Extrapolation_example_files/figure-html/explore extrapolation thresholds-3.png index 7c4404ea52c20af2fe7bef59f50dbfd98e4ee85d..37dd328086673f3fc64977f466ca7df4a69933a4 100644 GIT binary patch delta 21457 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 diff --git a/docs/articles/v06_Extrapolation_example_files/figure-html/graphical explore - uni_comb extrapolation-1.png b/docs/articles/v06_Extrapolation_example_files/figure-html/graphical explore - uni_comb extrapolation-1.png index f848a93db71ad14f50790e04af0d7775a3cef641..31e4afe3ca8fd5255d2008caec7fc74a9cea7bcd 100644 GIT binary patch delta 25036 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%0DDHUd%#Fs}Cet8XYja{HR0et&x= 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 delta 25046 zcmbSyWl$Y$wC@fM-g~XJ*M1rrh&CLE_BrT9CG58`Adytl@9KuXYT@Cs`By_#NwqDC zSG0!-5+A#Hly)p%=UL*<7k7k?_uY*`t#CLUoFSjlVpj%Ck>DM%yO)!KFyY`DPl<{7 zKYtHy>@9aM$oJb__+rxTiOk1m6#y2426B>g0_H-b{V;9pmd zxarCh{>Qt?aAX?(_WeWgUj&vrTkTLinOG0;UqHn5d_F+}ZSv3WvlW)kQnBLYIoo%^ zNONDOIorZx4QfcK{TXmy1xsY|nRIrkzP;B*x?Xx5n$x*_q1Sl5bUn4h3tLRRemOuf5f*unXqgacZpQB7_cP^n zZ_(DK)aoocbPsKqq+snj^j8+_4WCL;1oo8Ma9~43F)6vey?JB+%qziI# zak=j~UX9n8TGw2*DM`-XZ5i5J>o)Botb(Do#hOklYeEJLeS`oDJVeg za!!tJLry@A;vCjp{^MEWL5}6(c)Ni_gY(we?kl-tkOSTo4!g8VTH6&O0ijlbq-+D~ z-59=Ur#zLRl9sntfIDAg;cXTRYkno$j6G_8W-lqeT`#EUK)&OG$ z!t#>4K8&ZzyCL$~zqkt?3W;t)!KM0 zRll}cF78@|m3Mt?&L}@R+4wK+*zLSv6I~?6;OM{JeN)kLnr~0q(O{4kB#?+%2etR# zz_6Anu6Ks7x>kmuAdz@Rs}B+P*Gq(~hHQ<8$9xP96jwG*7AX9BXD}g{tp&WUg?75@ zmCNI(U(qltNy_3hJN`n{j?rC6?pd2se<9Gua3S^+H@!pSEH!v1DA;T#LKVV>3a5

mIXYG(}N;ndXA1mEs3BE;Itjp>Nm}6WJ<+mE`B7r3|<9SScx@@>m%uVo#_k zj^vmSO~-<=XY*)k#1Fn&VupQqR~fY(%cq{S92ptiGSg~s4RUW{E0mrq%9?Z#`5`WDHk*kdJvg0 z)89WRGYZ*+_}ZdR>_zDTtdShjHV+sqeENN|hw@j1R3hQGM{HVOBT}2bZH(5X-s^D+c0oER7LSBas8B$J@NMdQc;{0CJ`7c(gY<`r52 ziD8Os@x5|K_;F$cXbJ*3J8DXv&D&hDF=Y~7XMLIWa8u{{KsA14fe*A9HBNfrQh&3u zHBIgvW2HukF{vRUbFflGB(2yYWXzbd!d3juVQkJ33gU(qAs2lJDm#$WIatjX#gOwk z*ijmhCWzuk49@Ws+SpPZ32e_H4a!WtRSOJQS9(V&TewGtNUfG#56J#JEE}-<*@~w? zBX->dk2M{-#2#EG5}k=Mu{V2fdvKB!vT;Ex7TBx;+m5z|AS?TF!9+<5?TCAl{mod7 z0@Z|fpjvU;pyZmK$I7cJTmuj|a9?#5ZeG?Hy66l+kqO0s(OFE1}^v-*Dl z@gV=38PRi8YHbgU(IZs>_1`>li3o7|+P8uge9*p;9gY_N6&RB-YPAG;o(<*$D32{G z&#%n}uH4qHKAlMl|6BA}IdfzLp%H~DF)3<)B}a7f4kx8~T zeVHS}>}vd}=9MITjX9rtB@zNn{E7_N2V2GB3kU=A?0yXDp6^%zzjGPti$>42z zvyA+@05{n@B(To1bvsQHp{0j}`SFdzkJldaH*?V}^_gdgkRocM-+61cR7OOuX6m>K z9}omx#)){;yBKaoqaH;VX}ySP|~doLA^tBlFT})mm)TVYc*J`eIR8bFi97b}gmx_sGDtEEcYE~s2=-~RHRxfBSmv58qNzYxc z_JN~-p}H`3D4~h31r0}$=S6R2F`PkB$4Y=a5n8PNBqoe(cLQDg7!tV^*GoAx6(~Ycha4Dq=Ag#VK=T0s-%&EIdo+^q?&>;%VaLwKpDww5#3H`ynOC% zk)8nD=*qDr5L-W7#`M*@quq(CJ%PuySvt#o_y;~C_ZuH`)*L%CQgO~c~;9j$+hj_Nrb~3h@qWj`oGPH32e>Jin}>&N73wu5yY-AH6RxNNb_V`Vz_Ot=P8fOX4RgyhXn+bq@DST}zIwFQx+ z-$_+k3n!y}pDjuhBT{;W5SvT!D86$$_icQklB5F>HoJb#OrqH@QNh=@4imL~ZXeT6T&PI1Z&pIN7~wYAR3QH>#Fwep7|HJ?N8 zNqjdj?Dn|2IdvK(3dB5ldh-UWefJ)t$&epSnvhFEU?gzMOhH&1!|TouCwZOG?d~Tl z{izS>WKA=~Bu>l~8NOk9i2cgK7ZaB$3Pq}!Ez8n&d92cnYe0OAio$Azt71A{O)Ei6 z%uWCMmOG2d$SBuX7xsXQ20iGYvx}#Gbme+zW$uyJ@&+NgcChP=p8nb9NA#to1A$i$Ji(V;!vg)!@qJVOb3vlUSmc%@jm{{y-h@B&aLzGNL zprHT>GBeplAIO9B_p?zavp6Lap%c|_-r94C8(yJ8$LZoJXl>dnd(D1R;h<4{k?F`; z{APRrY7TXtXee58XwpO}qjZGpn|z&aH(N1dbAeK4Qm%P{ti`4aZh>@}9>ESEJbGJ@Iydw0JSmSmnfw7!QkV2)w zggVm;Hf3Fok91}3PGkg3#6oE$d0F3!-t6WwW*Gai7Y5|jeV&R>2~lpchmDaL zYj^hzH3%CHAT*3z5>S>{Uqroo@>E)t`-3V4U@T!VaItP>e!GbFZ`}WLxhuo+euW~p zTdA&l-F73fl<+@t689jtq$Dam{f$B{_IDY$F|OVXXUo~T3S((xfuCWVkye)XJ7|#8 z$->FA6#cJ!I&?;a2#kmg+AYSI9fsDoa|>U+)@vGWdShAHcs_K7qA_KW^tY2i{;t6W zup#7+)--ruF|{X}Q80bWcumnCL~QC8#eaJoBV(ET>E<14M-wUS69?TUw*=Cn=Ly7T z9afSmTodhVlW}kjxOeAm@m+a~ENSsuD|6D)c1suu zqz6YpSi7t6eLb!vtR8Z8_L^J()aL-gz5yHl0t#u`fMr6Oi4~+5RIy=(oNU0#z={J9 z{!LiY7uFEXO;|dhu0c%^6c+s1j47)Z#44${Vn}Tv@sdo$`{oml7)ySp#6FQqBbEYu zqtXfid+;ogmc2G?m>A!)GGp0Aq)-rKg5a`SFLp?eFpdLpg1Xt&*9VSTGbBJ*_E|#_w4P46Z5e{!_o2~ zgynb^w1Ep=_RWVB{*NgHGk|L{*xKb3RQwW@rD0cckOj5=(?da;5qe1RW&G$6A@VT%Sfb}-Z)q~ z6!KZw5c9gvdksfi3sSG~Wf-E8dMR=h{k&0kYAusP&G-D(2*r!pBJC~Zc)yx|W=SRi zW@*`7QE~#;cE|tnB)aXJlM2s#FU4NI-Q+h;D(gVbb)>~EwficmUa<|!rEGDRE_uIv zvbDYU$8qe#)>+S#L+3k*?Js6sS#Ks$uTICIlDLI#EkoamOJU|i2n?%v_`}pw$dgJ- z_s}EZ>A8r|2pX1+kA~iHOc|^AKvhh}fsNsjH~1IIBU9XKb>W}@#T~Z`w5^xn(cf6s zBJ;txz~SSM4tNl{rVz6M2#fZSo-)m(<%ajXkzbfN1qI%|$q+>Q64yhT9{|U_8G&%b zri??y45!$1_HTioy`uiiu!%>SMCCB+`bIOoC4%g6%SEW}>@6t7;|i4ly&X1?C>=@E z5`y>Y<807KWWQ{p2{cmMu-I1`4-C1}n9xLidXY+SrT)r6z9jQzusHGaYmzO61svgA z_<`fKnBd7D@ATXPdJE8L@&%gu%L5uXNf>21SlU&)tA=Y|dqu!0{*jaTo}#1cAOAkY zfZjKnlh3TwKI0upe9yNep!~vg#bx`be>7fxY$~ZM8k@UFuwiHK&na}u{*$Y70;Rh2 z?f}hBP}gd+inkyKOyiRq@y(T?NKf^`*QA2+AJCjd%a~Fn4tW&GsXuu*>7T-W3TDVm zad``HoNsdKRl5hFBrw0)`?Il^;OJ?ckbf0f_GB5bvPiWy&A0P{EN2mDf3ob zZyt$OP45>k6MEDITb{>A5itqhe9yHMLBhmO9o1z%qJ~S1lYW#w!u^zXC+^dkSI|Os z?LX>vRNH%L=6Q+6#=!4z?=i7())YKga{Y5D>;;{mJ+2>--*JiRlaNekc@@Eq&`_qZ(aQMeeTgJ9-(9Hrhc(_=!{E?Ome%Ix%#el8v_j)Z(3DYFmDIqn~lHw zH5nuKB1wu=*@fS?^6QodOQx2>-BDJARZ=n3v7{k_R_IIV7M_6?DRNn;5QHsnhyB5S zzX+a@y3w$UeGqc72TO@47lp!wLe%3)p`r1Xv>?U6!}G zs!^~JdoB@_pu|WaJuHP${>QE|4yO2>Y-nlJW&IT+f89f+!cl2X#1mRXxoU&757!hQ zv(ADJHL<+3gO1Koxk$<1qRzi&af*WQW2!8?v#e4|i(XVg)z79((|{)Ms1<+o+Rpqs zU2cXlHa1qITN4QoJ2XZ!mNb@A<6P~C;e3f+M3*t3SQlqWTNa*b3Grxghl}^dnRAlY zMo`aX$d0WTCrY;zm`|ZKO9B;?)hv3Q>z9B*lH^GpgRx<+xeo-xu|vn_iELDV%0 z@pBcz+zKya!Vjq87AM$}4E!{3cl2w^|9B;VFGrv!D~m*`@8Pspu^rOlJ4N87<5${jN+NKW z^%YOK-gAyb_Vm1&a{e;+=ww20u}v=ORi=|bVqx{CJ(s&{)~6{9x{pLiVv=WuWy=fa zcc?vi+DX)jTDH^vqU2)RGSeor7q14aUvj3sY>9#x9m0|UA1EV~Nl|ccRGbkgENk1z zw^JUbmqx?ci8^m01Wx`;Fu~??CO<*HLQVz=zGe7JVx9k`?=#jmBnZD7_ksRL{j)E< zgZ*V}Fcz;khS!%>@A@-5bcO@A?ePS*PU8!8U>X&+z*;Z|S`T@Kg5%=o3#e929OIyF zyUSgVC$K-$B-FHpq&%m4xLeBtjnfJl?EcU(@7SxuVjvvBNGch}%-r0< zf{=*FxFZD3cCPxn-CVWP!^PCuNR3EY;Mvr+XZPBy4J|jYb z5@3LVMW3_%F?$S5!Z*Mnj7hMzLX|*T9hdu<(UWI@MA<7O0S;vF_wNM)@|epP1EACw zNnh|$+p=9Zi+PyBg0jaPa<%JrPPaBF`*iiG;RlFLd)EHAX!1?=Y@8`w9HcR!0y9d% z&eZaC$)Bzkv7B$PhYqy{UD?+%2450(Vnw9Jt04s;twwcM4lIv;4)3f=G16{NLcgzv zT3OZy?D6qM=4jhohvt4+YYZhN2VfRdo2jVEwZq9qIks?A@`9`#UEdXj+B`%AJ*>Ta zoI1LXyAwVC7!yi261zIVscF|X<|8w6AAfY$a`VMF5uOgI23v}YRWU%A!YdP?d-(9CZA)Ki%yh$%x9@AcHvhPf!q9)LmS72|+xK9;iDx3W z5wmJbs)`KY2x4&X>t@bcmRGinGs{l&Bl^ftGrfQv2o~U{t5^k+uV^6M;F9=GCdJH>erib~xjw2Ay zr46RctOlO>#~TyHSre8)Im>8vNGLDn8G;i9k9oMlvH}6KV|g9+NX!WHwRQ;0_*-!` zU%k+y*LcYuKNzWFyBIW6YvR5$epR_p{l$lz6F2X3)YLyX=u9&O7W+Zf6zs4iSM651 z&oe$k^xd^<{W4=!X*-x!Atk!)tmzQ4Q&{S^`g5*zA!`a;Ekd>$;0&zf3rp94M%;X-+!j4Qm_}(mK{2 zrF0$bB!--n0OrD(DAJgO1~mN$!N;q~ zFI#MM!tc5$og1Wdr91~d5&F}G-S%x%^uqHRR3GBiUE}6wH2GYW+s*Ot*v*bp*lHzo zEqE*q_$;2iX+HVx;5fiNRoV5@o2E=DaF4ghbgZ75BsmcP+o~8gH2jNo(02l>JsC3x z2Y>0lx8!=`?9NHgO9IjI2Vd{SOHAPeC1lIu4(1CQ5l-?BzCa^ACBnk3M+-e!Hr;+U z#gJdlHP=+gyGF}&D1DfWF-xx3uvSz9a*bw<$woH^G5BMafz@3EVrd9aJ0Hbu`YJs` zUZ#kgEnqtS(Ti)0LMVy#kRq#^{u?P%dnh3VGXs?R&g1Qa{7>WDK^#GJh8O3!Abl(& zMu~i)*jd2I%-elxnh&BK4ybf%@K0?Y>{E$qCuFzFIsdG~fMts92Oqk})kqAeHJ zP$37xr`u~t)CKH2k{iW4LVlXOEaOAZ`;(p*wL5t!k#i7*+}hK>jF7tvSQSJ|b{!4{ z*$K$IOIT@qp1uncW`vZSr)<+owzC-6s#OmV#~_85umV8KO_}MJlc;O5ptm$TPIs#m zO``nE4SXHmc$X#7rG+=4F?v*am`M5^!|+yp?OnS3qp^zWP#(I;-CC$=PD!i{tJdIc zE}X3vzf`-1Ve!AIy-B&Nn=Em{@w&d-Y!BaMXBO+(*E77UDF*E<862W`@3g!FT6H8u zz@Gi;BV8(dvXq`uD8?>Drc@A1c`G*&!F$*M4w~^!`nytY@lN z-5eM0HX$+$M$v4p2=yA5o9^W%J?JnAOxn)v4+MISFLZ0{&6b+|EQ(=n6{c&g6D_X3 zpUgk9GfC#tX4ua-Bq3PBE<`o$$qk(p1IWy-!7@@3sF*HleZ$%Wp~+31is{A&C6n%;ibRUTqKcgjtosBs3$=qw4o0a8c4 ze1x=AADc1q4d9Rktc+PH+Zy5z$&gJ9zdo2d%0FfNM8TmrH4k}$yf>WGk@aPdo6ZsU zM1hKG{`5Msc9a|m7CPbl7>lNyO$(8jaRX36Hdm*-=B&$6-1+T4mNO zwzv_S(%x#;e4dGb!|XXwvq%6ZuP`MXFK#y)Jw0OpuYIeq32^r1J>yX+mb-YK(DgE~ zOl%%ziJS6XJT2m5-J6<2)`Uqq4URyw5DrvDIV>Z{OBV+vWDM2x>_AjR#F1`wUag}^=EKf zYMi(u_sZ{%ao0G_1US+qE7fe&pxj#A<9&x6vHb})a+<5wu*x{KgJqG*15fnL`@Hr# zvFtec$I3|@xOT8@;8RKF|3U({CYVaws4qV;b=1!oJJ`qvlUCt{`jQQJBRA+s2%sZ{ z<`Hi1FqtzbE+b40PyxM%{<~eU&84iCG4qX4LG&YjG!B>aIHSP+NY#Nimn zB!7EMW0VY!z7P1;m5&a^a`p6Yp;|rMY^5g!rXqJfbYygV0MOfR0?*)8hCh)v@U9ft zES@Zo5{CE)u(_pKXNMltu8-j-<%GtS)|Lc<#;IP55#B?Z^_O@5j9h|^$$!ER^St{X zjm5uxg&IH7Cc8wdAhiCo{#P1L>nXZyb?Vzw!dDwaUCyKgym7EP3qaZmVOBs+#Oj4t zpL}*(GA)UxWO*$d4IfXr4?@}Xs)Pk5?LdRf{4%!r7f5rTG|8UM#idpKTZqC>VgY*B zkErf0JIOc=-*H_eGvC3qvZ>6Q=8vV1Iayopnhl-Bm-uef+U2T+Mn_}O(9)`w#hnG7 zC7j2~>j>SRzd={-e+NLhf2e^uQekf;N}RyDT4r%|>JTNmWftSnsI=F{B_;QxmG+m5 zQ$Ed!7vhU{=~u(?9 z^Xhkfvs3$1zC|BNV|JRuw}WDWAM8Gz?1(dw4HHLInfh;MT7b1!u90$oK=h=VijM|5 zr@+xmRid4VU6A%FKbzU}d_>mkw3jw&PK2Ld-q4V2ZEbDjj;#4B1@41xD&z#F3^pkG z?SkN!Iqq+BMR2gf(eRmF28LKrv2WOxD<0y-&{es^tJ{3G^!&HZq~X`^M=@xzkkd}C zemKtfpX)0kl>$n!@qxm%qh>iJ;L4zacAGJg09=|j{)H=OoV?g^Qhg6w z;t?X(dVlq7CPev%*0oR>*@_%#iVBBWo)iaXSJT^i6o$DqC{){2gRBXDP8P7vTDEn<;Nt7$Iclggkx$ zpl})^689r*rVQmd>?@Jlf-UidEDBOD}aw09HI@(%n zKF#e?q2pNJDEQJjhKc=+aFgMfbPwXd)e+VOg(elv~NOuI;bG^)VH)dFek z*$J&NsDkJ}!V)qzT`l(Q?=yKUxM?P~RgG9W4hdhCn)TtcH0+lr^h3jLWG#5Q7LNRc zTYMpzkFXTTjb?B~I^#WfTaf-oSRvrs_%JtLPuL;kRLr!qTZ$ksA7ITnwgn)kO{l?K2 zd)pL8X}ak!t)|FMYJz}Gei^^$st^YPePe81oPo7 zMjM|np85o#xr`|SGol5nc#ie6u;g5-!>G645^=bEN7~_~VafHVh)5U{dV>6s>VJ#j zq6Lj@>r2*>kR1s$E5I&w(bE~b{XM#C&%I?Ixp z3JxDY^nWDwKi%8nS4+&b>Y+He8BA;?#OM4~)k$UR1}H3zP-61Ivk)mGsUgR9HKn0m zY!dG5{p8J9X{3hJtMnaKB+9mAlt8MluLpUGD@B>9Pv9_7As5#3uo$uyZg{`yGzS7? z-NmFXJ)|!`zZK(R!r^#pF_8lb39u^pWv}j3B2%ujbEs9DNPwI2$~x{X^J44u7Ahb$(JD`b8ID23 z-orQuU2X4qS@Iy1XX=U zpfy6n(nx7JMqpgZ-E$zk2IY~3Q>?k_{1uzbl$4aXuU<05|3#LLIyrHI!DsfqG5r8` zx(iNo=%fOj=jZ1;^xLr1R)nZ&t@N|;$|skFlP(vxW+X`rYDE(T8oTQc^rL9QBBMBIk~Am$K!*u|-I4pk*b%>*S^1iV*+tUB{3lW9 z^y!kLh}3Q~@x+Cswq<9YsB_Z#RxDP2Q11q~L&=0}An zf78Cw)pKc6d)&KQ{5hL2_GiZuK3&!BWmKy{`7PV- zMq(UUSrQQKhim85mqRz(WJ#9Dcl|{AAK#!1t?EmB8P8G{Z`l+Sg6pZY-`*ywjofm) z{35n(De*(;^|{C9>+QcIX?>;EwJEj?;(xg?B|dEvHQk^VhWN-+D*@>e$^!o~UMg@v z_reu@rpyEpMlm6kFSGw8fnMumvF=QbLk6}O0iOgCcK&wyI9D6q7V}!zSpvI0)VcEA zdbC{wXyywKZJP#!90>Avu;+^{)0!avUBL?x`?Eb@QFl|1Qs;PsDJe|Kbh!7<9`dra z`#bSWv!5U$I?2z9inH2>xf%yV{~7@1x90^CIXFmYUR4^Z=_{P^a{MBjG1C{_&h(YW z+|zpqD{R7>>Z1ge)|V}<*teCI{9em(;pq68)wuOrzB}yKvYqo@5|+){tckeM@Y+pl z6qb&SyrHYIJQt81#P$RuOTA`y_LNEH+(p~b_yNzzlSP#fpR?^`k7DOyl@7rD4^^?c z{Sz*&Idt|5xT*3=ue9eOEOGw>IIBHVwtG(L8_68|% zm9J!*?I^6akh_;~Ovo1{+FhJJQOAW4HUtnrvpxjs)q5j%H1YdCw3A;(DwA`Gd(d=! zQbm+k%r|g|QP9bW#aBJzZ&&w0XXnv2uGh=dvwHWN+c7u%z|&rx99|;!d>yR$!!8a~ z10kU<*WA_Mqdyj22hxR}Q#PzwEqk30A6=KyE%W#)`ptCN#+Q1BnvcnwAD)DJuip3p zVU(Z&+pt1^jQ+DOM=4NIGwO#j?X;jkuSQj9Uf_nrhx*S{DQtw>ho9EMj6&|5xoktN zEM3jjn05!*hvRAE+1hJUP9|{F6o{$=_Y`6hZo+bK(^!y*o*Di|<=Z6|fnzr#W_Lwyv54DmBm<>C9Hf(^z;_*^ah#rS{ zyPE!^gavdCmK?rj-Vqr*ac;A7X|+Dru0?tOKGr)raA%xL2&(#8 zvuja-*lRnU6jrbFogFLpqeZ`VKk>;a!>8LRE~4+T%)cd0!nEp~sTnn)wjS(*gdz_+ zs%OzrzCo;hz>cEO^>QGSZgs@7rc%gl-+&knPG}nX{hdloPF|%Iz3H{0E0#DJMI!fH zBVL+5G-lG;%wk4bjb_BPh^exfDtFx(btjO_g!$y^s^NzSu5%cFR(5t^A8U*6U2;PU;ClOlQG3@YbhQMC zg0{D8Lpa#<9FJu@#$`O7=O3_yfSYJjarB(J@N5_A-Tt{NehDOTO-%xb7&06V0iww9 z3z6dh43Zi@TiXc3hh5Fa13L#nh&3{tJd>_{T`+iTRHjw5v}BM9x*xA#0M|J!*EY%B zH(MDPVpTeJK6H_pnVDc9myqFD0gEi=>r+Te|L+fl*HgfQCJe|exFLty-y$L+f zDhBVO=h_a_YN7en;lj%4f(O`@WG+vk?_LO~iri2=Zv%Z+Fjl(SFb1A0FF`5x!t?2F ziL5(4T~ULg`lc7$|}S-J+rsDen*QH8~=JxisM4!BxpB|3j9PbWlYCaT^k&>d((hmwAHCBtJ zG#oVxy525=VmmWMFB7Ky!&{gmzat;7Ey1Ok?$K1D=gPSOmjS6Y&111Qn809q6FW`l z2za{lS_vkAxgLcy;dFwk3G%Q{~9VccUu9jMU(h_gt zoE({fRfz~O@U{XI-Tiot>?u*zcNGU_-gE7{?{OfRtxM=2dUsEcBxetp=W~w>54NiZ z4uBvc#v3W5Ht_m02^_yZ`k^Be-F+qVzpnMG()kXG$C$p2*CZsVds+1VHsJsH1JL1G zP(LR+sCK(Ya}~Wnw_v8+OtE&M+U^;kTNQ;I1+ZWL$8P)IXo~x)3f_P4<~(0?Kvv`w ztNA>a^<+5^quh3eBi(ZqnIZla#L%A~1V*=p@L&J!tmh5-sobCpirhIk*w{0C5&)K- z9y6R6`AoO(z-U<@v++|NRI8v{Vzc~L1WW2335d2Nf&YA`=pPKUc} z7K5?ao1UJ|13@sj0_vyOg@jOtFC!A`^jLg(Bqb&7m{D3&7SCx0MW1{>`QI1go`r|A zHuL!!veqtt;el+9*RF&RKU2i;qyL?T7g%CL=y*=8&71Qji-P42VV1#rAvb)ElGBZ`CJBd;CdLG z*4~`<<8JXBKsnC}-c;Ucf3_CIElIt(MF)}bl=bP9Rp@3t7VIbx5E1JxXKlRtbQdKA z(g2Ya3zbcSS*NEcp;M%*1rM@}`*qs7>(y|A@g_O?n=V%Www9;6mI{|G6^Yk|Glks|y%X!DsheYA@@3Q6**eoqp}CtybLMe(t)>i@9{!QM^a5B$ zd>T*;w>qU(>$m*hvti(W42N9@iRRozQKsB(=C?$8Iy>Rj{z8Q8MT9xK>XZfd`h5!# ze?Poq!rj~xJU+{KO1(R5!1&x1PEg^rCX?=Wsr|-t`9!$%J2Uh_Kp*@XeocZBE1^g65qw&bX=ZKq2E9`3Hrjyo`(50|5+t8)8=dQN}V zXAo1_5y3^t&{T`s42$*ZnS1!}4>}7;SGd{i5H7fKIpouv)c|L4I?q%Hb2aaRK>*S~ zs)4RT@BeXR2&N2tn3w%#n*VD`2|SM}AC$%hE#4P@yeVwCWvq5sdMxi5sIkc7tFh8d zONzP>t0D^vZuRv;1W~8%sQK=XDTnV#xS^@1Cm++%kpCrT^J#p^@ktbr`Wz|Qsf*ZV zi2Hm?T+EQ)p$n^EYvRz==|qWtJb2AW-liSpdG|THl{1ht1v9RJPTK2!3z3dzGUI&o zcn`Z>H^5jR>!O_yTi|nWpN{FsVRxWc{x1E%_droK*Y|8Cef*B!BURDvci4;HmPR0D z!4&D$IS-aJc^nyl?qPSHa*B?DWnXzM7?~H>-Mq~w<@R}F@`CBXaWPNVQBTVWy7oqQ zmj_g_y%1r4p!uJ`Hq1udXklo8?|vZlPkAiMir!+u)GYb?@GZZI@&dYDUk^^{Ha@NFvtNdHjyvFV?vg3RX$BAHf|H6HM|1uSwbHy*d6crEN1d^OX4 zepw@8DSUN)Gk!d~Zq;iA5vRfj553brF{5jU66ucx_;(0Sz-vZKeQ15tAU6ZA#-2}Zr(oj z^z_`!PBnKA@Gjk#J9%yGHGvWk@AI5}!$DBr8`0a5s8fumV+>H4rJne_Pi<%%^~MEp z!)rMJak|lq6C`rZ=Y;jVUin&Pcjw_>{f_Q9(xWl(*?k0Gr08v2J9y*rGF3^J*fB4I zktx-}hXFV^^7V^6Te%DH7TpSQDOUaf`-{TV+ncDzX?tg9rD5rT1vnu9+CZ9Q0dIrn zxx7G6g0RW|ldeIzX)p4Xp<~-inEkn$qlg5!*(;`)UaFc!Z$=EEW0(@Z0~>bb|JORy zu0;x74+0*|lCrWr$X8LIe*4k4(QZfU!s_Dn1l>EG8S+mE2zc?h9rd_vww5j9 zQJjQD{?GWMoRF5Ei(|J+z;nN zjb2m5%3to!bP%*$OD|qEUpavnKOJ!Jk5wz+%D>9uyYl3|_@z_q47x%_b37SO_ggn} zEf2aPk0()Q&mR*!tPLzHV;4C~8cIFIUVMfx;Z1MqMh#s-%^^Je!3tp@$$9W5DTVZ$N$V~ z?sX8{Hwy|1#{3UVtgb3NbNloEK`x85B!~YXSG$BS;^X1bW2AS}AR6zy7^ntnA50I; zpodSxnSkU!Z9m9jWZ?v?k7+$aJw8q(UuCk}j*rYF& z!lL&p7|%ecV_cQi3l@TIU<(zK9Fv1C3hVLo3qv8Dh^ZJ4QlS;iF z?O7yi&=E50#N^aQ47Icy)xh`yk{tIKlG)+-Lox@agIDP*mXe?cme3 z4K_B?isrX>u<+BEH}B){3l;IEB-*5YF@1WU#dw&Y=JT$oVIeD_+E-j}Xy(#U=&Sn6 zp)a}(@Y2Xc)w^FTe^s@=7q`O2gN2osyT2dZ z=kMw=?jC&)n=8U}JMREDHHu&REQXE*0164DmYemtu6^gdojmfRI06-^AK5&` z0=_G$rVokyXo^EKy?p&fg6@~Wp@D&kyQ7v84AJ}HD0b1E%_+`0zMy5^p2D?ek+UFCvlXjN7&+Ib9y!PWD z;kbgkN4AqJ(oY^dTAJFe6fG(Nuws7~6^(;xPvF2hQmabZdJ+F@Yv_tvG?!5m@V(v1 z_XcUc5&)}i!Lb7kE4)w`L+5ja-htD)dxM{0l<(usRv^uQYMKCb!A-imLHFyrg~K0i zA(W|pLLaw~?Y>vJ?`qQf-&UKYs%-aYr9MAJI#ehx2Ihc5B~1YDm<(H9K~ZrGg|%@Q zD)79;MXugCDtK_+xh^gtA+N$>=r>rI+W;c*(SQxu%`NThwdh3ehhK)(h)CX-pIu`` z^}JX^+<$9u`68+(`&p*XmYICz;NUp#=Ny9feJPMyEtUQ76@%=fxOl+kP{z?!)$!zX z74swp(IV|pbzE$0_SK?~D)`k?VAWxsRJRh&3iKdt@mX719ycw5L|SN8d?gIkue6K? zUocwt0dCK&n6*m9z`+sZal`PDdiyk*?^0k*XvKPHVU}}Jroxbt8|rq+uf^vy+eCKY z>E8;$CxUwmce$?(;U|J)0DNzp@dyZP_NU9d!GWiw$T}lvtiS# zCjgJ}BOUmbcZK=Dso(2T6J2ai|!qEx(_cnc}KKCqW7d z3S3sBR1d2JEr8{Pjm}CX_2|LS;2^qJ)%r@u*AE5;(3ZP~ma!k?l3d1}NV+xBF`y?w zgNKK=GhU#+3-;KpzDID#MVfI^znMK2y)32=J~vgmMPdy)#l^+tqzn7}hC)@ixw*+R zXyysqXL_=o(udPscz1TYXDu%aO_!PvEK^U0qulvLflp8SzWRPj%HNcxzsWAbtqcK= zF0Dc)5eEJ@W-ZQX13sb!&)odUz|XGyhH@+o2jgiZ}LwXFGhJ>kn~6T8K1hJRxEoR3wey)i#U!Awq|5MnSR?mLE|4g4TWaGY|xWW=W?i3qn`Yl{d2d{QNOF9!q|_mQCQ(Pjz63 z7PZ`Ou#$$cruxmZY$2~iRE_*oT0E(I2a8eee4?M8A|jw7U}*&p&DXh5%LCUPWcT(4 zd+rTY?gu*Y@$oxHPmf330I1`?6#<>!u!ux_YZrkhzZM@wE^h9fnwE#+oXtDAAfMig ziEnO(m5{VsRDE5hD8dF(#0au)1nvunVPRn!dU{3Rtr~z7^R8i%OhtEp*1w_JtUU;s zh|lroqSqEFxQBJ%h`!dL<)Qj{{fs(7Zqgr#daGgV>h_=w0G0gSRLK-=hVLqGNluQ` zkjPyT2m##g`_n(%a&mL6_9lyOw?Jw7!wih$fpa?MpcZklfBb5`Lr3V?;e+MZmZ<%V z%hfpc39}*#*6ma9#LS68O~sh<@^UWE<4=BIRsAk5o=9XjIUiS7)xU_acHe~Mswfay~W;Z{*eRvYt}cX8{VKgjE6jt!Vv?Y zzo6gf`94OcX?Cp*k!<|@f7NmwUQK0NKL`$X9V;M3hX5i122{FWLqZV{1f&WPq#6Yx z(sCIK;z*4^=%N(qHT0@tklsN+L4`0tC{hB_zkQka-g@s3__7uxYbCk&+;jHX`&ahO zScmuY2Rn_7zAEU`Q(BqGH?H(@Zxu;~3UTAcjpd~lBny`Nq`0`&;Bt4-JjkzUd3o0> zJXr0JXSY=H3p_7e1)*qMN8#HpC%&tmi&I??KezqczP)>V*1q!upSe?a@#FGYeb|bLa0f5*9Rt@%6_$_l6^0$gD1NFH?TX- z-y81~T|<7=D&IBiMa84#cYDd-WW-|%Yu>Cmd4I}rG2!9ip}{0n0G^P4FcE>~-L+}N z0^OmXII+D2;(o+QxxnT)rF0N?>_J{kOG(l3@F+z$H&n5=dR3K2o7Z_7=AHxw{!cvT z@;vKRCM3YM?ZT?CVKyJKhZm_KC)opT{BGDBBbR`R;kkR*Rd}sdF}JSzYr$tiu5LMa zp8%zi=kzTf5b+N(bucyD^u3q|HJ>>!n0we?%{gONsVcSU}uf%2OjZ?z4x%_~A9BU7&m zc^)++lY_-tQUWByip$f=<@?Qu}!2~s`jh%%YcR7!p2}iHeh4)OP^!I+#72bvbMGs zm6N;ay|U2tbmx&r;hwB6LvQ5jxw~Ju7$=ZFWi2t$p3o)ipBS&4U9k{_qeo~^C6d&P1ZD#8Z`~>La@paT(KT)*4_e8+?-xIL40ui}b(FbH2RDca2_cc< zCWXJmJK}P;V=x4NQ3;8KwSWi(x4YG=L$yKCH8nNCb8Ke>*>?1&XJ($g8pw+SH$&SW z`!XcNGLTo!3jMQpa0tMyZ}**;a1^Xl1bx`1B~EDs;GGS`yzuek?-noE)Q5@+<8W;m z#s&2#gt6IJU$X(YSBc0AUyI?|_l(4sa5d;0rSbjKolR3;%bH$ade*ow+28bJ`vEU& zgG}Q?lUZ9@AMw%m()U!yky+^$OMzv;;2dDAQcPDEa0IUlLl@WA0-A9T)sMama&fea>nzN&uE{wsHf4N&U{mLHFe|wqYXlyJ$d6Br}EDV^3QjiB#5owLL<*Qgio^~rSDwK8Um%P z+n-x{OES9tVa_v;iINLwUkxA-l0YD3Znn1K2hFFt};U?CfeNbKhw7!|{i;NbWTFr02! zS-nY1PiJLsEN7#P0fsJtH?Hs~s6>{Ui1c%6)gxP4I(=kiTt*t>J389iy|Odw{B^92 zHB?|hpT@{I535zlKk`1d<(BrphR3Dk;o5rpHi3|EElx2NFcCl(yR~Ijr8}LgD$k_Q zF$BAtTk0~4#exjDt)y~hsFn#PP#2_C5i}9LG-kt$s!JhKQZ&mCzkP+4edD6LvD20) z4loAo-#>wUB1qftUd+VAL_9E_EYqJcad87Sk=_1WxIc!=A-Gn|i&k?ust5j1BAel3$(y~TzxGdDMnGbbZU z)`t!sMzIu(y*+>ZE0I&^q=IC$>Y5PMCwT9AN0pO5$I zm^RWr(VNeBP_~wQ=l1QXqzsHix3{-<8KOrL-!9#vm{7IO%Ekrm$x+@P@29{YB+`8xSemXV_b+U>giz%*8p3pB4o!R&AwEC4G?Z1k6ve;bM?DU|(_UrO{6 zR0C$CTcAGL2CX40i_F|w{+HNHquh&-0>iORUy5}hDagA`#Y|OgtQ+}m``5`27^J7A z=|i=goplC$grn=S`2kGCWB^UV;!ywwtU7J7zbKtX(?`o0^as6}_WE1FxWGPa@NvU9 zlesporlr*dghvPuG0=t1KMkO&H&i4*PhI`Qs?3-e-a*5Ie>cab1F7!K-m^J75@w~t zW$kl)4%uBO^`2W^oX*}@dbJUPh2R}eqMHAO_g7Io#`agS$yKDWG# z`LT6~6O+Dm=iyPX*Ir`1At>sBqvu$DI0MiNX^NK722JESTtuQ|<*)ZejSxdy#vxM$ zqIEqn5!=<>ZQu6h3XimnKP2;H7~mu%eZ%JHQw3IzTQD>RWH8;EHzN~AvMY zMkZ8oJO$WiHsI%!+HE!L5GY5XL!k%Vn5lYim$N?o`ZW|p;6)DkJgol3R(%qO)4g)# zN?*BqzO#!<*IR7?Az@*Az}OyOK+S`hKUVU0oSuO}xbGgmlX&tXdqFAa)~(lFG7}taoN) zP7MnU#TNBva!cEMntX6oLBD#z)VJ0EHVpc>cOt6@5ZGZhYU@e%9`xT~g!F<0?|i;u zMks0SoNjySOBvZt?^+eaJJ&sYyHr6WPe$7edrrpQIW@h;4EARfSa1_#Ri*MmOH3=R zmB^%-}upS*UAON^u_0FS{uit$i}&q%;b-SKR@ovtN4?}G4HP8UNE{-BO}~d z^}6~Ze?70P8fPFM%f#&y%h#{VsBeFH)nmsygw#uvS|Yc@#`5B8H-*T>Xj}`HBJ$6O)0ceU3K=e_nWe_Pl54!16cm4d?JlyNt;_JRM*`dZ{+R~d^0Z5#e5<7jKHT_30J~?jMtPp zAi>T>-4I|ugj9C}YA68v7{$;4@6mk*veJ+5OHKs^1-W~^r*-!9hylF>3j2a|0uF$| zxbnc9Izp;czj^bfafx$MDT$d3TOK7tQ3`HZs8wJha^WZsk1K#`;HMwuLm%8P`x>R> zSqLS2c;=xM-=57Q#Uj2OCom?!9|p?Z<-M0_<{o20e6sgc;3gaZOkvK>&M0

Z6Hv zTlx-bVZ+12>GGlHZWtOe(Q*v7lNBGjJ{U}FAjgT;j}I03W93Qe7RXuww6i2a9`6D< zTRsB=M#$hiG!@v6G)C4pG|XvDwNGvQgc;&qi8OW!Q48?X7NC~Puf;E)| z$i7xyQ8~M6y%cLV^W!7ioX6r+rku-23KV=89f@|yAq*${4M}T(F`AGw%Yn**LN)tP zvA(6nkW40LT-r=f@f{(Ut)+gxzP~{hOF@Oh)xZAQ0q9VwUiWFC=i*&_d-46DN6oJk z-Se=i#l^D5#|t!I<|NF^M`bcWsuH;tx+91QHLerT+11|`|XiM|{{Z<=QA;7Be6evdmt|;OVsxw&p>{|Bqq@?6t z`E1Yt#>U3fuU!jt)_<+_>bx27#~>2d<{VwtpUCIMy!ipM;uH?64+t#q;u)v(l$7Aa z;O!qOy;qjQ@{z|dvB7v7Ag@w#|19Jm&tM_1JXs$1EN1*s=TX(DW0)W;B!s6xi98q< z(Rba#VsJ#91EtG=98O#T5)2RQ{&*GYcP*|51|@2c_bYo|$IVV@b@nkT!yvLJJ^rYO zt<2ktep1CyWy`_QKbBd{9-By{rsgth>Z`(zHd-^o*$y-@N|eB{gN;jbe+%KkpbIoM zeI28W3>?um86O{aU7jD?cJ-eVmILH6s{!`XnQ6joQ925$x;VcN7Eh=R3`-1t{t=$> z6xBdp?t+L%I65r*L|VA0q$JSXK%L9zI55?Jy{$&r%`Q7T=jG++lSW%#$1g55e)`l3 zJcY3D<~@MPCr_Si2MqO^=rwedZO(1#izvRnxjE4J_Bud~t|Fqv;HAhu=8umrpdrQZ z$(w&lnmHPqSlG*84#lPcpwZIW5Ql9`gnydUWy8HCT*7VEPJ)i~cK0JOUa znQVw=0QI^cWq|5rb>N$|sHiB9ysNDyVRN{c*Jvb009D@2by|h}w_Sdu6PY~9a(}1F%5)$sWAkz1V+r zj$vfn>2!+3*=;F$gtl42Dnw)kNY9L^*~n^NN9BK&t^PZ7j?|W(xWkN7{T)XAd}ory za2yUVYkS9)fw82~RmMYMvZq z;rS0SPycbZ#%G!?|HQ9hR9O?n^p=(_};{?2ZwQB0)uIH4bN-A9 zgpZP2z92S~*`cNyE=6r9%Banj(9j&<3J{_cW<8G{=Y zLccXcKAY+0qXkx5mwR{2PJGN32>1sRAt)&N|HVWl(QvUo_kuB7(W}N_z8QIK<^SiU z4}n@D%Kj9QRR!@}N?N)A8borKAVZ*rS!h^TQfH?=kWwvBDy8VI<5GNWZ4dYrAL@XZ z91I&NltOs}67e-?rR>}kr?S)1u0vf*R|frp&+fWUU?J{HL_&$ULOVT|P+QnriAr@w zIn~4xTc?KfueHVp_SRxCkf~991XKMxkVjB|GV}7J+!f<;##7*M0GbW5OjBWCcH^C? zeFYBG5nvab{11=W&SGP%<=-Sst^#LF(M?db1HlNCH(k&jPKt?b7Ji_%pwhB6c+Gq~ zV(;ka$a*VHq8IKG8L_?F5LlQC6uD{P>^bCI8i;n}hARXU-~6Db`!@%L`QgKcIo51e zeD9qma6&aHO5zW_Q}X?ihVxXVpor!apYKw3-pMlbPI=&Ycd(Hl_n*2&PAsx6UNJiT;Jh$w;C&Xq zb|_+w-92>hAgDar{6SZjmX@Hh?=8!MJM7FTw1+c4eB424>W-0f(Kj$iMv=m$h9?R6 zeSoP_p}9^KRkB-`U@$K`SI^o>A_RYEgEZSMaNZOu@@|KU$+pOTshEg_Tycf`fY*x9 zceK1Z*HQrO-q11AOf-iv%B~ol`1g2Fh2Vz)XuCA~u9JYR#vsw^K|kw&$|xN4v1U>9HI+9QrJ}=CdT?YO*VuO0bJJ( z`{BJuiq`4a67dhu<#_t@r2DxV!KGk*5)4X##WpT)3E_Ay;R@OB2%eu}XBy z)nvk_&_>V_SghXfr65a+;Mw*D%%FA-HkC%BU1~s{BuMvjt6#eG7%oB_A0>PL4RINy z7BGd@m=*=#K!Q@Hg~C^WIOuL@Y}Dj~uYX`pH=gr7fG$~L(U2svq=9eGZ#jSTObJh> z6SsPb_o;&l0xuzK{3KCTK3HE@_c$I9%^vx|l`uHb+zM^N#r zy}jKPZpz~jKfrY2wino$l)icDQAPCBW^uJcGZoj=wynR#iHhPW(6XMC17`=<)ONBD zDL^M2n_Y23>t`yEcR9uD_5Wz<&BjnGl%T^}7 zWkIAa!hV?2kPBN5VpJ9PE5aZumG+vb6sqrX0 z$Ve31P6-DnE{x}qbH4p7John({9`Cf04F{k51kdz_*UsDSO~5Zv<+VBW>mb9=$y^n zcdc=zR9t8b6o@daxG^oI%en1KxFO`Y_OQ)-a{2If9mu~}#_+J(4sTX}bF6|89@H{O z8r=ZHNYI)C0;n1on?=yO(>tzL2WCh*>fb_+9$f`Bk4Q-bsYmXQ8E7Ji7`kub;q*D@ z0>u@+SZFL^+&^o-n5$D-j{|?e=MxwK7@tJYD%2?588;7{{x>W`0GCZWy#Fq7Km)P~ z;Ori_RV@Q;X6&Qc>3!lHd5G#fl+ahN1Zb7uL|&(aQmH*lY|ljDlujldkfSevfUB;p zO`Kyg+CGPWpCG(;eY&|$ZRk2-@IYF6z=_E=GKjh|{3|U2*8iVtLwXogrNu4<>g+ zxJ`V(7Xe84Z}q~*QttKjc6QzdhUJ9i#tQ>%9c}?ExjJrK zMXn&0fV&^zIaN|S&+KVYlL8APKQ%o)|H@GX9v51XwP&BLCKGxb!5+fSfkjc|5F7F( zoUga`Vgb&4bNxRb-B|w(gSd)nX=y=y48;lGGPkiwhMO7E;BJ(QKo>ng-9ueYP(vM{ zZ}&pB&CWZKwzj>^!0mvlu8hc>JLkI!9EeOp`z$QTOG)JU1c6lWH&H)|9wd+raCQxD zH_(Ny0{#Axu0FK>KI{!Q0P;df{9RC$c04^x4eBv0THk2m=BnimNxf@M-UQcxdD)7o zxhL5d{-a`T-SyTRLxW8yi~hbU^-nQ&Vf4M7M_3zd5krDcO0~o3@Gb^_<=W+}i?<&A EAG{~!Z2$lO diff --git a/docs/authors.html b/docs/authors.html index fb520a2a..42441d66 100644 --- a/docs/authors.html +++ b/docs/authors.html @@ -94,7 +94,7 @@

Citation

diff --git a/docs/index.html b/docs/index.html index 9dd220d1..dacedc23 100644 --- a/docs/index.html +++ b/docs/index.html @@ -73,7 +73,7 @@

Overview

Structure of flexsdm

-

The function of flexsdm package are organized into three major modeling steps

+

The functions of flexsdm package are organized into three major modeling steps

@@ -316,7 +316,7 @@

Dev status

diff --git a/docs/news/index.html b/docs/news/index.html index 51cdf48b..385de6aa 100644 --- a/docs/news/index.html +++ b/docs/news/index.html @@ -44,6 +44,35 @@

Changelog

Source: NEWS.md +
+

flexsdm 1.3.5-5

+

flexsdm 1.3.5

  • it is possible to restrict the cell used to perform collinearity reduction analysis to a geographical area smaller than the full extent of environmental variables in correct_clinvar() @@ -106,7 +135,7 @@

    flexsdm 1.3.1

diff --git a/docs/pkgdown.js b/docs/pkgdown.js index 9757bf9e..1a99c65f 100644 --- a/docs/pkgdown.js +++ b/docs/pkgdown.js @@ -152,3 +152,11 @@ async function searchFuse(query, callback) { }); }); })(window.jQuery || window.$) + +document.addEventListener('keydown', function(event) { + // Check if the pressed key is '/' + if (event.key === '/') { + event.preventDefault(); // Prevent any default action associated with the '/' key + document.getElementById('search-input').focus(); // Set focus to the search input + } +}); diff --git a/docs/pkgdown.yml b/docs/pkgdown.yml index 75efd23f..76187907 100644 --- a/docs/pkgdown.yml +++ b/docs/pkgdown.yml @@ -1,5 +1,5 @@ -pandoc: 3.1.11 -pkgdown: 2.1.0 +pandoc: '3.2' +pkgdown: 2.1.1 pkgdown_sha: ~ articles: v01_pre_modeling: v01_pre_modeling.html @@ -8,7 +8,7 @@ articles: v04_Red_fir_example: v04_Red_fir_example.html v05_Rare_species_example: v05_Rare_species_example.html v06_Extrapolation_example: v06_Extrapolation_example.html -last_built: 2024-09-06T22:04Z +last_built: 2024-10-02T16:33Z urls: reference: https://sjevelazco.github.io/flexsdm/reference article: https://sjevelazco.github.io/flexsdm/articles diff --git a/docs/reference/abies.html b/docs/reference/abies.html index 68e1acd2..e92904bb 100644 --- a/docs/reference/abies.html +++ b/docs/reference/abies.html @@ -90,7 +90,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/backg.html b/docs/reference/backg.html index d5a00bed..b13d6d4f 100644 --- a/docs/reference/backg.html +++ b/docs/reference/backg.html @@ -87,7 +87,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/calib_area.html b/docs/reference/calib_area.html index 31c22b06..75845dd5 100644 --- a/docs/reference/calib_area.html +++ b/docs/reference/calib_area.html @@ -202,7 +202,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/correct_colinvar.html b/docs/reference/correct_colinvar.html index 71d6d553..a7780311 100644 --- a/docs/reference/correct_colinvar.html +++ b/docs/reference/correct_colinvar.html @@ -280,7 +280,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/data_bpdp.html b/docs/reference/data_bpdp.html index bb9e0f99..f9029049 100644 --- a/docs/reference/data_bpdp.html +++ b/docs/reference/data_bpdp.html @@ -176,7 +176,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/data_pdp.html b/docs/reference/data_pdp.html index 009b39ad..2a00e541 100644 --- a/docs/reference/data_pdp.html +++ b/docs/reference/data_pdp.html @@ -178,7 +178,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/env_outliers.html b/docs/reference/env_outliers.html index e0104247..f642f22d 100644 --- a/docs/reference/env_outliers.html +++ b/docs/reference/env_outliers.html @@ -227,7 +227,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/esm_gam.html b/docs/reference/esm_gam.html index d5d8f2ec..9329fc13 100644 --- a/docs/reference/esm_gam.html +++ b/docs/reference/esm_gam.html @@ -214,7 +214,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/esm_gau.html b/docs/reference/esm_gau.html index 4e505433..9d2cefa7 100644 --- a/docs/reference/esm_gau.html +++ b/docs/reference/esm_gau.html @@ -169,7 +169,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/esm_gbm.html b/docs/reference/esm_gbm.html index f4dd29ef..d00de07f 100644 --- a/docs/reference/esm_gbm.html +++ b/docs/reference/esm_gbm.html @@ -196,7 +196,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/esm_glm.html b/docs/reference/esm_glm.html index dadf92ff..8d9322a4 100644 --- a/docs/reference/esm_glm.html +++ b/docs/reference/esm_glm.html @@ -185,7 +185,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/esm_max.html b/docs/reference/esm_max.html index 1f81fa04..4673bf48 100644 --- a/docs/reference/esm_max.html +++ b/docs/reference/esm_max.html @@ -231,7 +231,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/esm_net.html b/docs/reference/esm_net.html index 0c4507d0..9dcc27b7 100644 --- a/docs/reference/esm_net.html +++ b/docs/reference/esm_net.html @@ -172,7 +172,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/esm_svm.html b/docs/reference/esm_svm.html index 87514cb3..d2d6417b 100644 --- a/docs/reference/esm_svm.html +++ b/docs/reference/esm_svm.html @@ -186,7 +186,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/extra_eval.html b/docs/reference/extra_eval.html index 3b83764f..2184a8fe 100644 --- a/docs/reference/extra_eval.html +++ b/docs/reference/extra_eval.html @@ -300,7 +300,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/extra_truncate.html b/docs/reference/extra_truncate.html index 5e4fd88b..6a798a17 100644 --- a/docs/reference/extra_truncate.html +++ b/docs/reference/extra_truncate.html @@ -117,7 +117,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/fit_ensemble.html b/docs/reference/fit_ensemble.html index e974b894..0b8c25e6 100644 --- a/docs/reference/fit_ensemble.html +++ b/docs/reference/fit_ensemble.html @@ -178,7 +178,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/fit_gam.html b/docs/reference/fit_gam.html index b980ee20..1628db84 100644 --- a/docs/reference/fit_gam.html +++ b/docs/reference/fit_gam.html @@ -212,7 +212,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/fit_gau.html b/docs/reference/fit_gau.html index 3baf113e..20e7bf60 100644 --- a/docs/reference/fit_gau.html +++ b/docs/reference/fit_gau.html @@ -181,7 +181,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/fit_gbm.html b/docs/reference/fit_gbm.html index 7c6bfae7..020309ad 100644 --- a/docs/reference/fit_gbm.html +++ b/docs/reference/fit_gbm.html @@ -200,7 +200,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/fit_glm.html b/docs/reference/fit_glm.html index 99f0f615..d7bf4529 100644 --- a/docs/reference/fit_glm.html +++ b/docs/reference/fit_glm.html @@ -214,7 +214,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/fit_max.html b/docs/reference/fit_max.html index a0b50b35..ce9d1802 100644 --- a/docs/reference/fit_max.html +++ b/docs/reference/fit_max.html @@ -219,7 +219,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/fit_net.html b/docs/reference/fit_net.html index 4026c8ed..164f0993 100644 --- a/docs/reference/fit_net.html +++ b/docs/reference/fit_net.html @@ -191,7 +191,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/fit_raf.html b/docs/reference/fit_raf.html index d3ca6a7e..f86d55aa 100644 --- a/docs/reference/fit_raf.html +++ b/docs/reference/fit_raf.html @@ -186,7 +186,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/fit_svm.html b/docs/reference/fit_svm.html index 0a08e46f..a8070db0 100644 --- a/docs/reference/fit_svm.html +++ b/docs/reference/fit_svm.html @@ -199,7 +199,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/get_block.html b/docs/reference/get_block.html index 76edbe83..420ab894 100644 --- a/docs/reference/get_block.html +++ b/docs/reference/get_block.html @@ -118,7 +118,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/hespero.html b/docs/reference/hespero.html index 6766d819..36200150 100644 --- a/docs/reference/hespero.html +++ b/docs/reference/hespero.html @@ -87,7 +87,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/homogenize_na.html b/docs/reference/homogenize_na.html index e7476d12..02dfeb83 100644 --- a/docs/reference/homogenize_na.html +++ b/docs/reference/homogenize_na.html @@ -98,7 +98,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/index.html b/docs/reference/index.html index fcba0afc..09251817 100644 --- a/docs/reference/index.html +++ b/docs/reference/index.html @@ -387,7 +387,7 @@

All functions -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/interp.html b/docs/reference/interp.html index 44434130..69cfeb41 100644 --- a/docs/reference/interp.html +++ b/docs/reference/interp.html @@ -146,7 +146,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/msdm_posteriori.html b/docs/reference/msdm_posteriori.html index 2f6ce4e9..33773a25 100644 --- a/docs/reference/msdm_posteriori.html +++ b/docs/reference/msdm_posteriori.html @@ -325,7 +325,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/msdm_priori.html b/docs/reference/msdm_priori.html index 0278d8f3..19ba885b 100644 --- a/docs/reference/msdm_priori.html +++ b/docs/reference/msdm_priori.html @@ -219,7 +219,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/occfilt_env.html b/docs/reference/occfilt_env.html index 9ea1e654..8f46d235 100644 --- a/docs/reference/occfilt_env.html +++ b/docs/reference/occfilt_env.html @@ -201,7 +201,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/occfilt_geo.html b/docs/reference/occfilt_geo.html index 0c1359c3..4c5943ee 100644 --- a/docs/reference/occfilt_geo.html +++ b/docs/reference/occfilt_geo.html @@ -219,7 +219,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/p_bpdp.html b/docs/reference/p_bpdp.html index 69fc6b79..d5e3302b 100644 --- a/docs/reference/p_bpdp.html +++ b/docs/reference/p_bpdp.html @@ -255,7 +255,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/p_extra.html b/docs/reference/p_extra.html index 975e33be..47eedfb4 100644 --- a/docs/reference/p_extra.html +++ b/docs/reference/p_extra.html @@ -393,7 +393,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/p_pdp.html b/docs/reference/p_pdp.html index 6136570c..ff5e28dc 100644 --- a/docs/reference/p_pdp.html +++ b/docs/reference/p_pdp.html @@ -226,7 +226,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/part_random.html b/docs/reference/part_random.html index dacf620b..5c59c85d 100644 --- a/docs/reference/part_random.html +++ b/docs/reference/part_random.html @@ -163,7 +163,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/part_sband.html b/docs/reference/part_sband.html index 9c29b552..8909388f 100644 --- a/docs/reference/part_sband.html +++ b/docs/reference/part_sband.html @@ -277,7 +277,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/part_sblock.html b/docs/reference/part_sblock.html index a575f2e1..68e69b8c 100644 --- a/docs/reference/part_sblock.html +++ b/docs/reference/part_sblock.html @@ -378,7 +378,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/part_senv.html b/docs/reference/part_senv.html index f9f7a52b..54e132ff 100644 --- a/docs/reference/part_senv.html +++ b/docs/reference/part_senv.html @@ -229,7 +229,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/plot_res.html b/docs/reference/plot_res.html index fc91bdce..d0625187 100644 --- a/docs/reference/plot_res.html +++ b/docs/reference/plot_res.html @@ -91,7 +91,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/sample_background.html b/docs/reference/sample_background.html index e39d3fc2..ff51d40f 100644 --- a/docs/reference/sample_background.html +++ b/docs/reference/sample_background.html @@ -400,7 +400,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/sample_pseudoabs.html b/docs/reference/sample_pseudoabs.html index bb7aee76..3fb6d583 100644 --- a/docs/reference/sample_pseudoabs.html +++ b/docs/reference/sample_pseudoabs.html @@ -303,7 +303,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/sdm_directory.html b/docs/reference/sdm_directory.html index b452222a..424c08ce 100644 --- a/docs/reference/sdm_directory.html +++ b/docs/reference/sdm_directory.html @@ -177,7 +177,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/sdm_eval.html b/docs/reference/sdm_eval.html index ec87cb7e..0b4c2cf1 100644 --- a/docs/reference/sdm_eval.html +++ b/docs/reference/sdm_eval.html @@ -167,7 +167,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/sdm_extract.html b/docs/reference/sdm_extract.html index aae730bc..d7a57804 100644 --- a/docs/reference/sdm_extract.html +++ b/docs/reference/sdm_extract.html @@ -139,7 +139,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/sdm_predict.html b/docs/reference/sdm_predict.html index 9f820ec6..5cdc84d0 100644 --- a/docs/reference/sdm_predict.html +++ b/docs/reference/sdm_predict.html @@ -290,7 +290,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/sdm_summarize.html b/docs/reference/sdm_summarize.html index 6b12bedd..7c9c7bc4 100644 --- a/docs/reference/sdm_summarize.html +++ b/docs/reference/sdm_summarize.html @@ -148,7 +148,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/spp.html b/docs/reference/spp.html index 4445550b..149e4b71 100644 --- a/docs/reference/spp.html +++ b/docs/reference/spp.html @@ -90,7 +90,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/tune_gbm.html b/docs/reference/tune_gbm.html index fa9a11a1..ff32eef5 100644 --- a/docs/reference/tune_gbm.html +++ b/docs/reference/tune_gbm.html @@ -235,7 +235,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/tune_max.html b/docs/reference/tune_max.html index 4adb79dd..7ee04711 100644 --- a/docs/reference/tune_max.html +++ b/docs/reference/tune_max.html @@ -239,7 +239,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/tune_net.html b/docs/reference/tune_net.html index 59531442..4343a086 100644 --- a/docs/reference/tune_net.html +++ b/docs/reference/tune_net.html @@ -208,7 +208,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/tune_raf.html b/docs/reference/tune_raf.html index 6b802040..5ec31978 100644 --- a/docs/reference/tune_raf.html +++ b/docs/reference/tune_raf.html @@ -203,7 +203,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/reference/tune_svm.html b/docs/reference/tune_svm.html index e204473f..9f0af461 100644 --- a/docs/reference/tune_svm.html +++ b/docs/reference/tune_svm.html @@ -209,7 +209,7 @@

Examples -

Site built with pkgdown 2.1.0.

+

Site built with pkgdown 2.1.1.

diff --git a/docs/search.json b/docs/search.json index 79afa484..f4bf87b6 100644 --- a/docs/search.json +++ b/docs/search.json @@ -1 +1 @@ -[{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"flexsdm: Overview of Pre-modeling functions","text":"Species distribution modeling (SDM) become standard tool many research areas, including ecology, conservation biology, biogeography, paleobiogeography, epidemiology. SDM active area theoretical methodological research. flexsdm package provides users ability manipulate parameterize models variety ways meet unique research needs. flexibility enables users define complete partial modeling procedure specific modeling situation (e.g., number variables, number records, different algorithms ensemble methods, algorithms tuning, etc.). vignette, users learn first set functions flexsdm package fall “pre-modeling” umbrella (see full list). pre-modeling functions calib_area() Delimit calibration area constructing species distribution models correct_colinvar() Collinearity reduction predictors env_outliers() Integration outliers detection methods environmental space part_random() Data partitioning training testing models part_sblock() Spatial block cross-validation part_sband() Spatial band cross-validation part_senv() Environmental cross-validation plot_res() Plot different resolutions used part_sblock get_block() Transform spatial partition layer spatial properties environmental variables sample_background() Sample background points sample_pseudoabs() Sample pseudo-absence sdm_directory() Create directories saving outputs flexsdm sdm_extract() Extract environmental data based x y coordinates occfilt_env() Perform environmental filtering species occurrences occfilt_geo() Perform geographical filtering species occurrences","code":""},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"installation","dir":"Articles","previous_headings":"","what":"Installation","title":"flexsdm: Overview of Pre-modeling functions","text":"First, install flexsdm package. can install released version flexsdm github :","code":"# devtools::install_github('sjevelazco/flexsdm') library(flexsdm) library(dplyr) #> #> Attaching package: 'dplyr' #> The following objects are masked from 'package:stats': #> #> filter, lag #> The following objects are masked from 'package:base': #> #> intersect, setdiff, setequal, union library(terra) #> terra 1.7.78 #> #> Attaching package: 'terra' #> The following object is masked from 'package:knitr': #> #> spin"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"project-directory-setup","dir":"Articles","previous_headings":"","what":"Project Directory Setup","title":"flexsdm: Overview of Pre-modeling functions","text":"building SDM’s, organizing folders (directories) project save time confusion. project directory main project folder store relevant data results current project. Now, let’s create project directory initial data model results stored. function sdm_directory() can , based types model algorithms want use /types projections like make. First decide computer like store inputs outputs project (main directory) use dir.create() create main directory. Next, specify whether want include folders projections, calibration areas, algorithms, ensembles, thresholds.","code":"my_project <- file.path(file.path(tempdir(), \"flex_sdm_project\")) dir.create(my_project) project_directory <- sdm_directory( main_dir = my_project, projections = NULL, calibration_area = TRUE, algorithm = c(\"fit_max\", \"tune_raf\"), ensemble = c(\"mean\"), threshold = TRUE, return_vector = TRUE )"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"data-species-occurrence-and-background-data","dir":"Articles","previous_headings":"","what":"Data, species occurrence and background data","title":"flexsdm: Overview of Pre-modeling functions","text":"tutorial, using species occurrences available flexsdm package. “spp” example dataset includes pr_ab column (presence = 1, absence = 0), location columns (x, y). can load “spp” data local R environment using code :","code":"data(\"spp\") spp #> # A tibble: 1,150 × 4 #> species x y pr_ab #> #> 1 sp1 -5541. -145138. 0 #> 2 sp1 -51981. 16322. 0 #> 3 sp1 -269871. 69512. 1 #> 4 sp1 -96261. -32008. 0 #> 5 sp1 269589. -566338. 0 #> 6 sp1 29829. -328468. 0 #> 7 sp1 -152691. 393782. 0 #> 8 sp1 -195081. 253652. 0 #> 9 sp1 -951. -277978. 0 #> 10 sp1 145929. -271498. 0 #> # ℹ 1,140 more rows"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"geographic-region","dir":"Articles","previous_headings":"","what":"Geographic region","title":"flexsdm: Overview of Pre-modeling functions","text":"species occurrences located California Floristic Province (far western USA). “regions” dataset can used visualize study area geographic space. points distributed across study area?","code":"regions <- system.file(\"external/regions.tif\", package = \"flexsdm\") regions <- terra::rast(regions) try(plot(regions), silent=TRUE) points(spp[, 2:3], pch = 19, cex = 0.5, col = as.factor(spp$species))"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"calibration-area","dir":"Articles","previous_headings":"","what":"Calibration area","title":"flexsdm: Overview of Pre-modeling functions","text":"important decision SDM delimit model’s calibration area, geographic space use train model(s). Choice calibration area affects modeling steps, including sampling pseudo-absence background points, performance metrics, geographic patterns habitat suitability. want train SDM using entire extent United States interested geographic distribution environmental controls rare plant species found mountaintops Sierra Nevada, California! Let’s use presence locations one species exercise. calib_area() function offers three methods defining calibration area: buffer, mcp, bmcp, mask. briefly go .","code":"spp1 <- spp %>% dplyr::filter(species == \"sp1\") %>% dplyr::filter(pr_ab == 1) %>% dplyr::select(-pr_ab)"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"buffer","dir":"Articles","previous_headings":"Calibration area","what":"1. Buffer","title":"flexsdm: Overview of Pre-modeling functions","text":"calibration area defined using buffers around presence points. User’s can specify distance around points using “width” argument. buffer width value interpreted m CRS longitude/latitude, map units cases.","code":"crs(regions, proj=TRUE) #> [1] \"+proj=aea +lat_0=0 +lon_0=-120 +lat_1=34 +lat_2=40.5 +x_0=0 +y_0=-4000000 +datum=NAD83 +units=m +no_defs\" ca_1 <- calib_area( data = spp1, x = \"x\", y = \"y\", method = c(\"buffer\", width = 40000), crs = crs(regions) ) plot(regions, main = \"Buffer method\") plot(ca_1, add = TRUE) points(spp1[, 2:3], pch = 19, cex = 0.5)"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"minimum-convex-polygon","dir":"Articles","previous_headings":"Calibration area","what":"2. Minimum convex polygon","title":"flexsdm: Overview of Pre-modeling functions","text":"minimum convex polygon (mcp) method produces much simpler shape.","code":"ca_2 <- calib_area( data = spp1, x = \"x\", y = \"y\", method = c(\"mcp\"), crs = crs(regions) ) plot(regions, main = \"Minimum convex polygon method\") plot(ca_2, add = TRUE) points(spp1[, 2:3], pch = 19, cex = 0.5)"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"buffered-minimum-convex-polygon","dir":"Articles","previous_headings":"Calibration area","what":"3. Buffered minimum convex polygon","title":"flexsdm: Overview of Pre-modeling functions","text":"can also create buffer around minimum convex polygon.","code":"ca_3 <- calib_area( data = spp1, x = \"x\", y = \"y\", method = c(\"bmcp\", width = 40000), crs = crs(regions) ) plot(regions, main = \"Buffered minimum convex polygon\") plot(ca_3, add = TRUE) points(spp1[, 2:3], pch = 19, cex = 0.5)"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"mask","dir":"Articles","previous_headings":"Calibration area","what":"4. Mask","title":"flexsdm: Overview of Pre-modeling functions","text":"mask method allows polygons selected intersect species locations delineate calibration area. useful expect species distributions associated ecologically significant (mapped) ecoregions, interested distributions within political boundaries. use random set polygons named “clusters” illustrate mask method. original polygons left polygons contain points (“mask” calibration area) right.","code":"clusters <- system.file(\"external/clusters.shp\", package = \"flexsdm\") clusters <- terra::vect(clusters) ca_4 <- calib_area( data = spp1, x = \"x\", y = \"y\", method = c(\"mask\", clusters, \"clusters\"), crs = crs(regions) ) par(mfrow = c(1, 2)) plot(clusters, main = \"Original polygons\") plot(ca_4, main = \"Polygons with points (mask)\") points(spp1[, 2:3], pch = 19, cex = 0.5)"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"reducing-collinearity-among-the-predictors","dir":"Articles","previous_headings":"","what":"Reducing collinearity among the predictors","title":"flexsdm: Overview of Pre-modeling functions","text":"Predictor collinearity common issue SDMs, can lead model overfitting inaccurate tests significance predictors (De Marco & Nóbrega, 2018; Dormann et al., 2013).","code":""},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"environmental-predictors","dir":"Articles","previous_headings":"Reducing collinearity among the predictors","what":"Environmental predictors","title":"flexsdm: Overview of Pre-modeling functions","text":"use four climatic variables available flexsdm package: actual evapotranspiration (CFP_1), climatic water deficit (CFP_2), maximum temperature warmest month (CFP_3), minimum temperature coldest month (CFP_4). relationship different environmental variables can visualized pairs() function terra package. Several variables highly correlated (.89 predictors tmx tmn). can correct reduce collinearity? function correct_colinvar() four methods deal collinearity: pearson, vif, pca, fa. method returns 1) raster object (SpatRaster) selected predictors 2) useful outputs relevant method. functions used supplementary tools, predictor selection SDMs complicated ultimately based relationship environment species’ biology. said, functions offer options exploring relationships predictor variables can aid predictor selection process. Let’s look method:","code":"somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) names(somevar) <- c(\"aet\", \"cwd\", \"tmx\", \"tmn\") plot(somevar) terra::pairs(somevar)"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"pearson-correlation","dir":"Articles","previous_headings":"Reducing collinearity among the predictors","what":"1. Pearson correlation","title":"flexsdm: Overview of Pre-modeling functions","text":"method returns three objects 1) SpatRaster environmental variables correlation given threshold (default 0.7), 2) names variables correlation given threshold “removed” environmental data, 3) correlation matrix environmental variables. However, strongly urge users use information along knowledge specific species-environment relationships select ecologically-relevant predictors SDMs. example, , modeling distribution plant species water-limited Mediterranean-type ecosystem, may want include climatic water deficit (cwd) actual evapotranspiration (aet). Despite highly correlated, variables capture water availability evaporative demand, respectively (Stephenson 1998). Additionally, minimum absolute temperature strongly controls vegetation distributions (Woodward, Lomas, Kelly 2004), select tmn (minimum temperature coldest month) example. references, see:","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"woodward-f--i--m--r--lomas-and-c--k--kelly--2004--global-climate-and-the-distribution-of-plant-biomes--philosophical-transactions-of-the-royal-society-of-london--series-b-biological-sciences-35914651476-","dir":"Articles","previous_headings":"Reducing collinearity among the predictors > 1. Pearson correlation","what":"2. Woodward, F. I., M. R. Lomas, and C. K. Kelly. 2004. Global climate and the distribution of plant biomes. Philosophical transactions of the Royal Society of London. Series B, Biological sciences 359:1465–1476.","title":"flexsdm: Overview of Pre-modeling functions","text":"","code":"pearson_var <- correct_colinvar(somevar, method = c(\"pearson\", th = \"0.7\")) pearson_var$cor_table #> aet cwd tmx tmn #> aet 0.0000000 0.7689893 0.7924813 0.7845401 #> cwd 0.7689893 0.0000000 0.4168956 0.5881831 #> tmx 0.7924813 0.4168956 0.0000000 0.7323259 #> tmn 0.7845401 0.5881831 0.7323259 0.0000000 pearson_var$cor_variables #> $aet #> [1] \"cwd\" \"tmx\" \"tmn\" #> #> $cwd #> [1] \"aet\" #> #> $tmx #> [1] \"aet\" \"tmn\" #> #> $tmn #> [1] \"aet\" \"tmx\" chosen_variables <- somevar[[c('cwd','aet','tmn')]]"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"variance-inflation-factor","dir":"Articles","previous_headings":"Reducing collinearity among the predictors","what":"2. Variance inflation factor","title":"flexsdm: Overview of Pre-modeling functions","text":"method removes predictors variance inflation factor higher chosen threshold. , users can specify threshold (default 10). method retains predictors aet, tmx, tmn removes cwd. output method matches produced pearson method: 1) environmental layer retained variables, 2) list removed variables, 3) correlation matrix variables.","code":"vif_var <- correct_colinvar(somevar, method = c(\"vif\", th = \"10\")) vif_var$env_layer #> class : SpatRaster #> dimensions : 558, 394, 4 (nrow, ncol, nlyr) #> resolution : 1890, 1890 (x, y) #> extent : -373685.8, 370974.2, -604813.3, 449806.7 (xmin, xmax, ymin, ymax) #> coord. ref. : +proj=aea +lat_0=0 +lon_0=-120 +lat_1=34 +lat_2=40.5 +x_0=0 +y_0=-4000000 +datum=NAD83 +units=m +no_defs #> source : somevar.tif #> names : aet, cwd, tmx, tmn #> min values : 0.000, -9.39489, 22.44685, 0.2591429 #> max values : 1357.865, 14.20047, 614.69125, 64.3747588 vif_var$removed_variables #> NULL vif_var$vif_table #> # A tibble: 4 × 2 #> Variables VIF #> #> 1 aet 7.62 #> 2 cwd 3.29 #> 3 tmx 3.95 #> 4 tmn 2.89"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"principal-component-analysis","dir":"Articles","previous_headings":"Reducing collinearity among the predictors","what":"3. Principal component analysis","title":"flexsdm: Overview of Pre-modeling functions","text":"Finally, “pca” method performs principal components analysis predictors returns axis accounts 95% total variance system. method returns 1) SpatRaster object selected environmental variables, 2) matrix coefficients principal components predictors, 3) tibble cumulative variance explained selected principal components.","code":"pca_var <- correct_colinvar(somevar, method = c(\"pca\")) pca_var$env_layer #> class : SpatRaster #> dimensions : 558, 394, 3 (nrow, ncol, nlyr) #> resolution : 1890, 1890 (x, y) #> extent : -373685.8, 370974.2, -604813.3, 449806.7 (xmin, xmax, ymin, ymax) #> coord. ref. : +proj=aea +lat_0=0 +lon_0=-120 +lat_1=34 +lat_2=40.5 +x_0=0 +y_0=-4000000 +datum=NAD83 +units=m +no_defs #> source(s) : memory #> names : PC1, PC2, PC3 #> min values : -8.453273, -4.260147, -1.525085 #> max values : 2.827164, 3.337545, 4.342864 pca_var$coefficients #> # A tibble: 4 × 5 #> variable PC1 PC2 PC3 PC4 #> #> 1 aet 0.550 -0.0722 0.296 -0.778 #> 2 cwd 0.450 -0.777 0.103 0.429 #> 3 tmx -0.485 -0.594 -0.450 -0.459 #> 4 tmn -0.511 -0.198 0.836 -0.0241 pca_var$cumulative_variance #> # A tibble: 4 × 2 #> PC cvar #> #> 1 1 0.764 #> 2 2 0.915 #> 3 3 0.979 #> 4 4 1"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"factorial-analysis","dir":"Articles","previous_headings":"Reducing collinearity among the predictors","what":"4. Factorial analysis","title":"flexsdm: Overview of Pre-modeling functions","text":"Selecting “fa” method performs factorial analysis reduce dimensionality selects predictor(s) highest correlation axis. outputs method similar produced ‘pca’ method.","code":"fa_var <- correct_colinvar(env_layer = somevar, method = c(\"fa\")) fa_var$env_layer fa_var$number_factors fa_var$removed_variables fa_var$uniqueness fa_var$loadings"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"comments","dir":"Articles","previous_headings":"Reducing collinearity among the predictors","what":"5. Comments","title":"flexsdm: Overview of Pre-modeling functions","text":"flexsdm also possible restrict cell used perform collinearity reduction analysis geographical area smaller full extent environmental variables. See ‘restric_to_region’ ‘restric_pca_proj’ correct_colinvar examples alternative PCA given function help.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"data-filtering","dir":"Articles","previous_headings":"","what":"Data filtering","title":"flexsdm: Overview of Pre-modeling functions","text":"Sample bias species occurrence data common issue ecological studies filtering occurrence data can reduce bias. flexsdm provides two functions different types filtering, based geographical environmental “thinning”, randomly removing points dense (oversampling) geographical environmental space. can improve model performance reduce redundancy data.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"environmental-filtering","dir":"Articles","previous_headings":"Data filtering","what":"Environmental filtering","title":"flexsdm: Overview of Pre-modeling functions","text":"function occfilt_env(), performs environmental filtering species occurrence data. method basically reduces environmental redundancy data based methods outlined Valera et al. (2014). However, function unique flexsdm, able use number environmental dimensions perform PCA filtering. example, use original environmental data (somevar) occurrence data single species (spp1). filtering occurrences, important row species data unique code (example: idd). function also gives user option specifying number classes used split environmental condition. explore results using 5, 8, 12 bins. Increasing number bins increases number occurrence points retained.","code":"spp1$idd <- 1:nrow(spp1) filt_env5 <- occfilt_env( data = spp1, x = \"x\", y = \"y\", id = \"idd\", env_layer = somevar, nbins = 5 ) #> Extracting values from raster ... #> 12 records were removed because they have NAs for some variables #> Number of unfiltered records: 238 #> Number of filtered records: 57 filt_env8 <- occfilt_env( data = spp1, x = \"x\", y = \"y\", id = \"idd\", env_layer = somevar, nbins = 8 ) #> Extracting values from raster ... #> 12 records were removed because they have NAs for some variables #> Number of unfiltered records: 238 #> Number of filtered records: 112 filt_env12 <- occfilt_env( data = spp1, x = \"x\", y = \"y\", id = \"idd\", env_layer = somevar, nbins = 12 ) #> Extracting values from raster ... #> 12 records were removed because they have NAs for some variables #> Number of unfiltered records: 238 #> Number of filtered records: 173 par(mfrow = c(2, 2)) somevar[[1]] %>% plot(main = \"Original occurrence data\") points(spp1 %>% select(x, y)) somevar[[1]] %>% plot(main = \"Filtering with 5 bins\") points(filt_env5 %>% select(x, y)) somevar[[1]] %>% plot(main = \"Filtering with 8 bins\") points(filt_env8 %>% select(x, y)) somevar[[1]] %>% plot(main = \"Filtering with 12 bins\") points(filt_env12 %>% select(x, y))"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"geographical-filtering","dir":"Articles","previous_headings":"Data filtering","what":"Geographical filtering","title":"flexsdm: Overview of Pre-modeling functions","text":"Next, look occfilt_geo(), three alternatives determine distance threshold pair points: “moran” determines threshold distance points minimizes spatial autocorrelation occurrence data; “cellsize” filters occurrences based resolution predictors (specified coarser resolution); finally, “determined” allows users manually determine distance threshold.","code":"filt_geo1 <- occfilt_geo( data = spp1, x = \"x\", y = \"y\", env_layer = somevar, method = c(\"moran\"), prj = crs(somevar) ) #> Extracting values from raster ... #> 16 records were removed because they have NAs for some variables #> Number of unfiltered records: 234 #> Threshold for Moran: 0.1 #> Distance threshold(km): 345.859 #> Number of filtered records: 4 filt_geo2 <- occfilt_geo( data = spp1, x = \"x\", y = \"y\", env_layer = somevar, method = c(\"cellsize\", factor = \"3\"), # coarser resolution than the provided raster prj = crs(somevar) ) #> Extracting values from raster ... #> 16 records were removed because they have NAs for some variables #> Number of unfiltered records: 234 #> Distance threshold(km): 4.617 #> Number of filtered records: 212 filt_geo3 <- occfilt_geo( data = spp1, x = \"x\", y = \"y\", env_layer = somevar, method = c(\"defined\", d = \"30\"), prj = crs(somevar) ) #> Extracting values from raster ... #> 16 records were removed because they have NAs for some variables #> Number of unfiltered records: 234 #> Distance threshold(km): 30 #> Number of filtered records: 0 par(mfrow = c(2, 2)) somevar[[1]] %>% plot(main = \"Original occurrence data\") points(spp1 %>% select(x, y)) somevar[[1]] %>% plot(main = \"Filtering with Moran's I\") points(filt_geo1 %>% select(x, y)) somevar[[1]] %>% plot(main = \"Filtering with cell size\") points(filt_geo2 %>% select(x, y)) somevar[[1]] %>% plot(main = \"Filtering with defined distance (30km)\") points(filt_geo3 %>% select(x, y))"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"data-partitioning","dir":"Articles","previous_headings":"","what":"Data partitioning","title":"flexsdm: Overview of Pre-modeling functions","text":"Data partitioning, splitting data testing training groups, key step building SDMs. flexsdm offers multiple options data partitioning, including part_random(), part_sband(), part_sblock(), part_senv(). Let’s explore methods.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"conventional-data-partitioning-methods-part_random","dir":"Articles","previous_headings":"Data partitioning","what":"1. Conventional data partitioning methods (part_random)","title":"flexsdm: Overview of Pre-modeling functions","text":"part_random() function provides users ability divide species occurrence data based conventional partition methods including k-folds, repeated k-folds, leave-one-cross-validation, bootstrap partitioning. , use “kfold” method 10 folds divide data. results 10 folds occurrence data 25 observations fold.","code":"spp1$pr_ab <- 1 # Add a column with 1 to denote that this is presences only data sp_part1 <- part_random( data = spp1, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 10) ) sp_part1$.part %>% table() #> . #> 1 2 3 4 5 6 7 8 9 10 #> 25 25 25 25 25 25 25 25 25 25"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"spatial-band-cross-validation-part_sband","dir":"Articles","previous_headings":"Data partitioning","what":"2. Spatial band cross-validation (part_sband)","title":"flexsdm: Overview of Pre-modeling functions","text":"part_sband() part_sblock() partition data based position geographic space. Geographically structured data partitioning methods especially useful users want evaluate model transferability different regions time periods. function part_sband tests different numbers spatial partitions using latitudinal longitudinal bands selects best number bands given presence, presence-absence, presence-background dataset. procedure based spatial autocorrelation, environmental similarity, number presence/absence records band partition. function’s output includes 1) tibble presence/absence locations assigned partition number, 2) tibble information best partition, 3) SpatRaster showing selected grid.","code":"set.seed(1) sp_part2 <- part_sband( env_layer = somevar, data = spp1, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", type = \"lat\", # specify bands across different degrees of longitude 'lon' or latitude 'lat'. min_bands = 2, # minimum number of spatial bands to be tested max_bands = 20, # maximum number of spatial bands to be tested n_part = 2, prop = 0.5 ) #> 12 rows were excluded from database because NAs were found #> The following number of bands will be tested: #> 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 #> Creating basic raster mask... #> Searching for the optimal number of bands... plot(sp_part2$grid, col = gray.colors(20)) points(sp_part2$part[c(\"x\", \"y\")], col = rainbow(8)[sp_part2$part$.part], cex = 0.9, pch = c(1, 19)[sp_part2$part$pr_ab + 1] )"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"spatial-block-cross-validation-part_sblock","dir":"Articles","previous_headings":"Data partitioning","what":"3. Spatial block cross-validation (part_sblock)","title":"flexsdm: Overview of Pre-modeling functions","text":"part_sblock() function similar part_sband() instead bands explores spatial blocks different raster cells sizes returns one best suited input dataset. , can see data divided different “blocks” training testing. However, notice grid partition produced part_sblock different resolution original environmental variables. want map layer properties (.e. resolution, extent, NAs) original environmental variables, apply get_block() function grid resulting part_sblock(). layer can really useful generating pseudo-absence background sample points, explore next section.","code":"sp_part3 <- part_sblock( env_layer = somevar, data = spp1, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", min_res_mult = 10, # Minimum value used for multiplying raster resolution and define the finest resolution to be tested max_res_mult = 500, # Maximum value used for multiplying raster resolution and define the coarsest resolution to be tested num_grids = 30, # Number of grid to be tested between min_res_mult X (raster resolution) and max_res_mult X (raster resolution) n_part = 2, # Number of partitions prop = 0.5 # Proportion of points used for testing autocorrelation between groupds (0-1) ) #> 12 rows were excluded from database because NAs were found #> The following grid cell sizes will be tested: #> 18900 | 50834.48 | 82768.97 | 114703.45 | 146637.93 | 178572.41 | 210506.9 | 242441.38 | 274375.86 | 306310.34 | 338244.83 | 370179.31 | 402113.79 | 434048.28 | 465982.76 | 497917.24 | 529851.72 | 561786.21 | 593720.69 | 625655.17 | 657589.66 | 689524.14 | 721458.62 | 753393.1 | 785327.59 | 817262.07 | 849196.55 | 881131.03 | 913065.52 | 945000 #> Creating basic raster mask... #> Searching for the optimal grid size... plot(sp_part3$grid) points(sp_part3$part[c(\"x\", \"y\")], col = c(\"blue\", \"red\")[sp_part3$part$.part], cex = 0.5, pch = 19 ) terra::res(sp_part3$grid) #> [1] 881131 881131 terra::res(somevar) #> [1] 1890 1890 grid_env <- get_block(env_layer = somevar, best_grid = sp_part3$grid) plot(grid_env) # this is a block layer with the same layer # properties as environmental variables. points(sp_part3$part[c(\"x\", \"y\")], col = c(\"blue\", \"red\")[sp_part3$part$.part], cex = 0.5, pch = 19 )"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"environmental-and-spatial-cross-validation-part_senv","dir":"Articles","previous_headings":"Data partitioning","what":"4. Environmental and spatial cross-validation (part_senv)","title":"flexsdm: Overview of Pre-modeling functions","text":"final partitioning function flexsdm part_senv(), explores different numbers environmental partitions based K-means clustering algorithm returns one best-suited particular dataset, considering spatial autocorrelation, environmental similarity, number presence /absence records partition. map shows partitioning based environmental spatial factors.","code":"sp_part4 <- part_senv( env_layer = somevar, data = spp1, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", min_n_groups = 2, # Minimum number of groups to be tested max_n_groups = 10, # Maximum number of groups to be tested prop = 0.5 # Proportion of points used for testing autocorrelation between groups (0-1) ) #> 12 rows were excluded from database because NAs were found #> The following grid cell sizes will be tested: #> 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 #> Searching best partition... plot(regions, col = gray.colors(9)) points(sp_part4$part[c(\"x\", \"y\")], col = hcl.colors(length(unique(sp_part4$part)))[sp_part4$part$.part], cex = 1, pch = 19 )"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"background-and-pseudo-absence-sampling","dir":"Articles","previous_headings":"","what":"Background and pseudo-absence sampling","title":"flexsdm: Overview of Pre-modeling functions","text":"Presence-occurrence data quite common ecology researchers may adequate “absence” data species interest. Sometimes building species distribution models, need able generate background pseudo-absence points modeling goals. flexsdm package allows users using sample_background() sample_pseudoabs().","code":""},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"sample-background","dir":"Articles","previous_headings":"Background and pseudo-absence sampling","what":"1. Sample background","title":"flexsdm: Overview of Pre-modeling functions","text":"function sample_background() allows slection background sample points based different geographic restrictions sampling methods. , sample set background points based earlier spatial block partitioning using “random” method. Using lapply() case ensures generate background points spatial blocks (n = 2). also specifying want ten times amount background points original occurrences calibration area buffer area around presence points (see section “Calibration area”).","code":"p_data <- sp_part3$part # presence data from spatial block partition example set.seed(10) bg <- lapply(1:2, function(x) { sample_background( data = p_data, x = \"x\", y = \"y\", n = sum(p_data == x) * 10, # number of background points to be sampled method = \"random\", rlayer = grid_env, maskval = x, calibarea = ca_1 # A SpatVector which delimit the calibration area used for a given species ) }) %>% bind_rows() %>% mutate(pr_ab = 0) par(mfrow = c(2, 1)) plot(grid_env, main = \"Presence points\") plot(ca_1, add = TRUE) points(p_data, cex = .7, pch = 19) plot(grid_env, main = \"Background points\") plot(ca_1, add = TRUE) points(bg, cex = .1, pch = 19)"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"sample-pseudo-absences","dir":"Articles","previous_headings":"Background and pseudo-absence sampling","what":"2. Sample pseudo-absences","title":"flexsdm: Overview of Pre-modeling functions","text":"Similarly, function sample_pseudoabs allows random pseudo-absence sampling based environmental /geographical constraints. example, specifying method = “env_const” selects pseudo-absences environmentally constrained regions lower suitability values predicted Bioclim model. Additionally, function allows users specify calibration area generate pseudo-absence points. , use buffer area around presence points (ca_1) show might look like. can see, generated pseudo-absence points general vicinity presence points, concentrated areas lower environmental suitability. specific method chosen sampling background /pseudo-absence points vary depending research goals.","code":"set.seed(10) psa <- lapply(1:2, function(x) { sample_pseudoabs( data = p_data, x = \"x\", y = \"y\", n = sum(p_data == x), # number of pseudo-absence points to be sampled method = c(\"env_const\", env = somevar), rlayer = grid_env, maskval = x, calibarea = ca_1 ) }) %>% bind_rows() %>% mutate(pr_ab = 0) #> Extents do not match, raster layers used were croped to minimum extent #> Extents do not match, raster layers used were croped to minimum extent par(mfrow = c(2, 1)) plot(grid_env, main = \"Presence points\") plot(ca_1, add = TRUE) points(p_data, cex = .7, pch = 19) plot(grid_env, main = \"Pseudo-absence points\") plot(ca_1, add = TRUE) points(psa, cex = .7, pch = 19)"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"extracting-environmental-values","dir":"Articles","previous_headings":"","what":"Extracting environmental values","title":"flexsdm: Overview of Pre-modeling functions","text":"Finally, modeling species geographic distributions, must extract environmental data presences + absences/pseudo-absences/background point locations. function sdm_extract() extracts environmental data values based x y coordinates returns tibble original data + additional columns extracted environmental variables locations. Let’s original presence points (spp1) background locations (bg). #=========#=========#=========#=========#=========#=========#=========# Vignette still construction changes #=========#=========#=========#=========#=========#=========#=========#","code":"all_points <- bind_rows(spp1 %>% dplyr::select(-idd), bg) ex_spp <- sdm_extract( data = all_points, x = \"x\", y = \"y\", env_layer = somevar, # Raster with environmental variables variables = NULL, # Vector with the variable names of predictor variables Usage variables. = c(\"aet\", \"cwd\", \"tmin\"). If no variable is specified, function will return data for all layers. filter_na = TRUE ) ex_spp"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v02_modeling.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"flexsdm: Overview of Modeling functions","text":"Species distribution modeling (SDM) become standard tool multiple research areas, including ecology, conservation biology, biogeography, paleobiogeography, epidemiology. SDM area active theoretical methodological research. flexsdm package provides users ability manipulate parameterize models variety ways meet unique research needs. flexibility enables users define complete partial modeling procedure specific modeling situations (e.g., number variables, number records, different algorithms ensemble methods, algorithms tuning, etc.). vignette, users learn second set functions flexsdm package fall “modeling” umbrella. functions designed construct validate different types models can grouped fit_* , tune_* , esm_* family functions. addition function perform ensemble modeling. fit_* functions construct validate models default hyper-parameter values. tune_* functions construct validate models searching best combination hyper-parameter values, esm_ functions can used constructing validating Ensemble Small Models. Finally, fit_ensemble() function fitting validating ensemble models. functions model construction validation: fit_* functions family fit_gam() Fit validate Generalized Additive Models fit_gau() Fit validate Gaussian Process models fit_gbm() Fit validate Generalized Boosted Regression models fit_glm() Fit validate Generalized Linear Models fit_max() Fit validate Maximum Entropy models fit_net() Fit validate Neural Networks models fit_raf() Fit validate Random Forest models fit_svm() Fit validate Support Vector Machine models tune_* functions family tune_gbm() Fit validate Generalized Boosted Regression models exploration hyper-parameters tune_max() Fit validate Maximum Entropy models exploration hyper-parameters tune_net() Fit validate Neural Networks models exploration hyper-parameters tune_raf() Fit validate Random Forest models exploration hyper-parameters tune_svm() Fit validate Support Vector Machine models exploration hyper-parameters model ensemble fit_ensemble() Fit validate ensemble models different ensemble methods esm_* functions family esm_gam() Fit validate Generalized Additive Models Ensemble Small Model approach esm_gau() Fit validate Gaussian Process models Models Ensemble Small Model approach esm_gbm() Fit validate Generalized Boosted Regression models Ensemble Small Model approach esm_glm() Fit validate Generalized Linear Models Ensemble Small Model approach esm_max() Fit validate Maximum Entropy models Ensemble Small Model approach esm_net() Fit validate Neural Networks models Ensemble Small Model approach esm_svm() Fit validate Support Vector Machine models Ensemble Small Model approach","code":""},{"path":"https://sjevelazco.github.io/flexsdm/articles/v02_modeling.html","id":"installation","dir":"Articles","previous_headings":"","what":"Installation","title":"flexsdm: Overview of Modeling functions","text":"First, install flexsdm package. can install released version flexsdm github :","code":"# devtools::install_github('sjevelazco/flexsdm') require(flexsdm) #> Loading required package: flexsdm require(terra) #> Loading required package: terra #> terra 1.7.78 #> #> Attaching package: 'terra' #> The following object is masked from 'package:knitr': #> #> spin require(dplyr) #> Loading required package: dplyr #> #> Attaching package: 'dplyr' #> The following objects are masked from 'package:terra': #> #> intersect, union #> The following objects are masked from 'package:stats': #> #> filter, lag #> The following objects are masked from 'package:base': #> #> intersect, setdiff, setequal, union"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v02_modeling.html","id":"project-directory-setup","dir":"Articles","previous_headings":"","what":"Project directory setup","title":"flexsdm: Overview of Modeling functions","text":"Decide computer like store inputs outputs project (main directory). Use existing one use dir.create() create main directory. specify whether include folders projections, calibration areas, algorithms, ensembles, thresholds. details see Vignette 01_pre_modeling","code":""},{"path":"https://sjevelazco.github.io/flexsdm/articles/v02_modeling.html","id":"data-species-occurrence-and-background-data","dir":"Articles","previous_headings":"","what":"Data, species occurrence and background data","title":"flexsdm: Overview of Modeling functions","text":"tutorial, using species occurrences environmental data available flexsdm package. “abies” example dataset includes pr_ab column (presence = 1, absence = 0), location columns (x, y) environmental data. can load “abies” data local R environment using code : (EXAMPLE LOOKS LITTLE STRANGE ALSO USING BACKGROUND DATA, ABIES DATASET CLEARLY ABSENCES…) want replace abies dataset data, make sure dataset contains environmental conditions related presence-absence data. use pre-modeling family function k-fold partition method (used cross-validation). partition method number folds replications must presence-absence background points datasets. Now, abies2 object new column called “.part” 5 k-folds (1, 2, 3, 4, 5), indicating partition record (row) member . Next, apply partition method number folds environmental conditions background points. backg2 object new column called “.part” 5 k-folds (1, 2, 3, 4, 5).","code":"data(\"abies\") data(\"backg\") dplyr::glimpse(abies) #> Rows: 1,400 #> Columns: 13 #> $ id 715, 5680, 7907, 1850, 1702, 10036, 12384, 6513, 9884, 8651, … #> $ pr_ab 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0… #> $ x -95417.134, 98986.536, 121474.257, -39976.221, 111372.261, -2… #> $ y 314240.13, -159415.18, -99463.44, -17456.11, -91404.05, 39222… #> $ aet 323.1133, 447.5567, 182.2833, 372.3867, 209.4567, 308.3000, 5… #> $ cwd 546.1400, 815.4033, 271.1800, 946.2933, 398.5500, 534.9533, 3… #> $ tmin 1.2433, 9.4267, -4.9500, 8.7767, -4.0333, 4.6600, 4.3800, 4.9… #> $ ppt_djf 62.7257, 129.6406, 150.7003, 116.0236, 164.9327, 166.2220, 48… #> $ ppt_jja 17.7941, 6.4317, 11.2294, 2.7020, 9.2686, 16.5310, 41.2494, 8… #> $ pH 5.773341, 5.600000, 0.000000, 6.411796, 0.000000, 5.700000, 5… #> $ awc 0.10837019, 0.16000000, 0.00000000, 0.09719457, 0.00000000, 0… #> $ depth 152.000000, 201.000000, 0.000000, 59.759930, 0.000000, 112.99… #> $ landform 7, 11, 15, 14, 15, 15, 7, 15, 4, 10, 6, 10, 10, 15, 10, 11, 1… dplyr::glimpse(backg) #> Rows: 5,000 #> Columns: 13 #> $ pr_ab 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, … #> $ x 160779.16, 36849.16, -240170.84, -152420.84, -193190.84, … #> $ y -449968.33, 24151.67, 90031.67, -143518.33, 24151.67, 223… #> $ aet 280.4567, 259.7800, 400.1767, 367.4833, 397.3667, 385.263… #> $ cwd 1137.2433, 381.5367, 699.6500, 843.4467, 842.3833, 637.35… #> $ tmin 13.5100, -3.1733, 8.6800, 9.0133, 8.9700, 4.9333, 6.2933,… #> $ ppt_djf 71.2741, 171.4537, 285.0893, 72.0309, 125.2467, 226.1534,… #> $ ppt_jja 1.1920, 17.5193, 5.0158, 1.2047, 1.9778, 8.1554, 18.4182,… #> $ pH 0.0000000, 0.2122687, 5.7222223, 7.5350823, 6.1963525, 5.… #> $ awc 0.000000000, 0.003473487, 0.080370426, 0.170000002, 0.131… #> $ depth 0.00000, 201.00000, 50.07409, 154.39426, 122.39575, 56.17… #> $ percent_clay 0.0000000, 0.4438345, 18.4111176, 46.9751244, 37.1873169,… #> $ landform 13, 10, 6, 6, 10, 14, 8, 14, 6, 7, 11, 14, 14, 10, 6, 6, … abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 5) ) dplyr::glimpse(abies2) #> Rows: 1,400 #> Columns: 14 #> $ id 715, 5680, 7907, 1850, 1702, 10036, 12384, 6513, 9884, 8651, … #> $ pr_ab 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0… #> $ x -95417.134, 98986.536, 121474.257, -39976.221, 111372.261, -2… #> $ y 314240.13, -159415.18, -99463.44, -17456.11, -91404.05, 39222… #> $ aet 323.1133, 447.5567, 182.2833, 372.3867, 209.4567, 308.3000, 5… #> $ cwd 546.1400, 815.4033, 271.1800, 946.2933, 398.5500, 534.9533, 3… #> $ tmin 1.2433, 9.4267, -4.9500, 8.7767, -4.0333, 4.6600, 4.3800, 4.9… #> $ ppt_djf 62.7257, 129.6406, 150.7003, 116.0236, 164.9327, 166.2220, 48… #> $ ppt_jja 17.7941, 6.4317, 11.2294, 2.7020, 9.2686, 16.5310, 41.2494, 8… #> $ pH 5.773341, 5.600000, 0.000000, 6.411796, 0.000000, 5.700000, 5… #> $ awc 0.10837019, 0.16000000, 0.00000000, 0.09719457, 0.00000000, 0… #> $ depth 152.000000, 201.000000, 0.000000, 59.759930, 0.000000, 112.99… #> $ landform 7, 11, 15, 14, 15, 15, 7, 15, 4, 10, 6, 10, 10, 15, 10, 11, 1… #> $ .part 3, 2, 5, 3, 5, 4, 2, 1, 2, 2, 1, 2, 1, 2, 2, 2, 5, 4, 5, 1, 5… backg2 <- part_random( data = backg, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 5) ) dplyr::glimpse(backg2) #> Rows: 5,000 #> Columns: 14 #> $ pr_ab 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, … #> $ x 160779.16, 36849.16, -240170.84, -152420.84, -193190.84, … #> $ y -449968.33, 24151.67, 90031.67, -143518.33, 24151.67, 223… #> $ aet 280.4567, 259.7800, 400.1767, 367.4833, 397.3667, 385.263… #> $ cwd 1137.2433, 381.5367, 699.6500, 843.4467, 842.3833, 637.35… #> $ tmin 13.5100, -3.1733, 8.6800, 9.0133, 8.9700, 4.9333, 6.2933,… #> $ ppt_djf 71.2741, 171.4537, 285.0893, 72.0309, 125.2467, 226.1534,… #> $ ppt_jja 1.1920, 17.5193, 5.0158, 1.2047, 1.9778, 8.1554, 18.4182,… #> $ pH 0.0000000, 0.2122687, 5.7222223, 7.5350823, 6.1963525, 5.… #> $ awc 0.000000000, 0.003473487, 0.080370426, 0.170000002, 0.131… #> $ depth 0.00000, 201.00000, 50.07409, 154.39426, 122.39575, 56.17… #> $ percent_clay 0.0000000, 0.4438345, 18.4111176, 46.9751244, 37.1873169,… #> $ landform 13, 10, 6, 6, 10, 14, 8, 14, 6, 7, 11, 14, 14, 10, 6, 6, … #> $ .part 4, 4, 1, 5, 5, 2, 5, 3, 2, 5, 4, 1, 4, 1, 5, 1, 1, 5, 4, …"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v02_modeling.html","id":"fit-and-validate-models","dir":"Articles","previous_headings":"Data, species occurrence and background data","what":"1. Fit and validate models","title":"flexsdm: Overview of Modeling functions","text":"fit validate models: . maximum entropy model default hyper-parameter values (flexsdm::fit_max) II. random forest model exploration hyper-parameters (flexsdm::tune_raf). . Maximum Entropy models default hyper-parameter values. function returns list object following elements: model: “MaxEnt” class object. object can used predicting. predictors: tibble quantitative (c column names) qualitative (f column names) variables use modeling. performance: performance metric (see sdm_eval). metrics threshold dependent calculated based threshold specified argument. can see selected threshold values. Predicted suitability test partition (row) based best model. database used fit_ensemble. II- Random forest models exploration hyper-parameters. First, create data.frame provides hyper-parameters values tested. recommended generate data.frame. Hyper-parameter needed tuning ‘mtry’. maximum mtry must equal total number predictors. use data object abies2, k-fold partition method: Let’s see output object contains. function returns list object following elements: model: “randomForest” class object. object can used see formula details, basic summary o fthe model, predicting. predictors: tibble quantitative (c column names) qualitative (f column names) variables use modeling. performance: performance metric (see sdm_eval). metrics threshold dependent calculated based threshold specified argument. can see selected threshold values. Predicted suitability test partition (row) based best model. database used fit_ensemble. model objects can used flexsdm::fit_ensemble().","code":"max_t1 <- fit_max( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), predictors_f = c(\"landform\"), partition = \".part\", background = backg2, thr = c(\"max_sens_spec\", \"equal_sens_spec\", \"max_sorensen\"), clamp = TRUE, classes = \"default\", pred_type = \"cloglog\", regmult = 1 ) #> Formula used for model fitting: #> ~aet + ppt_jja + pH + awc + depth + I(aet^2) + I(ppt_jja^2) + I(pH^2) + I(awc^2) + I(depth^2) + hinge(aet) + hinge(ppt_jja) + hinge(pH) + hinge(awc) + hinge(depth) + ppt_jja:aet + pH:aet + awc:aet + depth:aet + pH:ppt_jja + awc:ppt_jja + depth:ppt_jja + awc:pH + depth:pH + depth:awc + categorical(landform) - 1 #> Replica number: 1/1 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 names(max_t1) #> [1] \"model\" \"predictors\" \"performance\" \"data_ens\" options(max.print = 20) max_t1$model #> #> Call: glmnet::glmnet(x = mm, y = as.factor(p), family = \"binomial\", weights = weights, lambda = 10^(seq(4, 0, length.out = 200)) * sum(reg)/length(reg) * sum(p)/sum(weights), standardize = F, penalty.factor = reg) #> #> Df %Dev Lambda #> 1 0 0.00 21.3700 #> 2 0 0.00 20.4100 #> 3 0 0.00 19.4800 #> 4 0 0.00 18.6000 #> 5 0 0.00 17.7600 #> 6 0 0.00 16.9600 #> [ reached getOption(\"max.print\") -- omitted 194 rows ] max_t1$predictors #> # A tibble: 1 × 6 #> c1 c2 c3 c4 c5 f #> #> 1 aet ppt_jja pH awc depth landform max_t1$performance #> # A tibble: 3 × 25 #> model threshold thr_value n_presences n_absences TPR_mean TPR_sd TNR_mean #> #> 1 max equal_sens_sp… 0.573 700 700 0.674 0.0164 0.674 #> 2 max max_sens_spec 0.416 700 700 0.909 0.0260 0.52 #> 3 max max_sorensen 0.335 700 700 0.95 0.0101 0.469 #> # ℹ 17 more variables: TNR_sd , SORENSEN_mean , SORENSEN_sd , #> # JACCARD_mean , JACCARD_sd , FPB_mean , FPB_sd , #> # OR_mean , OR_sd , TSS_mean , TSS_sd , AUC_mean , #> # AUC_sd , BOYCE_mean , BOYCE_sd , IMAE_mean , #> # IMAE_sd max_t1$data_ens #> # A tibble: 1,400 × 5 #> rnames replicates part pr_ab pred #> #> 1 8 .part 1 0 0.600 #> 2 11 .part 1 0 0.237 #> 3 13 .part 1 0 0.0483 #> 4 20 .part 1 0 0.115 #> 5 32 .part 1 0 0.716 #> 6 33 .part 1 0 0.0430 #> 7 48 .part 1 0 0.143 #> 8 55 .part 1 0 0.726 #> 9 65 .part 1 0 0.850 #> 10 75 .part 1 0 0.308 #> # ℹ 1,390 more rows tune_grid <- expand.grid(mtry = seq(1, 7, 1)) rf_t <- tune_raf( data = abies2, response = \"pr_ab\", predictors = c( \"aet\", \"cwd\", \"tmin\", \"ppt_djf\", \"ppt_jja\", \"pH\", \"awc\", \"depth\" ), predictors_f = c(\"landform\"), partition = \".part\", grid = tune_grid, thr = \"max_sens_spec\", metric = \"TSS\", ) #> Formula used for model fitting: #> pr_ab ~ aet + cwd + tmin + ppt_djf + ppt_jja + pH + awc + depth + landform #> Tuning model... #> Replica number: 1/1 #> Formula used for model fitting: #> pr_ab ~ aet + cwd + tmin + ppt_djf + ppt_jja + pH + awc + depth + landform #> Replica number: 1/1 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 names(rf_t) #> [1] \"model\" \"predictors\" \"performance\" #> [4] \"hyper_performance\" \"data_ens\" rf_t$model #> #> Call: #> randomForest(formula = formula1, data = data, mtry = mtry, ntree = 500, importance = FALSE, ) #> Type of random forest: classification #> Number of trees: 500 #> No. of variables tried at each split: 3 #> #> OOB estimate of error rate: 11.64% #> Confusion matrix: #> 0 1 class.error #> 0 605 95 0.13571429 #> 1 68 632 0.09714286 rf_t$predictors #> # A tibble: 1 × 9 #> c1 c2 c3 c4 c5 c6 c7 c8 f #> #> 1 aet cwd tmin ppt_djf ppt_jja pH awc depth landform rf_t$performance #> # A tibble: 1 × 26 #> mtry model threshold thr_value n_presences n_absences TPR_mean TPR_sd #> #> 1 3 raf max_sens_spec 0.638 700 700 0.911 0.0314 #> # ℹ 18 more variables: TNR_mean , TNR_sd , SORENSEN_mean , #> # SORENSEN_sd , JACCARD_mean , JACCARD_sd , FPB_mean , #> # FPB_sd , OR_mean , OR_sd , TSS_mean , TSS_sd , #> # AUC_mean , AUC_sd , BOYCE_mean , BOYCE_sd , #> # IMAE_mean , IMAE_sd rf_t$data_ens #> # A tibble: 1,400 × 5 #> rnames replicates part pr_ab pred #> #> 1 8 .part 1 0 0.118 #> 2 11 .part 1 0 0.116 #> 3 13 .part 1 0 0.006 #> 4 20 .part 1 0 0.412 #> 5 32 .part 1 0 0.128 #> 6 33 .part 1 0 0.032 #> 7 48 .part 1 0 0.008 #> 8 55 .part 1 0 0.072 #> 9 65 .part 1 0 0.366 #> 10 75 .part 1 0 0.088 #> # ℹ 1,390 more rows"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v02_modeling.html","id":"model-ensemble","dir":"Articles","previous_headings":"Data, species occurrence and background data","what":"2. Model Ensemble","title":"flexsdm: Overview of Modeling functions","text":"example fit validate ensemble model using two model objects just created.","code":"# Fit and validate ensemble model an_ensemble <- fit_ensemble( models = list(max_t1, rf_t), ens_method = \"meansup\", thr = NULL, thr_model = \"max_sens_spec\", metric = \"TSS\" ) #> | | | 0% | |======================================================================| 100% # Outputs names(an_ensemble) #> [1] \"models\" \"thr_metric\" \"predictors\" \"performance\" an_ensemble$thr_metric #> [1] \"max_sens_spec\" \"TSS_mean\" an_ensemble$predictors #> # A tibble: 2 × 9 #> c1 c2 c3 c4 c5 f c6 c7 c8 #> #> 1 aet ppt_jja pH awc depth landform NA NA NA #> 2 aet cwd tmin ppt_djf ppt_jja landform pH awc depth an_ensemble$performance #> # A tibble: 7 × 25 #> model threshold thr_value n_presences n_absences TPR_mean TPR_sd TNR_mean #> #> 1 meansup equal_sens_… 0.568 700 700 0.879 0.0267 0.879 #> 2 meansup lpt 0.022 700 700 1 0 0.407 #> 3 meansup max_fpb 0.486 700 700 0.923 0.0234 0.859 #> 4 meansup max_jaccard 0.486 700 700 0.923 0.0234 0.859 #> 5 meansup max_sens_sp… 0.486 700 700 0.911 0.0314 0.87 #> 6 meansup max_sorensen 0.486 700 700 0.923 0.0234 0.859 #> 7 meansup sensitivity 0.53 700 700 0.9 0 0.863 #> # ℹ 17 more variables: TNR_sd , SORENSEN_mean , SORENSEN_sd , #> # JACCARD_mean , JACCARD_sd , FPB_mean , FPB_sd , #> # OR_mean , OR_sd , TSS_mean , TSS_sd , AUC_mean , #> # AUC_sd , BOYCE_mean , BOYCE_sd , IMAE_mean , #> # IMAE_sd "},{"path":"https://sjevelazco.github.io/flexsdm/articles/v02_modeling.html","id":"fit-and-validate-models-with-ensemble-of-small-model-approach","dir":"Articles","previous_headings":"Data, species occurrence and background data","what":"3. Fit and validate models with Ensemble of Small Model approach","title":"flexsdm: Overview of Modeling functions","text":"method consists creating bivariate models pair-wise combinations predictors perform ensemble based average suitability weighted Somers’ D metric (D = 2 x (AUC -0.5)). ESM recommended modeling species occurrences. function allow categorical variables use types variables problematic applied species occurrences. detail see Breiner et al. (2015, 2018) can use different methods flexsdm::part_random function according data. See part_random details. function constructs Generalized Additive Models using Ensembles Small Models (ESM) approach (Breiner et al., 2015, 2018). function returns list object following elements: esm_model: list “GAM” class object bivariate model. object can used predicting using ESM approachwith sdm_predict function. predictors: tibble variables use modeling. performance: Performance metric (see sdm_eval). threshold dependent metrics calculated based threshold specified argument. Now, test rep_kfold partition method. method ‘folds’ refers number partitions data partitioning ‘replicate’ refers number replicates. assume values >=1. use new rep_kfold partition gam model Test random bootstrap partitioning. method ‘replicate’ refers number replicates (assumes value >=1), ‘proportion’ refers proportion occurrences used model fitting (assumes value >0 <=1). method can configure proportion training testing data according species occurrences. example, proportion=‘0.7’ indicates 70% data used model training, 30% used model testing. method, function return .partX columns “train” “test” words entries. Use new rep_kfold partition gam model #=========#=========#=========#=========#=========#=========#=========# Vignette still construction changes #=========#=========#=========#=========#=========#=========#=========#","code":"data(\"abies\") library(dplyr) # Create a smaller subset of occurrences set.seed(10) abies2 <- abies %>% na.omit() %>% group_by(pr_ab) %>% dplyr::slice_sample(n = 10) %>% group_by() # Using k-fold partition method for model cross validation abies2 <- part_random( data = abies2, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 3) ) abies2 #> # A tibble: 20 × 14 #> id pr_ab x y aet cwd tmin ppt_djf ppt_jja pH awc #> #> 1 12040 0 -308909. 384248. 573. 332. 4.84 521. 48.8 5.63 0.108 #> 2 10361 0 -254286. 417158. 260. 469. 2.93 151. 15.1 6.20 0.0950 #> 3 9402 0 -286979. 386206. 587. 376. 6.45 333. 15.7 5.5 0.160 #> 4 9815 0 -291849. 445595. 443. 455. 4.39 332. 19.1 6 0.0700 #> 5 10524 0 -256658. 184438. 355. 568. 5.87 303. 10.6 5.20 0.0800 #> 6 8860 0 121343. -164170. 354. 733. 3.97 182. 9.83 0 0 #> 7 6431 0 107903. -122968. 461. 578. 4.87 161. 7.66 5.90 0.0900 #> 8 11730 0 -333903. 431238. 561. 364. 6.73 387. 25.2 5.80 0.130 #> 9 808 0 -150163. 357180. 339. 564. 2.64 220. 15.3 6.40 0.100 #> 10 11054 0 -293663. 340981. 477. 396. 3.89 332. 26.4 4.60 0.0634 #> 11 2960 1 -49273. 181752. 512. 275. 0.920 319. 17.3 5.92 0.0900 #> 12 3065 1 126907. -198892. 322. 544. 0.700 203. 10.6 5.60 0.110 #> 13 5527 1 116751. -181089. 261. 537. 0.363 178. 7.43 0 0 #> 14 4035 1 -31777. 115940. 394. 440. 2.07 298. 11.2 6.01 0.0769 #> 15 4081 1 -5158. 90159. 301. 502. 0.703 203. 14.6 6.11 0.0633 #> 16 3087 1 102151. -143976. 299. 425. -2.08 205. 13.4 3.88 0.110 #> 17 3495 1 -19586. 89803. 438. 419. 2.13 189. 15.2 6.19 0.0959 #> 18 4441 1 49405. -60502. 362. 582. 2.42 218. 7.84 5.64 0.0786 #> 19 301 1 -132516. 270845. 367. 196. -2.56 422. 26.3 6.70 0.0300 #> 20 3162 1 59905. -53634. 319. 626. 1.99 212. 4.50 4.51 0.0396 #> # ℹ 3 more variables: depth , landform , .part # We set the model without threshold specification and with the kfold created above esm_gam_t1 <- esm_gam( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"cwd\", \"tmin\", \"ppt_djf\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), partition = \".part\", thr = NULL ) #> #> Model has more coefficients than data used for training it. Try to reduce k names(esm_gam_t1) #> NULL options(max.print = 10) # If you don't want to see printed all the output esm_gam_t1$esm_model #> NULL esm_gam_t1$predictors #> NULL esm_gam_t1$performance #> NULL # Remove the previous k-fold partition abies2 <- abies2 %>% select(-starts_with(\".\")) # Test with rep_kfold partition using 3 folds and 5 replicates set.seed(10) abies2 <- part_random( data = abies2, pr_ab = \"pr_ab\", method = c(method = \"rep_kfold\", folds = 3, replicates = 5) ) abies2 #> # A tibble: 20 × 18 #> id pr_ab x y aet cwd tmin ppt_djf ppt_jja pH awc #> #> 1 12040 0 -308909. 384248. 573. 332. 4.84 521. 48.8 5.63 0.108 #> 2 10361 0 -254286. 417158. 260. 469. 2.93 151. 15.1 6.20 0.0950 #> 3 9402 0 -286979. 386206. 587. 376. 6.45 333. 15.7 5.5 0.160 #> 4 9815 0 -291849. 445595. 443. 455. 4.39 332. 19.1 6 0.0700 #> 5 10524 0 -256658. 184438. 355. 568. 5.87 303. 10.6 5.20 0.0800 #> 6 8860 0 121343. -164170. 354. 733. 3.97 182. 9.83 0 0 #> 7 6431 0 107903. -122968. 461. 578. 4.87 161. 7.66 5.90 0.0900 #> 8 11730 0 -333903. 431238. 561. 364. 6.73 387. 25.2 5.80 0.130 #> 9 808 0 -150163. 357180. 339. 564. 2.64 220. 15.3 6.40 0.100 #> 10 11054 0 -293663. 340981. 477. 396. 3.89 332. 26.4 4.60 0.0634 #> 11 2960 1 -49273. 181752. 512. 275. 0.920 319. 17.3 5.92 0.0900 #> 12 3065 1 126907. -198892. 322. 544. 0.700 203. 10.6 5.60 0.110 #> 13 5527 1 116751. -181089. 261. 537. 0.363 178. 7.43 0 0 #> 14 4035 1 -31777. 115940. 394. 440. 2.07 298. 11.2 6.01 0.0769 #> 15 4081 1 -5158. 90159. 301. 502. 0.703 203. 14.6 6.11 0.0633 #> 16 3087 1 102151. -143976. 299. 425. -2.08 205. 13.4 3.88 0.110 #> 17 3495 1 -19586. 89803. 438. 419. 2.13 189. 15.2 6.19 0.0959 #> 18 4441 1 49405. -60502. 362. 582. 2.42 218. 7.84 5.64 0.0786 #> 19 301 1 -132516. 270845. 367. 196. -2.56 422. 26.3 6.70 0.0300 #> 20 3162 1 59905. -53634. 319. 626. 1.99 212. 4.50 4.51 0.0396 #> # ℹ 7 more variables: depth , landform , .part1 , .part2 , #> # .part3 , .part4 , .part5 esm_gam_t2 <- esm_gam( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"cwd\", \"tmin\", \"ppt_djf\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), partition = \".part\", thr = NULL ) #> #> Model has more coefficients than data used for training it. Try to reduce k # Remove the previous k-fold partition abies2 <- abies2 %>% select(-starts_with(\".\")) # Test with bootstrap partition using 10 replicates set.seed(10) abies2 <- part_random( data = abies2, pr_ab = \"pr_ab\", method = c(method = \"boot\", replicates = 10, proportion = 0.7) ) abies2 #> # A tibble: 20 × 23 #> id pr_ab x y aet cwd tmin ppt_djf ppt_jja pH awc #> #> 1 12040 0 -308909. 384248. 573. 332. 4.84 521. 48.8 5.63 0.108 #> 2 10361 0 -254286. 417158. 260. 469. 2.93 151. 15.1 6.20 0.0950 #> 3 9402 0 -286979. 386206. 587. 376. 6.45 333. 15.7 5.5 0.160 #> 4 9815 0 -291849. 445595. 443. 455. 4.39 332. 19.1 6 0.0700 #> 5 10524 0 -256658. 184438. 355. 568. 5.87 303. 10.6 5.20 0.0800 #> 6 8860 0 121343. -164170. 354. 733. 3.97 182. 9.83 0 0 #> 7 6431 0 107903. -122968. 461. 578. 4.87 161. 7.66 5.90 0.0900 #> 8 11730 0 -333903. 431238. 561. 364. 6.73 387. 25.2 5.80 0.130 #> 9 808 0 -150163. 357180. 339. 564. 2.64 220. 15.3 6.40 0.100 #> 10 11054 0 -293663. 340981. 477. 396. 3.89 332. 26.4 4.60 0.0634 #> 11 2960 1 -49273. 181752. 512. 275. 0.920 319. 17.3 5.92 0.0900 #> 12 3065 1 126907. -198892. 322. 544. 0.700 203. 10.6 5.60 0.110 #> 13 5527 1 116751. -181089. 261. 537. 0.363 178. 7.43 0 0 #> 14 4035 1 -31777. 115940. 394. 440. 2.07 298. 11.2 6.01 0.0769 #> 15 4081 1 -5158. 90159. 301. 502. 0.703 203. 14.6 6.11 0.0633 #> 16 3087 1 102151. -143976. 299. 425. -2.08 205. 13.4 3.88 0.110 #> 17 3495 1 -19586. 89803. 438. 419. 2.13 189. 15.2 6.19 0.0959 #> 18 4441 1 49405. -60502. 362. 582. 2.42 218. 7.84 5.64 0.0786 #> 19 301 1 -132516. 270845. 367. 196. -2.56 422. 26.3 6.70 0.0300 #> 20 3162 1 59905. -53634. 319. 626. 1.99 212. 4.50 4.51 0.0396 #> # ℹ 12 more variables: depth , landform , .part1 , .part2 , #> # .part3 , .part4 , .part5 , .part6 , .part7 , #> # .part8 , .part9 , .part10 esm_gam_t3 <- esm_gam( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"cwd\", \"tmin\", \"ppt_djf\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), partition = \".part\", thr = NULL ) #> #> Model has more coefficients than data used for training it. Try to reduce k"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v03_post_modeling.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"flexsdm: Overview of Post-modeling functions","text":"Species distribution modeling (SDM) become standard tool multiple research areas, including ecology, conservation biology, biogeography, paleobiogeography, epidemiology. SDM area active theoretical methodological research flexsdm package provides users ability manipulate parameterize models variety ways meet unique research needs. flexibility enables users define complete partial modeling procedure specific modeling situations (e.g., number variables, number records, different algorithms ensemble methods, algorithms tuning, etc.). vignette, users learn post-modeling set functions flexsdm package. functions designed aim assisting flexsdm user predicting, evaluating, correcting SDMs. functions created model prediction, evaluation correction: Post-modeling functions sdm_predict() Spatial predictions individual ensemble models sdm_summarize() Merge model performance tables interp() Raster interpolation SDM predictions two time periods extra_eval() Measure model extrapolation extra_correct() Constraint suitability values given extrapolation value msdm_priori() Create spatial predictor variables reduce overprediction species distribution models msdm_posteriori() Methods correct overprediction species distribution models based occurrences suitability patterns","code":""},{"path":"https://sjevelazco.github.io/flexsdm/articles/v03_post_modeling.html","id":"installation","dir":"Articles","previous_headings":"","what":"Installation","title":"flexsdm: Overview of Post-modeling functions","text":"Install flexsdm package. can install released version flexsdm github :","code":"# devtools::install_github('sjevelazco/flexsdm') library(flexsdm) library(dplyr) #> #> Attaching package: 'dplyr' #> The following objects are masked from 'package:stats': #> #> filter, lag #> The following objects are masked from 'package:base': #> #> intersect, setdiff, setequal, union library(terra) #> terra 1.7.78 #> #> Attaching package: 'terra' #> The following object is masked from 'package:knitr': #> #> spin"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v03_post_modeling.html","id":"project-directory-setup","dir":"Articles","previous_headings":"","what":"Project directory setup","title":"flexsdm: Overview of Post-modeling functions","text":"Decide computer like store inputs outputs project (main directory). Use existing one use dir.create() create main directory. specify whether include folders projections, calibration areas, algorithms, ensembles, thresholds. details see Vignette 01_pre_modeling","code":""},{"path":"https://sjevelazco.github.io/flexsdm/articles/v03_post_modeling.html","id":"species-occurrence-presenceabsense-and-environmental-data","dir":"Articles","previous_headings":"","what":"Species occurrence, presence/absense and environmental data","title":"flexsdm: Overview of Post-modeling functions","text":"tutorial, using “spp” example dataset includes pr_ab (presence = 1, absence = 0), location (x, y) data 3 plant species found California raster environmental data. can load data local R environment using code : want replace spp dataset data, make sure contains coordinates, species presence = 1 / absence = 0 raster environmental data. First, prepare occurrences, environmental conditions partitions Next, fit different models","code":"data(\"spp\") somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) # Select only one species some_sp <- spp %>% filter(species == \"sp3\") # Extract the environmental condition from the rsater for sp3 some_sp <- sdm_extract( data = some_sp, x = \"x\", y = \"y\", env_layer = somevar ) #> 4 rows were excluded from database because NAs were found # Make a partition defining the method, folds and replicates some_sp <- part_random( data = some_sp, pr_ab = \"pr_ab\", method = c(method = \"rep_kfold\", folds = 3, replicates = 5) ) # Fit and validate a [generalized linear model](https://sjevelazco.github.io/flexsdm/reference/fit_glm.html) mglm <- fit_glm( data = some_sp, response = \"pr_ab\", predictors = c(\"CFP_1\", \"CFP_2\", \"CFP_3\", \"CFP_4\"), partition = \".part\", poly = 2 ) #> Formula used for model fitting: #> pr_ab ~ CFP_1 + CFP_2 + CFP_3 + CFP_4 + I(CFP_1^2) + I(CFP_2^2) + I(CFP_3^2) + I(CFP_4^2) #> Replica number: 1/5 #> Partition number: 1/3 #> Partition number: 2/3 #> Partition number: 3/3 #> Replica number: 2/5 #> Partition number: 1/3 #> Partition number: 2/3 #> Partition number: 3/3 #> Replica number: 3/5 #> Partition number: 1/3 #> Partition number: 2/3 #> Partition number: 3/3 #> Replica number: 4/5 #> Partition number: 1/3 #> Partition number: 2/3 #> Partition number: 3/3 #> Replica number: 5/5 #> Partition number: 1/3 #> Partition number: 2/3 #> Partition number: 3/3 # Fit and validate a [random forest model](https://sjevelazco.github.io/flexsdm/reference/fit_raf.html) mraf <- fit_raf( data = some_sp, response = \"pr_ab\", predictors = c(\"CFP_1\", \"CFP_2\", \"CFP_3\", \"CFP_4\"), partition = \".part\", ) #> Formula used for model fitting: #> pr_ab ~ CFP_1 + CFP_2 + CFP_3 + CFP_4 #> Replica number: 1/5 #> Partition number: 1/3 #> Partition number: 2/3 #> Partition number: 3/3 #> Replica number: 2/5 #> Partition number: 1/3 #> Partition number: 2/3 #> Partition number: 3/3 #> Replica number: 3/5 #> Partition number: 1/3 #> Partition number: 2/3 #> Partition number: 3/3 #> Replica number: 4/5 #> Partition number: 1/3 #> Partition number: 2/3 #> Partition number: 3/3 #> Replica number: 5/5 #> Partition number: 1/3 #> Partition number: 2/3 #> Partition number: 3/3 # Fit and validate a [general boosted regression model](https://sjevelazco.github.io/flexsdm/reference/fit_gbm.html) mgbm <- fit_gbm( data = some_sp, response = \"pr_ab\", predictors = c(\"CFP_1\", \"CFP_2\", \"CFP_3\", \"CFP_4\"), partition = \".part\" ) #> Formula used for model fitting: #> pr_ab ~ CFP_1 + CFP_2 + CFP_3 + CFP_4 #> Replica number: 1/5 #> Partition number: 1/3 #> Partition number: 2/3 #> Partition number: 3/3 #> Replica number: 2/5 #> Partition number: 1/3 #> Partition number: 2/3 #> Partition number: 3/3 #> Replica number: 3/5 #> Partition number: 1/3 #> Partition number: 2/3 #> Partition number: 3/3 #> Replica number: 4/5 #> Partition number: 1/3 #> Partition number: 2/3 #> Partition number: 3/3 #> Replica number: 5/5 #> Partition number: 1/3 #> Partition number: 2/3 #> Partition number: 3/3"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v03_post_modeling.html","id":"fit-and-ensemble-the-models-above","dir":"Articles","previous_headings":"Species occurrence, presence/absense and environmental data","what":"1. Fit and ensemble the models above","title":"flexsdm: Overview of Post-modeling functions","text":"can also fit model using Ensembles Small Models approach. example, fit without threshold specification k-fold cross-validation. Finally, can predict different kinds models data (some_sp). sdm_predict can used predicting one models fitted fit_ tune_ functions. output list SpatRaster continuous /binary predictions.","code":"# Fit and ensemble the models. To choose the arguments that best fit your own data, see all options available in [fit_ensemble](https://sjevelazco.github.io/flexsdm/reference/fit_ensemble.html) mensemble <- fit_ensemble( models = list(mglm, mraf, mgbm), ens_method = \"meansup\", thr = NULL, thr_model = \"max_sens_spec\", metric = \"TSS\" ) #> | | | 0% | |======================================================================| 100% msmall <- esm_gam( data = some_sp, response = \"pr_ab\", predictors = c(\"CFP_1\", \"CFP_2\", \"CFP_3\", \"CFP_4\"), partition = \".part\", thr = NULL ) #> | | | 0% | |============ | 17% | |======================= | 33% | |=================================== | 50% | |=============================================== | 67% | |========================================================== | 83% | |======================================================================| 100% # Predict using a single model, which is an mglm model in this example, # and a threshold type for binary predictions ind_p <- sdm_predict( models = mglm, pred = somevar, thr = \"max_fpb\", con_thr = FALSE, predict_area = NULL ) #> Predicting individual models # Inspect the object. It's a SpatRaster with 2 layers: glm, max_fpb # These are the continuous and binary prediction from the model ind_p #> $glm #> class : SpatRaster #> dimensions : 558, 394, 2 (nrow, ncol, nlyr) #> resolution : 1890, 1890 (x, y) #> extent : -373685.8, 370974.2, -604813.3, 449806.7 (xmin, xmax, ymin, ymax) #> coord. ref. : +proj=aea +lat_0=0 +lon_0=-120 +lat_1=34 +lat_2=40.5 +x_0=0 +y_0=-4000000 +datum=NAD83 +units=m +no_defs #> source(s) : memory #> varnames : somevar #> somevar #> names : glm, max_fpb #> min values : 2.220446e-16, TRUE #> max values : 1.000000e+00, TRUE # Plot to see this layers ind_p_rst <- terra::rast(ind_p) plot(ind_p_rst) # Predict a list of more than one model, specifying a threshold type list_p <- sdm_predict( models = list(mglm, mraf, mgbm), pred = somevar, thr = \"max_fpb\", con_thr = FALSE, predict_area = NULL ) #> Predicting list of individual models # Inspect the object. It's a list with 3 SpatRaster, one for each model, # each of which contains 2 layers, for the continuous and thresholded binary predictions. list_p #> $glm #> class : SpatRaster #> dimensions : 558, 394, 2 (nrow, ncol, nlyr) #> resolution : 1890, 1890 (x, y) #> extent : -373685.8, 370974.2, -604813.3, 449806.7 (xmin, xmax, ymin, ymax) #> coord. ref. : +proj=aea +lat_0=0 +lon_0=-120 +lat_1=34 +lat_2=40.5 +x_0=0 +y_0=-4000000 +datum=NAD83 +units=m +no_defs #> source(s) : memory #> varnames : somevar #> somevar #> names : glm, max_fpb #> min values : 2.220446e-16, TRUE #> max values : 1.000000e+00, TRUE #> #> $raf #> class : SpatRaster #> dimensions : 558, 394, 2 (nrow, ncol, nlyr) #> resolution : 1890, 1890 (x, y) #> extent : -373685.8, 370974.2, -604813.3, 449806.7 (xmin, xmax, ymin, ymax) #> coord. ref. : +proj=aea +lat_0=0 +lon_0=-120 +lat_1=34 +lat_2=40.5 +x_0=0 +y_0=-4000000 +datum=NAD83 +units=m +no_defs #> source(s) : memory #> varnames : somevar #> somevar #> names : raf, max_fpb #> min values : 0, FALSE #> max values : 1, TRUE #> #> $gbm #> class : SpatRaster #> dimensions : 558, 394, 2 (nrow, ncol, nlyr) #> resolution : 1890, 1890 (x, y) #> extent : -373685.8, 370974.2, -604813.3, 449806.7 (xmin, xmax, ymin, ymax) #> coord. ref. : +proj=aea +lat_0=0 +lon_0=-120 +lat_1=34 +lat_2=40.5 +x_0=0 +y_0=-4000000 +datum=NAD83 +units=m +no_defs #> source(s) : memory #> varnames : somevar #> somevar #> names : gbm, max_fpb #> min values : 0.0002949323, FALSE #> max values : 0.9986537352, TRUE # Plot to see this layers list_p_rst <- terra::rast(list_p) plot(list_p_rst) # Predict an ensemble model. This is only possible using one fit_ensemble object. It's not possible to include e.g., list(fit_ensemble1, fit_ensemble2) in the model argument. ensemble_p <- sdm_predict( models = mensemble, pred = somevar, thr = \"max_fpb\", con_thr = FALSE, predict_area = NULL ) #> Predicting ensembles # Inspect the object. It's a SpatRaster with 2 layers, mensemble and max_fpb # These are the continuous and binary prediction from the ensemble model ensemble_p #> $meansup #> class : SpatRaster #> dimensions : 558, 394, 2 (nrow, ncol, nlyr) #> resolution : 1890, 1890 (x, y) #> extent : -373685.8, 370974.2, -604813.3, 449806.7 (xmin, xmax, ymin, ymax) #> coord. ref. : +proj=aea +lat_0=0 +lon_0=-120 +lat_1=34 +lat_2=40.5 +x_0=0 +y_0=-4000000 +datum=NAD83 +units=m +no_defs #> source(s) : memory #> varnames : somevar #> somevar #> names : meansup, max_fpb #> min values : 0, FALSE #> max values : 1, TRUE # Plot to see this layers ensemble_p_rst <- terra::rast(ensemble_p) plot(ensemble_p_rst) # Predict an ensembles of small models. small_p <- sdm_predict( models = msmall, pred = somevar, thr = \"max_fpb\", con_thr = FALSE, predict_area = NULL ) #> Predicting ensemble of small models # Inspect the object It's a SpatRaster with 2 layers, msmall and max_fpb # These are the continuous and binary prediction from the ESM model small_p #> $esm_gam #> class : SpatRaster #> dimensions : 558, 394, 2 (nrow, ncol, nlyr) #> resolution : 1890, 1890 (x, y) #> extent : -373685.8, 370974.2, -604813.3, 449806.7 (xmin, xmax, ymin, ymax) #> coord. ref. : +proj=aea +lat_0=0 +lon_0=-120 +lat_1=34 +lat_2=40.5 +x_0=0 +y_0=-4000000 +datum=NAD83 +units=m +no_defs #> source(s) : memory #> names : esm_gam, max_fpb #> min values : 2.476531e-05, FALSE #> max values : 1.000000e+00, TRUE # Plot to see this layers small_p_rst <- terra::rast(small_p) plot(small_p_rst)"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v03_post_modeling.html","id":"merge-model-performance-tables","dir":"Articles","previous_headings":"Species occurrence, presence/absense and environmental data","what":"2. Merge model performance tables","title":"flexsdm: Overview of Post-modeling functions","text":"function combines model performance tables input models. function requires list one models fitted fit_ tune_ functions, fit_ensemble output, esm_ family function output. Build models use performance table merge Finally, merge three sdm performance tables.","code":"# Load abies data data(abies) abies #> # A tibble: 1,400 × 13 #> id pr_ab x y aet cwd tmin ppt_djf ppt_jja pH awc #> #> 1 715 0 -95417. 314240. 323. 546. 1.24 62.7 17.8 5.77 0.108 #> 2 5680 0 98987. -159415. 448. 815. 9.43 130. 6.43 5.60 0.160 #> 3 7907 0 121474. -99463. 182. 271. -4.95 151. 11.2 0 0 #> 4 1850 0 -39976. -17456. 372. 946. 8.78 116. 2.70 6.41 0.0972 #> 5 1702 0 111372. -91404. 209. 399. -4.03 165. 9.27 0 0 #> 6 10036 0 -255715. 392229. 308. 535. 4.66 166. 16.5 5.70 0.0777 #> 7 12384 0 -311765. 380213. 568. 352. 4.38 480. 41.2 5.80 0.110 #> 8 6513 0 111360. -120229. 327. 633. 4.93 163. 8.91 1.18 0.0116 #> 9 9884 0 -284326. 442136. 377. 446. 3.99 296. 16.8 5.96 0.0900 #> 10 8651 0 137640. -110538. 215. 265. -4.62 180. 9.57 0 0 #> # ℹ 1,390 more rows #> # ℹ 2 more variables: depth , landform # We will partition the data with the k-fold method abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 5) ) # Build a generalized additive model, and a generalized linear model using fit_ family functions gam_t1 <- fit_gam( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), predictors_f = c(\"landform\"), partition = \".part\", thr = c(\"max_sens_spec\", \"equal_sens_spec\", \"max_sorensen\") ) #> Formula used for model fitting: #> pr_ab ~ s(aet, k = -1) + s(ppt_jja, k = -1) + s(pH, k = -1) + s(awc, k = -1) + s(depth, k = -1) + landform #> Replica number: 1/1 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 glm_t1 <- fit_glm( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), predictors_f = c(\"landform\"), partition = \".part\", thr = c(\"max_sens_spec\", \"equal_sens_spec\", \"max_sorensen\"), poly = 0, inter_order = 0 ) #> Formula used for model fitting: #> pr_ab ~ aet + ppt_jja + pH + awc + depth + landform #> Replica number: 1/1 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 # Build a tuned model using tune_ family functions # Prepare the grid object to use in grid argument tune_grid <- expand.grid(mtry = seq(1, 7, 1)) # Build a tuned random forest model rf_t1 <- tune_raf( data = abies2, response = \"pr_ab\", predictors = c( \"aet\", \"cwd\", \"tmin\", \"ppt_djf\", \"ppt_jja\", \"pH\", \"awc\", \"depth\" ), predictors_f = c(\"landform\"), partition = \".part\", grid = tune_grid, thr = c(\"max_sens_spec\", \"equal_sens_spec\", \"max_sorensen\"), metric = \"TSS\", ) #> Formula used for model fitting: #> pr_ab ~ aet + cwd + tmin + ppt_djf + ppt_jja + pH + awc + depth + landform #> Tuning model... #> Replica number: 1/1 #> Formula used for model fitting: #> pr_ab ~ aet + cwd + tmin + ppt_djf + ppt_jja + pH + awc + depth + landform #> Replica number: 1/1 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 rf_t1$performance #> # A tibble: 1 × 26 #> mtry model threshold thr_value n_presences n_absences TPR_mean TPR_sd #> #> 1 3 raf max_sens_spec 0.638 700 700 0.916 0.0430 #> # ℹ 18 more variables: TNR_mean , TNR_sd , SORENSEN_mean , #> # SORENSEN_sd , JACCARD_mean , JACCARD_sd , FPB_mean , #> # FPB_sd , OR_mean , OR_sd , TSS_mean , TSS_sd , #> # AUC_mean , AUC_sd , BOYCE_mean , BOYCE_sd , #> # IMAE_mean , IMAE_sd # Note in rf_t1$performance the best model was the one with mtry = 3 and threshold = 'max_sens_spec' merge_df <- sdm_summarize(models = list(gam_t1, glm_t1, rf_t1)) merge_df #> # A tibble: 7 × 27 #> model_ID model threshold thr_value n_presences n_absences TPR_mean TPR_sd #> #> 1 1 gam equal_sens_sp… 0.540 700 700 0.737 0.0366 #> 2 1 gam max_sens_spec 0.530 700 700 0.751 0.0461 #> 3 1 gam max_sorensen 0.359 700 700 0.864 0.0580 #> 4 2 glm equal_sens_sp… 0.523 700 700 0.663 0.0583 #> 5 2 glm max_sens_spec 0.463 700 700 0.803 0.111 #> 6 2 glm max_sorensen 0.356 700 700 0.876 0.0436 #> 7 3 raf max_sens_spec 0.638 700 700 0.916 0.0430 #> # ℹ 19 more variables: TNR_mean , TNR_sd , SORENSEN_mean , #> # SORENSEN_sd , JACCARD_mean , JACCARD_sd , FPB_mean , #> # FPB_sd , OR_mean , OR_sd , TSS_mean , TSS_sd , #> # AUC_mean , AUC_sd , BOYCE_mean , BOYCE_sd , #> # IMAE_mean , IMAE_sd , mtry "},{"path":"https://sjevelazco.github.io/flexsdm/articles/v03_post_modeling.html","id":"raster-interpolation-between-two-time-periods","dir":"Articles","previous_headings":"Species occurrence, presence/absense and environmental data","what":"3. Raster interpolation between two time periods","title":"flexsdm: Overview of Post-modeling functions","text":"function useful calculating projected suitability values two time periods simple interpolation using two raster objects suitability values. useful , example, SDM projected future past time period (using maps predictor variables, climate variables, different time periods), user requires estimate suitability intermediate time periods. example may needed input types models risk analysis. function returns SpatRaster dir_save used NULL. However, user specifies dir_save, function save interpolated raster files given directory. function create object interpolated values n annual layers ranging initial final year. resolution dimensions result object remain initial final maps. example, nine annual (2011-2019) interpolated maps generated initial (2010) final (2020) prediction maps. cell starting value 1 ending value 0 changed increments (1-0)/((2020-2010)-1), given interpolated values 0.9, 0.8, 0.7…0.1","code":"library(terra) library(dplyr) f <- system.file(\"external/suit_time_step.tif\", package = \"flexsdm\") abma <- terra::rast(f) plot(abma) int <- interp( r1 = abma[[1]], # set the raster of initial year r2 = abma[[2]], # set the raster of final year y1 = 2010, # set the numeric initial year y2 = 2020, # set the numeric final year rastername = \"Abies\", dir_save = NULL ) # Layers in the abma SpatRaster names(abma) #> [1] \"current\" \"future\" # plot(abma) # Layers in the int SpatRaster int #> class : SpatRaster #> dimensions : 558, 394, 11 (nrow, ncol, nlyr) #> resolution : 1890, 1890 (x, y) #> extent : -373685.8, 370974.2, -604813.3, 449806.7 (xmin, xmax, ymin, ymax) #> coord. ref. : +proj=aea +lat_0=0 +lon_0=-120 +lat_1=34 +lat_2=40.5 +x_0=0 +y_0=-4000000 +datum=NAD83 +units=m +no_defs #> source(s) : memory #> varnames : suit_time_step #> suit_time_step #> suit_time_step #> ... #> names : Abies_2010, Abies_2011, Abies_2012, Abies_2013, Abies_2014, Abies_2015, ... #> min values : 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.0000000, ... #> max values : 0.9756107, 0.9606077, 0.9504615, 0.9440073, 0.9442941, 0.9463548, ... plot(int)"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v03_post_modeling.html","id":"measure-model-extrapolation","dir":"Articles","previous_headings":"Species occurrence, presence/absense and environmental data","what":"4. Measure model extrapolation","title":"flexsdm: Overview of Post-modeling functions","text":"function measures extent model extrapolation comparing data used modeling calibration area model projection using approach proposed Velazco et al., prep. accessible area defines calibration area used extract environmental conditions","code":"library(dplyr) library(terra) data(spp) f <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(f) # Inspect the unique values for species spp$species %>% unique() #> [1] \"sp1\" \"sp2\" \"sp3\" # Subset spp data into a tibble only with coordinates for sp3 and pr_ab == 1 sp <- spp %>% dplyr::filter(species == \"sp3\", pr_ab == 1) %>% dplyr::select(x, y) # Define accessible area for sp3 based on a buffer with around each point that is related to dispersal ability or some other ecological criterion ca <- calib_area( sp, x = \"x\", y = \"y\", method = c(\"buffer\", width = 30000), crs = crs(somevar) ) # Plot the SpatRaster, occurrences and accessible area plot(somevar$CFP_1) points(sp) plot(ca, add = T) somevar_ca <- somevar %>% crop(., ca) %>% mask(., ca) # Plot environmental conditions of the calibration area plot(somevar_ca) xp <- extra_eval( training_data = somevar_ca, projection_data = somevar, n_cores = 1, aggreg_factor = 3 ) # Plot the SpatRaster object with the extrapolation values measured in percentage plot(xp)"},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/articles/v03_post_modeling.html","id":"create-spatial-predictor-variables-to-reduce-overprediction-of-species-distribution-models","dir":"Articles","previous_headings":"Species occurrence, presence/absense and environmental data","what":"6. Create spatial predictor variables to reduce overprediction of species distribution models","title":"flexsdm: Overview of Post-modeling functions","text":"function creates geographical predictor variables , together environmental variables, can used construct constrained species distribution models. function returns SpatRaster object, used together environmental variables construct species distribution models. ‘xy’ approach creates single pair raster layers can used species share study region. Otherwise, ‘cml’, ‘min’, ‘ker’ create species-specific raster layer. Next, use different methods according data.","code":"library(dplyr) library(terra) data(\"spp\") somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) # Select the presences of one species (sp3) occ <- spp %>% dplyr::filter(species == \"sp3\", pr_ab == 1) # Select a raster layer to be used as a basic raster a_variable <- somevar[[1]] plot(a_variable) points(occ %>% dplyr::select(x, y)) # Use xy method m_xy <- msdm_priori( data = occ, x = \"x\", y = \"y\", method = \"xy\", env_layer = a_variable ) plot(m_xy) # Explore the object. This method assumes that spatial structure can partially explain species distribution (Bahn & Mcgill, 2007). Therefore, the result are two raster layers containing the latitude and longitude of pixels, respectively. This method could be used for all species set that share the same study area region. m_xy #> class : SpatRaster #> dimensions : 558, 394, 2 (nrow, ncol, nlyr) #> resolution : 1890, 1890 (x, y) #> extent : -373685.8, 370974.2, -604813.3, 449806.7 (xmin, xmax, ymin, ymax) #> coord. ref. : +proj=aea +lat_0=0 +lon_0=-120 +lat_1=34 +lat_2=40.5 +x_0=0 +y_0=-4000000 +datum=NAD83 +units=m +no_defs #> source(s) : memory #> varnames : somevar #> somevar #> names : msdm_lon, msdm_lat #> min values : -370850.8, -601978.3 #> max values : 368139.2, 448861.7 m_cml <- msdm_priori( data = occ, x = \"x\", y = \"y\", method = \"cml\", env_layer = a_variable ) plot(m_cml) # Explore the object. This method assumes that pixels closer to presences are likely included in species distributions. The results is a raster layer containing the sum of euclidean geographic distances from each pixel to all occurrences of a species. m_cml #> class : SpatRaster #> dimensions : 558, 394, 1 (nrow, ncol, nlyr) #> resolution : 1890, 1890 (x, y) #> extent : -373685.8, 370974.2, -604813.3, 449806.7 (xmin, xmax, ymin, ymax) #> coord. ref. : +proj=aea +lat_0=0 +lon_0=-120 +lat_1=34 +lat_2=40.5 +x_0=0 +y_0=-4000000 +datum=NAD83 +units=m +no_defs #> source(s) : memory #> varname : somevar #> name : msdm_cml #> min value : 0 #> max value : 1"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v03_post_modeling.html","id":"methods-to-correct-overprediction-of-species-distribution-models-based-on-occurrences-and-suitability-patterns","dir":"Articles","previous_headings":"Species occurrence, presence/absense and environmental data","what":"7. Methods to correct overprediction of species distribution models based on occurrences and suitability patterns","title":"flexsdm: Overview of Post-modeling functions","text":"methods designed reduce overprediction species distribution models based posteriori method (see Mendes et al 2020), .e., combination patterns species occurrences predicted suitability. First, prepare data Next, fit predict model Next, let’s predict model plot map Finally, perform correction avoid models overpredictions. #=========#=========#=========#=========#=========#=========#=========# Vignette still construction changes #=========#=========#=========#=========#=========#=========#=========#","code":"library(dplyr) library(terra) data(\"spp\") somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) # Prepare data for modeling a species set.seed(10) occ <- spp %>% dplyr::filter(species == \"sp2\") %>% # filter using only sp2 sdm_extract( data = ., x = \"x\", y = \"y\", env_layer = somevar, filter_na = TRUE ) %>% # extract variables values from the raster layer part_random(., pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 10) ) # add columns with partition #> 6 rows were excluded from database because NAs were found m_glm <- fit_glm( data = occ, response = \"pr_ab\", predictors = names(somevar), partition = \".part\", thr = \"equal_sens_spec\", ) #> Formula used for model fitting: #> pr_ab ~ CFP_1 + CFP_2 + CFP_3 + CFP_4 + I(CFP_1^2) + I(CFP_2^2) + I(CFP_3^2) + I(CFP_4^2) #> Replica number: 1/1 #> Partition number: 1/10 #> Partition number: 2/10 #> Partition number: 3/10 #> Partition number: 4/10 #> Partition number: 5/10 #> Partition number: 6/10 #> Partition number: 7/10 #> Partition number: 8/10 #> Partition number: 9/10 #> Partition number: 10/10 # Predict this model m_pred <- sdm_predict(models = m_glm, pred = somevar, thr = NULL, con_thr = FALSE) #> Predicting individual models # Predicting individual models plot(m_pred[[1]]) # Using mcp method. The Minimum Convex Polygon (mcp) method excludes from SDMs climate suitable pixels that do not intercept a minimum convex polygon, with interior angles smaller than 180, enclosing all occurrences of a species. m_mcp <- msdm_posteriori( records = occ, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", method = \"mcp\", cont_suit = m_pred[[1]], thr = \"equal_sens_spec\", buffer = NULL ) plot(m_mcp) # Using bmcp method. The Buffered Minimum Convex Polygon (bmcp) method is similar to the 'mcp' except by the inclusion of a buffer zone surrounding minimum convex polygons. m_bmcp <- msdm_posteriori( records = occ, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", method = \"bmcp\", cont_suit = m_pred[[1]], thr = \"equal_sens_spec\", buffer = 30000, crs = crs(m_pred[[1]]) ) plot(m_bmcp) # Using obr method. The Occurrences Based Restriction (obr) method assumes that suitable patches intercepting species occurrences are more likely a part of species distributions than suitable patches that do not intercept any occurrence. m_obr <- msdm_posteriori( records = occ, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", method = \"obr\", cont_suit = m_pred[[1]], thr = \"equal_sens_spec\", buffer = NULL ) plot(m_obr) # Using pres method. The only occurrences based restriction (pres) method only retains those pixels in suitability patches intercepting occurrences. m_pres <- msdm_posteriori( records = occ, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", method = \"pres\", cont_suit = m_pred[[1]], thr = \"equal_sens_spec\", buffer = NULL ) plot(m_pres) # Using lq method. The Lower Quantile (lq) method works whenever a suitable pixel is within a k patch, i.e., not within this lower quartile, the suitability of the pixel is reduced to zero. This means that 75% of k patches were withdrawn from the model. m_lq <- msdm_posteriori( records = occ, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", method = \"lq\", cont_suit = m_pred[[1]], thr = \"equal_sens_spec\", buffer = NULL ) plot(m_lq)"},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/articles/v04_Red_fir_example.html","id":"study-species-overview-of-methods","dir":"Articles","previous_headings":"Example of full modeling process","what":"Study species & overview of methods","title":"flexsdm: Red Fir example","text":", used flexsdm package model current distribution California red fir (Abies magnifica). Red fir high-elevation conifer species ’s geographic range extends Sierra Nevada California, USA, southern portion Cascade Range Oregon. species, used presence data compiled several public datasets curated natural resources agencies. built distribution models using four hydro-climatic variables: actual evapotranspiration, climatic water deficit, maximum temperature warmest month, minimum temperature coldest month. variables resampled (aggregated) 1890 m spatial resolution improve processing time.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/articles/v04_Red_fir_example.html","id":"delimit-of-a-calibration-area","dir":"Articles","previous_headings":"Example of full modeling process","what":"Delimit of a calibration area","title":"flexsdm: Red Fir example","text":"Delimiting calibration area (aka accessible area) essential step SDMs methodological theoretical terms. calibration area affect several characteristics SDM like range environmental variables, number absences, distribution background points pseudo-absences, unfortunately, performance metrics like AUC TSS. several ways delimit calibration area. calib_area(). used method calibration area delimited 100-km buffer around presences (shown figure ).","code":"# devtools::install_github('sjevelazco/flexsdm') library(flexsdm) library(terra) library(dplyr) somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) # environmental data names(somevar) <- c(\"aet\", \"cwd\", \"tmx\", \"tmn\") data(abies) abies_p <- abies %>% select(x, y, pr_ab) %>% filter(pr_ab == 1) # filter only for presence locations ca <- calib_area( data = abies_p, x = 'x', y = 'y', method = c('buffer', width = 100000), crs = crs(somevar) ) # create a calibration area with 100 km buffer around occurrence points # visualize the species occurrences layer1 <- somevar[[1]] layer1[!is.na(layer1)] <- 1 plot(layer1, col=\"gray80\", legend=FALSE, axes=FALSE) plot(crop(ca, layer1), add=TRUE) points(abies_p[,c(\"x\", \"y\")], col = \"#00000480\")"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v04_Red_fir_example.html","id":"occurrence-filtering","dir":"Articles","previous_headings":"Example of full modeling process","what":"Occurrence filtering","title":"flexsdm: Red Fir example","text":"Sample bias species occurrence data long recognized issue SDM. However, environmental filtering observation data can improve model predictions reducing redundancy environmental (e.g. climatic) hyper-space (Varela et al. 2014). use function occfilt_env() thin red fir occurrences based environmental space. function unique flexsdm, contrast packages able use number environmental dimensions perform PCA filtering. Next apply environmental occurrence filtering using 8 bins display resulting filtered occurrence data","code":"abies_p$id <- 1:nrow(abies_p) # adding unique id to each row abies_pf <- abies_p %>% occfilt_env( data = ., x = \"x\", y = \"y\", id = \"id\", nbins = 8, env_layer = somevar ) %>% left_join(abies_p, by = c(\"id\", \"x\", \"y\")) #> Extracting values from raster ... #> 27 records were removed because they have NAs for some variables #> Number of unfiltered records: 673 #> Number of filtered records: 216 plot(layer1, col=\"gray80\", legend=FALSE, axes=FALSE) plot(crop(ca, layer1), add=TRUE) points(abies_p[,c(\"x\", \"y\")], col = \"#00000480\") points(abies_pf[,c(\"x\", \"y\")], col = \"#5DC86180\")"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v04_Red_fir_example.html","id":"block-partition-with-4-folds","dir":"Articles","previous_headings":"Example of full modeling process","what":"Block partition with 4 folds","title":"flexsdm: Red Fir example","text":"Data partitioning, splitting data testing training groups, key step building SDMs. flexsdm offers multiple options data partitioning use spatial block method. Geographically structured data partitioning methods especially useful users want evaluate model transferability different regions time periods. part_sblock() function explores spatial blocks different raster cells sizes returns one best suited input datset based spatial autocorrelation, environmental similarity, number presence/absence records block partition. function’s output provides users 1) tibble presence/absence locations assigned partition number, 2) tibble information best partition, 3) SpatRaster showing selected grid. want divide data 4 different partitions using spatial block method.","code":"set.seed(10) occ_part <- abies_pf %>% part_sblock( data = ., env_layer = somevar, pr_ab = \"pr_ab\", x = \"x\", y = \"y\", n_part = 4, min_res_mult = 3, max_res_mult = 200, num_grids = 30, prop = 1 ) #> The following grid cell sizes will be tested: #> 5670 | 18508.97 | 31347.93 | 44186.9 | 57025.86 | 69864.83 | 82703.79 | 95542.76 | 108381.72 | 121220.69 | 134059.66 | 146898.62 | 159737.59 | 172576.55 | 185415.52 | 198254.48 | 211093.45 | 223932.41 | 236771.38 | 249610.34 | 262449.31 | 275288.28 | 288127.24 | 300966.21 | 313805.17 | 326644.14 | 339483.1 | 352322.07 | 365161.03 | 378000 #> Creating basic raster mask... #> Searching for the optimal grid size... abies_pf <- occ_part$part # Transform best block partition to a raster layer with same resolution and extent than # predictor variables block_layer <- get_block(env_layer = somevar, best_grid = occ_part$grid) cl <- c(\"#64146D\", \"#9E2962\", \"#F47C15\", \"#FCFFA4\") plot(block_layer, col=cl, legend=FALSE, axes=FALSE) points(abies_pf[,c(\"x\", \"y\")]) # Number of presences per block abies_pf %>% dplyr::group_by(.part) %>% dplyr::count() #> # A tibble: 4 × 2 #> # Groups: .part [4] #> .part n #> #> 1 1 38 #> 2 2 59 #> 3 3 33 #> 4 4 86 # Additional information of the best block occ_part$best_part_info #> # A tibble: 1 × 5 #> n_grid cell_size spa_auto env_sim sd_p #> #> 1 14 172577. 0.5 173. 24.1"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v04_Red_fir_example.html","id":"pseudo-absencebackground-points-using-partition-previously-created-as-a-mask","dir":"Articles","previous_headings":"Example of full modeling process","what":"Pseudo-absence/background points (using partition previously created as a mask)","title":"flexsdm: Red Fir example","text":"example, species presence data. However, SDM methods require either pseudo-absence background data. , use spatial block partition just created generate pseudo-absence background points. Extract environmental data presence-absence background data . View distributions present points, pseudo-absence points, background points using blocks reference map.","code":"# Spatial blocks where species occurs # Sample background points throughout study area with random method, allocating 10X the number of presences a background set.seed(10) bg <- lapply(1:4, function(x) { sample_background( data = abies_pf, x = \"x\", y = \"y\", n = sum(abies_pf$.part == x) * 10, method = \"random\", rlayer = block_layer, maskval = x, calibarea = ca ) }) %>% bind_rows() bg <- sdm_extract(data = bg, x = \"x\", y = \"y\", env_layer = block_layer) # Sample a number of pseudo-absences equal to the presence in each partition set.seed(10) psa <- lapply(1:4, function(x) { sample_pseudoabs( data = abies_pf, x = \"x\", y = \"y\", n = sum(abies_pf$.part == x), method = \"random\", rlayer = block_layer, maskval = x, calibarea = ca ) }) %>% bind_rows() psa <- sdm_extract(data = psa, x = \"x\", y = \"y\", env_layer = block_layer) cl <- c(\"#280B50\", \"#9E2962\", \"#F47C15\", \"#FCFFA4\") plot(block_layer, col=\"gray80\", legend=FALSE, axes=FALSE) points(bg[,c(\"x\", \"y\")], col=cl[bg$.part], cex=0.8) # Background points points(psa[,c(\"x\", \"y\")], bg=cl[psa$.part], cex=0.8, pch=21) # Pseudo-absences # Bind a presences and pseudo-absences abies_pa <- bind_rows(abies_pf, psa) abies_pa # Presence-Pseudo-absence database #> # A tibble: 432 × 4 #> x y pr_ab .part #> #> 1 -12558. 68530. 1 2 #> 2 115217. -145937. 1 4 #> 3 3634. 22501. 1 2 #> 4 44972. -60781. 1 2 #> 5 -34463. 160313. 1 3 #> 6 83108. -27300. 1 2 #> 7 124877. -176319. 1 4 #> 8 118707. -179991. 1 4 #> 9 126141. -176302. 1 4 #> 10 -49722. 141124. 1 3 #> # ℹ 422 more rows bg # Background points #> # A tibble: 2,160 × 4 #> x y pr_ab .part #> #> 1 -153501. 392162. 0 1 #> 2 -89241. 263642. 0 1 #> 3 -89241. 27392. 0 1 #> 4 -130821. 331682. 0 1 #> 5 -132711. 339242. 0 1 #> 6 -51441. -63328. 0 1 #> 7 -59001. 67082. 0 1 #> 8 -32541. -51988. 0 1 #> 9 -96801. 932. 0 1 #> 10 -47661. -31198. 0 1 #> # ℹ 2,150 more rows abies_pa <- abies_pa %>% sdm_extract( data = ., x = \"x\", y = \"y\", env_layer = somevar, filter_na = TRUE ) bg <- bg %>% sdm_extract( data = ., x = \"x\", y = \"y\", env_layer = somevar, filter_na = TRUE )"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v04_Red_fir_example.html","id":"fit-models-with-tune_max-fit_gau-and-fit_glm","dir":"Articles","previous_headings":"Example of full modeling process","what":"Fit models with tune_max, fit_gau, and fit_glm","title":"flexsdm: Red Fir example","text":"Now, fit models. flexsdm package offers wide range modeling options, traditional statistical methods like GLMs GAMs, machine learning methods like random forests support vector machines. modeling method, flexsdm provides fit_ tune_ functions, allow users use default settings adjust hyperparameters depending research goals. , test tune_max() (tuned Maximum Entropy model), fit_gau() (fit Guassian Process model), fit_glm (fit Generalized Linear Model). model, selected three threshold values generate binary suitability predictions: threshold maximizes TSS (max_sens_spec), threshold sensitivity specificity equal (equal_sens_spec), threshold Sorenson index highest (max_sorenson). example, selected TSS performance metric used selecting best combination hyper-parameter values tuned Maximum Entropy model.","code":"t_max <- tune_max( data = abies_pa, response = \"pr_ab\", predictors = names(somevar), background = bg, partition = \".part\", grid = expand.grid( regmult = seq(0.1, 3, 0.5), classes = c(\"l\", \"lq\", \"lqhpt\") ), thr = c(\"max_sens_spec\", \"equal_sens_spec\", \"max_sorensen\"), metric = \"TSS\", clamp = TRUE, pred_type = \"cloglog\" ) #> Tuning model... #> Replica number: 1/1 #> Partition number: 1/4 #> Partition number: 2/4 #> Partition number: 3/4 #> Partition number: 4/4 #> Fitting best model #> Formula used for model fitting: #> ~aet + cwd + tmx + tmn + I(aet^2) + I(cwd^2) + I(tmx^2) + I(tmn^2) + hinge(aet) + hinge(cwd) + hinge(tmx) + hinge(tmn) + thresholds(aet) + thresholds(cwd) + thresholds(tmx) + thresholds(tmn) + cwd:aet + tmx:aet + tmn:aet + tmx:cwd + tmn:cwd + tmn:tmx - 1 #> Replica number: 1/1 #> Partition number: 1/4 #> Partition number: 2/4 #> Partition number: 3/4 #> Partition number: 4/4 f_gau <- fit_gau( data = abies_pa, response = \"pr_ab\", predictors = names(somevar), partition = \".part\", thr = c(\"max_sens_spec\", \"equal_sens_spec\", \"max_sorensen\") ) #> Replica number: 1/1 #> Partition number: 1/4 #> Partition number: 2/4 #> Partition number: 3/4 #> Partition number: 4/4 f_glm <- fit_glm( data = abies_pa, response = \"pr_ab\", predictors = names(somevar), partition = \".part\", thr = c(\"max_sens_spec\", \"equal_sens_spec\", \"max_sorensen\"), poly = 2 ) #> Formula used for model fitting: #> pr_ab ~ aet + cwd + tmx + tmn + I(aet^2) + I(cwd^2) + I(tmx^2) + I(tmn^2) #> Replica number: 1/1 #> Partition number: 1/4 #> Partition number: 2/4 #> Partition number: 3/4 #> Partition number: 4/4"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v04_Red_fir_example.html","id":"fit-an-ensemble-model","dir":"Articles","previous_headings":"Example of full modeling process","what":"Fit an ensemble model","title":"flexsdm: Red Fir example","text":"Spatial predictions different SDM algorithms can vary substantially, ensemble modeling become increasingly popular. fit_ensemble() function, users can easily produce ensemble SDM based individual fit_ tune_ models included package. example, fit ensemble model red fir based weighted average three individual models. used threshold values performance metric implemented individual models. output flexsdm model objects allows easily compare metrics across models, AUC TSS. example, can use sdm_summarize() function merge model performance tables.","code":"ens_m <- fit_ensemble( models = list(t_max, f_gau, f_glm), ens_method = \"meanw\", thr = c(\"max_sens_spec\", \"equal_sens_spec\", \"max_sorensen\"), thr_model = \"max_sens_spec\", metric = \"TSS\" ) #> | | | 0% | |======================================================================| 100% ens_m$performance #> # A tibble: 3 × 25 #> model threshold thr_value n_presences n_absences TPR_mean TPR_sd TNR_mean #> #> 1 meanw equal_sens_sp… 0.582 216 216 0.787 0.0795 0.808 #> 2 meanw max_sens_spec 0.470 216 216 0.949 0.0162 0.752 #> 3 meanw max_sorensen 0.449 216 216 0.963 0.0143 0.738 #> # ℹ 17 more variables: TNR_sd , SORENSEN_mean , SORENSEN_sd , #> # JACCARD_mean , JACCARD_sd , FPB_mean , FPB_sd , #> # OR_mean , OR_sd , TSS_mean , TSS_sd , AUC_mean , #> # AUC_sd , BOYCE_mean , BOYCE_sd , IMAE_mean , #> # IMAE_sd model_perf <- sdm_summarize(list(t_max, f_gau, f_glm, ens_m)) model_perf #> # A tibble: 10 × 28 #> model_ID model threshold thr_value n_presences n_absences TPR_mean TPR_sd #> #> 1 1 max max_sens_spec 0.364 216 216 0.954 0.0316 #> 2 2 gau equal_sens_s… 0.643 216 216 0.784 0.0890 #> 3 2 gau max_sens_spec 0.471 216 216 0.952 0.0122 #> 4 2 gau max_sorensen 0.471 216 216 0.964 0.0108 #> 5 3 glm equal_sens_s… 0.649 216 216 0.800 0.0851 #> 6 3 glm max_sens_spec 0.554 216 216 0.954 0.0493 #> 7 3 glm max_sorensen 0.423 216 216 0.977 0.0379 #> 8 4 meanw equal_sens_s… 0.582 216 216 0.787 0.0795 #> 9 4 meanw max_sens_spec 0.470 216 216 0.949 0.0162 #> 10 4 meanw max_sorensen 0.449 216 216 0.963 0.0143 #> # ℹ 20 more variables: TNR_mean , TNR_sd , SORENSEN_mean , #> # SORENSEN_sd , JACCARD_mean , JACCARD_sd , FPB_mean , #> # FPB_sd , OR_mean , OR_sd , TSS_mean , TSS_sd , #> # AUC_mean , AUC_sd , BOYCE_mean , BOYCE_sd , #> # IMAE_mean , IMAE_sd , regmult , classes "},{"path":"https://sjevelazco.github.io/flexsdm/articles/v04_Red_fir_example.html","id":"project-the-ensemble-model","dir":"Articles","previous_headings":"Example of full modeling process","what":"Project the ensemble model","title":"flexsdm: Red Fir example","text":"Next project ensemble model space across entire extent environmental layer, California Floristic Province, using sdm_predict() function. function can use predict species suitability across area species’ current future suitability. example, project ensemble model one threshold, though users option project multiple models multiple threshold values. , also specify want function return SpatRast continuous suitability values threshold (con_thr = TRUE).","code":"pr_1 <- sdm_predict( models = ens_m, pred = somevar, thr = \"max_sens_spec\", con_thr = TRUE, predict_area = NULL ) #> Predicting ensembles unconstrained <- pr_1$meanw[[1]] names(unconstrained) <- \"unconstrained\" cl <- c(\"#FDE725\", \"#B3DC2B\", \"#6DCC57\", \"#36B677\", \"#1F9D87\", \"#25818E\", \"#30678D\", \"#3D4988\", \"#462777\", \"#440154\") plot(unconstrained, col=cl, legend=FALSE, axes=FALSE)"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v04_Red_fir_example.html","id":"constrain-the-model-with-msdm_posterior","dir":"Articles","previous_headings":"Example of full modeling process","what":"Constrain the model with msdm_posterior","title":"flexsdm: Red Fir example","text":"Finally, flexsdm offers users function help correct overprediction SDM based occurrence records suitability patterns. example constrained ensemble model using method “occurrence based restriction”, assumes suitable patches intercept species occurrences likely part species distributions suitable patches intercept occurrences. methods msdm_posteriori() function work presences important always use original database (.e., presences spatially environmentally filtered). methods available msdm_posteriori() function based Mendes et al. (2020). #=========#=========#=========#=========#=========#=========#=========# Vignette still construction changes #=========#=========#=========#=========#=========#=========#=========#","code":"thr_val <- ens_m$performance %>% dplyr::filter(threshold == \"max_sens_spec\") %>% pull(thr_value) m_pres <- msdm_posteriori( records = abies_p, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", cont_suit = pr_1$meanw[[1]], method = c(\"obr\"), thr = c(\"sensitivity\", sens = thr_val), buffer = NULL ) constrained <- m_pres$meanw[[1]] names(constrained) <- \"constrained\" cl <- c(\"#FDE725\", \"#B3DC2B\", \"#6DCC57\", \"#36B677\", \"#1F9D87\", \"#25818E\", \"#30678D\", \"#3D4988\", \"#462777\", \"#440154\") plot(constrained, col=cl, legend=FALSE, axes=FALSE)"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v05_Rare_species_example.html","id":"intro","dir":"Articles","previous_headings":"","what":"Intro","title":"flexsdm: Modeling a rare species","text":"Creating SDMs rare poorly known species can difficult task. Occurrence data often limited observation, can lead model overfitting, especially using many predictor variables build models. However, researchers often interested building SDMs rare species, often threatened need conservation action. address issues associated modeling spatial distributions rare species, Lomba et al. (2010) Breiner et al. (2015) proposed method “ensemble small models” ESM. ESM, many bivariate models pairwise combinations predictor variable, ensemble performed. flexsdm, ensemble created using average suitability across “small models”, weighted Somers’ D (D = 2 * (AUC-.5)). important note method allow use categorical variables (soil type). practical applications ESMs include identifying areas reintroduction rare species areas establishing new populations, especially face climate change. example, Dubos et al. (2021) used variation ESM identify areas may remain suitable climate change two rare species Madagascar: golden mantella frog (Mantella aurantiaca) Manapany day gecko (Phelsuma inexpectata). example, walk process comparing ESM traditional modeling approaches Hesperocyparis stephensonii (Cuyamaca cypress), conifer tree species endemic southern California. species listed Critically Endangered IUCN found headwaters King Creek San Diego County. Cedar Fire 2003 left 30-40 surviving trees. hypothetical example, searching suitable areas might possible establish new populations species, hopes decreasing species’ future extinction risk.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/articles/v05_Rare_species_example.html","id":"data","dir":"Articles","previous_headings":"Intro","what":"Data","title":"flexsdm: Modeling a rare species","text":"models, use four environmental variables influence plant distributions California: available evapotranspiration (aet), climatic water deficit (cwd), maximum temperature warmest month (tmx), minimum temperature coldest month (tmn). occurrence data include 21 geo-referenced observations downloaded online database Calflora.","code":"# devtools::install_github('sjevelazco/flexsdm') library(flexsdm) library(terra) library(dplyr) # environmental data somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) names(somevar) <- c(\"aet\", \"cwd\", \"tmx\", \"tmn\") # species occurence data (presence-only) data(hespero) hespero <- hespero %>% dplyr::select(-id) # California ecoregions regions <- system.file(\"external/regions.tif\", package = \"flexsdm\") regions <- terra::rast(regions) regions <- as.polygons(regions) sp_region <- terra::subset(regions, regions$category == \"SCR\") # ecoregion where *Hesperocyparis stephensonii* is found # visualize the species occurrences plot( sp_region, col = \"gray80\", legend = FALSE, axes = FALSE, main = \"Hesperocyparis stephensonii occurrences\" ) points(hespero[, c(\"x\", \"y\")], col = \"black\", pch = 16) cols <- rep(\"gray80\", 8) cols[regions$category == \"SCR\"] <- \"yellow\" terra::inset( regions, loc = \"bottomleft\", scale = .3, col = cols )"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v05_Rare_species_example.html","id":"delimit-calibration-area","dir":"Articles","previous_headings":"Intro","what":"Delimit calibration area","title":"flexsdm: Modeling a rare species","text":"First, must define model’s calibration area. flexsdm package offers several methods defining model calibration area. , use 25-km buffer areas around presence points select pseudo-absence locations.","code":"ca <- calib_area( data = hespero, x = \"x\", y = \"y\", method = c('buffer', width=25000), crs = crs(somevar) ) # visualize the species occurrences & calibration area plot( sp_region, col = \"gray80\", legend = FALSE, axes = FALSE, main = \"Calibration area and occurrences\") plot(ca, add=TRUE) points(hespero[,c(\"x\", \"y\")], col = \"black\", pch = 16)"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v05_Rare_species_example.html","id":"create-pseudo-absence-data","dir":"Articles","previous_headings":"Intro","what":"Create pseudo-absence data","title":"flexsdm: Modeling a rare species","text":"often case rare species, species presence data. However, SDM methods require either pseudo-absence background data. , use calibration area produce pseudo-absence data can used SDMs.","code":"# Sample the same number of species presences set.seed(10) psa <- sample_pseudoabs( data = hespero, x = \"x\", y = \"y\", n = sum(hespero$pr_ab), # selecting number of pseudo-absence points that is equal to number of presences method = \"random\", rlayer = somevar, calibarea = ca ) # Visualize species presences and pseudo-absences plot( sp_region, col = \"gray80\", legend = FALSE, axes = FALSE, xlim = c(289347, 353284), ylim = c(-598052, -520709), main = \"Presence = yellow, Pseudo-absence = black\") plot(ca, add=TRUE) points(psa[,c(\"x\", \"y\")], cex=0.8, pch=16, col = \"black\") # Pseudo-absences points(hespero[,c(\"x\", \"y\")], col = \"yellow\", pch = 16, cex = 1.5) # Presences # Bind a presences and pseudo-absences hespero_pa <- bind_rows(hespero, psa) hespero_pa # Presence-Pseudo-absence database #> # A tibble: 42 × 3 #> x y pr_ab #> #> 1 316923. -557843. 1 #> 2 317155. -559234. 1 #> 3 316960. -558186. 1 #> 4 314347. -559648. 1 #> 5 317348. -557349. 1 #> 6 316753. -559679. 1 #> 7 316777. -558644. 1 #> 8 317050. -559043. 1 #> 9 316655. -559928. 1 #> 10 316418. -567439. 1 #> # ℹ 32 more rows"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v05_Rare_species_example.html","id":"partition-data-for-evaluating-models","dir":"Articles","previous_headings":"Intro","what":"Partition data for evaluating models","title":"flexsdm: Modeling a rare species","text":"evaluate model performance, need specify data testing training. flexsdm offers range random spatial random data partition methods evaluating SDMs. use repeated K-fold cross-validation, suitable partition approach performing ESM.","code":"set.seed(10) # Repeated K-fold method hespero_pa2 <- part_random( data = hespero_pa, pr_ab = \"pr_ab\", method = c(method = \"rep_kfold\", folds = 5, replicates = 10) )"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v05_Rare_species_example.html","id":"extracting-environmental-values","dir":"Articles","previous_headings":"Intro","what":"Extracting environmental values","title":"flexsdm: Modeling a rare species","text":"Next, extract values four environmental predictors presence pseudo-absence locations.","code":"hespero_pa3 <- sdm_extract( data = hespero_pa2, x = 'x', y = 'y', env_layer = somevar, variables = c('aet', 'cwd', 'tmx', 'tmn') )"},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/articles/v05_Rare_species_example.html","id":"standard-models","dir":"Articles","previous_headings":"Intro > Modeling","what":"Standard models","title":"flexsdm: Modeling a rare species","text":"First, let’s use three standard algorithms model distribution Hesperocyparis stephensonii: GLM, GBM, SVM. case, use calibration area making predictions.","code":"mglm <- fit_glm( data = hespero_pa3, response = 'pr_ab', predictors = c('aet', 'cwd', 'tmx', 'tmn'), partition = '.part', thr = 'max_sens_spec' ) #> Formula used for model fitting: #> pr_ab ~ aet + cwd + tmx + tmn + I(aet^2) + I(cwd^2) + I(tmx^2) + I(tmn^2) #> Replica number: 1/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 2/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 3/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 4/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 5/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 6/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 7/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 8/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 9/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 10/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 mgbm <- fit_gbm( data = hespero_pa3, response = 'pr_ab', predictors = c('aet', 'cwd', 'tmx', 'tmn'), partition = '.part', thr = 'max_sens_spec' ) #> Formula used for model fitting: #> pr_ab ~ aet + cwd + tmx + tmn #> Replica number: 1/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 2/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 3/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 4/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 5/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 6/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 7/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 8/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 9/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 10/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 msvm <- fit_svm( data = hespero_pa3, response = 'pr_ab', predictors = c('aet', 'cwd', 'tmx', 'tmn'), partition = '.part', thr = 'max_sens_spec' ) #> Formula used for model fitting: #> pr_ab ~ aet + cwd + tmx + tmn #> Replica number: 1/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 2/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 3/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 4/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 5/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 6/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 7/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 8/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 9/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 10/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 mpred <- sdm_predict( models = list(mglm, mgbm, msvm), pred = somevar, con_thr = TRUE, predict_area = ca ) #> Predicting list of individual models"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v05_Rare_species_example.html","id":"ensemble-of-small-models","dir":"Articles","previous_headings":"Intro > Modeling","what":"Ensemble of small models","title":"flexsdm: Modeling a rare species","text":"Now let’s try algorithms ESM approach. Note predicting ESM, possible process one time.","code":"eglm <- esm_glm( data = hespero_pa3, response = 'pr_ab', predictors = c('aet', 'cwd', 'tmx', 'tmn'), partition = '.part', thr = 'max_sens_spec' ) #> | | | 0% | |============ | 17% | |======================= | 33% | |=================================== | 50% | |=============================================== | 67% | |========================================================== | 83% | |======================================================================| 100% egbm <- esm_gbm( data = hespero_pa3, response = 'pr_ab', predictors = c('aet', 'cwd', 'tmx', 'tmn'), partition = '.part', thr = 'max_sens_spec' ) #> | | | 0% | |============ | 17% | |======================= | 33% | |=================================== | 50% | |=============================================== | 67% | |========================================================== | 83% | |======================================================================| 100% esvm <- esm_svm( data = hespero_pa3, response = 'pr_ab', predictors = c('aet', 'cwd', 'tmx', 'tmn'), partition = '.part', thr = 'max_sens_spec' ) #> | | | 0% | |============ | 17% | |======================= | 33% | |=================================== | 50% | |=============================================== | 67% | |========================================================== | 83% | |======================================================================| 100% eglm_pred <- sdm_predict( models = eglm , pred = somevar, con_thr = TRUE, predict_area = ca ) #> Predicting ensemble of small models egbm_pred <- sdm_predict( models = egbm , pred = somevar, con_thr = TRUE, predict_area = ca ) #> Predicting ensemble of small models esvm_pred <- sdm_predict( models = esvm, pred = somevar, con_thr = TRUE, predict_area = ca ) #> Predicting ensemble of small models"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v05_Rare_species_example.html","id":"comparing-our-models","dir":"Articles","previous_headings":"Intro","what":"Comparing our models","title":"flexsdm: Modeling a rare species","text":"First, let’s take look spatial predictions models. spatial outputs suggest standard models tend predict broader areas high suitability values ESMs. Next, look performance metrics models, based repeated k-folds cross-validation partition method. can easily done using “sdm_summarize()” function flexsdm. , can see AUC, TSS, Jaccard index higher ESMs corresponding standard model. However, Boyce index Inverse Mean Absolute Error slightly higher standard models.","code":"par(mfrow = c(3, 2)) plot(mpred$glm, main = 'Standard GLM') #points(hespero$x, hespero$y, pch = 19) plot(eglm_pred[[1]], main = 'ESM GLM') #points(hespero$x, hespero$y, pch = 19) plot(mpred$gbm, main = 'Standard GBM') #points(hespero$x, hespero$y, pch = 19) plot(egbm_pred[[1]], main = 'ESM GBM') #points(hespero$x, hespero$y, pch = 19) plot(mpred$svm, main = 'Standard SVM') #points(hespero$x, hespero$y, pch = 19) plot(esvm_pred[[1]], main = 'ESM SVM') #points(hespero$x, hespero$y, pch = 19) merge_df <- sdm_summarize(models = list(mglm, mgbm, msvm, eglm, egbm, esvm)) knitr::kable( merge_df %>% dplyr::select( model, AUC = AUC_mean, TSS = TSS_mean, JACCARD = JACCARD_mean, BOYCE = BOYCE_mean, IMAE = IMAE_mean ) )"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v05_Rare_species_example.html","id":"conclusions","dir":"Articles","previous_headings":"Intro","what":"Conclusions","title":"flexsdm: Modeling a rare species","text":"Modeling decisions context-dependent must made case--case basis. However, ESM useful approach practitioners interested modeling rare species want avoid common model overfitting issues. always producing SDMs “real-world” applications, important consider spatial prediction patterns along multiple model performance metrics.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/articles/v05_Rare_species_example.html","id":"references","dir":"Articles","previous_headings":"Intro","what":"References","title":"flexsdm: Modeling a rare species","text":"Lomba, ., L. Pellissier, C. Randin, J. Vicente, F. Moreira, J. Honrado, . Guisan. 2010. Overcoming rare species modelling paradox: novel hierarchical framework applied Iberian endemic plant. Biological conservation 143:2647–2657. https://doi.org/10.1016/j.biocon.2010.07.007 Breiner, F. T., Guisan, ., Bergamini, ., & Nobis, M. P. (2015). Overcoming limitations modelling rare species using ensembles small models. Methods Ecology Evolution, 6(10), 1210–1218. https://doi.org/10.1111/2041-210X.12403 Breiner, F. T., Nobis, M. P., Bergamini, ., & Guisan, . (2018). Optimizing ensembles small models predicting distribution species occurrences. Methods Ecology Evolution, 9(4), 802–808. https://doi.org/10.1111/2041-210X.12957 Dubos, N., Montfort, F., Grinand, C., Nourtier, M., Deso, G., Probst, J.-M., Razafimanahaka, J. H., Andriantsimanarilafy, R. R., Rakotondrasoa, E. F., Razafindraibe, P., Jenkins, R., & Crottini, . (2021). narrow-ranging species doomed extinction? Projected dramatic decline future climate suitability two highly threatened species. Perspectives Ecology Conservation, S2530064421000894. https://doi.org/10.1016/j.pecon.2021.10.002","code":""},{"path":"https://sjevelazco.github.io/flexsdm/articles/v06_Extrapolation_example.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"flexsdm: Tools to explore extrapolation in SDMs","text":"Many SDM applications require model extrapolation, e.g., predictions beyond range data set used fit model. example, models often must extrapolate predicting habitat suitability novel environmental conditions induced climate change predicting spread invasive species outside native range based species-environment relationship observed native range. flexsdm, offer new approach (known Shape) evaluating extrapolation truncating spatial predictions based degree extrapolation measured. Shape model-agnostic approach calculating degree extrapolation given projection data point multivariate distance nearest training data point – capturing often complex shape data within environmental space. distances relativized factor reflects dispersion training data environmental space. implemented flexsdm, Shape approach also incorporates adjustable threshold allow binary discrimination acceptable unacceptable degrees extrapolation, based user’s needs applications. information Shape metric, recommend reading article Velazco et al., 2023. vignette, walk evaluate model extrapolation Hesperocyparis stephensonii (Cuyamaca cypress), conifer tree species endemic southern California. species listed Critically Endangered IUCN extremely restricted distribution, found headwaters King Creek San Diego County. Note: tutorial follows generally workflow vignette modeling distribution rare species using ensemble small models (ESM). However, instead constructing ESMs, evaluate model extrapolation predict models extent California Floristic Province (CFP).","code":""},{"path":"https://sjevelazco.github.io/flexsdm/articles/v06_Extrapolation_example.html","id":"data","dir":"Articles","previous_headings":"","what":"Data","title":"flexsdm: Tools to explore extrapolation in SDMs","text":"models, use four environmental variables influence plant distributions California: available evapotranspiration (aet), climatic water deficit (cwd), maximum temperature warmest month (tmx), minimum temperature coldest month (tmn). occurrence data include 21 geo-referenced observations downloaded online database Calflora.","code":"library(flexsdm) library(terra) library(dplyr) library(patchwork) # environmental data somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) names(somevar) <- c(\"cwd\", \"tmn\", \"aet\", \"ppt_jja\") # species occurence data (presence-only) data(hespero) hespero <- hespero %>% dplyr::select(-id) # California ecoregions regions <- system.file(\"external/regions.tif\", package = \"flexsdm\") regions <- terra::rast(regions) regions <- terra::as.polygons(regions) sp_region <- terra::subset(regions, regions$category == \"SCR\") # ecoregion where *Hesperocyparis stephensonii* is found # visualize the species occurrences plot( sp_region, col = \"gray80\", legend = FALSE, axes = FALSE, main = \"Hesperocyparis stephensonii occurrences\" ) points(hespero[, c(\"x\", \"y\")], col = \"black\", pch = 16) cols <- rep(\"gray80\", 8) cols[regions$category == \"SCR\"] <- \"yellow\" terra::inset( regions, loc = \"bottomleft\", scale = .3, col = cols )"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v06_Extrapolation_example.html","id":"delimit-calibration-area","dir":"Articles","previous_headings":"","what":"Delimit calibration area","title":"flexsdm: Tools to explore extrapolation in SDMs","text":"First, must define model’s calibration area. flexsdm package offers several methods defining model calibration area. , use 25-km buffer areas around presence points select pseudo-absence locations.","code":"ca <- calib_area( data = hespero, x = \"x\", y = \"y\", method = c(\"buffer\", width = 25000), crs = crs(somevar) ) # visualize the species occurrences & calibration area plot( sp_region, col = \"gray80\", legend = FALSE, axes = FALSE, main = \"Calibration area and occurrences\" ) plot(ca, add = TRUE) points(hespero[, c(\"x\", \"y\")], col = \"black\", pch = 16)"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v06_Extrapolation_example.html","id":"create-pseudo-absence-data","dir":"Articles","previous_headings":"","what":"Create pseudo-absence data","title":"flexsdm: Tools to explore extrapolation in SDMs","text":"often case rare species, species presence data. However, SDM methods require either pseudo-absence background point data. , use calibration area produce pseudo-absence data can used SDMs.","code":"# Sample the same number of species presences set.seed(10) psa <- sample_pseudoabs( data = hespero, x = \"x\", y = \"y\", n = sum(hespero$pr_ab), # number of pseudo-absence points equal to number of presences method = \"random\", rlayer = somevar, calibarea = ca ) # Visualize species presences and pseudo-absences plot( sp_region, col = \"gray80\", legend = FALSE, axes = FALSE, xlim = c(289347, 353284), ylim = c(-598052, -520709), main = \"Presence = yellow, Pseudo-absence = black\" ) plot(ca, add = TRUE) points(psa[, c(\"x\", \"y\")], cex = 0.8, pch = 16, col = \"black\") # Pseudo-absences points(hespero[, c(\"x\", \"y\")], col = \"yellow\", pch = 16, cex = 1.5) # Presences # Bind a presences and pseudo-absences hespero_pa <- bind_rows(hespero, psa) hespero_pa # Presence-Pseudo-absence database #> # A tibble: 42 × 3 #> x y pr_ab #> #> 1 316923. -557843. 1 #> 2 317155. -559234. 1 #> 3 316960. -558186. 1 #> 4 314347. -559648. 1 #> 5 317348. -557349. 1 #> 6 316753. -559679. 1 #> 7 316777. -558644. 1 #> 8 317050. -559043. 1 #> 9 316655. -559928. 1 #> 10 316418. -567439. 1 #> # ℹ 32 more rows"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v06_Extrapolation_example.html","id":"partition-data-for-evaluating-models","dir":"Articles","previous_headings":"","what":"Partition data for evaluating models","title":"flexsdm: Tools to explore extrapolation in SDMs","text":"evaluate model performance, need specify data testing training. flexsdm offers range random spatial random data partition methods evaluating SDMs. use repeated K-fold cross-validation, suitable partition approach validating SDM data.","code":"set.seed(10) # Repeated K-fold method hespero_pa2 <- part_random( data = hespero_pa, pr_ab = \"pr_ab\", method = c(method = \"rep_kfold\", folds = 5, replicates = 10) )"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v06_Extrapolation_example.html","id":"extracting-environmental-values","dir":"Articles","previous_headings":"","what":"Extracting environmental values","title":"flexsdm: Tools to explore extrapolation in SDMs","text":"Next, extract values four environmental predictors presence pseudo-absence locations.","code":"hespero_pa3 <- sdm_extract( data = hespero_pa2, x = \"x\", y = \"y\", env_layer = somevar, variables = c(\"cwd\", \"tmn\", \"aet\", \"ppt_jja\") )"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v06_Extrapolation_example.html","id":"modeling","dir":"Articles","previous_headings":"","what":"Modeling","title":"flexsdm: Tools to explore extrapolation in SDMs","text":"Let’s use three standard algorithms model distribution Hesperocyparis stephensonii: GLM, GBM, SVM. case, use extent CFP prediction area can evaluate model extrapolation across broad geographic area.","code":"mglm <- fit_glm( data = hespero_pa3, response = \"pr_ab\", predictors = c(\"cwd\", \"tmn\", \"aet\", \"ppt_jja\"), partition = \".part\", thr = \"max_sens_spec\" ) mgbm <- fit_gbm( data = hespero_pa3, response = \"pr_ab\", predictors = c(\"cwd\", \"tmn\", \"aet\", \"ppt_jja\"), partition = \".part\", thr = \"max_sens_spec\" ) msvm <- fit_svm( data = hespero_pa3, response = \"pr_ab\", predictors = c(\"cwd\", \"tmn\", \"aet\", \"ppt_jja\"), partition = \".part\", thr = \"max_sens_spec\" ) mpred <- sdm_predict( models = list(mglm, mgbm, msvm), pred = somevar, con_thr = TRUE, predict_area = NULL )"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v06_Extrapolation_example.html","id":"comparing-our-models","dir":"Articles","previous_headings":"","what":"Comparing our models","title":"flexsdm: Tools to explore extrapolation in SDMs","text":"First, let’s take look spatial predictions models. GLM GBM predict lot suitable habitat far species found!","code":"par(mfrow = c(1, 3)) plot(mpred$glm, main = \"GLM\") # points(hespero$x, hespero$y, pch = 19) plot(mpred$gbm, main = \"GBM\") # points(hespero$x, hespero$y, pch = 19) plot(mpred$svm, main = \"SVM\") # points(hespero$x, hespero$y, pch = 19)"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v06_Extrapolation_example.html","id":"partial-dependence-plots-to-explore-the-impact-of-predictor-conditions-on-suitability","dir":"Articles","previous_headings":"","what":"Partial dependence plots to explore the impact of predictor conditions on suitability","title":"flexsdm: Tools to explore extrapolation in SDMs","text":"Extrapolation reflects issue model handles novel data. , see three algorithms explored tutorial predict pretty different geographic patterns habitat suitability based occurrence/pseudo-absence data environmental predictors. Let’s take look partial dependence plots see marginal effect environmental predictors suitability looks like test models. function allows visualize model may extrapolate outside environmental conditions used training, visualizing “projection” data different color. case, environmental predictors cover extent CFP. flexsdm allows users plot univariate partial dependence plots (p_pdp) bivariate partial dependence plots (p_bpdp); shown model. Note: p_bpdp function allows users option show boundaries training data using either rectangle convex hull approach. use convex hull approach. Uni bivariate partial dependence plots GLM: Uni bivariate partial dependence plots GBM: Uni bivariate partial dependence plots SVM: plots show really interesting story! notably, GLM GBM show consistently high habitat suitability areas much higher actual evapotranspiration narrow range values used train model. However, SVM seems best job estimating high habitat suitability environmental values outside training data. Importantly, models can behave differently depending modeling situation context.","code":"p_pdp(model = mglm$model, training_data = hespero_pa3, projection_data = somevar) p_bpdp(model = mglm$model, training_data = hespero_pa3, training_boundaries = \"convexh\") p_pdp(model = mgbm$model, training_data = hespero_pa3, projection_data = somevar) p_bpdp(model = mgbm$model, training_data = hespero_pa3, training_boundaries = \"convexh\", resolution = 100) p_pdp(model = msvm$model, training_data = hespero_pa3, projection_data = somevar) p_bpdp(model = msvm$model, training_data = hespero_pa3, training_boundaries = \"convexh\")"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v06_Extrapolation_example.html","id":"extrapolation-evaluation","dir":"Articles","previous_headings":"","what":"Extrapolation evaluation","title":"flexsdm: Tools to explore extrapolation in SDMs","text":"Remember species highly restricted southern California! However, two models (GLM GBM) predict high habitat suitability throughout parts CFP, SVM provides conservative predictions. see GLM GBM tend predict high habitat suitability areas environmentally different training conditions. models extrapolating environmental space? Let’s find using “extra_eval” function SDM. function requires input model training data, column specifying presence vs. absence locations, projection data (can SpatRaster tibble containing data used model projection – can reflect larger region, separate region, different time period used model training), metric calculating degree extrapolation (default Mahalanobis distance, though euclidean also option- explore ), number cores parallel processing, aggregation factor, case want measure extrapolation large data set. First look degree extrapolation geographic space using Shape method based Mahalanobis distance. Also distinguish univariate combinatorial extrapolation. Using Mahalanobis distance: output extra_eval function SpatRaster, showing degree extrapolation across projection area, estimated Shape method. can also explore extrapolation suitability patterns environmental geographic space, using just one function. , use p_extra function. function plots ggplot object. Let’s start extrapolation evaluation. plots show areas high extrapolation (dark blue) far training data (shown black) environmental geographic space. higher extrapolation values extrapolation area northwestern portion CFP. Let’s explore univariate combinatorial extrapolation. former defined projecting data outside range training conditions, combinatorial extrapolation area projecting data within range training conditions.","code":"xp_m <- extra_eval( training_data = hespero_pa3, pr_ab = \"pr_ab\", projection_data = somevar, metric = \"mahalanobis\", univar_comb = TRUE, n_cores = 1, aggreg_factor = 1 ) xp_m #> class : SpatRaster #> dimensions : 558, 394, 2 (nrow, ncol, nlyr) #> resolution : 1890, 1890 (x, y) #> extent : -373685.8, 370974.2, -604813.3, 449806.7 (xmin, xmax, ymin, ymax) #> coord. ref. : +proj=aea +lat_0=0 +lon_0=-120 +lat_1=34 +lat_2=40.5 +x_0=0 +y_0=-4000000 +datum=NAD83 +units=m +no_defs #> source(s) : memory #> names : extrapolation, uni_comb #> min values : 0.000, 1 #> max values : 3730.677, 2 cl <- c(\"#FDE725\", \"#B3DC2B\", \"#6DCC57\", \"#36B677\", \"#1F9D87\", \"#25818E\", \"#30678D\", \"#3D4988\", \"#462777\", \"#440154\") par(mfrow = c(1, 2)) plot(xp_m$extrapolation, main = \"Shape metric\", col = cl) plot(xp_m$uni_comb, main = \"Univariate (1) and \\n combinatorial (2) extrapolation\", col = cl) p_extra( training_data = hespero_pa3, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", color_p = \"black\", extra_suit_data = xp_m, projection_data = somevar, geo_space = TRUE, prop_points = 0.05 ) #> Number of cell used to plot 3642 (5%) p_extra( training_data = hespero_pa3, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", color_p = \"black\", extra_suit_data = xp_m$uni_comb, projection_data = somevar, geo_space = TRUE, prop_points = 0.05, color_gradient = c(\"#B3DC2B\", \"#30678D\"), alpha_p = 0.2 ) #> Number of cell used to plot 3642 (5%)"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v06_Extrapolation_example.html","id":"truncating-sdms-predictions-based-on-extrapolation-thresholds","dir":"Articles","previous_headings":"","what":"Truncating SDMs predictions based on extrapolation thresholds","title":"flexsdm: Tools to explore extrapolation in SDMs","text":"Depending user’s end goal, may want exclude suitability values environmentally “” far modeling training data. Shape method allows select extrapolation threshold exclude suitability values. truncating models can use p_extra function explore binary extrapolation patter environmental geographical space. test values 50, 100, 500, comparison. Values 1 (yellow one) depict environmental geographical regions constraint models suitability (truncate). Note lower threshold, restrictive environmental geographic regions used constrain model. Now use function extra_truncate truncate suitability predictions made GLM, GBM, SVM based extrapolation thresholds explored previously. note, threshold selection user-dependent, function allows select multiple thresholds one time compare outputs. Users can also select “trunc_value” within extra_truncate function, specifies value assigned cells exceed extrapolation threshold (also specified function). default 0 users also choose another value reduce suitability. Based maps, can see lower extrapolation threshold, restricted habitat suitability patterns, higher values retain greater amount suitable habitat. Selecting best threshold depend modeling goals objectives, . Want learn Shape extrapolation metrics? Read article “Velazco, S. J. E., Brooke, M. R., De Marco Jr., P., Regan, H. M., & Franklin, J. (2023). far can extrapolate species distribution model? Exploring Shape, novel method. Ecography, 11, e06992. https://doi.org/10.1111/ecog.06992”","code":"p_extra( training_data = hespero_pa3, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", color_p = \"black\", extra_suit_data = as.numeric(xp_m$extrapolation < 50), projection_data = somevar, geo_space = TRUE, prop_points = 0.05, color_gradient = c(\"gray\", \"#FDE725\"), alpha_p = 0.5 ) + plot_annotation(subtitle = \"Binary extrapolation pattern with using a threshold of 50\") #> Number of cell used to plot 3642 (5%) p_extra( training_data = hespero_pa3, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", color_p = \"black\", extra_suit_data = as.numeric(xp_m$extrapolation < 100), projection_data = somevar, geo_space = TRUE, prop_points = 0.05, color_gradient = c(\"gray\", \"#FDE725\"), alpha_p = 0.5 ) + plot_annotation(subtitle = \"Binary extrapolation pattern with using a threshold of 100\") #> Number of cell used to plot 3642 (5%) p_extra( training_data = hespero_pa3, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", color_p = \"black\", extra_suit_data = as.numeric(xp_m$extrapolation < 500), projection_data = somevar, geo_space = TRUE, prop_points = 0.05, color_gradient = c(\"gray\", \"#FDE725\"), alpha_p = 0.5 ) + plot_annotation(subtitle = \"Binary extrapolation pattern with using a threshold of 500\") #> Number of cell used to plot 3642 (5%) glm_trunc <- extra_truncate( suit = mpred$glm, extra = xp_m, threshold = c(50, 100, 500), trunc_value = 0 ) gbm_trunc <- extra_truncate( suit = mpred$gbm, extra = xp_m, threshold = c(50, 100, 500), trunc_value = 0 ) svm_trunc <- extra_truncate( suit = mpred$svm, extra = xp_m, threshold = c(50, 100, 500), trunc_value = 0 ) par(mfrow = c(3, 3)) plot(glm_trunc$`50`, main = \"GLM; extra threshold = 50\", col = cl) plot(glm_trunc$`100`, main = \"GLM; extra threshold = 100\", col = cl) plot(glm_trunc$`500`, main = \"GLM; extra threshold = 500\", col = cl) plot(gbm_trunc$`50`, main = \"GBM; extra threshold = 50\", col = cl) plot(gbm_trunc$`100`, main = \"GBM; extra threshold = 100\", col = cl) plot(gbm_trunc$`500`, main = \"GBM; extra threshold = 500\", col = cl) plot(svm_trunc$`50`, main = \"SVM; extra threshold = 50\", col = cl) plot(svm_trunc$`100`, main = \"SVM; extra threshold = 100\", col = cl) plot(svm_trunc$`500`, main = \"SVM; extra threshold = 500\", col = cl)"},{"path":"https://sjevelazco.github.io/flexsdm/authors.html","id":null,"dir":"","previous_headings":"","what":"Authors","title":"Authors and Citation","text":"Santiago J.E. Velazco. Author, maintainer. Brooke Rose. Author. André F.. Andrade. Author. Ignacio Minoli. Author. Janet Franklin. Author.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/authors.html","id":"citation","dir":"","previous_headings":"","what":"Citation","title":"Authors and Citation","text":"Velazco, S.J.E., Rose, M.B., Andrade, .F.., Minoli, ., Franklin, J. (2022). flexsdm: R package supporting comprehensive flexible species distribution modelling workflow. Methods Ecology Evolution, 13(8) 1661-1669. https://doi.org/10.1111/2041-210X.13874","code":"@Article{, title = {flexsdm: An R package for supporting a comprehensive and flexible species distribution modelling workflow}, author = {Santiago J.E. Velazco and Brooke Rose and André F.A. Andrade and Ignacio Minoli and Janet Franklin}, journal = {Methods in Ecology and Evolution}, year = {2022}, volume = {13}, number = {8}, pages = {1661-1669}, url = {https://onlinelibrary.wiley.com/doi/10.1111/2041-210X.13874}, }"},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/index.html","id":"overview","dir":"","previous_headings":"","what":"Overview","title":"Tools for Data Preparation, Fitting, Prediction, Evaluation, and Post-Processing of Species Distribution Models","text":"Species distribution modeling become standard tool several research areas ecology, conservation biology, biogeography, paleobiogeography, epidemiology. Species distribution modeling area active research theoretical methodological aspects. One exciting features flexsdm high manipulation parametrization capacity based different functions arguments. attributes enable users define complete partial modeling workflow specific modeling situation (e.g., number variables, number records, different algorithms, algorithms tuning, ensemble methods).","code":""},{"path":"https://sjevelazco.github.io/flexsdm/index.html","id":"structure-of-flexsdm","dir":"","previous_headings":"","what":"Structure of flexsdm","title":"Tools for Data Preparation, Fitting, Prediction, Evaluation, and Post-Processing of Species Distribution Models","text":"function flexsdm package organized three major modeling steps","code":""},{"path":"https://sjevelazco.github.io/flexsdm/index.html","id":"id_1-pre-modeling-functions","dir":"","previous_headings":"","what":"1. Pre-modeling functions","title":"Tools for Data Preparation, Fitting, Prediction, Evaluation, and Post-Processing of Species Distribution Models","text":"Set tools prepare modeling input data (e.g., species occurrences thinning, sample pseudo-absences background points, delimitation calibration area). calib_area() Delimit calibration area constructing species distribution models correct_colinvar() Collinearity reduction predictors env_outliers() Integration outliers detection methods environmental space part_random() Data partitioning training testing models part_sblock() Spatial block cross validation part_sband() Spatial band cross validation part_senv() Environmental cross-validation plot_res() Plot different resolutions used part_sblock get_block() Transform spatial partition layer spatial properties environmental variables sample_background() Sample background points sample_pseudoabs() Sampel pseudo-absence sdm_directory() Create directories saving outputs flexsdm sdm_extract() Extract environmental data based x y coordinates occfilt_env() Perform environmental filtering species occurrences occfilt_geo() Perform geographical filtering species occurrences","code":""},{"path":"https://sjevelazco.github.io/flexsdm/index.html","id":"id_2-modeling-functions","dir":"","previous_headings":"","what":"2. Modeling functions","title":"Tools for Data Preparation, Fitting, Prediction, Evaluation, and Post-Processing of Species Distribution Models","text":"includes functions related modeling construction validation. Several can grouped fit_*, tune_*, esm_* family functions. fit_* construct validate models default hyper-parameter values. tune_* construct validate models searching best hyper-parameter values combination. esm_ construct validate Ensemble Small Models.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/index.html","id":"model-evaluation","dir":"","previous_headings":"2. Modeling functions","what":"Model evaluation","title":"Tools for Data Preparation, Fitting, Prediction, Evaluation, and Post-Processing of Species Distribution Models","text":"sdm_eval() Calculate different model performance metrics","code":""},{"path":"https://sjevelazco.github.io/flexsdm/index.html","id":"fit_-functions-family","dir":"","previous_headings":"2. Modeling functions","what":"fit_* functions family","title":"Tools for Data Preparation, Fitting, Prediction, Evaluation, and Post-Processing of Species Distribution Models","text":"fit_gam() Fit validate Generalized Additive Models fit_gau() Fit validate Gaussian Process models fit_gbm() Fit validate Generalized Boosted Regression models fit_glm() Fit validate Generalized Linear Models fit_max() Fit validate Maximum Entropy models fit_net() Fit validate Neural Networks models fit_raf() Fit validate Random Forest models fit_svm() Fit validate Support Vector Machine models","code":""},{"path":"https://sjevelazco.github.io/flexsdm/index.html","id":"tune_-functions-family","dir":"","previous_headings":"2. Modeling functions","what":"tune_* functions family","title":"Tools for Data Preparation, Fitting, Prediction, Evaluation, and Post-Processing of Species Distribution Models","text":"tune_gbm() Fit validate Generalized Boosted Regression models exploration hyper-parameters tune_max() Fit validate Maximum Entropy models exploration hyper-parameters tune_net() Fit validate Neural Networks models exploration hyper-parameters tune_raf() Fit validate Random Forest models exploration hyper-parameters tune_svm() Fit validate Support Vector Machine models exploration hyper-parameters","code":""},{"path":"https://sjevelazco.github.io/flexsdm/index.html","id":"model-ensemble","dir":"","previous_headings":"2. Modeling functions","what":"Model ensemble","title":"Tools for Data Preparation, Fitting, Prediction, Evaluation, and Post-Processing of Species Distribution Models","text":"fit_ensemble() Fit validate ensemble models different ensemble methods","code":""},{"path":"https://sjevelazco.github.io/flexsdm/index.html","id":"esm_-functions-family","dir":"","previous_headings":"2. Modeling functions","what":"esm_* functions family","title":"Tools for Data Preparation, Fitting, Prediction, Evaluation, and Post-Processing of Species Distribution Models","text":"esm_gam() Fit validate Generalized Additive Models Ensemble Small Model approach esm_gau() Fit validate Gaussian Process models Models Ensemble Small Model approach esm_gbm() Fit validate Generalized Boosted Regression models Ensemble Small Model approach esm_glm() Fit validate Generalized Linear Models Ensemble Small Model approach esm_max() Fit validate Maximum Entropy models Ensemble Small Model approach esm_net() Fit validate Neural Networks models Ensemble Small Model approach esm_svm() Fit validate Support Vector Machine models Ensemble Small Model approach","code":""},{"path":"https://sjevelazco.github.io/flexsdm/index.html","id":"id_3-post-modeling-functions","dir":"","previous_headings":"","what":"3. Post-modeling functions","title":"Tools for Data Preparation, Fitting, Prediction, Evaluation, and Post-Processing of Species Distribution Models","text":"Tools related models’ geographical predictions, evaluation, correction. sdm_predict() Spatial predictions individual ensemble model sdm_summarize() Merge model performance tables interp() Raster interpolation two time periods extra_eval() Measure model extrapolation extra_truncate() Constraint suitability values given extrapolation value msdm_priori() Create spatial predictor variables reduce overprediction species distribution models msdm_posteriori() Methods correct overprediction species distribution models based occurrences suitability patterns.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/index.html","id":"id_4-graphical-model-exploration","dir":"","previous_headings":"","what":"4. Graphical model exploration","title":"Tools for Data Preparation, Fitting, Prediction, Evaluation, and Post-Processing of Species Distribution Models","text":"Useful tools visually explore models’ geographical environemtal predictions, model extrapolation, partial depnendece plot. p_pdp() Create partial dependence plot(s) explore marginal effect predictors suitability p_bpdp() Create partial dependence surface plot(s) explore bivariate marginal effect predictors suitability p_extra() Graphical exploration extrapolation suitability pattern environmental geographical space data_pdp() Calculate data construct partial dependence plots data_bpdp() Calculate data construct partial dependence surface plots","code":""},{"path":"https://sjevelazco.github.io/flexsdm/index.html","id":"installation","dir":"","previous_headings":"","what":"Installation","title":"Tools for Data Preparation, Fitting, Prediction, Evaluation, and Post-Processing of Species Distribution Models","text":"can install development version flexsdm github ⚠️ NOTE: version 1.4-22 terra package causing errors trying instal flexsdm. Please, first install version ≥ 1.5-12 terra package available CRAN development version terra flexsdm.","code":"# install.packages(\"remotes\") # For Windows and Mac OS operating systems remotes::install_github(\"sjevelazco/flexsdm\") # For Linux operating system remotes::install_github(\"sjevelazco/flexsdm@HEAD\")"},{"path":"https://sjevelazco.github.io/flexsdm/index.html","id":"package-website","dir":"","previous_headings":"","what":"Package website","title":"Tools for Data Preparation, Fitting, Prediction, Evaluation, and Post-Processing of Species Distribution Models","text":"See package website (https://sjevelazco.github.io/flexsdm/) functions explanation vignettes.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/index.html","id":"package-citation","dir":"","previous_headings":"","what":"Package citation","title":"Tools for Data Preparation, Fitting, Prediction, Evaluation, and Post-Processing of Species Distribution Models","text":"Velazco, S.J.E., Rose, M.B., Andrade, .F.., Minoli, ., Franklin, J. (2022). flexsdm: R package supporting comprehensive flexible species distribution modelling workflow. Methods Ecology Evolution, 13(8) 1661–1669. https://doi.org/10.1111/2041-210X.13874 Test package give us feedback send e-mail sjevelazco@gmail.com.","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/pkg_citation/index.html","id":null,"dir":"Pkg_citation","previous_headings":"","what":"Function reference","title":"Function reference","text":"abies data set containing localities environmental condition Abies (fir tree) species California, USA backg data set containing environmental conditions background points calib_area() Delimit calibration area constructing species distribution models correct_colinvar() Collinearity reduction predictor variables data_bpdp() Calculate data construct partial dependence surface plots data_pdp() Calculate data construct partial dependence plots env_outliers() Integration outliers detection methods environmental space esm_gam() Fit validate Generalized Additive Models based Ensembles Small Models approach esm_gau() Fit validate Gaussian Process models based Ensembles Small Models approach esm_gbm() Fit validate Generalized Boosted Regression models based Ensembles Small Models approach esm_glm() Fit validate Generalized Linear Models based Ensembles Small Models approach esm_max() Fit validate Maximum Entropy Models based Ensemble Small Model approach esm_net() Fit validate Neural Networks based Ensembles Small Models approach esm_svm() Fit validate Support Vector Machine models based Ensembles Small Models approach extra_eval() Measure model extrapolation based Shape extrapolation metric extra_truncate() Truncate suitability predictions based extrapolation value fit_ensemble() Ensemble model fitting validation fit_gam() Fit validate Generalized Additive Models fit_gau() Fit validate Gaussian Process models fit_gbm() Fit validate Generalized Boosted Regression models fit_glm() Fit validate Generalized Linear Models fit_max() Fit validate Maximum Entropy models fit_net() Fit validate Neural Networks models fit_raf() Fit validate Random Forests models fit_svm() Fit validate Support Vector Machine models get_block() Transform spatial partition layer spatial properties environmental variables hespero data set containing localities Hesperocyparis stephensonii species California, USA homogenize_na() Homogenize cells NAs across layers interp() Raster interpolation two time periods msdm_posteriori() Methods correct overprediction species distribution models based occurrences suitability patterns. msdm_priori() Create spatial predictor variables reduce overprediction species distribution models occfilt_env() Perform environmental filtering species occurrences occfilt_geo() Perform geographical filtering species occurrences part_random() Conventional data partitioning methods part_sband() Spatial band cross-validation part_sblock() Spatial block cross-validation part_senv() Environmental spatial cross-validation plot_res() Plot different resolutions used part_sblock p_bpdp() Bivariate partial dependence plot p_extra() Graphical exploration extrapolation suitability pattern environmental geographical space p_pdp() Partial Dependent Plot sample_background() Sample background points sample_pseudoabs() Sample pseudo-absences sdm_directory() Create directories saving outputs flexsdm sdm_eval() Calculate different model performance metrics sdm_extract() Extract environmental data values spatial raster based x y coordinates sdm_predict() Spatial predictions individual ensemble models sdm_summarize() Merge model performance tables spp data set containing presences absences three virtual species tune_gbm() Fit validate Generalized Boosted Regression models exploration hyper-parameters optimize performance tune_max() Fit validate Maximum Entropy models exploration hyper-parameters optimize performance tune_net() Fit validate Neural Networks models exploration hyper-parameters tune_raf() Fit validate Random Forest models exploration hyper-parameters optimize performance tune_svm() Fit validate Support Vector Machine models exploration hyper-parameters optimize performance","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/abies.html","id":null,"dir":"Reference","previous_headings":"","what":"A data set containing localities and environmental condition of an Abies (fir tree) species in California, USA — abies","title":"A data set containing localities and environmental condition of an Abies (fir tree) species in California, USA — abies","text":"data set containing localities environmental condition Abies (fir tree) species California, USA","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/abies.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"A data set containing localities and environmental condition of an Abies (fir tree) species in California, USA — abies","text":"","code":"abies"},{"path":"https://sjevelazco.github.io/flexsdm/reference/abies.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"A data set containing localities and environmental condition of an Abies (fir tree) species in California, USA — abies","text":"tibble object 5000 rows 10 variables: ID presences absences records ID pr_ab presence absences denoted 1 0 respectively x y columns coordinates Albers Equal Area Conic coordinate system column aet landform columns values environmental variables locality","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/abies.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"A data set containing localities and environmental condition of an Abies (fir tree) species in California, USA — abies","text":"","code":"if (FALSE) { # \\dontrun{ require(dplyr) data(\"abies\") abies } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/backg.html","id":null,"dir":"Reference","previous_headings":"","what":"A data set containing environmental conditions of background points — backg","title":"A data set containing environmental conditions of background points — backg","text":"data set containing environmental conditions background points","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/backg.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"A data set containing environmental conditions of background points — backg","text":"","code":"backg"},{"path":"https://sjevelazco.github.io/flexsdm/reference/backg.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"A data set containing environmental conditions of background points — backg","text":"tibble object 5000 rows 10 variables: pr_ab background point denoted 0 x y columns geographical coordinates column aet landform columns values environmental variables coordinate locations","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/backg.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"A data set containing environmental conditions of background points — backg","text":"","code":"if (FALSE) { # \\dontrun{ require(dplyr) data(\"backg\") backg } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/calib_area.html","id":null,"dir":"Reference","previous_headings":"","what":"Delimit calibration area for constructing species distribution models — calib_area","title":"Delimit calibration area for constructing species distribution models — calib_area","text":"function offers different methods define calibration area. output used flexsdm functions like sample_backgroud, sample_pseudoabs, sdm_predict, among others","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/calib_area.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Delimit calibration area for constructing species distribution models — calib_area","text":"","code":"calib_area(data, x, y, method, groups = NULL, crs = NULL)"},{"path":"https://sjevelazco.github.io/flexsdm/reference/calib_area.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Delimit calibration area for constructing species distribution models — calib_area","text":"data data.frame tibble. Database presences x character. Column name longitude data y character. Column name latitude data method character. Method used delimiting calibration area. necessary concatenate (c()) different objects argument. following methods implemented: buffer: calibration area defined buffer around presences. Usage method = c('buffer', width=40000). value buffer width m must provided CRS longitude/latitude, map units cases mcp: calibration area defined minimum convex polygon. Usage method = 'mcp'. bmcp: calibration area defined buffered minimum convex polygon buffer width. Usage method = c('bmcp', width=40000). value buffer width m must provided CRS longitude/latitude, map units cases mask: calibration area defined selected polygons spatial vector object intersected presences. Usage method = c(\"mask\", clusters, \"DN\"). second concatenated element must SpatVector, third element character column name SpatVector used filtering polygons. groups character. Column name indicating differentiated subsets points. used mcp bmcp method. Default NULL crs character. Coordinate reference system used transforming occurrences outputs. set NULL, result mask method crs SpatVector used. Define crs mandatory buffer, mcp bmcp method.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/calib_area.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Delimit calibration area for constructing species distribution models — calib_area","text":"SpatVector","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/calib_area.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Delimit calibration area for constructing species distribution models — calib_area","text":"","code":"if (FALSE) { # \\dontrun{ require(terra) require(dplyr) data(\"spp\") clusters <- system.file(\"external/clusters.shp\", package = \"flexsdm\") clusters <- terra::vect(clusters) single_spp <- spp %>% dplyr::filter(species == \"sp1\") %>% dplyr::filter(pr_ab == 1) %>% dplyr::select(-pr_ab) plot(clusters) points(single_spp[-1], col=\"red\") crs(clusters, proj=TRUE) # coordinate reference system (CRS) used for this points database # note that the unit of this CRS is in m, consequently the buffer width # will be interpreted in m too # buffer method ca_1 <- calib_area( data = single_spp, x = \"x\", y = \"y\", method = c(\"buffer\", width = 40000), crs = crs(clusters) ) plot(ca_1) points(single_spp[, 2:3], pch = 19, cex = 0.5) # mcp method ca_2 <- calib_area( data = single_spp, x = \"x\", y = \"y\", method = \"mcp\", crs = crs(clusters) ) plot(ca_2) points(single_spp[, 2:3], pch = 19, cex = 0.5) # mcp method for different groups single_spp <- single_spp %>% mutate(groups = ifelse(x > 150000, \"a\", \"b\")) plot(single_spp[, 2:3], pch = 19, col = \"blue\") points(single_spp[single_spp$groups == \"a\", 2:3], col = \"red\", pch = 19) points(single_spp[, 2:3]) ca_2.1 <- calib_area( data = single_spp, x = \"x\", y = \"y\", method = c(\"mcp\"), crs = crs(clusters), groups = \"groups\" ) plot(ca_2.1) points(single_spp[, 2:3], pch = 19, cex = 0.5) # bmcp method ca_3 <- calib_area( data = single_spp, x = \"x\", y = \"y\", method = c(\"bmcp\", width = 30000), crs = crs(clusters) ) plot(ca_3) points(single_spp[, 2:3], pch = 19, cex = 0.5) # bmcp method for different groups ca_3.1 <- calib_area( data = single_spp, x = \"x\", y = \"y\", method = c(\"bmcp\", width = 30000), crs = crs(clusters), groups = \"groups\" ) plot(ca_3.1) points(single_spp[, 2:3], pch = 19, cex = 0.5) # mask method plot(clusters) names(clusters) ca_3.1 <- calib_area( data = single_spp, x = \"x\", y = \"y\", method = c(\"mask\", clusters, \"clusters\"), ) plot(ca_3.1) points(single_spp[, 2:3], pch = 19, cex = 0.5, col = \"red\") } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/correct_colinvar.html","id":null,"dir":"Reference","previous_headings":"","what":"Collinearity reduction of predictor variables — correct_colinvar","title":"Collinearity reduction of predictor variables — correct_colinvar","text":"Collinearity reduction predictor variables","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/correct_colinvar.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Collinearity reduction of predictor variables — correct_colinvar","text":"","code":"correct_colinvar( env_layer, method, proj = NULL, save_proj = NULL, restric_to_region = NULL, restric_pca_proj = FALSE, maxcell = NULL )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/correct_colinvar.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Collinearity reduction of predictor variables — correct_colinvar","text":"env_layer SpatRaster object class SpatRaster containing predictors. function allow categorical variables method character. Collinearity reduction method. necessary provide vector argument. next methods implemented: pearson: Highlights correlated variables according Pearson correlation. threshold maximum correlation must specified. Otherwise, threshold 0.7 defined default. Usage method = c('pearson', th='0.7'). vif: Select variables Variance Inflation Factor, threshold can specified user. Otherwise, threshold 10 defined default.Usage method = c('vif', th = '10'). pca: Perform Principal Component Analysis use principal components new predictors. selected components account 95% whole variation system. Usage method = c('pca'). fa: Perform Factorial Analysis select, original predictors, number factors defined Broken-Stick variables highest correlation factors selected. Usage method = c('fa'). proj character. used pca method. Path folder contains sub-folders different projection scenarios. Variables names must names raster used env_layer argument. Usage proj = \"C:/User/Desktop/Projections\" (see Details use argument) save_proj character. Directory save PCA projection. Default NULL. restric_to_region SpatVector. Area used restrict cells env_layer moment perform collinearity reduction. Default: NULL. restric_pca_proj logical. Area used restrict geographically PCA projection within SpatVector used restric_to_region. use PCA analysis. Default: FALSE. maxcell numeric. Number raster cells randomly sampled. Taking sample useful reduce memory usage large rasters. NULL, function use raster cells. Default NULL. Usage maxcell = 50000.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/correct_colinvar.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Collinearity reduction of predictor variables — correct_colinvar","text":"#' 'pearson', returns list following elements: cor_table: matrix object pairwise correlation values environmental variables cor_variables: list object length number environmental values containing pairwise relations exceeded correlation threshold one environmental variables 'vif' method, returns list following elements: env_layer: SpatRaster object selected environmental variables removed_variables: character vector removed environmental variables vif_table: data frame VIF values environmental variables 'pca' method, returns list following elements: env_layer: SpatRaster scores selected principal component (PC) sum 95% whole variation original environmental variables coefficients: matrix coefficient principal component (PC) predictors cumulative_variance: tibble cumulative variance explained selected principal component (PC) 'fa' method, returns list following elements: env_layer: SpatRaster scores selected variables due correlation factors. number_factors: number factors selected according Broken-Stick criteria, removed_variables: removed variables, uniqueness: uniqueness environmental variable according factorial analysis, loadings: environmental variables loadings chosen factors","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/correct_colinvar.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Collinearity reduction of predictor variables — correct_colinvar","text":"case environmental variables current conditions time periods (future present), recommended perform PCA analysis current environmental condition project PCA time periods. , necessary use “proj” argument. Path folder (e.g., projections) contains sub-folders different projection scenarios (e.g., years emissions). Within sub-folder must stored single multiband rasters environmental variables. example: C:/Users/my_pc/projections/ ├── MRIESM_2050_ssp126 │ └── var1.tif │ └── var2.tif │ └── var3.tif ├── MRIESM_2080_ssp585 │ └── var1.tif │ └── var2.tif │ └── var3.tif ├── UKESM_2050_ssp370 │ └── var1.tif │ └── var2.tif │ └── var3.tif pca method run time projections, correct_colinvar function create Projection_PCA (exact path path object returned function) system sub-folders multiband raster principal components (pcs.tif) C:/Users/my_pc/Projection_PCA/ ├── MRIESM_2050_ssp126 │ └── pcs.tif # multiband tif principal components ├── MRIESM_2080_ssp585 │ └── pcs.tif ├── UKESM_2050_ssp370 │ └── pcs.tif","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/correct_colinvar.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Collinearity reduction of predictor variables — correct_colinvar","text":"","code":"if (FALSE) { # \\dontrun{ require(terra) require(dplyr) somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) # Perform pearson collinearity control var <- correct_colinvar(env_layer = somevar, method = c(\"pearson\", th = \"0.7\")) var$cor_table var$cor_variables # For all correct_colinvar methods it is possible to take a sample or raster to reduce memory var <- correct_colinvar(env_layer = somevar, method = c(\"pearson\", th = \"0.7\"), maxcell = 10000) var$cor_table var$cor_variables # Perform vif collinearity control var <- correct_colinvar(env_layer = somevar, method = c(\"vif\", th = \"8\")) var$env_layer var$removed_variables var$vif_table # Perform pca collinearity control var <- correct_colinvar(env_layer = somevar, method = c(\"pca\")) plot(var$env_layer) var$env_layer var$coefficients var$cumulative_variance # Perform pca collinearity control with different projections ## Below will be created a set of folders to simulate the structure of the directory where ## environmental variables are stored for different scenarios dir_sc <- file.path(tempdir(), \"projections\") dir.create(dir_sc) dir_sc <- file.path(dir_sc, c('scenario_1', 'scenario_2')) sapply(dir_sc, dir.create) somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) terra::writeRaster(somevar, file.path(dir_sc[1], \"somevar.tif\"), overwrite=TRUE) terra::writeRaster(somevar, file.path(dir_sc[2], \"somevar.tif\"), overwrite=TRUE) ## Perform pca with projections dir_w_proj <- dirname(dir_sc[1]) dir_w_proj var <- correct_colinvar(env_layer = somevar, method = \"pca\", proj = dir_w_proj) var$env_layer var$coefficients var$cumulative_variance var$proj # Perform fa colinearity control var <- correct_colinvar(env_layer = somevar, method = c(\"fa\")) var$env_layer var$number_factors var$removed_variables var$uniqueness var$loadings ##%######################################################%## # # #### Other option to perform PCA #### #### considering cell restricted to a region #### # # ##%######################################################%## # Define a calibration area abies2 <- abies %>% dplyr::select(x, y, pr_ab) %>% dplyr::filter(pr_ab==1) plot(somevar[[1]]) points(abies2[-3]) ca <- calib_area(abies2, x = \"x\", y = \"y\", method = c(\"mcp\"), crs=crs(somevar)) plot(ca, add=T) # Full geographical range to perform PCA pca_fr <- correct_colinvar(env_layer = somevar , method = c(\"pca\"), maxcell = NULL, restric_to_region = NULL, restric_pca_proj = FALSE) # Perform PCA only with cell delimited by polygon used in restric_to_region pca_rr <- correct_colinvar(env_layer = somevar , method = c(\"pca\"), maxcell = NULL, restric_to_region = ca, restric_pca_proj = FALSE) # Perform and predicted PCA only with cell delimited by polygon used in restric_to_region pca_rrp <- correct_colinvar(env_layer = somevar , method = c(\"pca\"), maxcell = NULL, restric_to_region = ca, restric_pca_proj = TRUE) plot(pca_fr$env_layer) # PCA with all cells plot(pca_rr$env_layer) # PCA with calibration area cell but predicted for entire region plot(pca_rrp$env_layer) # PCA performed and predicted for cells within calibration area (ca) } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/data_bpdp.html","id":null,"dir":"Reference","previous_headings":"","what":"Calculate data to construct partial dependence surface plots — data_bpdp","title":"Calculate data to construct partial dependence surface plots — data_bpdp","text":"Calculate data construct Partial dependence surface plot (.e., bivariate dependence plot) two predictor set","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/data_bpdp.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Calculate data to construct partial dependence surface plots — data_bpdp","text":"","code":"data_bpdp( model, predictors, resolution = 50, training_data = NULL, training_boundaries = NULL, projection_data = NULL, clamping = FALSE )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/data_bpdp.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Calculate data to construct partial dependence surface plots — data_bpdp","text":"model model object class \"gam\", \"gbm\", \"glm\", \"graf\", \"ksvm\", \"ksvm\", \"maxnet”, “nnet\", \"randomForest\" model can found first element list returned function fit_, tune_, esm_ function families predictors character. Vector two predictor name(s) plot. NULL predictors plotted. Default NULL resolution numeric. Number equally spaced points predict continuous predictors. Default 50 training_data data.frame. Database response (0,1) predictor values used fit model. Default NULL training_boundaries character. Plot training conditions boundaries based training data (.e., presences, presences absences, etc). training_boundaries = \"convexh\", function delimit training environmental region based convex-hull. training_boundaries = \"rectangle\", function delimit training environmental region based four straight lines. used methods necessary provide data training_data argument. NULL predictors used. Default NULL. projection_data SpatRaster. Raster layer environmental variables used model projection. Default NULL clamping logical. Perform clamping. maxent models. Default FALSE","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/data_bpdp.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Calculate data to construct partial dependence surface plots — data_bpdp","text":"list two tibbles \"pdpdata\" \"resid\". pspdata: data construct partial dependence surface plot, first two column includes values selected environmental variables, third column predicted suitability. training_boundaries: data plot boundaries training data.","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/data_bpdp.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Calculate data to construct partial dependence surface plots — data_bpdp","text":"","code":"if (FALSE) { # \\dontrun{ library(terra) library(dplyr) somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) # environmental data names(somevar) <- c(\"aet\", \"cwd\", \"tmx\", \"tmn\") data(abies) abies2 <- abies %>% select(x, y, pr_ab) abies2 <- sdm_extract(abies2, x = \"x\", y = \"y\", env_layer = somevar ) abies2 <- part_random(abies2, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 5) ) m <- fit_svm( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"cwd\", \"tmx\", \"tmn\"), partition = \".part\", thr = c(\"max_sens_spec\") ) df <- data_bpdp( model = m$model, predictors = c(\"aet\", \"cwd\"), resolution = 50, projection_data = somevar, training_boundaries = \"rectangle\", training_data = abies2, clamping = TRUE ) df names(df) df$pspdata df$training_boundaries # see p_bpdp to construct partial dependence plot with ggplot2 } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/data_pdp.html","id":null,"dir":"Reference","previous_headings":"","what":"Calculate data to construct partial dependence plots — data_pdp","title":"Calculate data to construct partial dependence plots — data_pdp","text":"Calculate data construct partial dependence plots given predictor","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/data_pdp.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Calculate data to construct partial dependence plots — data_pdp","text":"","code":"data_pdp( model, predictors, resolution = 50, resid = FALSE, training_data = NULL, projection_data = NULL, clamping = FALSE )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/data_pdp.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Calculate data to construct partial dependence plots — data_pdp","text":"model model object class \"gam\", \"gbm\", \"glm\", \"graf\", \"ksvm\", \"ksvm\", \"maxnet”, “nnet\", \"randomForest\" model can found first element list returned function fit_, tune_, esm_ function families predictors character. Vector predictor name. resolution numeric. Number equally spaced points predict continuous predictors. Default 50 resid logical. Calculate residuals based training data. Default FALSE training_data data.frame. Database response (0,1) predictor values used fit model. Default NULL projection_data SpatRaster. Raster layer environmental variables used model projection. argument used, function calculate partial dependence curves distinguishing conditions used training projection conditions (.e., projection data present projection area training). Default NULL clamping logical. Perform clamping. maxent models. Default FALSE","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/data_pdp.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Calculate data to construct partial dependence plots — data_pdp","text":"list two tibbles \"pdpdata\" \"resid\". pdpdata: data construct partial dependence plots, first column includes values selected environmental variable, second column predicted suitability, third column range type, two values Training Projecting, referring suitability calculated within outside range training conditions. Third column returned \"projection_data\" argument used resid: data plot residuals. first column includes values selected environmental variable second column predicted suitability.","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/data_pdp.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Calculate data to construct partial dependence plots — data_pdp","text":"","code":"if (FALSE) { # \\dontrun{ library(terra) library(dplyr) somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) # environmental data names(somevar) <- c(\"aet\", \"cwd\", \"tmx\", \"tmn\") data(abies) abies2 <- abies %>% select(x, y, pr_ab) abies2 <- sdm_extract(abies2, x = \"x\", y = \"y\", env_layer = somevar ) abies2 <- part_random(abies2, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 5) ) svm_t1 <- fit_svm( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"cwd\", \"tmx\", \"tmn\"), partition = \".part\", thr = c(\"max_sens_spec\") ) df <- data_pdp( model = svm_t1$model, predictors = c(\"aet\"), resolution = 100, resid = TRUE, projection_data = somevar, training_data = abies2, clamping = FALSE ) df names(df) df$pdpdata df$resid plot(df$pdpdata[1:2], type = \"l\") points(df$resid[1:2], cex = 0.5) # see p_pdp to construct partial dependence plot with ggplot2 } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/data_psp.html","id":null,"dir":"Reference","previous_headings":"","what":"Calculate data to construct partial dependence surface plots — data_psp","title":"Calculate data to construct partial dependence surface plots — data_psp","text":"Calculate data construct Partial dependence surface plot (.e., bivariate dependence plot) two predictor set","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/data_psp.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Calculate data to construct partial dependence surface plots — data_psp","text":"","code":"data_psp( model, predictors, resolution = 50, training_data = NULL, pchull = FALSE, projection_data = NULL, clamping = FALSE )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/data_psp.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Calculate data to construct partial dependence surface plots — data_psp","text":"model model object class \"gam\", \"gbm\", \"glm\", \"graf\", \"ksvm\", \"ksvm\", \"maxnet”, “nnet\", \"randomForest\" model can found first element list returned function fit_, tune_, esm_ function families predictors character. Vector two predictor name(s) plot. NULL predictors plotted. Default NULL resolution numeric. Number equally spaced points predict continuous predictors. Default 50 training_data data.frame. Database response (0,1) predictor values used fit model. Default NULL pchull logical. Extract convex-hull limit training data. Default FALSE projection_data SpatRaster. Raster layer environmental variables used model projection. Default NULL clamping logical. Perform clamping. maxent models. Default FALSE","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/data_psp.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Calculate data to construct partial dependence surface plots — data_psp","text":"list two tibbles \"pdpdata\" \"resid\". pspdata: data construct partial dependence surface plot, first two column includes values selected environmental variables, third column predicted suitability. pchull: data plot residuals convex hull polygon bounding calibration data.","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/data_psp.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Calculate data to construct partial dependence surface plots — data_psp","text":"","code":"if (FALSE) { library(terra) library(dplyr) somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) # environmental data names(somevar) <- c(\"aet\", \"cwd\", \"tmx\", \"tmn\") data(abies) abies2 <- abies %>% select(x, y, pr_ab) abies2 <- sdm_extract(abies2, x = \"x\", y = \"y\", env_layer = somevar ) abies2 <- part_random(abies2, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 5) ) m <- fit_svm( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"cwd\", \"tmx\", \"tmn\"), partition = \".part\", thr = c(\"max_sens_spec\") ) df <- data_psp( model = m$model, predictors = c(\"aet\", \"cwd\"), resolution = 50, projection_data = somevar, pchull = TRUE, training_data = abies2, clamping = TRUE ) df names(df) df$pspdata df$pchull # see p_psp to construct partial dependence plot with ggplot2 }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/env_outliers.html","id":null,"dir":"Reference","previous_headings":"","what":"Integration of outliers detection methods in environmental space — env_outliers","title":"Integration of outliers detection methods in environmental space — env_outliers","text":"function performs different methods detecting outliers species distribution data based environmental conditions occurrences. methods need presence absence data (e.g. Two-class Support Vector Machine Random Forest) use presences (e.g. Reverse Jackknife, Box-plot, Random Forest outliers) . Outlier detection can useful procedure occurrence data cleaning (Chapman 2005, Liu et al., 2018).","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/env_outliers.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Integration of outliers detection methods in environmental space — env_outliers","text":"","code":"env_outliers(data, x, y, pr_ab, id, env_layer)"},{"path":"https://sjevelazco.github.io/flexsdm/reference/env_outliers.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Integration of outliers detection methods in environmental space — env_outliers","text":"data data.frame tibble presence (presence-absence) records, coordinates x character. Column name longitude data. y character. Column name latitude data. pr_ab character. Column name presence absence data (.e. 1 0) id character. Column name row id. row (record) must unique code. env_layer SpatRaster. Raster environmental variables","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/env_outliers.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Integration of outliers detection methods in environmental space — env_outliers","text":"tibble object database used 'data' argument seven additional columns, 1 0 denote presence detected outliers .out_bxpt: outliers detected Box-plot method .out_jack: outliers detected Reverse Jackknife method .out_svm: outliers detected Support Vector Machine method .out_rf: outliers detected Random Forest method .out_rfout: outliers detected Random Forest Outliers method .out_sum: frequency presences records detected outliers based previews methods (values 0 6).","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/env_outliers.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Integration of outliers detection methods in environmental space — env_outliers","text":"function apply outliers detection methods occurrence data. Box-plot Reverse Jackknife method test outliers variable individually, occurrence behaves outlier least one variable highlighted outlier. user uses presence data, Support Vector Machine Random Forest Methods performed. Support Vector Machine Random Forest performed default hyper-parameter values. case species < 7 occurrences, function perform methods (.e. additional columns 0 values); nonetheless, return tibble additional columns 0 1. information methods, see Chapman (2005), Liu et al. (2018), Velazco et al. (2022).","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/env_outliers.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Integration of outliers detection methods in environmental space — env_outliers","text":"Chapman, . D. (2005). Principles methods data cleaning: Primary Species Species- Occurrence Data. version 1.0. Report Global Biodiversity Information Facility, Copenhagen. p72. http://www.gbif.org/document/80528 Liu, C., White, M., & Newell, G. (2018). Detecting outliers species distribution data. Journal Biogeography, 45(1), 164 - 176. https://doi.org/10.1111/jbi.13122 Velazco, S.J.E.; Bedrij, N..; Keller, H..; Rojas, J.L.; Ribeiro, B.R.; De Marco, P. (2022) Quantifying role protected areas safeguarding uses biodiversity. Biological Conservation, xx(xx) xx-xx. https://doi.org/10.1016/j.biocon.2022.109525","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/env_outliers.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Integration of outliers detection methods in environmental space — env_outliers","text":"","code":"if (FALSE) { # \\dontrun{ require(dplyr) require(terra) require(ggplot2) # Environmental variables somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) # Species occurrences data(\"spp\") spp spp1 <- spp %>% dplyr::filter(species == \"sp1\") somevar[[1]] %>% plot() points(spp1 %>% filter(pr_ab == 1) %>% select(x, y), col = \"blue\", pch = 19) points(spp1 %>% filter(pr_ab == 0) %>% select(x, y), col = \"red\", cex = 0.5) spp1 <- spp1 %>% mutate(idd = 1:nrow(spp1)) # Detect outliers outs_1 <- env_outliers( data = spp1, pr_ab = \"pr_ab\", x = \"x\", y = \"y\", id = \"idd\", env_layer = somevar ) # How many outliers were detected by different methods? out_pa <- outs_1 %>% dplyr::select(starts_with(\".\"), -.out_sum) %>% apply(., 2, function(x) sum(x, na.rm = T)) out_pa # How many outliers were detected by the sum of different methods? outs_1 %>% dplyr::group_by(.out_sum) %>% dplyr::count() # Let explor where are locate records highlighted as outliers outs_1 %>% dplyr::filter(pr_ab == 1, .out_sum > 0) %>% ggplot(aes(x, y)) + geom_point(aes(col = factor(.out_sum))) + facet_wrap(. ~ factor(.out_sum)) # Detect outliers only with presences outs_2 <- env_outliers( data = spp1 %>% dplyr::filter(pr_ab == 1), pr_ab = \"pr_ab\", x = \"x\", y = \"y\", id = \"idd\", env_layer = somevar ) # How many outliers were detected by different methods out_p <- outs_2 %>% dplyr::select(starts_with(\".\"), -.out_sum) %>% apply(., 2, function(x) sum(x, na.rm = T)) # How many outliers were detected by the sum of different methods? outs_2 %>% dplyr::group_by(.out_sum) %>% dplyr::count() # Let explor where are locate records highlighted as outliers outs_2 %>% dplyr::filter(pr_ab == 1, .out_sum > 0) %>% ggplot(aes(x, y)) + geom_point(aes(col = factor(.out_sum))) + facet_wrap(. ~ factor(.out_sum)) # Comparison of function outputs when using it with # presences-absences or only presences data. bind_rows(out_p, out_pa) # Because the second case only were used presences, outliers methods # based in Random Forest (.out_rf) and Support Vector Machines (.out_svm) # were not performed. } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_gam.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit and validate Generalized Additive Models based on Ensembles of Small Models approach — esm_gam","title":"Fit and validate Generalized Additive Models based on Ensembles of Small Models approach — esm_gam","text":"function constructs Generalized Additive Models using Ensembles Small Models (ESM) approach (Breiner et al., 2015, 2018).","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_gam.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit and validate Generalized Additive Models based on Ensembles of Small Models approach — esm_gam","text":"","code":"esm_gam(data, response, predictors, partition, thr = NULL, k = 3)"},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_gam.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit and validate Generalized Additive Models based on Ensembles of Small Models approach — esm_gam","text":"data data.frame. Database response (0,1) predictors values. response character. Column name species absence-presence data (0,1) predictors character. Vector column names quantitative predictor variables (.e. continuous variables). function allow categorical variables can construct models continuous variables. Usage predictors = c(\"aet\", \"cwd\", \"tmin\"). partition character. Column name training validation partition groups. thr character. Threshold used get binary suitability values (.e. 0,1). useful threshold-dependent performance metrics. possible use one threshold type. necessary provide vector argument. following threshold criteria available: equal_sens_spec: Threshold sensitivity specificity equal. max_sens_spec: Threshold sum sensitivity specificity highest (aka threshold maximizes TSS). max_jaccard: threshold Jaccard index highest. max_sorensen: threshold Sorensen index highest. max_fpb: threshold FPB (F-measure presence-background data) highest. sensitivity: Threshold based specified sensitivity value. Usage thr = c('sensitivity', sens='0.6') thr = c('sensitivity'). 'sens' refers sensitivity value. sensitivity value specified, default value 0.9. user wants include one threshold type, necessary concatenate threshold types, e.g., thr=c('max_sens_spec', 'max_jaccard'), thr=c('max_sens_spec', 'sensitivity', sens='0.8'), thr=c('max_sens_spec', 'sensitivity'). Function use thresholds threshold specified k integer. dimension basis used represent smooth term. Default 3. ESM proposed fit models little data, recommend using small values parameter.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_gam.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit and validate Generalized Additive Models based on Ensembles of Small Models approach — esm_gam","text":"list object : esm_model: list \"gam\" class object mgcv package bivariate model. object can used predicting ensemble small models sdm_predict function. predictors: tibble variables use modeling. performance: Performance metrics (see sdm_eval). Threshold dependent metrics calculated based threshold specified argument.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_gam.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Fit and validate Generalized Additive Models based on Ensembles of Small Models approach — esm_gam","text":"method consists creating bivariate models pair-wise combinations predictors perform ensemble based average suitability weighted Somers' D metric (D = 2 x (AUC -0.5)). ESM recommended modeling species occurrences. function allow categorical variables use types variables problematic using occurrences. detail see Breiner et al. (2015, 2018). function fits GAM using mgvc package, Binomial distribution family thin plate regression spline smoothing basis (see ?mgvc::s).","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_gam.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Fit and validate Generalized Additive Models based on Ensembles of Small Models approach — esm_gam","text":"Breiner, F. T., Guisan, ., Bergamini, ., & Nobis, M. P. (2015). Overcoming limitations modelling rare species using ensembles small models. Methods Ecology Evolution, 6(10), 1210-218. https://doi.org/10.1111/2041-210X.12403 Breiner, F. T., Nobis, M. P., Bergamini, ., & Guisan, . (2018). Optimizing ensembles small models predicting distribution species occurrences. Methods Ecology Evolution, 9(4), 802-808. https://doi.org/10.1111/2041-210X.12957","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_gam.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit and validate Generalized Additive Models based on Ensembles of Small Models approach — esm_gam","text":"","code":"if (FALSE) { # \\dontrun{ data(\"abies\") require(dplyr) # Using k-fold partition method set.seed(10) abies2 <- abies %>% na.omit() %>% group_by(pr_ab) %>% dplyr::slice_sample(n = 10) %>% group_by() abies2 <- part_random( data = abies2, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 3) ) abies2 # Without threshold specification and with kfold esm_gam_t1 <- esm_gam( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"cwd\", \"tmin\", \"ppt_djf\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), partition = \".part\", thr = NULL ) esm_gam_t1$esm_model # bivariate model esm_gam_t1$predictors esm_gam_t1$performance # Test with rep_kfold partition abies2 <- abies2 %>% select(-starts_with(\".\")) set.seed(10) abies2 <- part_random( data = abies2, pr_ab = \"pr_ab\", method = c(method = \"rep_kfold\", folds = 3, replicates = 5) ) abies2 esm_gam_t2 <- esm_gam( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"cwd\", \"tmin\", \"ppt_djf\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), partition = \".part\", thr = NULL ) esm_gam_t2$esm_model # bivariate model esm_gam_t2$predictors esm_gam_t2$performance # Test with other bootstrap abies2 <- abies2 %>% select(-starts_with(\".\")) set.seed(10) abies2 <- part_random( data = abies2, pr_ab = \"pr_ab\", method = c(method = \"boot\", replicates = 10, proportion = 0.7) ) abies2 esm_gam_t3 <- esm_gam( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"cwd\", \"tmin\", \"ppt_djf\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), partition = \".part\", thr = NULL ) esm_gam_t3$esm_model # bivariate model esm_gam_t3$predictors esm_gam_t3$performance } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_gau.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit and validate Gaussian Process models based on Ensembles of Small Models approach — esm_gau","title":"Fit and validate Gaussian Process models based on Ensembles of Small Models approach — esm_gau","text":"function constructs Gaussian Process models using Ensembles Small Models (ESM) approach (Breiner et al., 2015, 2018).","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_gau.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit and validate Gaussian Process models based on Ensembles of Small Models approach — esm_gau","text":"","code":"esm_gau(data, response, predictors, partition, thr = NULL, background = NULL)"},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_gau.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit and validate Gaussian Process models based on Ensembles of Small Models approach — esm_gau","text":"data data.frame. Database response (0,1) predictors values. response character. Column name species absence-presence data (0,1) predictors character. Vector column names quantitative predictor variables (.e. continuous variables). function allow categorical variables can construct models continuous variables. Usage predictors = c(\"aet\", \"cwd\", \"tmin\") partition character. Column name training validation partition groups. thr character. Threshold used get binary suitability values (.e. 0,1). useful threshold-dependent performance metrics. possible use one threshold type. necessary provide vector argument. following threshold criteria available: equal_sens_spec: Threshold sensitivity specificity equal. max_sens_spec: Threshold sum sensitivity specificity highest (aka threshold maximizes TSS). max_jaccard: threshold Jaccard index highest. max_sorensen: threshold Sorensen index highest. max_fpb: threshold FPB (F-measure presence-background data) highest. sensitivity: Threshold based specified sensitivity value. Usage thr = c('sensitivity', sens='0.6') thr = c('sensitivity'). 'sens' refers sensitivity value. sensitivity value specified, default value 0.9. user wants include one threshold type, necessary concatenate threshold types, e.g., thr=c('max_sens_spec', 'max_jaccard'), thr=c('max_sens_spec', 'sensitivity', sens='0.8'), thr=c('max_sens_spec', 'sensitivity'). Function use thresholds threshold specified background data.frame. Database response column 0 predictors variables. column names must consistent data. Default NULL","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_gau.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit and validate Gaussian Process models based on Ensembles of Small Models approach — esm_gau","text":"list object : esm_model: list \"graf\" class object bivariate model. object can used predicting ensembles small models sdm_predict function. predictors: tibble variables use modeling. performance: Performance metric (see sdm_eval). threshold dependent metric calculated based threshold specified argument.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_gau.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Fit and validate Gaussian Process models based on Ensembles of Small Models approach — esm_gau","text":"method consists creating bivariate models pair-wise combinations predictors performs ensemble based average suitability weighted Somers' D metric (D = 2 x (AUC -0.5)). ESM recommended modeling species occurrences. function allow categorical variables use types variables problematic using occurrences. detail see Breiner et al. (2015, 2018).","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_gau.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Fit and validate Gaussian Process models based on Ensembles of Small Models approach — esm_gau","text":"Breiner, F. T., Guisan, ., Bergamini, ., & Nobis, M. P. (2015). Overcoming limitations modelling rare species using ensembles small models. Methods Ecology Evolution, 6(10), 1210-218. https://doi.org/10.1111/2041-210X.12403 Breiner, F. T., Nobis, M. P., Bergamini, ., & Guisan, . (2018). Optimizing ensembles small models predicting distribution species occurrences. Methods Ecology Evolution, 9(4), 802-808. https://doi.org/10.1111/2041-210X.12957","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_gau.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit and validate Gaussian Process models based on Ensembles of Small Models approach — esm_gau","text":"","code":"if (FALSE) { # \\dontrun{ data(\"abies\") require(dplyr) # Using k-fold partition method set.seed(10) abies2 <- abies %>% na.omit() %>% group_by(pr_ab) %>% dplyr::slice_sample(n = 10) %>% group_by() abies2 <- part_random( data = abies2, pr_ab = \"pr_ab\", method = c(method = \"rep_kfold\", folds = 3, replicates = 5) ) abies2 # Without threshold specification and with kfold esm_gau_t1 <- esm_gau( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"cwd\", \"tmin\", \"ppt_djf\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), partition = \".part\", thr = NULL ) esm_gau_t1$esm_model # bivariate model esm_gau_t1$predictors esm_gau_t1$performance } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_gbm.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit and validate Generalized Boosted Regression models based on Ensembles of Small Models approach — esm_gbm","title":"Fit and validate Generalized Boosted Regression models based on Ensembles of Small Models approach — esm_gbm","text":"function constructs Generalized Boosted Regression using Ensembles Small Models (ESM) approach (Breiner et al., 2015, 2018).","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_gbm.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit and validate Generalized Boosted Regression models based on Ensembles of Small Models approach — esm_gbm","text":"","code":"esm_gbm( data, response, predictors, partition, thr = NULL, n_trees = 100, n_minobsinnode = NULL, shrinkage = 0.1 )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_gbm.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit and validate Generalized Boosted Regression models based on Ensembles of Small Models approach — esm_gbm","text":"data data.frame. Database response (0,1) predictors values. response character. Column name species absence-presence data (0,1) predictors character. Vector column names quantitative predictor variables (.e. continuous variables). can construct models continuous variables allow categorical variables. Usage predictors = c(\"aet\", \"cwd\", \"tmin\") partition character. Column name training validation partition groups. thr character. Threshold used get binary suitability values (.e. 0,1). useful threshold-dependent performance metrics. possible use one threshold type. necessary provide vector argument. following threshold criteria available: equal_sens_spec: Threshold sensitivity specificity equal. max_sens_spec: Threshold sum sensitivity specificity highest (aka threshold maximizes TSS). max_jaccard: threshold Jaccard index highest. max_sorensen: threshold Sorensen index highest. max_fpb: threshold FPB (F-measure presence-background data) highest. sensitivity: Threshold based specified sensitivity value. Usage thr = c('sensitivity', sens='0.6') thr = c('sensitivity'). 'sens' refers sensitivity value. sensitivity value specified, default value 0.9. case use one threshold type necessary concatenate threshold types, e.g., thr=c('max_sens_spec', 'max_jaccard'), thr=c('max_sens_spec', 'sensitivity', sens='0.8'), thr=c('max_sens_spec', 'sensitivity'). Function use thresholds threshold specified. n_trees Integer specifying total number trees fit. equivalent number iterations number basis functions additive expansion. Default 100. n_minobsinnode Integer specifying minimum number observations terminal nodes trees. Note actual number observations, total weight. n_minobsinnode NULL, parameter assume value equal nrow(data)*0.5/4. Default NULL. shrinkage Numeric. parameter applied tree expansion. Also known learning rate step-size reduction; 0.001 0.1 usually works, smaller learning rate typically requires trees. Default 0.1.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_gbm.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit and validate Generalized Boosted Regression models based on Ensembles of Small Models approach — esm_gbm","text":"list object : esm_model: list \"gbm\" class object gbm package bivariate model. object can used predicting ensembles small models sdm_predict function. predictors: tibble variables use modeling. performance: Performance metrics (see sdm_eval). Threshold dependent metrics calculated based threshold specified thr argument.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_gbm.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Fit and validate Generalized Boosted Regression models based on Ensembles of Small Models approach — esm_gbm","text":"method consists creating bivariate models pair-wise combinations predictors perform ensemble based average suitability weighted Somers' D metric (D = 2 x (AUC -0.5)). ESM recommended modeling species occurrences. function allow categorical variables use types variables problematic using occurrences. detail see Breiner et al. (2015, 2018).","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_gbm.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Fit and validate Generalized Boosted Regression models based on Ensembles of Small Models approach — esm_gbm","text":"Breiner, F. T., Guisan, ., Bergamini, ., & Nobis, M. P. (2015). Overcoming limitations modelling rare species using ensembles small models. Methods Ecology Evolution, 6(10), 1210-218. https://doi.org/10.1111/2041-210X.12403 Breiner, F. T., Nobis, M. P., Bergamini, ., & Guisan, . (2018). Optimizing ensembles small models predicting distribution species occurrences. Methods Ecology Evolution, 9(4), 802-808. https://doi.org/10.1111/2041-210X.12957","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_gbm.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit and validate Generalized Boosted Regression models based on Ensembles of Small Models approach — esm_gbm","text":"","code":"if (FALSE) { # \\dontrun{ data(\"abies\") require(dplyr) # Using k-fold partition method set.seed(10) abies2 <- abies %>% na.omit() %>% group_by(pr_ab) %>% dplyr::slice_sample(n = 10) %>% group_by() abies2 <- part_random( data = abies2, pr_ab = \"pr_ab\", method = c(method = \"rep_kfold\", folds = 3, replicates = 5) ) abies2 # Without threshold specification and with kfold esm_gbm_t1 <- esm_gbm( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"cwd\", \"tmin\", \"ppt_djf\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), partition = \".part\", thr = NULL, n_trees = 100, n_minobsinnode = NULL, shrinkage = 0.1 ) esm_gbm_t1$esm_model # bivariate model esm_gbm_t1$predictors esm_gbm_t1$performance } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_glm.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit and validate Generalized Linear Models based on Ensembles of Small Models approach — esm_glm","title":"Fit and validate Generalized Linear Models based on Ensembles of Small Models approach — esm_glm","text":"function constructs Generalized Linear Models using Ensembles Small Models (ESM) approach (Breiner et al., 2015, 2018).","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_glm.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit and validate Generalized Linear Models based on Ensembles of Small Models approach — esm_glm","text":"","code":"esm_glm( data, response, predictors, partition, thr = NULL, poly = 0, inter_order = 0 )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_glm.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit and validate Generalized Linear Models based on Ensembles of Small Models approach — esm_glm","text":"data data.frame. Database response (0,1) predictors values. response character. Column name species absence-presence data (0,1). predictors character. Vector column names quantitative predictor variables (.e. continuous variables). can construct models continuous variables allow categorical variables. Usage predictors = c(\"aet\", \"cwd\", \"tmin\"). partition character. Column name training validation partition groups. thr character. Threshold used get binary suitability values (.e. 0,1). useful threshold-dependent performance metrics. possible use one threshold type. necessary provide vector argument. following threshold criteria available: equal_sens_spec: Threshold sensitivity specificity equal. max_sens_spec: Threshold sum sensitivity specificity highest (aka threshold maximizes TSS). max_jaccard: threshold Jaccard highest. max_sorensen: threshold Sorensen highest. max_fpb: threshold FPB (F-measure presence-background data) highest. sensitivity: Threshold based specified sensitivity value. Usage thr = c('sensitivity', sens='0.6') thr = c('sensitivity'). 'sens' refers sensitivity value. sensitivity value specified, default value 0.9. user wants include one threshold type, necessary concatenate threshold types, e.g., thr=c('max_sens_spec', 'max_jaccard'), thr=c('max_sens_spec', 'sensitivity', sens='0.8'), thr=c('max_sens_spec', 'sensitivity'). Function use thresholds threshold specified poly integer >= 2. used values >= 2 model use polynomials continuous variables (.e. used predictors argument). Default 0. ESM constructed occurrences recommended use polynomials avoid overfitting. inter_order integer >= 0. interaction order explanatory variables. Default 0. ESM constructed occurrences recommended use interaction terms.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_glm.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit and validate Generalized Linear Models based on Ensembles of Small Models approach — esm_glm","text":"list object : esm_model: list \"glm\" class object stats package bivariate model. object can used predicting ensembles small models sdm_predict function. predictors: tibble variables use modeling. performance: Performance metric (see sdm_eval). threshold dependent metric calculated based threshold specified thr argument.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_glm.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Fit and validate Generalized Linear Models based on Ensembles of Small Models approach — esm_glm","text":"method consists creating bivariate models pair-wise combinations predictors perform ensemble based average suitability weighted Somers' D metric (D = 2 x (AUC -0.5)). ESM recommended modeling species occurrences. function allow categorical variables use types variables problematic using occurrences. detail see Breiner et al. (2015, 2018).","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_glm.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Fit and validate Generalized Linear Models based on Ensembles of Small Models approach — esm_glm","text":"Breiner, F. T., Guisan, ., Bergamini, ., & Nobis, M. P. (2015). Overcoming limitations modelling rare species using ensembles small models. Methods Ecology Evolution, 6(10), 1210-218. https://doi.org/10.1111/2041-210X.12403 Breiner, F. T., Nobis, M. P., Bergamini, ., & Guisan, . (2018). Optimizing ensembles small models predicting distribution species occurrences. Methods Ecology Evolution, 9(4), 802-808. https://doi.org/10.1111/2041-210X.12957","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_glm.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit and validate Generalized Linear Models based on Ensembles of Small Models approach — esm_glm","text":"","code":"if (FALSE) { # \\dontrun{ data(\"abies\") require(dplyr) # Using k-fold partition method set.seed(10) abies2 <- abies %>% na.omit() %>% group_by(pr_ab) %>% dplyr::slice_sample(n = 10) %>% group_by() abies2 <- part_random( data = abies2, pr_ab = \"pr_ab\", method = c(method = \"rep_kfold\", folds = 3, replicates = 5) ) abies2 # Without threshold specification and with kfold esm_glm_t1 <- esm_glm( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"cwd\", \"tmin\", \"ppt_djf\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), partition = \".part\", thr = NULL, poly = 0, inter_order = 0 ) esm_glm_t1$esm_model # bivariate model esm_glm_t1$predictors esm_glm_t1$performance } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_max.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit and validate Maximum Entropy Models based on Ensemble of Small of Model approach — esm_max","title":"Fit and validate Maximum Entropy Models based on Ensemble of Small of Model approach — esm_max","text":"function constructs Maxent Models using Ensemble Small Model (ESM) approach (Breiner et al., 2015, 2018).","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_max.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit and validate Maximum Entropy Models based on Ensemble of Small of Model approach — esm_max","text":"","code":"esm_max( data, response, predictors, partition, thr = NULL, background = NULL, clamp = TRUE, classes = \"default\", pred_type = \"cloglog\", regmult = 2.5 )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_max.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit and validate Maximum Entropy Models based on Ensemble of Small of Model approach — esm_max","text":"data data.frame. Database response (0,1) predictors values. response character. Column name species absence-presence data (0,1) predictors character. Vector column names quantitative predictor variables (.e. continuous variables). function can construct models continuous variables, allow categorical variables Usage predictors = c(\"aet\", \"cwd\", \"tmin\"). partition character. Column name training validation partition groups. thr character. Threshold used get binary suitability values (.e. 0,1). useful threshold-dependent performance metrics. possible use one threshold type. necessary provide vector argument. following threshold criteria available: equal_sens_spec: Threshold sensitivity specificity equal. max_sens_spec: Threshold sum sensitivity specificity highest (aka threshold maximizes TSS). max_jaccard: threshold Jaccard highest. max_sorensen: threshold Sorensen highest. max_fpb: threshold FPB (F-measure presence-background data) highest. sensitivity: Threshold based specified sensitivity value. Usage thr = c('sensitivity', sens='0.6') thr = c('sensitivity'). 'sens' refers sensitivity value. sensitivity value specified, default 0.9 user wants include one threshold type, necessary concatenate threshold types, e.g., thr=c('max_sens_spec', 'max_jaccard'), thr=c('max_sens_spec', 'sensitivity', sens='0.8'), thr=c('max_sens_spec', 'sensitivity'). Function use thresholds threshold specified. background data.frame. Database response column 0 predictors variables. column names must consistent data. Default NULL clamp logical. set TRUE, predictors features restricted range seen model training. classes character. single feature combinations . Features symbolized letters: l (linear), q (quadratic), h (hinge), p (product), t (threshold). Usage classes = \"lpq\". Default \"default\" (see details). pred_type character. Type response required available \"link\", \"exponential\", \"cloglog\" \"logistic\". Default \"cloglog\" regmult numeric. constant adjust regularization. ESM used modeling species records default value 2.5","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_max.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit and validate Maximum Entropy Models based on Ensemble of Small of Model approach — esm_max","text":"list object : esm_model: list \"maxnet\" class object maxnet package bivariate model. object can used predicting ensembles small models sdm_predict function. predictors: tibble variables use modeling. performance: Performance metrics (see sdm_eval). threshold dependent metric calculated based threshold specified argument.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_max.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Fit and validate Maximum Entropy Models based on Ensemble of Small of Model approach — esm_max","text":"method consists creating bivariate models pair-wise combinations predictors perform ensemble based average suitability weighted Somers' D metric (D = 2 x (AUC -0.5)). ESM recommended modeling species occurrences. function allow categorical variables use types variables problematic using occurrences. detail see Breiner et al. (2015, 2018). function use default regularization multiplier equal 2.5 (see Breiner et al., 2018) argument “classes” set default MaxEnt use different features combination depending number presences (np) follow rule: np < 10 classes = \"l\", np 10 15 classes = \"lq\", np 15 80 classes = \"lqh\", np >= 80 classes = \"lqph\" presence-absence (presence-pseudo-absence) data used data argument addition background points, function fit models presences background points validate presences absences. procedure makes maxent comparable presences-absences models (e.g., random forest, support vector machine). presences background points data used, function fit validate model presences background data. presence-absences used data argument without background, function fit model specified data (recommended).","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_max.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Fit and validate Maximum Entropy Models based on Ensemble of Small of Model approach — esm_max","text":"Breiner, F. T., Guisan, ., Bergamini, ., & Nobis, M. P. (2015). Overcoming limitations modelling rare species using ensembles small models. Methods Ecology Evolution, 6(10), 1210-218. https://doi.org/10.1111/2041-210X.12403 Breiner, F. T., Nobis, M. P., Bergamini, ., & Guisan, . (2018). Optimizing ensembles small models predicting distribution species occurrences. Methods Ecology Evolution, 9(4), 802-808. https://doi.org/10.1111/2041-210X.12957","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_max.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit and validate Maximum Entropy Models based on Ensemble of Small of Model approach — esm_max","text":"","code":"if (FALSE) { # \\dontrun{ data(\"abies\") data(\"backg\") require(dplyr) # Using k-fold partition method set.seed(10) abies2 <- abies %>% na.omit() %>% group_by(pr_ab) %>% dplyr::slice_sample(n = 10) %>% group_by() abies2 <- part_random( data = abies2, pr_ab = \"pr_ab\", method = c(method = \"rep_kfold\", folds = 5, replicates = 5) ) abies2 set.seed(10) backg2 <- backg %>% na.omit() %>% group_by(pr_ab) %>% dplyr::slice_sample(n = 100) %>% group_by() backg2 <- part_random( data = backg2, pr_ab = \"pr_ab\", method = c(method = \"rep_kfold\", folds = 5, replicates = 5) ) backg2 # Without threshold specification and with kfold esm_max_t1 <- esm_max( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"cwd\", \"tmin\", \"ppt_djf\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), partition = \".part\", thr = NULL, background = backg2, clamp = TRUE, classes = \"default\", pred_type = \"cloglog\", regmult = 1 ) esm_max_t1$esm_model # bivariate model esm_max_t1$predictors esm_max_t1$performance } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_net.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit and validate Neural Networks based on Ensembles of Small of Models approach — esm_net","title":"Fit and validate Neural Networks based on Ensembles of Small of Models approach — esm_net","text":"function constructs Neural Networks using Ensembles Small Models (ESM) approach (Breiner et al., 2015, 2018).","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_net.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit and validate Neural Networks based on Ensembles of Small of Models approach — esm_net","text":"","code":"esm_net(data, response, predictors, partition, thr = NULL, size = 2, decay = 0)"},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_net.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit and validate Neural Networks based on Ensembles of Small of Models approach — esm_net","text":"data data.frame. Database response (0,1) predictors values. response character. Column name species absence-presence data (0,1) predictors character. Vector column names quantitative predictor variables (.e. continuous variables). function can construct models continuous variables allow categorical variables. Usage predictors = c(\"aet\", \"cwd\", \"tmin\"). partition character. Column name training validation partition groups. thr character. Threshold used get binary suitability values (.e. 0,1). useful threshold-dependent performance metrics. possible use one threshold type. necessary provide vector argument. following threshold criteria available: equal_sens_spec: Threshold sensitivity specificity equal. max_sens_spec: Threshold sum sensitivity specificity highest (aka threshold maximizes TSS). max_jaccard: threshold Jaccard index highest. max_sorensen: threshold Sorensen index highest. max_fpb: threshold FPB (F-measure presence-background data) highest. sensitivity: Threshold based specified sensitivity value. Usage thr = c('sensitivity', sens='0.6') thr = c('sensitivity'). 'sens' refers sensitivity value. sensitivity values specified, default used 0.9 user wants include one threshold type, necessary concatenate threshold types, e.g., thr=c('max_sens_spec', 'max_jaccard'), thr=c('max_sens_spec', 'sensitivity', sens='0.8'), thr=c('max_sens_spec', 'sensitivity'). Function use thresholds threshold specified size numeric. Number units hidden layer. Can zero skip-layer units. Default 2. decay numeric. Parameter weight decay. Default 0.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_net.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit and validate Neural Networks based on Ensembles of Small of Models approach — esm_net","text":"list object : esm_model: list \"nnet\" class object nnet package bivariate model. object can used predicting ensemble small model sdm_predict function. predictors: tibble variables use modeling. performance: Performance metric (see sdm_eval). threshold dependent metric calculated based threshold specified thr argument.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_net.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Fit and validate Neural Networks based on Ensembles of Small of Models approach — esm_net","text":"method consists creating bivariate models pair-wise combinations predictors perform ensemble based average suitability weighted Somers' D metric (D = 2 x (AUC -0.5)). ESM recommended modeling species occurrences. function allow categorical variables use types variables problematic using occurrences. detail see Breiner et al. (2015, 2018).","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_net.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Fit and validate Neural Networks based on Ensembles of Small of Models approach — esm_net","text":"Breiner, F. T., Guisan, ., Bergamini, ., & Nobis, M. P. (2015). Overcoming limitations modelling rare species using ensembles small models. Methods Ecology Evolution, 6(10), 1210-218. https://doi.org/10.1111/2041-210X.12403 Breiner, F. T., Nobis, M. P., Bergamini, ., & Guisan, . (2018). Optimizing ensembles small models predicting distribution species occurrences. Methods Ecology Evolution, 9(4), 802-808. https://doi.org/10.1111/2041-210X.12957","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_net.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit and validate Neural Networks based on Ensembles of Small of Models approach — esm_net","text":"","code":"if (FALSE) { # \\dontrun{ data(\"abies\") require(dplyr) # Using k-fold partition method set.seed(10) abies2 <- abies %>% na.omit() %>% group_by(pr_ab) %>% dplyr::slice_sample(n = 10) %>% group_by() abies2 <- part_random( data = abies2, pr_ab = \"pr_ab\", method = c(method = \"rep_kfold\", folds = 3, replicates = 5) ) abies2 # Without threshold specification and with kfold esm_net_t1 <- esm_net( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"cwd\", \"tmin\", \"ppt_djf\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), partition = \".part\", thr = NULL ) esm_net_t1$esm_model # bivariate model esm_net_t1$predictors esm_net_t1$performance } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_svm.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit and validate Support Vector Machine models based on Ensembles of Small of Models approach — esm_svm","title":"Fit and validate Support Vector Machine models based on Ensembles of Small of Models approach — esm_svm","text":"function constructs Support Vector Machine models using Ensembles Small Models (ESM) approach (Breiner et al., 2015, 2018).","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_svm.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit and validate Support Vector Machine models based on Ensembles of Small of Models approach — esm_svm","text":"","code":"esm_svm( data, response, predictors, partition, thr = NULL, sigma = \"automatic\", C = 1 )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_svm.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit and validate Support Vector Machine models based on Ensembles of Small of Models approach — esm_svm","text":"data data.frame. Database response (0,1) predictors values. response character. Column name species absence-presence data (0,1). predictors character. Vector column names quantitative predictor variables (.e. continuous variables). function can construct models continuous variables allow categorical variables. Usage predictors = c(\"aet\", \"cwd\", \"tmin\"). partition character. Column name training validation partition groups. thr character. Threshold used get binary suitability values (.e. 0,1). useful threshold-dependent performance metrics. possible use one threshold type. necessary provide vector argument. following threshold criteria available: equal_sens_spec: Threshold sensitivity specificity equal. max_sens_spec: Threshold sum sensitivity specificity highest (aka threshold maximizes TSS). max_jaccard: threshold Jaccard index highest. max_sorensen: threshold Sorensen index highest. max_fpb: threshold FPB (F-measure presence-background data) highest. sensitivity: Threshold based specified sensitivity value. Usage thr = c('sensitivity', sens='0.6') thr = c('sensitivity'). 'sens' refers sensitivity value. sensitivity value specified, default 0.9 user wants include one threshold type, necessary concatenate threshold types, e.g., thr=c('max_sens_spec', 'max_jaccard'), thr=c('max_sens_spec', 'sensitivity', sens='0.8'), thr=c('max_sens_spec', 'sensitivity'). Function use thresholds threshold specified sigma numeric. Inverse kernel width Radial Basis kernel function \"rbfdot\". Default \"automatic\". C numeric. Cost constraints violation, 'C' constant regularization term Lagrange formulation. Default 1","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_svm.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit and validate Support Vector Machine models based on Ensembles of Small of Models approach — esm_svm","text":"list object : esm_model: list \"ksvm\" class object ksvm package bivariate model. object can used predicting ensemble small model sdm_predict function. predictors: tibble variables use modeling. performance: Performance metric (see sdm_eval). threshold dependent metric calculated based threshold specified thr argument.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_svm.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Fit and validate Support Vector Machine models based on Ensembles of Small of Models approach — esm_svm","text":"method consists creating bivariate models pair-wise combinations predictors perform ensemble based average suitability weighted Somers' D metric (D = 2 x (AUC -0.5)). ESM recommended modeling species occurrences. function allow categorical variables use types variables problematic using occurrences. detail see Breiner et al. (2015, 2018). function constructs 'C-svc' classification type uses Radial Basis kernel \"Gaussian\" function (rbfdot). See details ksvm","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_svm.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Fit and validate Support Vector Machine models based on Ensembles of Small of Models approach — esm_svm","text":"Breiner, F. T., Guisan, ., Bergamini, ., & Nobis, M. P. (2015). Overcoming limitations modelling rare species using ensembles small models. Methods Ecology Evolution, 6(10), 1210-218. https://doi.org/10.1111/2041-210X.12403 Breiner, F. T., Nobis, M. P., Bergamini, ., & Guisan, . (2018). Optimizing ensembles small models predicting distribution species occurrences. Methods Ecology Evolution, 9(4), 802-808. https://doi.org/10.1111/2041-210X.12957","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_svm.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit and validate Support Vector Machine models based on Ensembles of Small of Models approach — esm_svm","text":"","code":"if (FALSE) { # \\dontrun{ data(\"abies\") require(dplyr) # Using k-fold partition method set.seed(10) abies2 <- abies %>% na.omit() %>% group_by(pr_ab) %>% dplyr::slice_sample(n = 10) %>% group_by() abies2 <- part_random( data = abies2, pr_ab = \"pr_ab\", method = c(method = \"rep_kfold\", folds = 3, replicates = 5) ) abies2 # Without threshold specification and with kfold esm_svm_t1 <- esm_svm( data = abies2, response = \"pr_ab\", predictors = c( \"aet\", \"cwd\", \"tmin\", \"ppt_djf\", \"ppt_jja\", \"pH\", \"awc\", \"depth\" ), partition = \".part\", thr = NULL ) esm_svm_t1$esm_model # bivariate model esm_svm_t1$predictors esm_svm_t1$performance } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/extra_eval.html","id":null,"dir":"Reference","previous_headings":"","what":"Measure model extrapolation based on Shape extrapolation metric — extra_eval","title":"Measure model extrapolation based on Shape extrapolation metric — extra_eval","text":"Measure extrapolation comparing environmental data used modeling calibration area model projection. function use Shape metric proposed Velazco et al., 2023","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/extra_eval.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Measure model extrapolation based on Shape extrapolation metric — extra_eval","text":"","code":"extra_eval( training_data, pr_ab, projection_data, metric = \"mahalanobis\", univar_comb = FALSE, n_cores = 1, aggreg_factor = 1 )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/extra_eval.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Measure model extrapolation based on Shape extrapolation metric — extra_eval","text":"training_data data.frame tibble environmental conditions presence absence (background points pseudo-absences) used constructing models pr_ab character. Column name presence absence (background points pseudo-absences) data (.e., 1 0) projection_data SpatRaster, data.frame tibble environmental condition used projecting model (e.g., larger, encompassing region, spatially separate region, different time period). data.frame tibble used function return tibble object. Otherwise, SpatRaster object. metric character. Metric used measure degree extrapolation. Default = mahalanobis. mahalanobis: Degree extrapolation calculated based Mahalanobis distance. euclidean: Degree extrapolation calculated based Euclidean distance. univar_comb logical. true, function add layer column distinguish univariate (.e., projection data outside range training conditions) combinatorial extrapolation (.e., projection data within range training conditions) using values 1 2, respectively. Default FALSE n_cores numeric. Number cores use parallelization. Default 1 aggreg_factor positive integer. Aggregation factor expressed number cells direction reduce raster resolution. Use value higher 1 useful measuring extrapolation using raster high number cells. resolution output raster object used 'projection_data' argument. Default 1, .e., default, changes made resolution environmental variables.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/extra_eval.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Measure model extrapolation based on Shape extrapolation metric — extra_eval","text":"SpatRaster tibble object extrapolation values measured Shape metric. Also possible estimate univariate combinatorial extrapolation metric (see `univar_comb` argument).","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/extra_eval.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Measure model extrapolation based on Shape extrapolation metric — extra_eval","text":"function measure model extrapolation base Shape metric (Velazco et al., 2023). Shape model-agnostic approach calculates extrapolation degree given projection data point multivariate distance nearest training data point. distances relativized factor reflects dispersion training data environmental space. Distinct approaches (e.g., MESS-Multivariate Environmental Similarity Surfaces, EO-Environmental Overlap, MOP-Mobility-Oriented Parity, EXDET-Extrapolation Detection, AOA-Area Applicability), Shape incorporates adjustable threshold control binary discrimination acceptable unacceptable extrapolation degrees (see extra_truncate). See vignette flexsdm website details Shape metric, model truncation, tools explore model extrapolation.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/extra_eval.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Measure model extrapolation based on Shape extrapolation metric — extra_eval","text":"Velazco, S.J.E., Brooke, M.R., De Marco Jr., P., Regan, H.M. Franklin, J. 2023. far can extrapolate species distribution model? Exploring Shape, novel method. Ecography: e06992. https://doi.org/10.1111/ecog.06992","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/extra_eval.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Measure model extrapolation based on Shape extrapolation metric — extra_eval","text":"","code":"if (FALSE) { # \\dontrun{ require(dplyr) require(terra) data(spp) f <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(f) names(somevar) <- c(\"aet\", \"cwd\", \"tmx\", \"tmn\") spp$species %>% unique() sp <- spp %>% dplyr::filter(species == \"sp3\", pr_ab == 1) %>% dplyr::select(x, y, pr_ab) # Calibration area based on some criterion such as dispersal ability ca <- calib_area(sp, x = \"x\", y = \"y\", method = c(\"bmcp\", width = 50000), crs = crs(somevar)) plot(somevar[[1]]) points(sp) plot(ca, add = T) # Sampling pseudo-absences set.seed(10) psa <- sample_pseudoabs( data = sp, x = \"x\", y = \"y\", n = nrow(sp) * 2, method = \"random\", rlayer = somevar, calibarea = ca ) # Merge presences and absences databases to get a complete calibration data sp_pa <- dplyr::bind_rows(sp, psa) sp_pa # Get environmental condition of calibration area sp_pa_2 <- sdm_extract(data = sp_pa, x = \"x\", y = \"y\", env_layer = somevar) sp_pa_2 # Measure degree of extrapolation based on Mahalanobis and # for a projection area based on a SpatRaster object extr <- extra_eval( training_data = sp_pa_2, projection_data = somevar, pr_ab = \"pr_ab\", n_cores = 1, aggreg_factor = 1, metric = \"mahalanobis\" ) plot(extr, main = \"Extrapolation pattern\") # Let's fit, predict and truncate a model with extra_truncate sp_pa_2 <- part_random( data = sp_pa_2, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 5) ) a_model <- fit_glm( data = sp_pa_2, response = \"pr_ab\", predictors = c(\"aet\", \"cwd\", \"tmx\", \"tmn\"), partition = \".part\", thr = c(\"max_sorensen\") ) predsuit <- sdm_predict(models = a_model, pred = somevar, thr = \"max_sorensen\") predsuit # list with a raster with two layer plot(predsuit[[1]]) # Truncate a model based on a given value of extrapolation # using 'extra_truncate' function par(mfrow = c(1, 2)) plot(extr, main = \"Extrapolation\") plot(predsuit[[1]][[1]], main = \"Suitability\") par(mfrow = c(1, 1)) predsuit_2 <- extra_truncate( suit = predsuit[[1]], extra = extr, threshold = c(50, 100, 200) ) predsuit_2 # a list of continuous and binary models with # different truncated at different extrapolation thresholds plot(predsuit_2$`50`) plot(predsuit_2$`100`) plot(predsuit_2$`200`) ##%######################################################%## #### Measure degree of extrapolation for #### #### projection area based on data.frame #### ##%######################################################%## extr_df <- extra_eval( training_data = sp_pa_2, projection_data = as.data.frame(somevar, xy=TRUE), pr_ab = \"pr_ab\", n_cores = 1, aggreg_factor = 1, metric = \"mahalanobis\" ) extr_df # see 'p_extra()' to explore extrapolation or suitability pattern in the # environmental and/or geographical space ##%######################################################%## #### Explore Shape metric with #### #### univariate and combinatorial extrapolation #### ##%######################################################%## extr <- extra_eval( training_data = sp_pa_2, projection_data = somevar, pr_ab = \"pr_ab\", n_cores = 1, aggreg_factor = 1, metric = \"mahalanobis\", univar_comb = TRUE ) extr plot(extr) # In the second layer, values equal to 1 and 2 # depict univariate and combinatorial extrapolation, respectively } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/extra_exclude.html","id":null,"dir":"Reference","previous_headings":"","what":"Constraint of suitability based on extrapolation — extra_exclude","title":"Constraint of suitability based on extrapolation — extra_exclude","text":"Exclusion suitability values less given extrapolation value (EXPERIMENTAL)","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/extra_exclude.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Constraint of suitability based on extrapolation — extra_exclude","text":"","code":"extra_exclude(suit, extra, threshold = 50)"},{"path":"https://sjevelazco.github.io/flexsdm/reference/extra_exclude.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Constraint of suitability based on extrapolation — extra_exclude","text":"suit SpatRaster suitability values extra SpatRaster extrapolation values measured percentage (output extra_eval function) threshold numeric. Vector one values used correct extrapolation. Default 50% (FUNCTION SET PROJECTED SUITABILITY VALUES LESS THRESHOLD ZERO? UNCLEAR. PLEASE EXPLICIT)","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/extra_exclude.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Constraint of suitability based on extrapolation — extra_exclude","text":"SpatRaster object corrected suitability values","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/extra_exclude.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Constraint of suitability based on extrapolation — extra_exclude","text":"","code":"if (FALSE) { # see examples in extra_eval function }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/extra_truncate.html","id":null,"dir":"Reference","previous_headings":"","what":"Truncate suitability predictions based on an extrapolation value — extra_truncate","title":"Truncate suitability predictions based on an extrapolation value — extra_truncate","text":"Exclusion suitability predictions environmental conditions assumed extrapolative.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/extra_truncate.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Truncate suitability predictions based on an extrapolation value — extra_truncate","text":"","code":"extra_truncate(suit, extra, threshold = 50, trunc_value = 0)"},{"path":"https://sjevelazco.github.io/flexsdm/reference/extra_truncate.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Truncate suitability predictions based on an extrapolation value — extra_truncate","text":"suit SpatRaster suitability values extra SpatRaster extrapolation values preferable measured extra_eval function threshold numeric. Vector one extrapolation values used truncate suitability Default 50% trunc_value numeric. Numeric value used cells assumed extrapolative","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/extra_truncate.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Truncate suitability predictions based on an extrapolation value — extra_truncate","text":"SpatRaster object truncated suitability values","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/extra_truncate.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Truncate suitability predictions based on an extrapolation value — extra_truncate","text":"Exclusion suitability predictions environmental conditions assumed extrapolative. function possible use metric measuring degree extrapolation (e.g., MESS-Multivariate Environmental Similarity Surfaces, EO-Environmental Overlap, MOP-Mobility-Oriented Parity, EXDET-Extrapolation Detection, AOA-Area Applicability). However, recommend use Shape approach (see extra_eval, Velazco et al., 2023). function truncates suitability predictions assigning given value, generally 0 NA. Usage trunc_value = NA. Default 0. cells assumed extrapolative, .e., higher given threshold given extrapolation metric. See vignette flexsdm website details Shape metric, model truncation, tools explore model extrapolation.","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/extra_truncate.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Truncate suitability predictions based on an extrapolation value — extra_truncate","text":"","code":"if (FALSE) { # \\dontrun{ # see examples in extra_eval function } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_ensemble.html","id":null,"dir":"Reference","previous_headings":"","what":"Ensemble model fitting and validation — fit_ensemble","title":"Ensemble model fitting and validation — fit_ensemble","text":"Ensemble model fitting validation","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_ensemble.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Ensemble model fitting and validation — fit_ensemble","text":"","code":"fit_ensemble( models, ens_method = c(\"mean\", \"meanw\", \"meansup\", \"meanthr\", \"median\"), thr = NULL, thr_model = NULL, metric = NULL )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_ensemble.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Ensemble model fitting and validation — fit_ensemble","text":"models list. list models fitted fit_ tune_ function family. Models used ensemble must presences-absences records, partition methods, threshold types. ens_method character. Method used create ensemble different models. vector must provided argument. meansup, meanw pcasup method, necessary provide evaluation metric threshold 'metric' 'thr_model' arguments respectively. default following ensemble methods performed: mean: Simple average different models. meanw: Weighted average models based performance. evaluation metric threshold type must provided. meansup: Average best models (evaluation metric average). evaluation metric must provided. meanthr: Averaging performed cells suitability values selected threshold. median: Median different models. Usage ensemble = \"meanthr\". several ensemble methods implemented necessary concatenate , e.g., ensemble = c(\"meanw\", \"meanthr\", \"median\") thr character. Threshold used get binary suitability values (.e. 0,1). useful threshold-dependent performance metrics. possible use one threshold criterion. vector must provided argument. following threshold criteria available: lpt: highest threshold omission. equal_sens_spec: Threshold sensitivity specificity equal. max_sens_spec: Threshold sum sensitivity specificity highest (aka threshold maximizes TSS). max_jaccard: threshold Jaccard highest. max_sorensen: threshold Sorensen highest. max_fpb: threshold FPB (F-measure presence-background data) highest. sensitivity: Threshold based specified sensitivity value. Usage thr = c('sensitivity', sens='0.6') thr = c('sensitivity'). 'sens' refers sensitivity value. sensitivity values specified, default 0.9. case using one threshold type necessary concatenate threshold types, e.g., thr=c('lpt', 'max_sens_spec', 'max_jaccard'), thr=c('lpt', 'max_sens_spec', 'sensitivity', sens='0.8'), thr=c('lpt', 'max_sens_spec', 'sensitivity'). Function use thresholds threshold specified. thr_model character. threshold needed conduct meanw, meandsup, meanthr ensemble methods. mandatory use one threshold, must threshold used fit models used \"models\" argument. Usage thr_model = 'equal_sens_spec' metric character. Performance metric used selecting best combination hyper-parameter values. One following metrics can used: SORENSEN, JACCARD, FPB, TSS, KAPPA, AUC, IMAE, BOYCE. Default TSS. Usage metric = BOYCE","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_ensemble.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Ensemble model fitting and validation — fit_ensemble","text":"list object : models: list models used performing ensemble. thr_metric: Threshold metric specified function. predictors: tibble quantitative (column names c) qualitative (column names f) variables used models. performance: tibble performance metrics (see sdm_eval). metrics threshold-dependent calculated based threshold specified argument.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_ensemble.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Ensemble model fitting and validation — fit_ensemble","text":"","code":"if (FALSE) { # \\dontrun{ require(dplyr) require(terra) # Environmental variables somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) # Species occurrences data(\"spp\") set.seed(1) some_sp <- spp %>% dplyr::filter(species == \"sp2\") %>% sdm_extract( data = ., x = \"x\", y = \"y\", env_layer = somevar, variables = names(somevar), filter_na = TRUE ) %>% part_random( data = ., pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 3) ) # gam mglm <- fit_glm( data = some_sp, response = \"pr_ab\", predictors = c(\"CFP_1\", \"CFP_2\", \"CFP_3\", \"CFP_4\"), partition = \".part\", poly = 2 ) mraf <- fit_raf( data = some_sp, response = \"pr_ab\", predictors = c(\"CFP_1\", \"CFP_2\", \"CFP_3\", \"CFP_4\"), partition = \".part\", ) mgbm <- fit_gbm( data = some_sp, response = \"pr_ab\", predictors = c(\"CFP_1\", \"CFP_2\", \"CFP_3\", \"CFP_4\"), partition = \".part\" ) # Fit and validate ensemble model mensemble <- fit_ensemble( models = list(mglm, mraf, mgbm), ens_method = \"meansup\", thr = NULL, thr_model = \"max_sens_spec\", metric = \"TSS\" ) } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_gam.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit and validate Generalized Additive Models — fit_gam","title":"Fit and validate Generalized Additive Models — fit_gam","text":"Fit validate Generalized Additive Models","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_gam.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit and validate Generalized Additive Models — fit_gam","text":"","code":"fit_gam( data, response, predictors, predictors_f = NULL, select_pred = FALSE, partition, thr = NULL, fit_formula = NULL, k = -1 )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_gam.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit and validate Generalized Additive Models — fit_gam","text":"data data.frame. Database response (0,1) predictors values. response character. Column name species absence-presence data (0,1). predictors character. Vector column names quantitative predictor variables (.e. continuous variables). Usage predictors = c(\"aet\", \"cwd\", \"tmin\") predictors_f character. Vector column names qualitative predictor variables (.e. ordinal nominal variables; factors). Usage predictors_f = c(\"landform\") select_pred logical. Perform predictor selection. Default FALSE. partition character. Column name training validation partition groups. thr character. Threshold used get binary suitability values (.e. 0,1). useful threshold-dependent performance metrics. possible use one threshold type. necessary provide vector argument. following threshold criteria available: lpt: highest threshold omission. equal_sens_spec: Threshold sensitivity specificity equal. max_sens_spec: Threshold sum sensitivity specificity highest (aka threshold maximizes TSS). max_jaccard: threshold Jaccard index highest. max_sorensen: threshold Sorensen index highest. max_fpb: threshold FPB (F-measure presence-background data) highest. sensitivity: Threshold based specified sensitivity value. Usage thr = c('sensitivity', sens='0.6') thr = c('sensitivity'). 'sens' refers sensitivity value. sensitivity value specified, default used 0.9. one threshold type used must concatenated, e.g., thr=c('lpt', 'max_sens_spec', 'max_jaccard'), thr=c('lpt', 'max_sens_spec', 'sensitivity', sens='0.8'), thr=c('lpt', 'max_sens_spec', 'sensitivity'). Function use threshold types none specified. fit_formula formula. formula object response predictor variables (e.g. formula(pr_ab ~ aet + ppt_jja + pH + awc + depth + landform)). Note variables used must consistent used response, predictors, predictors_f arguments k integer. dimension basis used represent smooth term. Default -1 (.e., k=10). See help ?mgcv::s.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_gam.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit and validate Generalized Additive Models — fit_gam","text":"list object : model: \"gam\" class object mgcv package. object can used predicting. predictors: tibble quantitative (c column names) qualitative (f column names) variables use modeling. performance: Performance metric (see sdm_eval). Threshold dependent metrics calculated based threshold specified argument. data_ens: Predicted suitability test partition. database used fit_ensemble","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_gam.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Fit and validate Generalized Additive Models — fit_gam","text":"function fits GAM using mgvc package, Binomial distribution family thin plate regression spline smoothing basis (see ?mgvc::s).","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_gam.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit and validate Generalized Additive Models — fit_gam","text":"","code":"if (FALSE) { # \\dontrun{ data(\"abies\") # Using k-fold partition method abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 10) ) abies2 gam_t1 <- fit_gam( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), predictors_f = c(\"landform\"), select_pred = FALSE, partition = \".part\", thr = \"max_sens_spec\" ) gam_t1$model gam_t1$predictors gam_t1$performance # Specifying the formula explicitly require(mgcv) gam_t2 <- fit_gam( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), predictors_f = c(\"landform\"), select_pred = FALSE, partition = \".part\", thr = \"max_sens_spec\", fit_formula = stats::formula(pr_ab ~ s(aet) + s(ppt_jja) + s(pH) + landform) ) gam_t2$model gam_t2$predictors gam_t2$performance %>% dplyr::select(ends_with(\"_mean\")) # Using repeated k-fold partition method abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"rep_kfold\", folds = 5, replicates = 5) ) abies2 gam_t3 <- fit_gam( data = abies2, response = \"pr_ab\", predictors = c(\"ppt_jja\", \"pH\", \"awc\"), predictors_f = c(\"landform\"), select_pred = FALSE, partition = \".part\", thr = \"max_sens_spec\" ) gam_t3 } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_gau.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit and validate Gaussian Process models — fit_gau","title":"Fit and validate Gaussian Process models — fit_gau","text":"Fit validate Gaussian Process models","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_gau.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit and validate Gaussian Process models — fit_gau","text":"","code":"fit_gau( data, response, predictors, predictors_f = NULL, background = NULL, partition, thr = NULL )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_gau.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit and validate Gaussian Process models — fit_gau","text":"data data.frame. Database response (0,1) predictors values. response character. Column name species absence-presence data (0,1). predictors character. Vector column names quantitative predictor variables (.e. continuous variables). Usage predictors = c(\"aet\", \"cwd\", \"tmin\") predictors_f character. Vector column names qualitative predictor variables (.e. ordinal nominal variables type). Usage predictors_f = c(\"landform\") background data.frame. Database response column 0 predictors variables. column names must consistent data partition character. Column name training validation partition groups. thr character. Threshold used get binary suitability values (.e. 0,1), useful threshold-dependent performance metrics. possible use one threshold type. vector must provided argument. following threshold criteria available: lpt: highest threshold omission. equal_sens_spec: Threshold sensitivity specificity equal. max_sens_spec: Threshold sum sensitivity specificity highest (aka threshold maximizes TSS). max_jaccard: threshold Jaccard index highest. max_sorensen: threshold Sorensen index highest. max_fpb: threshold FPB (F-measure presence-background data) highest. sensitivity: Threshold based specified sensitivity value. Usage thr = c('sensitivity', sens='0.6') thr = c('sensitivity'). 'sens' refers sensitivity value. sensitivity value specified, default used 0.9. one threshold type used must concatenated, e.g., thr=c('lpt', 'max_sens_spec', 'max_jaccard'), thr=c('lpt', 'max_sens_spec', 'sensitivity', sens='0.8'), thr=c('lpt', 'max_sens_spec', 'sensitivity'). Function use threshold criteria none specified.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_gau.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit and validate Gaussian Process models — fit_gau","text":"list object : model: \"graf\" class object. object can used predicting. predictors: tibble quantitative (c column names) qualitative (f column names) variables use modeling. performance: Performance metrics (see sdm_eval). Threshold dependent metrics calculated based threshold criteria specified argument. data_ens: Predicted suitability test partition. database used fit_ensemble","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_gau.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit and validate Gaussian Process models — fit_gau","text":"","code":"if (FALSE) { # \\dontrun{ data(\"abies\") # Using k-fold partition method abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 3) ) abies2 bg <- abies2 bg$pr_ab <- 0 gaup_t1 <- fit_gau( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), predictors_f = c(\"landform\"), partition = \".part\", background = bg, thr = c(\"max_sens_spec\", \"equal_sens_spec\", \"max_sorensen\") ) gaup_t1$model gaup_t1$predictors gaup_t1$performance gaup_t1$data_ens # Using bootstrap partition method only with presence-absence abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"boot\", replicates = 5, proportion = 0.7) ) abies2 gaup_t2 <- fit_gau( data = abies2, response = \"pr_ab\", predictors = c(\"ppt_jja\", \"pH\", \"awc\"), predictors_f = c(\"landform\"), partition = \".part\", thr = c(type = c(\"lpt\", \"max_sens_spec\", \"sensitivity\"), sens = \"0.8\") ) gaup_t2 } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_gbm.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit and validate Generalized Boosted Regression models — fit_gbm","title":"Fit and validate Generalized Boosted Regression models — fit_gbm","text":"Fit validate Generalized Boosted Regression models","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_gbm.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit and validate Generalized Boosted Regression models — fit_gbm","text":"","code":"fit_gbm( data, response, predictors, predictors_f = NULL, fit_formula = NULL, partition, thr = NULL, n_trees = 100, n_minobsinnode = as.integer(nrow(data) * 0.5/4), shrinkage = 0.1 )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_gbm.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit and validate Generalized Boosted Regression models — fit_gbm","text":"data data.frame. Database response (0,1) predictors values. response character. Column name species absence-presence data (0,1). predictors character. Vector column names quantitative predictor variables (.e. continuous variables). Usage predictors = c(\"aet\", \"cwd\", \"tmin\") predictors_f character. Vector column names qualitative predictor variables (.e. ordinal nominal variables type). Usage predictors_f = c(\"landform\") fit_formula formula. formula object response predictor variables (e.g. formula(pr_ab ~ aet + ppt_jja + pH + awc + depth + landform)). Note variables used must consistent used response, predictors, predictors_f arguments. Default NULL. partition character. Column name training validation partition groups. thr character. Threshold used get binary suitability values (.e. 0,1) needed threshold-dependent performance metrics. possible use one threshold type. necessary provide vector argument. following threshold criteria available: lpt: highest threshold omission. equal_sens_spec: Threshold sensitivity specificity equal. max_sens_spec: Threshold sum sensitivity specificity highest (aka threshold maximizes TSS). max_jaccard: threshold Jaccard index highest. max_sorensen: threshold Sorensen index highest. max_fpb: threshold FPB (F-measure presence-background data) highest. sensitivity: Threshold based specified sensitivity value. Usage thr = c('sensitivity', sens='0.6') thr = c('sensitivity'). 'sens' refers sensitivity value. sensitivity value specified, default used 0.9 one threshold type used must concatenated, e.g., thr=c('lpt', 'max_sens_spec', 'max_jaccard'), thr=c('lpt', 'max_sens_spec', 'sensitivity', sens='0.8'), thr=c('lpt', 'max_sens_spec', 'sensitivity'). Function use thresholds threshold specified. n_trees Integer specifying total number trees fit. equivalent number iterations number basis functions additive expansion. Default 100. n_minobsinnode Integer specifying minimum number observations terminal nodes trees. Note actual number observations, total weight. default value used nrow(data)*0.5/4 shrinkage Numeric. parameter applied tree expansion. Also known learning rate step-size reduction; 0.001 0.1 usually works, smaller learning rate typically requires trees. Default 0.1.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_gbm.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit and validate Generalized Boosted Regression models — fit_gbm","text":"list object : model: \"gbm\" class object gbm package. object can used predicting. predictors: tibble quantitative (c column names) qualitative (f column names) variables use modeling. performance: Performance metric (see sdm_eval). Threshold dependent metrics calculated based threshold specified thr argument. data_ens: Predicted suitability test partition based best model. database used fit_ensemble","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_gbm.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit and validate Generalized Boosted Regression models — fit_gbm","text":"","code":"if (FALSE) { # \\dontrun{ data(\"abies\") # Using k-fold partition method abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 10) ) abies2 gbm_t1 <- fit_gbm( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), predictors_f = c(\"landform\"), partition = \".part\", thr = c(\"max_sens_spec\", \"equal_sens_spec\", \"max_sorensen\") ) gbm_t1$model gbm_t1$predictors gbm_t1$performance gbm_t1$data_ens # Using bootstrap partition method abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"boot\", replicates = 10, proportion = 0.7) ) abies2 gbm_t2 <- fit_gbm( data = abies2, response = \"pr_ab\", predictors = c(\"ppt_jja\", \"pH\", \"awc\"), predictors_f = c(\"landform\"), partition = \".part\", thr = \"max_sens_spec\" ) gbm_t2 } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_glm.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit and validate Generalized Linear Models — fit_glm","title":"Fit and validate Generalized Linear Models — fit_glm","text":"Fit validate Generalized Linear Models","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_glm.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit and validate Generalized Linear Models — fit_glm","text":"","code":"fit_glm( data, response, predictors, predictors_f = NULL, select_pred = FALSE, partition, thr = NULL, fit_formula = NULL, poly = 2, inter_order = 0 )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_glm.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit and validate Generalized Linear Models — fit_glm","text":"data data.frame. Database response (0,1) predictors values. response character. Column name species absence-presence data (0,1). predictors character. Vector column names quantitative predictor variables (.e. continuous variables). Usage predictors = c(\"aet\", \"cwd\", \"tmin\") predictors_f character. Vector column names qualitative predictor variables (.e. ordinal nominal variables type). Usage predictors_f = c(\"landform\") select_pred logical. Perform predictor selection. TRUE predictors selected based backward step wise approach. Default FALSE. partition character. Column name training validation partition groups. thr character. Threshold used get binary suitability values (.e. 0,1), needed threshold-dependent performance metrics. one threshold type can used. necessary provide vector argument. following threshold criteria available: lpt: highest threshold omission. equal_sens_spec: Threshold sensitivity specificity equal. max_sens_spec: Threshold sum sensitivity specificity highest (aka threshold maximizes TSS). max_jaccard: threshold Jaccard index highest. max_sorensen: threshold Sorensen index highest. max_fpb: threshold FPB (F-measure presence-background data) highest. sensitivity: Threshold based specified sensitivity value. Usage thr = c('sensitivity', sens='0.6') thr = c('sensitivity'). 'sens' refers sensitivity value. specified sensitivity values, function use default 0.9 one threshold type used must concatenated, e.g., thr=c('lpt', 'max_sens_spec', 'max_jaccard'), thr=c('lpt', 'max_sens_spec', 'sensitivity', sens='0.8'), thr=c('lpt', 'max_sens_spec', 'sensitivity'). Function use thresholds threshold specified. fit_formula formula. formula object response predictor variables (e.g. formula(pr_ab ~ aet + ppt_jja + pH + awc + depth + landform)). Note variables used must consistent used response, predictors, predictors_f arguments poly integer >= 2. used values >= 2 model use polynomials continuous variables (.e. used predictors argument). Default 0. inter_order integer >= 0. interaction order explanatory variables. Default 0.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_glm.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit and validate Generalized Linear Models — fit_glm","text":"list object : model: \"glm\" class object stats package. object can used predicting. predictors: tibble quantitative (c column names) qualitative (f column names) variables use modeling. performance: Performance metrics (see sdm_eval). Threshold dependent metric calculated based threshold specified thr argument . data_ens: Predicted suitability test partition. database used fit_ensemble","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_glm.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit and validate Generalized Linear Models — fit_glm","text":"","code":"if (FALSE) { # \\dontrun{ data(\"abies\") abies # Using k-fold partition method abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 5) ) abies2 glm_t1 <- fit_glm( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), predictors_f = c(\"landform\"), select_pred = FALSE, partition = \".part\", thr = c(\"max_sens_spec\", \"equal_sens_spec\", \"max_sorensen\"), poly = 0, inter_order = 0 ) glm_t1$model glm_t1$predictors glm_t1$performance glm_t1$data_ens # Using second order polynomial terms and first-order interaction terms glm_t2 <- fit_glm( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), predictors_f = c(\"landform\"), select_pred = FALSE, partition = \".part\", thr = c(\"max_sens_spec\", \"equal_sens_spec\", \"max_sorensen\"), poly = 2, inter_order = 1 ) # Using repeated k-fold partition method abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"rep_kfold\", folds = 3, replicates = 5) ) abies2 # Using third order polynomial terms and second-order interaction terms glm_t3 <- fit_glm( data = abies2, response = \"pr_ab\", predictors = c(\"ppt_jja\", \"pH\", \"awc\"), predictors_f = c(\"landform\"), select_pred = FALSE, partition = \".part\", thr = c(\"max_sens_spec\", \"equal_sens_spec\", \"max_sorensen\"), poly = 3, inter_order = 2 ) } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_max.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit and validate Maximum Entropy models — fit_max","title":"Fit and validate Maximum Entropy models — fit_max","text":"Fit validate Maximum Entropy models","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_max.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit and validate Maximum Entropy models — fit_max","text":"","code":"fit_max( data, response, predictors, predictors_f = NULL, fit_formula = NULL, partition, background = NULL, thr = NULL, clamp = TRUE, classes = \"default\", pred_type = \"cloglog\", regmult = 1 )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_max.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit and validate Maximum Entropy models — fit_max","text":"data data.frame. Database response (0,1) predictors values. response character. Column name species absence-presence data (0,1). predictors character. Vector column names quantitative predictor variables (.e. continuous variables). Usage predictors = c(\"aet\", \"cwd\", \"tmin\") predictors_f character. Vector column names qualitative predictor variables (.e. ordinal nominal variables type). Usage predictors_f = c(\"landform\") fit_formula formula. formula object response predictor variables. See maxnet.formula function maxnet package. Note variables used must consistent used response, predictors, predictors_f arguments. Default NULL. partition character. Column name training validation partition groups. background data.frame. Database including rows 0 values response column predictors variables. column names must consistent data. Default NULL thr character. Threshold used get binary suitability values (.e. 0,1), needed threshold-dependent performance metrics. one threshold type can used. necessary provide vector argument. following threshold criteria available: lpt: highest threshold omission. equal_sens_spec: Threshold sensitivity specificity equal. max_sens_spec: Threshold sum sensitivity specificity highest (aka threshold maximizes TSS). max_jaccard: threshold Jaccard index highest. max_sorensen: threshold Sorensen index highest. max_fpb: threshold FPB (F-measure presence-background data) highest. sensitivity: Threshold based specified sensitivity value. Usage thr = c('sensitivity', sens='0.6') thr = c('sensitivity'). 'sens' refers sensitivity value. sensitivity values specified default used 0.9. one threshold type used must concatenated, e.g., thr=c('lpt', 'max_sens_spec', 'max_jaccard'), thr=c('lpt', 'max_sens_spec', 'sensitivity', sens='0.8'), thr=c('lpt', 'max_sens_spec', 'sensitivity'). Function use thresholds threshold specified. clamp logical. TRUE, predictors features restricted range seen model training. classes character. single feature combinations . Features symbolized letters: l (linear), q (quadratic), h (hinge), p (product), t (threshold). Usage classes = \"lpq\". Default \"default\" (see details). pred_type character. Type response required available \"link\", \"exponential\", \"cloglog\" \"logistic\". Default \"cloglog\" regmult numeric. constant adjust regularization. Default 1.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_max.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit and validate Maximum Entropy models — fit_max","text":"list object : model: \"maxnet\" class object maxnet package. object can used predicting. predictors: tibble quantitative (c column names) qualitative (f column names) variables use modeling. performance: Performance metrics (see sdm_eval). Threshold dependent metrics calculated based threshold specified thr argument. data_ens: Predicted suitability test partition based best model. database used fit_ensemble","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_max.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Fit and validate Maximum Entropy models — fit_max","text":"argument “classes” set default MaxEnt use different features combination depending number presences (np) follow rule: np < 10 classes = \"l\", np 10 15 classes = \"lq\", np 15 80 classes = \"lqh\", np >= 80 classes = \"lqph\" presence-absence (presence-pseudo-absence) data used data argument addition background points, function fit models presences background points validate presences absences. procedure makes maxent comparable presences-absences models (e.g., random forest, support vector machine). presences background points data used, function fit validate model presences background data. presence-absences used data argument without background, function fit model specified data (recommended).","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_max.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit and validate Maximum Entropy models — fit_max","text":"","code":"if (FALSE) { # \\dontrun{ data(\"abies\") data(\"backg\") abies # environmental conditions of presence-absence data backg # environmental conditions of background points # Using k-fold partition method # Note that the partition method, number of folds or replications must # be the same for presence-absence and background points datasets abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 5) ) abies2 backg2 <- part_random( data = backg, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 5) ) backg2 max_t1 <- fit_max( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), predictors_f = c(\"landform\"), partition = \".part\", background = backg2, thr = c(\"max_sens_spec\", \"equal_sens_spec\", \"max_sorensen\"), clamp = TRUE, classes = \"default\", pred_type = \"cloglog\", regmult = 1 ) length(max_t1) max_t1$model max_t1$predictors max_t1$performance max_t1$data_ens } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_net.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit and validate Neural Networks models — fit_net","title":"Fit and validate Neural Networks models — fit_net","text":"Fit validate Neural Networks models","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_net.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit and validate Neural Networks models — fit_net","text":"","code":"fit_net( data, response, predictors, predictors_f = NULL, fit_formula = NULL, partition, thr = NULL, size = 2, decay = 0.1 )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_net.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit and validate Neural Networks models — fit_net","text":"data data.frame. Database response (0,1) predictors values. response character. Column name species absence-presence data (0,1). predictors character. Vector column names quantitative predictor variables (.e. continuous variables). Usage predictors = c(\"aet\", \"cwd\", \"tmin\") predictors_f character. Vector column names qualitative predictor variables (.e. ordinal nominal variables type). Usage predictors_f = c(\"landform\") fit_formula formula. formula object response predictor variables (e.g. formula(pr_ab ~ aet + ppt_jja + pH + awc + depth + landform)). Note variables used must consistent used response, predictors, predictors_f arguments. Defaul NULL. partition character. Column name training validation partition groups. thr character. Threshold used get binary suitability values (.e. 0,1)., needed threshold-dependent performance metrics. one threshold type can specified. necessary provide vector argument. following threshold criteria available: lpt: highest threshold omission. equal_sens_spec: Threshold sensitivity specificity equal. max_sens_spec: Threshold sum sensitivity specificity highest (aka threshold maximizes TSS). max_jaccard: threshold Jaccard index highest. max_sorensen: threshold Sorensen index highest. max_fpb: threshold FPB (F-measure presence-background data) highest. sensitivity: Threshold based specified sensitivity value. Usage thr = c('sensitivity', sens='0.6') thr = c('sensitivity'). 'sens' refers sensitivity value. sensitivity value specified, default 0.9 one threshold type used must concatenated, e.g., thr=c('lpt', 'max_sens_spec', 'max_jaccard'), thr=c('lpt', 'max_sens_spec', 'sensitivity', sens='0.8'), thr=c('lpt', 'max_sens_spec', 'sensitivity'). Function use thresholds threshold specified. size numeric. Number units hidden layer. Can zero skip-layer units. Default 2. decay numeric. Parameter weight decay. Default 0.1.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_net.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit and validate Neural Networks models — fit_net","text":"list object : model: \"nnet.formula\" \"nnet\" class object nnet package. object can used predicting. predictors: tibble quantitative (c column names) qualitative (f column names) variables use modeling. performance: Performance metrics (see sdm_eval). Threshold dependent metric calculated based threshold specified argument. data_ens: Predicted suitability test partition. database used fit_ensemble","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_net.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit and validate Neural Networks models — fit_net","text":"","code":"if (FALSE) { # \\dontrun{ data(\"abies\") # Using k-fold partition method abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 10) ) abies2 nnet_t1 <- fit_net( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), predictors_f = c(\"landform\"), partition = \".part\", thr = c(\"max_sens_spec\", \"equal_sens_spec\", \"max_sorensen\"), fit_formula = NULL ) nnet_t1$model nnet_t1$predictors nnet_t1$performance nnet_t1$data_ens # Using bootstrap partition method and only with presence-absence # and get performance for several method abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"boot\", replicates = 10, proportion = 0.7) ) abies2 nnet_t2 <- fit_net( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), predictors_f = c(\"landform\"), partition = \".part\", thr = c(\"max_sens_spec\", \"equal_sens_spec\", \"max_sorensen\"), fit_formula = NULL ) nnet_t2 } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_raf.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit and validate Random Forests models — fit_raf","title":"Fit and validate Random Forests models — fit_raf","text":"Fit validate Random Forests models","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_raf.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit and validate Random Forests models — fit_raf","text":"","code":"fit_raf( data, response, predictors, predictors_f = NULL, fit_formula = NULL, partition, thr = NULL, mtry = sqrt(length(c(predictors, predictors_f))) )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_raf.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit and validate Random Forests models — fit_raf","text":"data data.frame. Database response (0,1) predictors values. response character. Column name species absence-presence data (0,1). predictors character. Vector column names quantitative predictor variables (.e. continuous variables). Usage predictors = c(\"aet\", \"cwd\", \"tmin\") predictors_f character. Vector column names qualitative predictor variables (.e. ordinal nominal variables type). Usage predictors_f = c(\"landform\") fit_formula formula. formula object response predictor variables (e.g. formula(pr_ab ~ aet + ppt_jja + pH + awc + depth + landform)). Note variables used must consistent used response, predictors, predictors_f arguments. Default NULL partition character. Column name training validation partition groups. thr character. Threshold used get binary suitability values (.e. 0,1), needed threshold-dependent performance metrics. one threshold type can used. necessary provide vector argument. following threshold criteria available: lpt: highest threshold omission. equal_sens_spec: Threshold sensitivity specificity equal. max_sens_spec: Threshold sum sensitivity specificity highest (aka threshold maximizes TSS). max_jaccard: threshold Jaccard highest. max_sorensen: threshold Sorensen highest. max_fpb: threshold FPB (F-measure presence-background data) highest. sensitivity: Threshold based specified sensitivity value. Usage thr = c('sensitivity', sens='0.6') thr = c('sensitivity'). 'sens' refers sensitivity value. specified sensitivity values, function use default 0.9 one threshold type used must concatenated, e.g., thr=c('lpt', 'max_sens_spec', 'max_jaccard'), thr=c('lpt', 'max_sens_spec', 'sensitivity', sens='0.8'), thr=c('lpt', 'max_sens_spec', 'sensitivity'). Function use thresholds threshold specified. mtry numeric. Number variables randomly sampled candidates split. Default sqrt(length(c(predictors, predictors_f)))","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_raf.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit and validate Random Forests models — fit_raf","text":"list object : model: \"randomForest\" class object randomForest package. object can used predicting. predictors: tibble quantitative (c column names) qualitative (f column names) variables use modeling. performance: Performance metrics (see sdm_eval). Threshold dependent metrics calculated based threshold specified argument. data_ens: Predicted suitability test partition. database used fit_ensemble","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_raf.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit and validate Random Forests models — fit_raf","text":"","code":"if (FALSE) { # \\dontrun{ data(\"abies\") # Using k-fold partition method abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 10) ) abies2 rf_t1 <- fit_raf( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), predictors_f = c(\"landform\"), partition = \".part\", thr = c(\"max_sens_spec\", \"equal_sens_spec\", \"max_sorensen\"), fit_formula = NULL ) rf_t1$model rf_t1$predictors rf_t1$performance rf_t1$data_ens # Using bootstrap partition method and only with presence-absence # and get performance for several method abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"boot\", replicates = 10, proportion = 0.7) ) abies2 rf_t2 <- fit_raf( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), predictors_f = c(\"landform\"), partition = \".part\", thr = c(\"max_sens_spec\", \"equal_sens_spec\", \"max_sorensen\"), fit_formula = NULL ) rf_t2 } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_svm.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit and validate Support Vector Machine models — fit_svm","title":"Fit and validate Support Vector Machine models — fit_svm","text":"Fit validate Support Vector Machine models","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_svm.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit and validate Support Vector Machine models — fit_svm","text":"","code":"fit_svm( data, response, predictors, predictors_f = NULL, fit_formula = NULL, partition, thr = NULL, sigma = \"automatic\", C = 1 )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_svm.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit and validate Support Vector Machine models — fit_svm","text":"data data.frame. Database response (0,1) predictors values. response character. Column name species absence-presence data (0,1). predictors character. Vector column names quantitative predictor variables (.e. continuous variables). Usage predictors = c(\"aet\", \"cwd\", \"tmin\") predictors_f character. Vector column names qualitative predictor variables (.e. ordinal nominal variables type). Usage predictors_f = c(\"landform\") fit_formula formula. formula object response predictor variables (e.g. formula(pr_ab ~ aet + ppt_jja + pH + awc + depth + landform)). Note variables used must consistent used response, predictors, predictors_f arguments partition character. Column name training validation partition groups. thr character. Threshold used get binary suitability values (.e. 0,1) needed threshold-dependent performance metrics. one threshold type can used. necessary provide vector argument. following threshold criteria available: lpt: highest threshold omission. equal_sens_spec: Threshold sensitivity specificity equal. max_sens_spec: Threshold sum sensitivity specificity highest (aka threshold maximizes TSS). max_jaccard: threshold Jaccard index highest. max_sorensen: threshold Sorensen index highest. max_fpb: threshold FPB (F-measure presence-background data) highest. sensitivity: Threshold based specified sensitivity value. Usage thr = c('sensitivity', sens='0.6') thr = c('sensitivity'). 'sens' refers sensitivity value. sensitivity value specified, default used 0.9 one threshold type used must concatenated, e.g., thr=c('lpt', 'max_sens_spec', 'max_jaccard'), thr=c('lpt', 'max_sens_spec', 'sensitivity', sens='0.8'), thr=c('lpt', 'max_sens_spec', 'sensitivity'). Function use thresholds threshold specified. sigma numeric. Inverse kernel width Radial Basis kernel function \"rbfdot\". Default \"automatic\". C numeric. Cost constraints violation, 'C'-constant regularization term Lagrange formulation. Default 1","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_svm.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit and validate Support Vector Machine models — fit_svm","text":"list object : model: \"ksvm\" class object kernlab package. object can used predicting. predictors: tibble quantitative (c column names) qualitative (f column names) variables use modeling. performance: Performance metric (see sdm_eval). Threshold dependent metrics calculated based threshold specified argument. data_ens: Predicted suitability test partition based best model. database used fit_ensemble","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_svm.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Fit and validate Support Vector Machine models — fit_svm","text":"function constructs 'C-svc' classification type uses Radial Basis kernel \"Gaussian\" function (rbfdot). See details details ksvm.","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_svm.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit and validate Support Vector Machine models — fit_svm","text":"","code":"if (FALSE) { # \\dontrun{ data(\"abies\") # Using k-fold partition method abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 5) ) abies2 svm_t1 <- fit_svm( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), predictors_f = c(\"landform\"), partition = \".part\", thr = c(\"max_sens_spec\", \"equal_sens_spec\", \"max_sorensen\"), fit_formula = NULL ) names(svm_t1) svm_t1$model svm_t1$predictors svm_t1$performance svm_t1$data_ens # Using bootstrap partition method and only with presence-absence # and get performance for several method abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"boot\", replicates = 10, proportion = 0.7) ) abies2 svm_t2 <- fit_svm( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), predictors_f = c(\"landform\"), partition = \".part\", thr = c(\"max_sens_spec\", \"equal_sens_spec\", \"max_sorensen\"), fit_formula = NULL ) svm_t2 } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/get_block.html","id":null,"dir":"Reference","previous_headings":"","what":"Transform a spatial partition layer to the same spatial properties as environmental variables — get_block","title":"Transform a spatial partition layer to the same spatial properties as environmental variables — get_block","text":"Transform spatial partition layer spatial properties environmental variables","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/get_block.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Transform a spatial partition layer to the same spatial properties as environmental variables — get_block","text":"","code":"get_block(env_layer, best_grid)"},{"path":"https://sjevelazco.github.io/flexsdm/reference/get_block.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Transform a spatial partition layer to the same spatial properties as environmental variables — get_block","text":"env_layer SpatRaster object environmental variables used block_partition band_partition function. Function always select first layer best_grid SpatRaster object returned block_partition band_partition","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/get_block.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Transform a spatial partition layer to the same spatial properties as environmental variables — get_block","text":"SpatRaster layer resolution extent environmental variables","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/get_block.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Transform a spatial partition layer to the same spatial properties as environmental variables — get_block","text":"Transform layer originating function block_partition band_partition spatial properties environmental variables","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/get_block.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Transform a spatial partition layer to the same spatial properties as environmental variables — get_block","text":"","code":"if (FALSE) { # \\dontrun{ require(dplyr) require(terra) data(spp) f <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(f) # Example for a single species single_spp <- spp %>% dplyr::filter(species == \"sp3\") part <- part_sblock( env_layer = somevar, data = single_spp, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", min_res_mult = 100, max_res_mult = 500, num_grids = 10, min_occ = 5, n_part = 2 ) grid_env <- get_block(env_layer = somevar, best_grid = part$grid) grid_env part$grid plot(part$grid) plot(grid_env) } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/hespero.html","id":null,"dir":"Reference","previous_headings":"","what":"A data set containing localities of Hesperocyparis stephensonii species in California, USA — hespero","title":"A data set containing localities of Hesperocyparis stephensonii species in California, USA — hespero","text":"data set containing localities Hesperocyparis stephensonii species California, USA","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/hespero.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"A data set containing localities of Hesperocyparis stephensonii species in California, USA — hespero","text":"","code":"hespero"},{"path":"https://sjevelazco.github.io/flexsdm/reference/hespero.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"A data set containing localities of Hesperocyparis stephensonii species in California, USA — hespero","text":"tibble object 14 rows 4 variables: ID presences records ID x y columns coordinates Albers Equal Area Conic coordinate system pr_ab presence denoted 1","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/hespero.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"A data set containing localities of Hesperocyparis stephensonii species in California, USA — hespero","text":"","code":"if (FALSE) { # \\dontrun{ require(dplyr) data(\"hespero\") hespero } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/homogenize_na.html","id":null,"dir":"Reference","previous_headings":"","what":"Homogenize cells with NAs across all layers — homogenize_na","title":"Homogenize cells with NAs across all layers — homogenize_na","text":"Homogenize cells NAs across layers","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/homogenize_na.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Homogenize cells with NAs across all layers — homogenize_na","text":"","code":"homogenize_na(x)"},{"path":"https://sjevelazco.github.io/flexsdm/reference/homogenize_na.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Homogenize cells with NAs across all layers — homogenize_na","text":"x SpatRaster.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/homogenize_na.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Homogenize cells with NAs across all layers — homogenize_na","text":"SpatRaster","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/homogenize_na.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Homogenize cells with NAs across all layers — homogenize_na","text":"Homogenize cells NAs across layers SpatRaster resulting SpatRaster layers cells NAa","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/homogenize_na.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Homogenize cells with NAs across all layers — homogenize_na","text":"","code":"if (FALSE) { # \\dontrun{ #' require(terra) somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) somevar2 <- homogenize_na(somevar) par(mfrow = c(2, 1)) plot(somevar$CFP_4) plot(somevar2$CFP_4) par(mfrow = c(1, 1)) # In somevar2 all layers have the same cells with NAs } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/interp.html","id":null,"dir":"Reference","previous_headings":"","what":"Raster interpolation between two time periods — interp","title":"Raster interpolation between two time periods — interp","text":"function interpolates values year two specified years simple interpolation using two raster objects containing e.g. habitat suitability values predicted using species distribution model.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/interp.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Raster interpolation between two time periods — interp","text":"","code":"interp(r1, r2, y1, y2, rastername = NULL, dir_save = NULL)"},{"path":"https://sjevelazco.github.io/flexsdm/reference/interp.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Raster interpolation between two time periods — interp","text":"r1 SpatRaster. Raster object initial year r2 SpatRaster. Raster object final year y1 numeric. Initial year y2 numeric. Final year rastername character. Word used prefix raster file name. Default NULL dir_save character. Directory path name folder raster files saved. NULL, function return SpatRaster object, else, save raster given directory. Default NULL","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/interp.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Raster interpolation between two time periods — interp","text":"dir_save NULL, function returns SpatRaster suitability interpolation year. dir_save used, function outputs saved directory specified dir_save.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/interp.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Raster interpolation between two time periods — interp","text":"function interpolates suitability values assuming annual changes suitability linear. function useful linking SDM output based averaged climate data climate change scenarios models require suitability values disaggregated time periods, population dynamics (Keith et al., 2008; Conlisk et al., 2013; Syphard et al., 2013).","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/interp.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Raster interpolation between two time periods — interp","text":"Keith, D.., Akçakaya, H.R., Thuiller, W., Midgley, G.F., Pearson, R.G., Phillips, S.J., Regan, H.M., Araujo, M.B. & Rebelo, T.G. (2008) Predicting extinction risks climate change: coupling stochastic population models dynamic bioclimatic habitat models. Biology Letters, 4, 560-563. Conlisk, E., Syphard, .D., Franklin, J., Flint, L., Flint, . & Regan, H.M. (2013) Management implications uncertainty assessing impacts multiple landscape-scale threats species persistence using linked modeling approach. Global Change Biology 3, 858-869. Syphard, .D., Regan, H.M., Franklin, J. & Swab, R. (2013) functional type vulnerability multiple threats depend spatial context Mediterranean-climate regions? Diversity Distributions, 19, 1263-1274.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/interp.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Raster interpolation between two time periods — interp","text":"","code":"if (FALSE) { # \\dontrun{ require(terra) require(dplyr) f <- system.file(\"external/suit_time_step.tif\", package = \"flexsdm\") abma <- terra::rast(f) plot(abma) int <- interp( r1 = abma[[1]], r2 = abma[[2]], y1 = 2010, y2 = 2020, rastername = \"Abies\", dir_save = NULL ) int } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/msdm_posteriori.html","id":null,"dir":"Reference","previous_headings":"","what":"Methods to correct overprediction of species distribution models based on occurrences and suitability patterns. — msdm_posteriori","title":"Methods to correct overprediction of species distribution models based on occurrences and suitability patterns. — msdm_posteriori","text":"methods reduce overprediction species distribution models based posteriori methods (see Mendes et al 2020), .e., combination patterns species occurrences predicted suitability","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/msdm_posteriori.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Methods to correct overprediction of species distribution models based on occurrences and suitability patterns. — msdm_posteriori","text":"","code":"msdm_posteriori( records, x, y, pr_ab, cont_suit, method = c(\"obr\", \"pres\", \"lq\", \"mcp\", \"bmcp\"), thr = \"equal_sens_spec\", buffer = NULL, crs = NULL )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/msdm_posteriori.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Methods to correct overprediction of species distribution models based on occurrences and suitability patterns. — msdm_posteriori","text":"records tibble data.frame. database spatial coordinates species presences absences (pseudo-absence) used create species distribution models. x character. Column name spatial x coordinates. y character. Column name spatial y coordinates. pr_ab character. Column name presence absence data (.e. 1 0) cont_suit SpatRaster. Raster continuous suitability predictions \"species_specific\" type calculates minimum pairwise-distances occurrences selects maximum distance, .e., value buffer maximum distance minimum distance. procedure depends spatial pattern species' occurrences; thus, species, value buffer width calculated (usage buffer=\"species_specific\"). method character. character string indicating constraint method used. thr character numeric. Threshold used get binary suitability values (.e. 0,1), needed threshold-dependent performance metrics. one threshold type can specified. necessary provide vector argument. following threshold criteria available: lpt: highest threshold omission. equal_sens_spec: Threshold sensitivity specificity equal. max_sens_spec: Threshold sum sensitivity specificity highest (aka threshold maximizes TSS). max_jaccard: threshold Jaccard index highest. max_sorensen: threshold Sorensen index highest. max_fpb: threshold FPB highest. sensitivity: Threshold based specified sensitivity value. Usage thr = c('sensitivity', sens='0.6') thr = c('sensitivity'). 'sens' refers sensitivity value. specified sensitivity values, function use default 0.9 Also, possible specifying threshold value using numeric values (thr = 0.623). Default \"equal_sens_spec\". buffer numeric. Buffer width use 'bmcp' approach. buffer width interpreted m Coordinate reference system used \"crs\" argument longitude/latitude, map units cases. Usage buffer=50000. Default NULL crs character. Coordinate reference system used calculating buffer \"bmcp\" method.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/msdm_posteriori.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Methods to correct overprediction of species distribution models based on occurrences and suitability patterns. — msdm_posteriori","text":"function return SpatRaster continuous binary prediction.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/msdm_posteriori.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Methods to correct overprediction of species distribution models based on occurrences and suitability patterns. — msdm_posteriori","text":"function help reduce overprediction species distribution models based combination patterns species occurrences predicted suitability. recommended use approaches current distribution models projected different time periods (past future). Five methods implemented: Abbreviation list SDM: species distribution model l: suitability patches intercept species occurrences k: suitability patches intercept species occurrences T: threshold distances used select suitability patches methods reduce overprediction species distribution models already fitted based occurrences suitability patterns species (see 'thr' arguments) Method 'obr' (Occurrences Based Restriction). method assumes suitable patches intercepting species occurrences (l) likely part species distributions suitable patches intercept occurrence (k). Distance k patches closest l patch calculated, k patches removed exceed species-specific distance threshold SDMs models. threshold (T) calculated maximum distance vector minimum pairwise distances occurrences. Whenever suitable pixel within k patch distance T closest l patch, suitability pixel reduced zero. assumed simple threshold surrogate species-specific dispersal ability. T low, either species sampled throughout distribution, species geographically restricted, justifying narrow inclusion k patches (Mendes et al., 2020). Method 'pres' (occurrences based restriction). restrictive variant 'obr' method. retains pixels suitability patches intercepting occurrences (k) (Mendes et al., 2020). Method 'lq' (Lower Quantile). method similar 'obr' method, except procedure define distance threshold withdrawn k patches, lower quartile distance k patches closest l patch. Whenever suitable pixel within k patch, .e., within lower quartile, suitability pixel reduced zero. means 75% k patches withdrawn model (Mendes et al., 2020). Method 'mcp' (Minimum Convex Polygon). Compiled adapted Kremen et al. (2008), method excludes SDM predictions suitable pixels intercept minimum convex polygon, interior angles smaller 180, enclosing occurrences species. Method 'bmcp' (Buffered Minimum Convex Polygon). Compiled adapted Kremen et al. (2008), similar 'mcp' method except inclusion buffer zone surrounding minimum convex polygons. method buffer width value must provided \"buffer\" argument CRS \"crs\" argument. methodological performance information methods see Mendes et al. (2020). using one constraining methods, cite Mendes et al (2020).","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/msdm_posteriori.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Methods to correct overprediction of species distribution models based on occurrences and suitability patterns. — msdm_posteriori","text":"Mendes, P.; Velazco S.J.E.; Andrade, .F..; De Marco, P. (2020) Dealing overprediction species distribution models: adding distance constraints can improve model accuracy, Ecological Modelling, press. https://doi.org/10.1016/j.ecolmodel.2020.109180 Kremen, C., Cameron, ., Moilanen, ., Phillips, S. J., Thomas, C. D., Beentje, H., . Zjhra, M. L. (2008). Aligning Conservation Priorities Across Taxa Madagascar High-Resolution Planning Tools. Science, 320(5873), 222-226. doi:10.1126/science.1155193","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/msdm_posteriori.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Methods to correct overprediction of species distribution models based on occurrences and suitability patterns. — msdm_posteriori","text":"","code":"if (FALSE) { # \\dontrun{ require(dplyr) require(terra) data(\"spp\") somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) # Preparing data for modeling a species set.seed(10) occ <- spp %>% dplyr::filter(species == \"sp2\") %>% # filter a species sdm_extract( data = ., x = \"x\", y = \"y\", env_layer = somevar, filter_na = TRUE ) %>% # extrac variables values part_random(., pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 10) ) # add columns with partition # Fit a model m_glm <- fit_glm( data = occ, response = \"pr_ab\", predictors = names(somevar), partition = \".part\", thr = \"equal_sens_spec\", ) # Lets predict this model m_pred <- sdm_predict(models = m_glm, pred = somevar, thr = NULL, con_thr = FALSE) plot(m_pred[[1]]) m_pred[[1]] %>% plot() # Lets extract the raster from this list m_pred <- m_pred[[1]] ### bmcp method m_bmcp <- msdm_posteriori( records = occ, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", method = \"bmcp\", cont_suit = m_pred, thr = \"equal_sens_spec\", buffer = 30000, crs=crs(m_pred) ) plot(m_bmcp) ### mcp method m_mcp <- msdm_posteriori( records = occ, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", method = \"mcp\", cont_suit = m_pred, thr = \"equal_sens_spec\", buffer = NULL ) plot(m_mcp) ### pres method m_pres <- msdm_posteriori( records = occ, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", method = \"pres\", cont_suit = m_pred, thr = \"equal_sens_spec\", buffer = NULL ) plot(m_pres) ### lq method m_lq <- msdm_posteriori( records = occ, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", method = \"lq\", cont_suit = m_pred, thr = \"equal_sens_spec\", buffer = NULL ) plot(m_lq) ### obr method m_obr <- msdm_posteriori( records = occ, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", method = \"obr\", cont_suit = m_pred, thr = \"equal_sens_spec\", buffer = NULL ) plot(m_obr) } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/msdm_priori.html","id":null,"dir":"Reference","previous_headings":"","what":"Create spatial predictor variables to reduce overprediction of species distribution models — msdm_priori","title":"Create spatial predictor variables to reduce overprediction of species distribution models — msdm_priori","text":"function creates geographical predictor variables , together environmental variables, can used construct constrained species distribution models.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/msdm_priori.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Create spatial predictor variables to reduce overprediction of species distribution models — msdm_priori","text":"","code":"msdm_priori(data, x, y, method = c(\"xy\", \"min\", \"cml\", \"ker\"), env_layer)"},{"path":"https://sjevelazco.github.io/flexsdm/reference/msdm_priori.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Create spatial predictor variables to reduce overprediction of species distribution models — msdm_priori","text":"data tibble data.frame. database geographical coordinates species presences. x character. Column name spatial x coordinates. y character. Column name spatial y coordinates. method character. character string indicating MSDM method used. following methods available: 'xy', 'min', 'cml', 'ker'. Usage method = 'cml' env_layer raster layer used construct species distribution models. object used create constraining variables resolution, extent, pattern empty cells environmental variables. advisable use raster environmental layer used create species distribution models avoid mismatch (e.g. resolution, extent, cells NA) environmental constraining variables.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/msdm_priori.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Create spatial predictor variables to reduce overprediction of species distribution models — msdm_priori","text":"function returns SpatRaster object. raster/s used together environmental variables construct species distribution models. 'xy' approach creates single pair raster layers can used species share study region. Otherwise, 'cml', 'min', 'ker' create species-specific raster layer.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/msdm_priori.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Create spatial predictor variables to reduce overprediction of species distribution models — msdm_priori","text":"function creates geographical predictor variables , together environmental variables, can used construct constrained species distribution models. recommended use approaches create models projected current conditions different time periods (past future). Four methods implemented: xy (Latlong method). method assumes spatial structure can partially explain species distribution (Bahn & McGill, 2007). Therefore, two raster layers created, containing latitude longitude pixels, respectively. raster layers included covariates environmental layers construct species distribution models. method interact species occurrence generic given study region; reason, possible use method species set share study region. min (Nearest neighbor distance method). Compiled adapted Allouche et al. (2008), method calculates cell Euclidean geographic distance nearest presence point. cml (Cumulative distance method). Compiled adapted Allouche et al. (2008), method assumes pixels closer presences likely included species distributions. Therefore, raster layer created containing sum Euclidean geographic distances pixel occurrences species. Obtained values normalized vary zero one. raster layer included environmental layers construct species distribution models. ker (Kernel method). Compiled adapted Allouche et al. (2008), method, like cml, assumes pixels located areas higher density occurrences likely included actual species distribution. Thus, raster layer created containing Gaussian values based density occurrences species. standard deviation Gaussian distribution maximum value vector minimum distances pairs occurrences species. Gaussian values normalized vary zero one. raster layer included environmental layers construct species distribution models. See Mendes et al. (2020) methodological performance details. used one constraining method cite Mendes et al 2020.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/msdm_priori.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Create spatial predictor variables to reduce overprediction of species distribution models — msdm_priori","text":"Mendes, P.; Velazco S.J.E.; Andrade, .F..; De Marco, P. (2020) Dealing overprediction species distribution models: adding distance constraints can improve model accuracy, Ecological Modelling, press. https://doi.org/10.1016/j.ecolmodel.2020.109180 Allouche, O.; Steinitz, O.; Rotem, D.; Rosenfeld, .; Kadmon, R. (2008). Incorporating distance constraints species distribution models. Journal Applied Ecology, 45(2), 599-609. doi:10.1111/j.1365-2664.2007.01445.x Bahn, V.; McGill, B. J. (2007). Can niche-based distribution models outperform spatial interpolation? Global Ecology Biogeography, 16(6), 733-742. doi:10.1111/j.1466-8238.2007.00331.x","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/msdm_priori.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Create spatial predictor variables to reduce overprediction of species distribution models — msdm_priori","text":"","code":"if (FALSE) { # \\dontrun{ require(dplyr) require(terra) data(\"spp\") somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) # Select the presences of a species occ <- spp %>% dplyr::filter(species == \"sp3\", pr_ab == 1) # Select a raster layer to be used as a basic raster a_variable <- somevar[[1]] plot(a_variable) points(occ %>% dplyr::select(x, y)) ### xy method m_xy <- msdm_priori( data = occ, x = \"x\", y = \"y\", method = \"xy\", env_layer = a_variable ) plot(m_xy) ### min method m_min <- msdm_priori( data = occ, x = \"x\", y = \"y\", method = \"min\", env_layer = a_variable ) plot(m_min) ### cml method m_cml <- msdm_priori( data = occ, x = \"x\", y = \"y\", method = \"cml\", env_layer = a_variable ) plot(m_cml) ### ker method m_ker <- msdm_priori( data = occ, x = \"x\", y = \"y\", method = \"ker\", env_layer = a_variable ) plot(m_ker) } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/occfilt_env.html","id":null,"dir":"Reference","previous_headings":"","what":"Perform environmental filtering on species occurrences — occfilt_env","title":"Perform environmental filtering on species occurrences — occfilt_env","text":"function perform filtering species occurrences based environmental conditions.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/occfilt_env.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Perform environmental filtering on species occurrences — occfilt_env","text":"","code":"occfilt_env(data, x, y, id, env_layer, nbins)"},{"path":"https://sjevelazco.github.io/flexsdm/reference/occfilt_env.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Perform environmental filtering on species occurrences — occfilt_env","text":"data data.frame. Data.frame tibble object presences (presence-absence) records, coordinates x character. Column name spatial x coordinates y character. Column name spatial y coordinates id character. Column names rows id. important row unique code. env_layer SpatRaster. Rasters environmental conditions nbins integer. number classes used split environmental condition","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/occfilt_env.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Perform environmental filtering on species occurrences — occfilt_env","text":"tibble object data environmentally filtered","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/occfilt_env.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Perform environmental filtering on species occurrences — occfilt_env","text":"function uses approach adapted approach proposed Varela et al. (2014). consists filtering occurrences environmental space. First, regular multidimensional grid created environmental space. multidimensional grid determined environmental variables (always use continuous variables) grid cell size defined number bins, used dividing variable range interval classes (Varela et al. 2014; Castellanos et al., 2019). number bins set \"nbins\" argument. , single occurrence randomly selected within cell multidimensional grid. Consider trade-number bins number filtered records number bins decreases, cell size grids increases, number filtered records decreases (Castellanos et al., 2019). occfilt_env works number dimensions (variables) original variables without performing PCA beforehand. greater number predictor variables (.e., number dimensions multidimensional environmental grid) greater number bins, greater time processing computer memory used. Therefore, recommended use small number bins 2-5 ten variables used. Environmental filters sensitive number bins. procedure selecting number bins used Velazco et al. (2020). selection consists testing different numbers bins, calculating average spatial autocorrelation among variables (based Moran’s index), selecting lowest average spatial autocorrelation highest number occurrences. Note greater number bins, greater records retained","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/occfilt_env.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Perform environmental filtering on species occurrences — occfilt_env","text":"Castellanos, . ., Huntley, J. W., Voelker, G., & Lawing, . M. (2019). Environmental filtering improves ecological niche models across multiple scales. Methods Ecology Evolution, 10(4), 481-492. https://doi.org/10.1111/2041-210X.13142 Varela, S., Anderson, R. P., Garcia-Valdes, R., & Fernandez-Gonzalez, F. (2014). Environmental filters reduce effects sampling bias improve predictions ecological niche models. Ecography, 37, 1084-1091. https://doi.org/10.1111/j.1600-0587.2013.00441.x Velazco, S. J. E., Svenning, J-C., Ribeiro, B. R., & Laureto, L. M. O. (2020). opportunities threats conserve phylogenetic diversity Neotropical palms. Diversity Distributions, 27, 512–523. https://doi.org/10.1111/ddi.13215","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/occfilt_env.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Perform environmental filtering on species occurrences — occfilt_env","text":"","code":"if (FALSE) { # \\dontrun{ require(terra) require(dplyr) # Environmental variables somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) plot(somevar) # Species occurrences data(\"spp\") spp spp1 <- spp %>% dplyr::filter(species == \"sp1\", pr_ab == 1) somevar[[1]] %>% plot() points(spp1 %>% select(x, y)) spp1$idd <- 1:nrow(spp1) # split environmental variables into 5 bins filtered_1 <- occfilt_env( data = spp1, x = \"x\", y = \"y\", id = \"idd\", env_layer = somevar, nbins = 5 ) # split into 8 bins filtered_2 <- occfilt_env( data = spp1, x = \"x\", y = \"y\", id = \"idd\", env_layer = somevar, nbins = 8 ) # split into 12 bins filtered_3 <- occfilt_env( data = spp1, x = \"x\", y = \"y\", id = \"idd\", env_layer = somevar, nbins = 12 ) # note that the higher the nbins parameter the more # classes must be processed (4 variables, 30 bins = 923521 classes) # While the greater the greater the number of bins, the greater records retained } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/occfilt_geo.html","id":null,"dir":"Reference","previous_headings":"","what":"Perform geographical filtering on species occurrences — occfilt_geo","title":"Perform geographical filtering on species occurrences — occfilt_geo","text":"function perform geographical filtering species occurrences based different approach define minimum nearest-neighbor distance points.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/occfilt_geo.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Perform geographical filtering on species occurrences — occfilt_geo","text":"","code":"occfilt_geo( data, x, y, env_layer, method, prj = \"+proj=longlat +datum=WGS84\", reps = 20 )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/occfilt_geo.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Perform geographical filtering on species occurrences — occfilt_geo","text":"data data.frame. Data.frame tibble object presences (presence-absence) records, coordinates x character. Column name longitude data y character. Column name latitude data env_layer SpatRaster. Raster variables used fit model method character. Method perform geographical thinning. Pairs points filtered based geographical distance criteria.following methods available: moran: records filtered based smallest distance reduces Moran's values lower 0.1. Latlong = TRUE occurrences geographical projection. Usage method: method = c('moran'). cellsize: records filtered based resolution environmental variables can aggregated coarser resolution defined factor. Usage method: method = c('cellsize', factor = '2'). defined: records filtered based distance value (d) provided km. Usage method: method = c('defined', d = 300). prj character. Projection string (PROJ4) occurrences. necessary projection used WGS84 (\"+proj=longlat +datum=WGS84\"). Default \"+proj=longlat +datum=WGS84\" reps integer. Number times repeat thinning process. Default 20","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/occfilt_geo.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Perform geographical filtering on species occurrences — occfilt_geo","text":"tibble object data filtered geographically","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/occfilt_geo.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Perform geographical filtering on species occurrences — occfilt_geo","text":"function three alternatives implemented determine distance threshold pair points: 1-\"moran\" determines minimum nearest-neighbor distance minimizes spatial autocorrelation occurrence data, following Moran's semivariogram. Principal Component Analysis environmental variables performed first Principal Component used calculate semivariograms. , method allow use continuous variables. Sometimes, method can () greatly reduce number presences. 2-\"cellsize\" filters occurrences based predictors' resolution. method calculate distance first two cells environmental variable use distance minimum nearest-neighbor distance filter occurrences. resolution raster aggregated based values used \"factor\". Thus, distance used filtering can adjusted represent larger grid size. 3-\"determined\" method uses minimum nearest-neighbor distance specified km. third method \"thin\" function spThin package used (Aiello-Lammens et al., 2015) following argument settings reps = 20, write.files = FALSE, locs.thinned.list.return = TRUE, write.log.file = FALSE.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/occfilt_geo.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Perform geographical filtering on species occurrences — occfilt_geo","text":"Aiello-Lammens, M. E., Boria, R. ., Radosavljevic, ., Vilela, B., & Anderson, R. P. (2015). spThin: R package spatial thinning species occurrence records use ecological niche models. Ecography, 38(5), 541-545. https://doi.org/10.1111/ecog.01132","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/occfilt_geo.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Perform geographical filtering on species occurrences — occfilt_geo","text":"","code":"if (FALSE) { # \\dontrun{ require(terra) require(dplyr) # Environmental variables somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) plot(somevar) # Species occurrences data(\"spp\") spp spp1 <- spp %>% dplyr::filter(species == \"sp1\", pr_ab == 1) somevar[[1]] %>% plot() points(spp1 %>% select(x, y)) # Using Moran method filtered_1 <- occfilt_geo( data = spp1, x = \"x\", y = \"y\", env_layer = somevar, method = c(\"moran\"), prj = crs(somevar) ) somevar[[1]] %>% plot(col = gray.colors(10)) points(spp1 %>% select(x, y)) # raw data points(filtered_1 %>% select(x, y), pch = 19, col = \"yellow\") # filtered data # Using cellsize method filtered_2 <- occfilt_geo( data = spp1, x = \"x\", y = \"y\", env_layer = somevar, method = c(\"cellsize\", factor = \"3\"), prj = crs(somevar) ) somevar[[1]] %>% plot(col = gray.colors(10)) points(spp1 %>% select(x, y)) # raw data points(filtered_2 %>% select(x, y), pch = 19, col = \"yellow\") # filtered data # Using defined method filtered_3 <- occfilt_geo( data = spp1, x = \"x\", y = \"y\", env_layer = somevar, method = c(\"defined\", d = \"30\"), prj = crs(somevar) ) somevar[[1]] %>% plot(col = gray.colors(10)) points(spp1 %>% select(x, y)) # raw data points(filtered_3 %>% select(x, y), pch = 19, col = \"yellow\") # filtered data } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_random.html","id":null,"dir":"Reference","previous_headings":"","what":"Conventional data partitioning methods — part_random","title":"Conventional data partitioning methods — part_random","text":"function provides different conventional (randomized, non-spatial) partitioning methods based cross validation folds (kfold, rep_kfold, loocv), well bootstrap (boot)","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_random.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Conventional data partitioning methods — part_random","text":"","code":"part_random(data, pr_ab, method = NULL)"},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_random.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Conventional data partitioning methods — part_random","text":"data data.frame. Database presences, presence-absence, pseudo-absence, records given species pr_ab character. Column name \"data\" presences, presence-absence, pseudo-absence. Presences must represented 1 absences 0 method character. Vector data partitioning method used. Usage part=c(method= 'kfold', folds='5'). Methods include: kfold: Random partitioning k-folds cross-validation. 'folds' refers number folds data partitioning, assumes value >=1. Usage method = c(method = \"kfold\", folds = 10). rep_kfold: Random partitioning repeated k-folds cross-validation. Usage method = c(method = \"rep_kfold\", folds = 10, replicates=10). 'folds' refers number folds data partitioning, assumes value >=1. 'replicate' refers number replicates, assumes value >=1. loocv: Leave-one-cross-validation (.k.. Jackknife). special case k-fold cross validation number partitions equal number records. Usage method = c(method = \"loocv\"). boot: Random bootstrap partitioning. Usage method=c(method='boot', replicates='2', proportion='0.7'). 'replicate' refers number replicates, assumes value >=1. 'proportion' refers proportion occurrences used model fitting, assumes value >0 <=1. example proportion='0.7' mean 70% data used model training, 30% used model testing.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_random.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Conventional data partitioning methods — part_random","text":"tibble object information used 'data' argument additional columns named .part containing partition groups. rep_kfold boot method return many \".part\" columns replicated defined. rest methods, single .part column returned. kfold, rep_kfold, loocv partition methods, groups defined integers. contrast, boot method, partition groups defined characters 'train' 'test'.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_random.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Conventional data partitioning methods — part_random","text":"Fielding, . H., & Bell, J. F. (1997). review methods assessment prediction errors conservation presence/absence models. Environmental Conservation, 24(1), 38-49. https://doi.org/10.1017/S0376892997000088","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_random.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Conventional data partitioning methods — part_random","text":"","code":"if (FALSE) { # \\dontrun{ data(\"abies\") abies$partition <- NULL abies <- tibble(abies) # K-fold method abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 10) ) abies2 # Repeated K-fold method abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"rep_kfold\", folds = 10, replicates = 10) ) abies2 # Leave-one-out cross-validation (loocv) method abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"loocv\") ) abies2 # Bootstrap method abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"boot\", replicates = 50, proportion = 0.7) ) abies2 abies2$.part1 %>% table() # Note that for this method .partX columns have train and test words. } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_sband.html","id":null,"dir":"Reference","previous_headings":"","what":"Spatial band cross-validation — part_sband","title":"Spatial band cross-validation — part_sband","text":"function explores different numbers spatial bands returns suitable value given presence presence-absence database. selection best number bands performed automatically considering spatial autocorrelation, environmental similarity, number presence absence records partition.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_sband.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Spatial band cross-validation — part_sband","text":"","code":"part_sband( env_layer, data, x, y, pr_ab, type = \"lon\", n_part = 2, min_bands = 2, max_bands = 20, min_occ = 10, prop = 0.5 )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_sband.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Spatial band cross-validation — part_sband","text":"env_layer SpatRaster. Raster environmental variable. Used evaluate spatial autocorrelation environmental similarity training testing partitions. function calculate dissimilarity based Euclidean distances, can used continuous environmental variables data data.frame. Data.frame tibble object presences (presence-absence, presence-pseudo-absence) records, coordinates x character. Column name spatial x coordinates y character. Column name spatial y coordinates pr_ab character. Column presences, presence-absence, -pseudo-absence. Presences must represented 1 absences 0 type character. Specify bands across different degrees longitude 'lon' latitude 'lat'. Default 'lon'. n_part integer. Number partition. Default 2, values 2 yet implemented. min_bands integer. Minimum number spatial bands tested, default 2. max_bands integer. Maximum number spatial bands tested, default 20. min_occ numeric. Minimum number presences absences partition fold. min_occ value base number predictors order avoid -fitting error fitting models given fold. Default 10. prop numeric. Proportion points used testing autocorrelation groups (values > 0 <=1). smaller number , faster function work. Default 0.5","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_sband.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Spatial band cross-validation — part_sband","text":"list : part: tibble object information used 'data' arguments additional column .part partition group. best_part_info: tibble information best partition. contains number best partition (n_grid), number bands (n_bands), standard deviation presences (sd_p), standard deviation absences (sd_a), Moran's spatial autocorrelation (spa_auto), environmental similarity based Euclidean distance (env_sim). grid: SpatRaster object bands","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_sband.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Spatial band cross-validation — part_sband","text":"part_sbands function allows testing different numbers partitions using range latitudinal longitudinal bands. function explores range numbers bands given number partitions automatically selects best number bands given presence, presence-absences, presence-pseudo-absences dataset. Selection number bands based optimization procedure explores partitions three dimensions determined spatial autocorrelation (measured Moran's ), environmental similarity (Euclidean distance), difference amount data among partition groups (Standard Deviation - SD; Velazco et al., 2019). procedure iterative; first select partitions autocorrelation values less lowest quartile Morans , environmental similarity values greater third quartile Euclidean distances, difference amount data less lowest quartile SD. selection repeated one partition retained (Velazco et al., 2019). main benefits partition selection ) subjective, ii) balances environmental similarity special autocorrelation partitions groups, iii) controls selection partitions little data may problematic model fitting (\"min_occ\" argument). Partitions geographically structured tend evaluate model transferability directly conventional ones (e.g., performed part_random) (Roberts et al., 2017; Santini et al., 2021), relevant models used projections regions outside calibration area time periods. Band partitions can option species best partition found part_sblock species distributed linearly (e.g., species inhabit coastlines). function can interact get_block, sample_background, sample_pseudoabs sampling background points pseudo-absences within spatial partition broups","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_sband.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Spatial band cross-validation — part_sband","text":"Roberts, D. R., Bahn, V., Ciuti, S., Boyce, M. S., Elith, J., Guillera-Arroita, G., Hauenstein, S., Lahoz-Monfort, J. J., Schroder, B., Thuiller, W., Warton, D. ., Wintle, B. ., Hartig, F., & Dormann, C. F. (2017). Cross-validation strategies data temporal, spatial, hierarchical, phylogenetic structure. Ecography, 40, 913-929. https://doi.org/10.1111/ecog.02881 Santini, L., Benitez-Lopez, ., Maiorano, L., Cengic, M., & Huijbregts, M. . J. (2021). Assessing reliability species distribution projections climate change research. Diversity Distributions, ddi.13252. https://doi.org/10.1111/ddi.13252 Velazco, S. J. E., Villalobos, F., Galvao, F., & De Marco Junior, P. (2019). dark scenario Cerrado plant species: Effects future climate, land use protected areas ineffectiveness. Diversity Distributions, 25(4), 660-673. https://doi.org/10.1111/ddi.12886","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_sband.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Spatial band cross-validation — part_sband","text":"","code":"if (FALSE) { # \\dontrun{ require(terra) require(dplyr) # Load datasets data(spp) f <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(f) # Example of two longitudinal partitions with presences and absences single_spp <- spp %>% dplyr::filter(species == \"sp1\") part_1 <- part_sband( env_layer = somevar, data = single_spp, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", type = \"lon\", min_bands = 2, max_bands = 20, n_part = 2, min_occ = 10, prop = 0.5 ) part_1$part # database with partition fold (.part) part_1$part %>% group_by(pr_ab, .part) %>% count() # number of presences and absences in each fold part_1$best_part_info # information of the best partition part_1$grid # raster with folds # Explore grid object and presences and absences points plot(part_1$grid, col = gray.colors(20)) points(part_1$part[c(\"x\", \"y\")], col = rainbow(8)[part_1$part$.part], cex = 0.9, pch = c(1, 19)[part_1$part$pr_ab + 1] ) # Example of four latitudinal partition and only presences single_spp <- spp %>% dplyr::filter(species == \"sp1\", pr_ab == 1) part_2 <- part_sband( env_layer = somevar, data = single_spp, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", type = \"lat\", min_bands = 8, max_bands = 40, n_part = 8, min_occ = 10, prop = 0.5 ) part_2$part part_2$best_part_info part_2$grid # Explore Grid object and presences points plot(part_2$grid, col = gray.colors(20)) points(part_2$part[c(\"x\", \"y\")], col = rainbow(8)[part_2$part$.part], cex = 0.5, pch = 19 ) } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_sblock.html","id":null,"dir":"Reference","previous_headings":"","what":"Spatial block cross-validation — part_sblock","title":"Spatial block cross-validation — part_sblock","text":"function explores spatial blocks different cell sizes returns suitable size given presence presence-absence database. selection best grid size performed automatically considering spatial autocorrelation, environmental similarity, number presence absence records partition.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_sblock.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Spatial block cross-validation — part_sblock","text":"","code":"part_sblock( env_layer, data, x, y, pr_ab, n_part = 3, min_res_mult = 3, max_res_mult = 200, num_grids = 30, min_occ = 10, prop = 0.5 )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_sblock.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Spatial block cross-validation — part_sblock","text":"env_layer SpatRaster. Raster environmental variable. Used evaluate spatial autocorrelation environmental similarity training testing partitions. function calculate dissimilarity based Euclidean distances, can used continuous environmental variables data data.frame. Data.frame tibble object presence (presence-absence, presences-pseudo-absence) records, coordinates x character. Column name spatial x coordinates y character. Column name spatial y coordinates pr_ab character. Column presence, presence-absence, pseudo-absence records. Presences must represented 1 absences 0 n_part integer. Number partition. Default 2. min_res_mult integer. Minimum value used multiplying raster resolution define finest resolution tested, default 3. max_res_mult integer. Maximum value used multiplying raster resolution define coarsest resolution tested, default 200. num_grids integer. Number grid tested min_res_mult X (raster resolution) max_res_mult X (raster resolution), default 30 min_occ numeric. Minimum number presences absences partition fold. min_occ value base amount predictors order avoid -fitting error fitting models given fold. Default 10. prop numeric. Proportion point used testing autocorrelation groups (values > 0 <=1). smaller proportion , faster function work. Default 0.5","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_sblock.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Spatial block cross-validation — part_sblock","text":"list : part: tibble object information used 'data' arguments additional column .part partition group. best_part_info: tibble information best partition. contains number best partition (n_grid), cell size (cell_size), standard deviation presences (sd_p), standard deviation absences (sd_a), Moran's spatial autocorrelation (spa_auto), environmental similarity based Euclidean distance (env_sim). grid: SpatRaster object blocks","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_sblock.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Spatial block cross-validation — part_sblock","text":"part_sblock allows test different numbers partitions using square blocks (like checkerboard). function explores range block sizes automatically selects best size given given presence, presence-absences, presence-pseudo-absences dataset. Number partition selection based optimization procedure explores partition size three dimensions determined spatial autocorrelation (measured Moran's ), environmental similarity (Euclidean distance), difference amount data among partition groups (Standard Deviation - SD; Velazco et al., 2019). procedure iteratively select partitions, first partitions autocorrelation values less lowest quartile Morans , environmental similarity values greater third quartile Euclidean distances difference amount data less lowest quartile SD. selection repeated one partition retained (Velazco et al., 2019). main benefit partition selection ) subjective, ii) balances environmental similarity special autocorrelation partitions, iii) controls selection partitions data may problematic model fitting (\"min_occ\" argument). Geographically structured partitions tend evaluate model transferability directly conventional ones (e.g., performed part_random) (Roberts et al., 2017; Santini et al., 2021), relevant models used projections regions outside calibration area time periods. function can interact get_block, sample_background, sample_pseudoabs sampling background points pseudo-absences within spatial partition broups","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_sblock.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Spatial block cross-validation — part_sblock","text":"Roberts, D. R., Bahn, V., Ciuti, S., Boyce, M. S., Elith, J., Guillera-Arroita, G., Hauenstein, S., Lahoz-Monfort, J. J., Schroder, B., Thuiller, W., Warton, D. ., Wintle, B. ., Hartig, F., & Dormann, C. F. (2017). Cross-validation strategies data temporal, spatial, hierarchical, phylogenetic structure. Ecography, 40, 913-929. https://doi.org/10.1111/ecog.02881 Santini, L., Benitez-Lopez, ., Maiorano, L., Cengic, M., & Huijbregts, M. . J. (2021). Assessing reliability species distribution projections climate change research. Diversity Distributions, ddi.13252. https://doi.org/10.1111/ddi.13252 Velazco, S. J. E., Villalobos, F., Galvao, F., & De Marco Junior, P. (2019). dark scenario Cerrado plant species: Effects future climate, land use protected areas ineffectiveness. Diversity Distributions, 25(4), 660-673. https://doi.org/10.1111/ddi.12886","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_sblock.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Spatial block cross-validation — part_sblock","text":"","code":"if (FALSE) { # \\dontrun{ require(terra) require(dplyr) # Load datasets data(spp) f <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(f) # Example for one single species single_spp <- spp %>% dplyr::filter(species == \"sp3\") part <- part_sblock( env_layer = somevar, data = single_spp, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", min_res_mult = 10, max_res_mult = 500, num_grids = 30, n_part = 2, min_occ = 5, prop = 0.5 ) part part$part # database with partition fold (.part) part$part %>% group_by(pr_ab, .part) %>% count() # number of presences and absences in each fold part$best_part_info # information of the best partition part$grid # raster with folds # Explore the Grid object plot(part$grid) points(part$part[c(\"x\", \"y\")], col = c(\"blue\", \"red\")[part$part$.part], cex = 0.5, pch = 19 ) terra::res(part$grid) terra::res(somevar) # Note that this is a layer with block partition, but it has a # different resolution than the original environmental variables. # If you wish have a layer with the same properties # (i.e. resolution, extent, NAs) as your original environmental # variables you can use the \\code{\\link{get_block}} function. grid_env <- get_block(env_layer = somevar, best_grid = part$grid) plot(grid_env) # this is a block layer with the same layer # properties as environmental variables. points(part$part[c(\"x\", \"y\")], col = c(\"blue\", \"red\")[part$part$.part], cex = 0.5, pch = 19 ) # This layer is very useful if you need to sample # pseudo_absence or background point # See examples in \\code{\\link{backgroudp}} and \\code{\\link{pseudoabs}} # Example of a higher number of partitions part <- part_sblock( env_layer = somevar, data = single_spp, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", min_res_mult = 10, max_res_mult = 500, num_grids = 30, n_part = 4, min_occ = 2, prop = 0.5 ) # Explore the Grid object plot(part$grid, col = gray.colors(4)) points(part$part[c(\"x\", \"y\")], col = rainbow(n = 4)[part$part$.part], cex = 0.5, pch = 19 ) # Using these functions with several species spp2 <- split(spp, spp$species) class(spp2) length(spp2) names(spp2) part_list <- lapply(spp2, function(x) { result <- part_sblock( env_layer = somevar, data = x, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", min_res_mult = 10, max_res_mult = 500, num_grids = 30, n_part = 2, min_occ = 5, prop = 0.5 ) result }) part_list$sp3 # For this dataset a suitable partition was not found # Create a single database for all species occ_part <- lapply(part_list, function(x) { if (!length(x) > 0) { x[[1]] } }) %>% dplyr::bind_rows(.id = \"species\") occ_part # Get the best grid info for all species grid_info <- dplyr::bind_rows(lapply( part_list, function(x) x[[2]] ), .id = \"species\") # Get the best grid layer for all species grid_layer <- lapply(part_list, function(x) x$grid) grid_layer2 <- lapply(grid_layer, function(x) { get_block(env_layer = somevar[[1]], best_grid = x) }) grid_layer2 <- terra::rast(grid_layer2) grid_layer2 plot(grid_layer2) # Block partition for presences-only database single_spp <- spp %>% dplyr::filter(species == \"sp1\", pr_ab == 1) single_spp single_spp$pr_ab %>% unique() # only presences part <- part_sblock( env_layer = somevar, data = single_spp, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", min_res_mult = 10, max_res_mult = 500, num_grids = 30, n_part = 4, min_occ = 10, prop = 0.5 ) part$part %>% dim() part$best_part_info part$grid plot(part$grid) points( part$part[c(\"x\", \"y\")], col = c(\"blue\", \"red\", \"green\", \"black\")[part$part$.part], cex = 0.5, ) } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_senv.html","id":null,"dir":"Reference","previous_headings":"","what":"Environmental and spatial cross-validation — part_senv","title":"Environmental and spatial cross-validation — part_senv","text":"function explores different numbers environmental partitions (clusters) based K-means clustering algorithm returns number partitions best suited given presence, presence-absences, presence-pseudo-absences database. Selection best number partitions performed automatically considering spatial autocorrelation, environmental similarity, number presence /absence records partition.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_senv.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Environmental and spatial cross-validation — part_senv","text":"","code":"part_senv( env_layer, data, x, y, pr_ab, min_n_groups = 2, max_n_groups = 10, min_occ = 10, prop = 0.5 )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_senv.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Environmental and spatial cross-validation — part_senv","text":"env_layer SpatRaster. Raster environmental variable. used evaluate spatial autocorrelation environmental similarity training testing partitions. function calculate dissimilarity based Euclidean distances, can used continuous variables data data.frame. Data.frame tibble object presence (presence-absence, presences-pseudo-absence) records, coordinates x character. Column name spatial x coordinates y character. Column name spatial y coordinates pr_ab character. Column presences, presence-absence, pseudo-absence. Presences must represented 1 absences 0 min_n_groups integer. Minimum number groups tested. Default 2. max_n_groups integer. Maximum number groups tested. Default 10. min_occ numeric. Minimum number presences absences partition fold. min_occ value base amount predictors order avoid -fitting error fitting models given fold. Default 10. prop numeric. Proportion point used testing autocorrelation groups (values > 0 <=1). smaller number , faster function work. Default 0.5","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_senv.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Environmental and spatial cross-validation — part_senv","text":"list : part: tibble object information used 'data' arguments additional column .part partition group. best_part_info: tibble information best partition. contains number partition (n_groups), standard deviation presences (sd_p), standard deviation absences (sd_a), Moran's spatial autocorrelation (spa_auto) environmental similarity based Euclidean distance (env_sim)","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_senv.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Environmental and spatial cross-validation — part_senv","text":"part_sblock allows test different numbers partitions defined envirnomental clusters delimited K-mean cluster algorithm. function explores range environmental clusters automatically selects best number cluster given given presence, presence-absences, presence-pseudo-absences dataset. selection number clusters based optimization procedure explores partition size three dimensions determined spatial autocorrelation (measured Moran's ), environmental similarity (Euclidean distance), difference amount data among clusters (Standard Deviation - SD; Velazco et al., 2019). procedure cyclically select partitions autocorrelation values less lowest quartile Morans , environmental similarity values greater third quartile Euclidean distances difference amount data less lowest quartile SD. selection repeated one partition retained (Velazco et al., 2019). main benefit partition selection ) subjective, ii) balances environmental similarity special autocorrelation partitions, iii) controls partition selection data may problematic model fitting (\"min_occ\" argument).. Partitions geographically structured tend evaluate model transferability directly conventional ones (e.g., performed part_random) (Roberts et al., 2017; Santini et al., 2021), relevant models want used projections regions outside calibration area periods. function can interact get_block, sample_background, sample_pseudoabs sampling background points pseudo-absences within spatial partition broups","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_senv.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Environmental and spatial cross-validation — part_senv","text":"Roberts, D. R., Bahn, V., Ciuti, S., Boyce, M. S., Elith, J., Guillera-Arroita, G., Hauenstein, S., Lahoz-Monfort, J. J., Schroder, B., Thuiller, W., Warton, D. ., Wintle, B. ., Hartig, F., & Dormann, C. F. (2017). Cross-validation strategies data temporal, spatial, hierarchical, phylogenetic structure. Ecography, 40, 913-929. https://doi.org/10.1111/ecog.02881 Santini, L., Benitez-Lopez, ., Maiorano, L., Cengic, M., & Huijbregts, M. . J. (2021). Assessing reliability species distribution projections climate change research. Diversity Distributions, ddi.13252. https://doi.org/10.1111/ddi.13252 Velazco, S. J. E., Villalobos, F., Galvao, F., & De Marco Junior, P. (2019). dark scenario Cerrado plant species: Effects future climate, land use protected areas ineffectiveness. Diversity Distributions, 25(4), 660-673. https://doi.org/10.1111/ddi.12886","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_senv.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Environmental and spatial cross-validation — part_senv","text":"","code":"if (FALSE) { # \\dontrun{ require(terra) require(ggplot2) f <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(f) # Select a species spp1 <- spp %>% dplyr::filter(species == \"sp1\") part1 <- part_senv( env_layer = somevar, data = spp1, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", min_n_groups = 2, max_n_groups = 10, min_occ = 10, prop = 0.2 ) part1 ggplot(part1$part, aes(x, y, col = factor(.part))) + geom_point(aes(shape = factor(pr_ab))) ggplot(part1$part, aes(x, y, col = factor(.part))) + geom_point(aes(shape = factor(pr_ab))) + facet_wrap(. ~ .part) ggplot(part1$part, aes(x, y, col = factor(.part))) + geom_point(aes(shape = factor(pr_ab))) + facet_wrap(. ~ pr_ab) } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/pdp_data.html","id":null,"dir":"Reference","previous_headings":"","what":"Calculate data to construct partial dependence plots — pdp_data","title":"Calculate data to construct partial dependence plots — pdp_data","text":"Calculate data construct partial dependence plots given predictor","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/pdp_data.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Calculate data to construct partial dependence plots — pdp_data","text":"","code":"pdp_data( model, predictors, resolution = 50, resid = FALSE, training_data = NULL, projection_data = NULL, clamping = FALSE )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/pdp_data.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Calculate data to construct partial dependence plots — pdp_data","text":"model model object class \"gam\", \"gbm\", \"glm\", \"graf\", \"ksvm\", \"ksvm\", \"maxnet”, “nnet\", \"randomForest\" model can found first element list returned function fit_, tune_, esm_ function families predictors character. Vector predictor name(s) plot. NULL predictors plotted. Default NULL resolution numeric. Number equally spaced points predict continuous predictors. Default 50 resid logical. Calculate residuals based training data. Default FALSE training_data data.frame. Database response (0,1) predictor values used fit model. Default NULL projection_data SpatRaster. Raster layer environmental variables used model projection. argument used, function calculate partial dependence curves distinguishing conditions used training projection conditions (.e., projection data present projection area training). Default NULL clamping logical. Perform clamping. maxent models. Default FALSE","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/pdp_data.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Calculate data to construct partial dependence plots — pdp_data","text":"list two tibbles \"pdpdata\" \"resid\". #' pdpdata: data construct partial dependence plots, first column includes values selected environmental variable, second column predicted suitability, third column range type, two values Training Projecting, referring suitability calculated within outside range training conditions. Third column returned \"projection_data\" argument used resid: data plot residuals. first column includes values selected environmental variable second column predicted suitability.","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/pdp_data.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Calculate data to construct partial dependence plots — pdp_data","text":"","code":"if (FALSE) { library(terra) library(dplyr) somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) # environmental data names(somevar) <- c(\"aet\", \"cwd\", \"tmx\", \"tmn\") data(abies) abies2 <- abies %>% select(x, y, pr_ab) abies2 <- sdm_extract(abies2, x = \"x\", y = \"y\", env_layer = somevar ) abies2 <- part_random(abies2, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 5) ) svm_t1 <- fit_svm( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"cwd\", \"tmx\", \"tmn\"), partition = \".part\", thr = c(\"max_sens_spec\") ) df <- pdp_data( model = svm_t1$model, predictors = c(\"aet\"), resolution = 100, resid = TRUE, projection_data = somevar, training_data = abies2, clamping = FALSE ) df names(df) df$pdpdata df$resid plot(df$pdpdata[1:2], type = \"l\") points(df$resid[1:2], cex = 0.5) # see p_pdp to construct partial dependence plot with ggplot2 }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/plot_res.html","id":null,"dir":"Reference","previous_headings":"","what":"Plot different resolutions to be used in part_sblock — plot_res","title":"Plot different resolutions to be used in part_sblock — plot_res","text":"function useful display maximum minimum resolution want test block_partition function. Note resolution tested fine, plot display may take long time.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/plot_res.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Plot different resolutions to be used in part_sblock — plot_res","text":"","code":"plot_res(r, res_mult)"},{"path":"https://sjevelazco.github.io/flexsdm/reference/plot_res.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Plot different resolutions to be used in part_sblock — plot_res","text":"r SpatRaster. raster layer, preferably layer environmental variables used res_mult numeric. Maximum minimum resolution tested.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/plot_res.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Plot different resolutions to be used in part_sblock — plot_res","text":"plot original raster overlapped grid resolution used","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/plot_res.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Plot different resolutions to be used in part_sblock — plot_res","text":"","code":"if (FALSE) { # \\dontrun{ f <- system.file(\"external/somevar.tif\", package = \"flexsdm\") r <- terra::rast(f) r <- r$CFP_1 plot_res(r, res_mult = 100) plot_res(r, res_mult = 200) } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/p_bpdp.html","id":null,"dir":"Reference","previous_headings":"","what":"Bivariate partial dependence plot — p_bpdp","title":"Bivariate partial dependence plot — p_bpdp","text":"Create bivariate partial dependence plot(s) explore bivariate marginal effect predictors suitability","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/p_bpdp.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Bivariate partial dependence plot — p_bpdp","text":"","code":"p_bpdp( model, predictors = NULL, resolution = 50, training_data = NULL, training_boundaries = NULL, projection_data = NULL, clamping = FALSE, color_gradient = c(\"#000004\", \"#1B0A40\", \"#4A0C69\", \"#781B6C\", \"#A42C5F\", \"#CD4345\", \"#EC6824\", \"#FA990B\", \"#F7CF3D\", \"#FCFFA4\"), color_training_boundaries = \"white\", theme = ggplot2::theme_classic() )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/p_bpdp.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Bivariate partial dependence plot — p_bpdp","text":"model model object class \"gam\", \"gbm\", \"glm\", \"graf\", \"ksvm\", \"ksvm\", \"maxnet”, “nnet\", \"randomForest\" model can found first element list returned function fit_, tune_, esm_ function families predictors character. Vector predictor names calculate partial dependence plots. NULL predictors used. Default NULL resolution numeric. Number equally spaced points predict suitability values continuous predictors. Default 50 training_data data.frame. Database response (0,1) predictor values used fit model. Default NULL training_boundaries character. Plot training conditions boundaries based training data (.e., presences, presences absences, etc). training_boundaries = \"convexh\", function delimit training environmental region based convex-hull. training_boundaries = \"rectangle\", function delimit training environmental region based four straight lines. used methods necessary provide data training_data argument. NULL predictors used. Default NULL. projection_data SpatRaster. Raster layer environmental variables used model projection. Default NULL clamping logical. Perform clamping. maxent models. Default FALSE color_gradient character. vector range colors plot. Default c(\"#FDE725\", \"#B3DC2B\", \"#6DCC57\", \"#36B677\", \"#1F9D87\", \"#25818E\", \"#30678D\", \"#3D4988\", \"#462777\", \"#440154\") color_training_boundaries character. vector one color used color points residuals, Default \"white\" theme ggplot2 theme. Default ggplot2::theme_classic()","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/p_bpdp.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Bivariate partial dependence plot — p_bpdp","text":"function creates partial dependent surface plots explore bivariate marginal effect predictors suitability. projection_data used, function extract minimum maximum values found region time period model projected. Partial dependence surface plot used interpret model explore model extrapolate outside environmental conditions used train model (convex hull polygon).","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/p_bpdp.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Bivariate partial dependence plot — p_bpdp","text":"","code":"if (FALSE) { # \\dontrun{ library(terra) library(dplyr) somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) # environmental data names(somevar) <- c(\"aet\", \"cwd\", \"tmx\", \"tmn\") data(abies) # set seed abies2 <- abies %>% dplyr::select(x, y, pr_ab) %>% dplyr::group_by(pr_ab) %>% dplyr::slice_sample(prop = 0.5) abies2 <- sdm_extract(abies2, x = \"x\", y = \"y\", env_layer = somevar ) abies2 <- part_random(abies2, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 5) ) svm_t1 <- fit_svm( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"cwd\", \"tmx\", \"tmn\"), partition = \".part\", thr = c(\"max_sens_spec\") ) # Partial depence surface plot p_bpdp(model = svm_t1$model, training_data = abies2) p_bpdp(model = svm_t1$model, training_data = abies2, predictors = c(\"aet\", \"cwd\")) p_bpdp(model = svm_t1$model, training_data = abies2, resolution = 10) p_bpdp(model = svm_t1$model, training_data = abies2, resolution = 70) # With training condition boundaires p_bpdp(model = svm_t1$model, training_data = abies2, training_boundaries = \"convexh\") p_bpdp(model = svm_t1$model, training_data = abies2, training_boundaries = \"rectangle\", color_training_boundaries = \"yellow\") p_bpdp( model = svm_t1$model, training_data = abies2, training_boundaries = \"convexh\", color_training_boundaries = \"orange\", color_gradient = c(\"#00007F\", \"#007FFF\", \"#7FFF7F\", \"#FF7F00\", \"#7F0000\") ) # With projection data p_bpdp( model = svm_t1$model, training_data = abies2, training_boundaries = \"rectangle\", projection_data = somevar, # a SpatRaster used to predict or project the model color_training_boundaries = \"white\", color_gradient = c(\"#00007F\", \"#007FFF\", \"#7FFF7F\", \"#FF7F00\", \"#7F0000\") ) # Bivariate partial dependence plot for training and projection condition plot(somevar[[1]], main = \"Projection area\") p_bpdp(model = svm_t1$model, training_data = abies2, projection_data = somevar, # a SpatRaster used to predict or project the model training_boundaries = \"convexh\") # Bivariate partial dependece plot with categorical variables somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) # environmental data names(somevar) <- c(\"aet\", \"cwd\", \"tmx\", \"tmn\") cat <- system.file(\"external/clusters.shp\", package = \"flexsdm\") cat <- terra::vect(cat) cat$clusters <- paste0(\"c\", cat$clusters) cat <- terra::rasterize(cat, somevar, field = \"clusters\") somevar <- c(somevar, cat) plot(somevar) # set seed abies2 <- abies %>% dplyr::select(x, y, pr_ab) %>% dplyr::group_by(pr_ab) %>% dplyr::slice_sample(prop = 0.5) abies2 <- sdm_extract( data = abies2, x = \"x\", y = \"y\", env_layer = somevar ) abies2 <- part_random(abies2, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 5) ) svm_t1 <- fit_svm( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"cwd\", \"tmx\", \"tmn\"), predictors_f = \"clusters\", partition = \".part\", thr = c(\"max_sens_spec\") ) p_bpdp(model = svm_t1$model, training_data = abies2, training_boundaries = \"convexh\") } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/p_extra.html","id":null,"dir":"Reference","previous_headings":"","what":"Graphical exploration of extrapolation or suitability pattern in the environmental and geographical space — p_extra","title":"Graphical exploration of extrapolation or suitability pattern in the environmental and geographical space — p_extra","text":"Graphical exploration extrapolation suitability pattern environmental geographical space","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/p_extra.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Graphical exploration of extrapolation or suitability pattern in the environmental and geographical space — p_extra","text":"","code":"p_extra( training_data, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", extra_suit_data, projection_data, predictors = NULL, geo_space = TRUE, geo_position = \"right\", prop_points = 0.2, maxcells = 1e+05, alpha_p = 0.5, color_p = \"black\", alpha_gradient = 0.5, color_gradient = c(\"#FDE725\", \"#B3DC2B\", \"#6DCC57\", \"#36B677\", \"#1F9D87\", \"#25818E\", \"#30678D\", \"#3D4988\", \"#462777\", \"#440154\"), theme = ggplot2::theme_classic() )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/p_extra.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Graphical exploration of extrapolation or suitability pattern in the environmental and geographical space — p_extra","text":"training_data data.frame. Database response (0,1) predictor values used fit model. x character. Column name spatial x coordinates y character. Column name spatial y coordinates pr_ab character. Column name species absence-presence, pseudo-absence-presence, background-presence data (0,1). extra_suit_data SpatRaster. Raster layer extrapolation suitability values. extra_suit_data must resolution extent projection_data projection_data SpatRaster. Raster layer environmental variables used model projection. projection_data must resolution extent extra_suit_data predictors character. Vector predictor name(s) calculate partial dependence plots. NULL predictors used. Default NULL. geo_space logical. TRUE produced map. Default TRUE geo_position character. Map position regarding plot environmental space, right, left, bottom, upper. Default \"right\" prop_points numeric. Proportion cells extra_suit_data projection_data select plotting. default. 0.5. maxcells integer. Maximum number cells used plot geographical space. Default 100000 alpha_p numeric. value 0 1 control transparency presence-absence points. Lower values corresponding transparent colors. Default 0.5 color_p character. vector color used color presence-absence points. Default \"black\" alpha_gradient numeric. value 0 1 control transparency projection data Lower values corresponding transparent colors. Default 0.5 color_gradient character. vector colors used color projection data. Default c( \"#FDE725\", \"#B3DC2B\", \"#6DCC57\", \"#36B677\", \"#1F9D87\", \"#25818E\", \"#30678D\", \"#3D4988\", \"#462777\", \"#440154\") theme ggplot2 theme. Default ggplot2::theme_classic()","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/p_extra.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Graphical exploration of extrapolation or suitability pattern in the environmental and geographical space — p_extra","text":"plot","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/p_extra.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Graphical exploration of extrapolation or suitability pattern in the environmental and geographical space — p_extra","text":"","code":"if (FALSE) { # \\dontrun{ require(dplyr) require(terra) require(ggplot2) data(spp) f <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(f) names(somevar) <- c(\"aet\", \"cwd\", \"tmx\", \"tmn\") spp$species %>% unique() sp <- spp %>% dplyr::filter(species == \"sp2\", pr_ab == 1) %>% dplyr::select(x, y, pr_ab) # Calibration area based on some criterion such as dispersal ability ca <- calib_area(sp, x = \"x\", y = \"y\", method = c(\"buffer\", width = 50000), crs = crs(somevar)) plot(somevar[[1]]) points(sp) plot(ca, add = T) # Sampling pseudo-absences set.seed(10) psa <- sample_pseudoabs( data = sp, x = \"x\", y = \"y\", n = nrow(sp) * 2, method = \"random\", rlayer = somevar, calibarea = ca ) # Merge presences and abasences databases to get a complete calibration data sp_pa <- dplyr::bind_rows(sp, psa) sp_pa # Get environmental condition of calibration area sp_pa_2 <- sdm_extract(data = sp_pa, x = \"x\", y = \"y\", env_layer = somevar) sp_pa_2 # Measure extrapolation based on calibration data (presence and pseudo-absences) # using SHAPE metric extr <- extra_eval( training_data = sp_pa_2, pr_ab = \"pr_ab\", projection_data = somevar, metric = \"mahalanobis\", univar_comb = FALSE, n_cores = 1, aggreg_factor = 1 ) plot(extr) ## %######################################################%## #### Explore extrapolation in the #### #### environmental and geographical space #### ## %######################################################%## p_extra( training_data = sp_pa_2, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", extra_suit_data = extr, projection_data = somevar, geo_space = TRUE, prop_points = 0.05 ) p_extra( training_data = sp_pa_2, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", extra_suit_data = extr, projection_data = somevar, predictors = c(\"tmn\", \"cwd\"), geo_space = TRUE, prop_points = 0.05 ) p_extra( training_data = sp_pa_2, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", extra_suit_data = extr, projection_data = somevar, predictors = c(\"cwd\", \"tmx\", \"aet\"), geo_space = TRUE, geo_position = \"left\", prop_points = 0.05, color_p = \"white\", alpha_p = 0.5, alpha_gradient = 0.2, color_gradient = c(\"#404096\", \"#529DB7\", \"#7DB874\", \"#E39C37\", \"#D92120\"), theme = ggplot2::theme_dark() ) p_extra( training_data = sp_pa_2, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", extra_suit_data = extr, projection_data = somevar, geo_space = TRUE, prop_points = 0.05, color_p = \"white\", alpha_p = 0.5, alpha_gradient = 0.2, color_gradient = c(\"#404096\", \"#529DB7\", \"#7DB874\", \"#E39C37\", \"#D92120\"), theme = ggplot2::theme_dark() ) # Explore extrapolation only in the environmental space p_extra( training_data = sp_pa_2, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", extra_suit_data = extr, projection_data = somevar, geo_space = FALSE, prop_points = 0.05, color_p = \"black\", color_gradient = c(\"#085CF8\", \"#65AF1E\", \"#F3CC1D\", \"#FC6A9B\", \"#D70500\"), theme = ggplot2::theme_minimal() ) ##%######################################################%## #### Explore univariate #### #### and combinatorial extrapolation #### ##%######################################################%## extr <- extra_eval( training_data = sp_pa_2, pr_ab = \"pr_ab\", projection_data = somevar, metric = \"mahalanobis\", univar_comb = TRUE, n_cores = 1, aggreg_factor = 1 ) plot(extr) p_extra( training_data = sp_pa_2, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", extra_suit_data = extr$uni_comb, # use uni_comb layer projection_data = somevar, geo_space = TRUE, prop_points = 0.05, color_gradient = c(\"#B3DC2B\",\"#25818E\") ) ## %######################################################%## #### With p_extra also is possible #### #### to explore the patterns of suitability #### ## %######################################################%## sp_pa_2 <- part_random( data = sp_pa_2, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 5) ) rf_m1 <- fit_raf( data = sp_pa_2, response = \"pr_ab\", predictors = c(\"aet\", \"cwd\", \"tmx\", \"tmn\"), partition = \".part\", thr = c(\"max_sorensen\") ) suit <- sdm_predict(models = rf_m1, pred = somevar) plot(suit$raf) suit <- suit$raf # Pasterns of suitability in geographical and environmental space p_extra( training_data = sp_pa_2, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", extra_suit_data = suit, projection_data = somevar, geo_space = TRUE, prop_points = 0.05, ) # Pasterns of suitability plotting as points only presences p_extra( training_data = sp_pa_2 %>% dplyr::filter(pr_ab == 1), x = \"x\", y = \"y\", pr_ab = \"pr_ab\", extra_suit_data = suit, projection_data = somevar, geo_space = TRUE, prop_points = 0.05, ) # Pasterns of suitability in the environmental space only # and plotting as points only presences p_extra( training_data = sp_pa_2 %>% dplyr::filter(pr_ab == 1), x = \"x\", y = \"y\", pr_ab = \"pr_ab\", extra_suit_data = suit, projection_data = somevar, geo_space = FALSE, prop_points = 0.05, ) } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/p_pdp.html","id":null,"dir":"Reference","previous_headings":"","what":"Partial Dependent Plot — p_pdp","title":"Partial Dependent Plot — p_pdp","text":"Create partial dependence plot(s) explore marginal effect predictors suitability","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/p_pdp.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Partial Dependent Plot — p_pdp","text":"","code":"p_pdp( model, predictors = NULL, resolution = 100, resid = FALSE, training_data = NULL, projection_data = NULL, clamping = FALSE, rug = FALSE, colorl = c(\"#462777\", \"#6DCC57\"), colorp = \"black\", alpha = 0.2, theme = ggplot2::theme_classic() )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/p_pdp.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Partial Dependent Plot — p_pdp","text":"model model object class \"gam\", \"gbm\", \"glm\", \"graf\", \"ksvm\", \"ksvm\", \"maxnet”, “nnet\", \"randomForest\" model can found first element list returned function fit_, tune_, esm_ function families predictors character. Vector predictor name(s) calculate partial dependence plots. NULL predictors used. Default NULL resolution numeric. Number equally spaced points predict suitability values continuous predictors. Default 50 resid logical. Calculate residuals based training data. Default FALSE training_data data.frame. Database response (0,1) predictor values used fit model. Default NULL projection_data SpatRaster. Raster layer environmental variables used model projection. argument used, function calculate partial dependence curves distinguishing conditions used training projection conditions (.e., projection data present projection area training). Default NULL clamping logical. Perform clamping. maxent models. Default FALSE rug logical. Display training data rug plot x-axis. Note: time-consuming large databases. Default FALSE colorl character. vector one two colors used color lines. projection_data argument used necessary provide two colors. Default c(\"#462777\", \"#6DCC57\") colorp character. vector one color used color points residuals, Default \"black\" alpha numeric. value 0 1 control transparency residual points. Lower values corresponding transparent colors. Default 0.2 theme ggplot2 theme. Default ggplot2::theme_classic()","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/p_pdp.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Partial Dependent Plot — p_pdp","text":"function creates partial dependent plots explore marginal effect predictors suitability. projection_data used, function extract minimum maximum values found region time period model projected. range projection data greater training data plotted different color. Partial dependence curves used interpret model explore model may extrapolate outside environmental conditions used train model.","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/p_pdp.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Partial Dependent Plot — p_pdp","text":"","code":"if (FALSE) { # \\dontrun{ library(terra) library(dplyr) somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) # environmental data names(somevar) <- c(\"aet\", \"cwd\", \"tmx\", \"tmn\") data(abies) # set seed abies2 <- abies %>% dplyr::select(x, y, pr_ab) %>% dplyr::group_by(pr_ab) %>% dplyr::slice_sample(prop = 0.5) abies2 <- sdm_extract(abies2, x = \"x\", y = \"y\", env_layer = somevar ) abies2 <- part_random(abies2, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 5) ) svm_t1 <- fit_svm( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"cwd\", \"tmx\", \"tmn\"), partition = \".part\", thr = c(\"max_sens_spec\") ) # Partial depence plot p_pdp(model = svm_t1$model, training_data = abies2) p_pdp(model = svm_t1$model, training_data = abies2, predictors = c(\"aet\", \"cwd\")) p_pdp(model = svm_t1$model, training_data = abies2, resolution = 5) p_pdp(model = svm_t1$model, training_data = abies2, resolution = 50) p_pdp(model = svm_t1$model, training_data = abies2, resid = TRUE) p_pdp( model = svm_t1$model, training_data = abies2, resid = TRUE, colorl = \"black\", colorp = \"red\", alpha = 0.1 ) p_pdp( model = svm_t1$model, training_data = abies2, resid = TRUE, colorl = \"black\", colorp = \"red\", alpha = 0.1, rug = TRUE ) # Partial depence plot for training and projection condition found in a projection area plot(somevar[[1]], main = \"Projection area\") p_pdp(model = svm_t1$model, training_data = abies2, projection_data = somevar) p_pdp( model = svm_t1$model, training_data = abies2, projection_data = somevar, colorl = c(\"#CC00FF\", \"#CCFF00\") ) p_pdp( model = svm_t1$model, training_data = abies2, projection_data = somevar, colorl = c(\"#CC00FF\", \"#CCFF00\"), resid = TRUE, colorp = \"gray\" ) p_pdp( model = svm_t1$model, training_data = abies2, projection_data = somevar, colorl = c(\"#CC00FF\", \"#CCFF00\"), resid = TRUE, colorp = \"gray\", rug = TRUE, theme = ggplot2::theme_dark() ) } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/p_psp.html","id":null,"dir":"Reference","previous_headings":"","what":"Partial Dependent Suface Plot — p_psp","title":"Partial Dependent Suface Plot — p_psp","text":"Create partial dependence surface plot(s) explore bivariate marginal effect predictors suitability","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/p_psp.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Partial Dependent Suface Plot — p_psp","text":"","code":"p_psp( model, predictors = NULL, resolution = 50, training_data = NULL, pchull = FALSE, projection_data = NULL, clamping = FALSE, color_gradient = c(\"#000004\", \"#1B0A40\", \"#4A0C69\", \"#781B6C\", \"#A42C5F\", \"#CD4345\", \"#EC6824\", \"#FA990B\", \"#F7CF3D\", \"#FCFFA4\"), color_chull = \"white\", theme = ggplot2::theme_classic() )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/p_psp.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Partial Dependent Suface Plot — p_psp","text":"model model object class \"gam\", \"gbm\", \"glm\", \"graf\", \"ksvm\", \"ksvm\", \"maxnet”, “nnet\", \"randomForest\" model can found first element list returned function fit_, tune_, esm_ function families predictors character. Vector predictor names calculate partial dependence plots. NULL predictors used. Default NULL resolution numeric. Number equally spaced points predict suitability values continuous predictors. Default 50 training_data data.frame. Database response (0,1) predictor values used fit model. Default NULL pchull logical. Plot convex-hull limit training data. Default FALSE. TRUE necessary provide data training_data argument projection_data SpatRaster. Raster layer environmental variables used model projection. Default NULL clamping logical. Perform clamping. maxent models. Default FALSE color_gradient character. vector range colors plot. Default c(\"#FDE725\", \"#B3DC2B\", \"#6DCC57\", \"#36B677\", \"#1F9D87\", \"#25818E\", \"#30678D\", \"#3D4988\", \"#462777\", \"#440154\") color_chull character. vector one color used color points residuals, Default \"white\" theme ggplot2 theme. Default ggplot2::theme_classic()","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/p_psp.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Partial Dependent Suface Plot — p_psp","text":"function creates partial dependent surface plots explore bivariate marginal effect predictors suitability. projection_data used, function extract minimum maximum values found region time period model projected. Partial dependence surface plot used interpret model explore model extrapolate outside environmental conditions used train model (convex hull polygon).","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/p_psp.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Partial Dependent Suface Plot — p_psp","text":"","code":"if (FALSE) { library(terra) library(dplyr) somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) # environmental data names(somevar) <- c(\"aet\", \"cwd\", \"tmx\", \"tmn\") data(abies) # set seed abies2 <- abies %>% dplyr::select(x, y, pr_ab) %>% dplyr::group_by(pr_ab) %>% dplyr::slice_sample(prop = 0.5) abies2 <- sdm_extract(abies2, x = \"x\", y = \"y\", env_layer = somevar ) abies2 <- part_random(abies2, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 5) ) svm_t1 <- fit_svm( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"cwd\", \"tmx\", \"tmn\"), partition = \".part\", thr = c(\"max_sens_spec\") ) # Partial depence surface plot p_psp(model = svm_t1$model, training_data = abies2) p_psp(model = svm_t1$model, training_data = abies2, predictors = c(\"aet\", \"cwd\")) p_psp(model = svm_t1$model, training_data = abies2, resolution = 10) p_psp(model = svm_t1$model, training_data = abies2, resolution = 70) p_psp(model = svm_t1$model, training_data = abies2, pchull = TRUE) p_psp( model = svm_t1$model, training_data = abies2, pchull = TRUE, color_chull = \"orange\", color_gradient = c(\"#00007F\", \"#007FFF\", \"#7FFF7F\", \"#FF7F00\", \"#7F0000\") ) # Partial depence surface plot for training and projection condition plot(somevar[[1]], main = \"Projection area\") p_psp(model = svm_t1$model, training_data = abies2, projection_data = somevar, pchull = TRUE) # PSP with categorical variables somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) # environmental data names(somevar) <- c(\"aet\", \"cwd\", \"tmx\", \"tmn\") cat <- system.file(\"external/clusters.shp\", package = \"flexsdm\") cat <- terra::vect(cat) cat$clusters <- paste0(\"c\", cat$clusters) cat <- terra::rasterize(cat, somevar, field = \"clusters\") somevar <- c(somevar, cat) plot(somevar) # set seed abies2 <- abies %>% dplyr::select(x, y, pr_ab) %>% dplyr::group_by(pr_ab) %>% dplyr::slice_sample(prop = 0.5) abies2 <- sdm_extract( data = abies2, x = \"x\", y = \"y\", env_layer = somevar ) abies2 <- part_random(abies2, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 5) ) svm_t1 <- fit_svm( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"cwd\", \"tmx\", \"tmn\"), predictors_f = \"clusters\", partition = \".part\", thr = c(\"max_sens_spec\") ) p_psp(model = svm_t1$model, training_data = abies2) }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/sample_background.html","id":null,"dir":"Reference","previous_headings":"","what":"Sample background points — sample_background","title":"Sample background points — sample_background","text":"Sampling background points options using different geographical restrictions sampling methods.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/sample_background.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Sample background points — sample_background","text":"","code":"sample_background( data, x, y, n, method = \"random\", rlayer, maskval = NULL, calibarea = NULL, rbias = NULL, sp_name = NULL )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/sample_background.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Sample background points — sample_background","text":"data data.frame tibble. Database presences records, coordinates x character. Column name spatial x coordinates y character. Column name spatial y coordinates n integer. Number background point sampled method character. Background allocation method. methods implemented : random: Random allocation background points. Usage method = 'random' thickening: Thickening background points based Vollering et al. (2019) method. method, buffer width must defined used around presences points. buffer can defined using argument method = c(\"thickening\", width = 20000). Buffer width must m raster (used rlayer) longitude/latitude CRS, map units cases. buffer width provided function use width value equal mean pair-wise presence distances. width value provided, argument must used method = 'thickening'. biased: method, similar \"thickening\", sample background biased bias presences. However, background points sampled used presences probability throughout entire study area, restricting bias within buffers “thickening” approach. using method, necessary provide layer presences bias \"rbias\" argument (Phillips et al., 2009). Usage method='thickening' method = c(\"thickening\", width = 20000). Default 'random' rlayer SpatRaster used sampling background points. best use layer resolution extent environmental variables used modeling. using maskval argument, raster layer must contain values constrain sampling maskval integer, character, factor. Values raster layer used constraining sampling background points calibarea SpatVect delimits calibration area used given species (see calib_area function). rbias SpatRaster used choosing background points using bias method. raster bias data must provided. recommended rbias match resolution extent rlayer. sp_name character. Species name output used. argument used, first output column species name. Default NULL.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/sample_background.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Sample background points — sample_background","text":"tibble object x y coordinates sampled background points","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/sample_background.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Sample background points — sample_background","text":"Phillips, S. J., Dudík, M., Elith, J., Graham, C. H., Lehmann, ., Leathwick, J., & Ferrier, S. (2009). Sample selection bias presence-distribution models: Implications background pseudo-absence data. Ecological Applications, 19(1), 181-197. Vollering, J., Halvorsen, R., Auestad, ., & Rydgren, K. (2019). Bunching background betters bias species distribution models. Ecography, 42(10), 1717-1727. https://doi.org/10.1111/ecog.04503","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/sample_background.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Sample background points — sample_background","text":"","code":"if (FALSE) { # \\dontrun{ require(terra) require(dplyr) data(spp) somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) # Example for a single species spp_pa <- spp %>% dplyr::filter(species == \"sp3\") # Spatially structured partition part <- part_sblock( env_layer = somevar, data = spp_pa, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", min_res_mult = 100, max_res_mult = 500, num_grids = 30, min_occ = 5, n_part = 2 ) grid_env <- get_block(env_layer = somevar, best_grid = part$grid) plot(grid_env) ## %######################################################%## # # #### Random background method #### # # ## %######################################################%## # Sample background points throughout study area with random sampling method spp_p <- spp_pa %>% dplyr::filter(pr_ab == 1) bg <- sample_background( data = spp_p, x = \"x\", y = \"y\", n = 1000, method = \"random\", rlayer = grid_env, sp_name = \"sp3\" ) bg plot(grid_env) points(bg[-1]) # Sample random background points constrained to a region with a give set of values plot(grid_env) sample_background( data = spp_p, x = \"x\", y = \"y\", n = 1000, method = \"random\", rlayer = grid_env, maskval = 1 ) %>% points() plot(grid_env) sample_background( data = spp_p, x = \"x\", y = \"y\", n = 1000, method = \"random\", rlayer = grid_env, maskval = 2 ) %>% points() plot(grid_env) sample_background( data = spp_p, x = \"x\", y = \"y\", n = 1000, method = \"random\", rlayer = grid_env, maskval = c(1, 2) ) %>% points() # Sample random background within a calibration area and constrained to a region ca_ps1 <- calib_area( data = spp_pa, x = \"x\", y = \"y\", method = c(\"buffer\", width = 50000), crs = crs(somevar) ) plot(grid_env) plot(ca_ps1, add = T) points(spp_pa[-1], col = \"blue\", cex = 0.7, pch = 19) sample_background( data = spp_p, x = \"x\", y = \"y\", n = 1000, method = \"random\", rlayer = grid_env, maskval = 1, calibarea = ca_ps1 ) %>% points(col = \"red\") ## %######################################################%## # # #### Thickening background method #### # # ## %######################################################%## # Thickening background without constraining them spp_p # presences database of a species grid_env # The raster layer used for sampling background bg <- sample_background( data = spp_p, x = \"x\", y = \"y\", n = 5000, method = \"thickening\", rlayer = grid_env, ) plot(grid_env) bg %>% points(col = \"red\") # Thickening background spp_p # presences database of a species grid_env # The raster layer used for sampling background bg <- sample_background( data = spp_p, x = \"x\", y = \"y\", n = 5000, method = c(\"thickening\", width = 150000), rlayer = grid_env ) plot(grid_env) bg %>% points(col = \"red\") # Sample thickening background within a calibration area and constrained to a region bg <- sample_background( data = spp_p, x = \"x\", y = \"y\", n = 3000, method = \"thickening\", rlayer = grid_env, maskval = 2, calibarea = ca_ps1 ) plot(grid_env) plot(ca_ps1, add = T) bg %>% points(col = \"red\", cex = 0.3) points(spp_p[c(\"x\", \"y\")], pch = 19) ## %######################################################%## # # #### Biased background method #### # # ## %######################################################%## require(dplyr) require(terra) data(spp) # Select the presences of a species spp_p <- spp %>% dplyr::filter(species == \"sp1\", pr_ab == 1) # Raster layer with density of points to obtain a biased sampling background occ_density <- system.file(\"external/occ_density.tif\", package = \"flexsdm\") occ_density <- terra::rast(occ_density) plot(occ_density) points(spp_p %>% dplyr::select(x, y), cex = 0.5) # A layer with region used to contrain background sampling area regions <- system.file(\"external/regions.tif\", package = \"flexsdm\") regions <- terra::rast(regions) plot(regions) points(spp_p %>% dplyr::select(x, y), cex = 0.5) # Biased background points spp_p # presences database of a species bg <- sample_background( data = spp_p, x = \"x\", y = \"y\", n = 3000, method = \"biased\", rlayer = regions, rbias = occ_density ) plot(occ_density) bg %>% points(col = \"red\", cex = 0.1) spp_p %>% dplyr::select(x, y) %>% points(., col = \"black\", pch = 19, cex = 0.5) # Biased background points constrained to a region # It will be selected region 6 plot(regions) plot(regions %in% c(1, 6)) bg <- sample_background( data = spp_p, x = \"x\", y = \"y\", n = 500, method = \"biased\", rlayer = regions, rbias = occ_density, maskval = c(1, 2) ) plot(occ_density) bg %>% points(col = \"red\", cex = 0.5) spp_p %>% dplyr::select(x, y) %>% points(., col = \"black\", pch = 19, cex = 0.5) } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/sample_pseudoabs.html","id":null,"dir":"Reference","previous_headings":"","what":"Sample pseudo-absences — sample_pseudoabs","title":"Sample pseudo-absences — sample_pseudoabs","text":"function provide several methods sampling pseudo-absences, instance totally random sampling method, options using different environmental geographical constraints.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/sample_pseudoabs.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Sample pseudo-absences — sample_pseudoabs","text":"","code":"sample_pseudoabs( data, x, y, n, method, rlayer, maskval = NULL, calibarea = NULL, sp_name = NULL )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/sample_pseudoabs.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Sample pseudo-absences — sample_pseudoabs","text":"data data.frame tibble. Database presences (presence-absence, presences-pseudo-absence) records, coordinates x character. Column name spatial x coordinates y character. Column name spatial y coordinates n integer. Number pseudo-absences sampled method character. Pseudo-absence allocation method. necessary provide vector argument. methods implemented : random: Random allocation pseudo-absences throughout area used model fitting. Usage method='random'. env_const: Pseudo-absences environmentally constrained regions lower suitability values predicted Bioclim model. method, necessary provide raster stack brick object environmental variables Usage method=c(method='env_const', env = somevar). geo_const: Pseudo-absences allocated far occurrences based geographical buffer. value buffer width m must provided raster (used rlayer) longitude/latitude CRS, map units cases. Usage method=c('geo_const', width='50000'). geo_env_const: Pseudo-absences constrained environmentally (based Bioclim model) distributed geographically far occurrences based geographical buffer. method, raster environmental variables stored SpatRaster object provided. value buffer width m must provided raster (used rlayer) longitude/latitude CRS, map units cases. Usage method=c('geo_env_const', width='50000', env = somevar). geo_env_km_const: Pseudo-absences constrained using three-level procedure; similar geo_env_const additional step distributes pseudo-absences environmental space using k-means cluster analysis. method, necessary provide raster stack brick object environmental variables value buffer width m raster (used rlayer) longitude/latitude CRS, map units cases. Usage method=c('geo_env_km_const', width='50000', env = somevar). rlayer SpatRaster. raster layer used sampling pseudo-absence layer resolution extent environmental variables used modeling recommended. case use maskval argument, raster layer must contain values used constrain sampling maskval integer, character, factor. Values raster layer used constraining pseudo-absence sampling calibarea SpatVector SpatVector delimit calibration area used given species (see calib_area function). sp_name character. Species name output used. argument used, first output column species name. Default NULL.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/sample_pseudoabs.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Sample pseudo-absences — sample_pseudoabs","text":"tibble object x y coordinates sampled pseudo-absence points","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/sample_pseudoabs.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Sample pseudo-absences — sample_pseudoabs","text":"","code":"if (FALSE) { # \\dontrun{ require(terra) require(dplyr) data(\"spp\") somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) regions <- system.file(\"external/regions.tif\", package = \"flexsdm\") regions <- terra::rast(regions) plot(regions) single_spp <- spp %>% dplyr::filter(species == \"sp3\") %>% dplyr::filter(pr_ab == 1) %>% dplyr::select(-pr_ab) # Pseudo-absences randomly sampled throughout study area ps1 <- sample_pseudoabs( data = single_spp, x = \"x\", y = \"y\", n = nrow(single_spp) * 10, method = \"random\", rlayer = regions, maskval = NULL, sp_name = \"sp3\" ) plot(regions, col = gray.colors(9)) points(single_spp[-1], col = \"blue\", cex = 0.7, pch = 19) # presences points(ps1[-1], col = \"red\", cex = 0.7, pch = 19) # absences # Pseudo-absences randomly sampled within a regions where a species occurs ## Regions where this species occurrs samp_here <- terra::extract(regions, single_spp[2:3])[, 2] %>% unique() %>% na.exclude() ps1 <- sample_pseudoabs( data = single_spp, x = \"x\", y = \"y\", n = nrow(single_spp) * 10, method = \"random\", rlayer = regions, maskval = samp_here ) plot(regions, col = gray.colors(9)) points(single_spp[-1], col = \"blue\", cex = 0.7, pch = 19) points(ps1, col = \"red\", cex = 0.7, pch = 19) # Pseudo-absences sampled with geographical constraint ps1 <- sample_pseudoabs( data = single_spp, x = \"x\", y = \"y\", n = nrow(single_spp) * 10, method = c(\"geo_const\", width = \"30000\"), rlayer = regions, maskval = samp_here ) plot(regions, col = gray.colors(9)) points(single_spp[-1], col = \"blue\", cex = 0.7, pch = 19) points(ps1, col = \"red\", cex = 0.7, pch = 19) # Pseudo-absences sampled with environmental constraint ps1 <- sample_pseudoabs( data = single_spp, x = \"x\", y = \"y\", n = nrow(single_spp) * 10, method = c(\"env_const\", env = somevar), rlayer = regions, maskval = samp_here ) plot(regions, col = gray.colors(9)) points(single_spp[-1], col = \"blue\", cex = 0.7, pch = 19) points(ps1, col = \"red\", cex = 0.7, pch = 19) # Pseudo-absences sampled with environmental and geographical constraint ps1 <- sample_pseudoabs( data = single_spp, x = \"x\", y = \"y\", n = nrow(single_spp) * 10, method = c(\"geo_env_const\", width = \"50000\", env = somevar), rlayer = regions, maskval = samp_here ) plot(regions, col = gray.colors(9)) points(single_spp[-1], col = \"blue\", cex = 0.7, pch = 19) points(ps1, col = \"red\", cex = 0.7, pch = 19) # Pseudo-absences sampled with environmental and geographical constraint and with k-mean clustering ps1 <- sample_pseudoabs( data = single_spp, x = \"x\", y = \"y\", n = nrow(single_spp) * 10, method = c(\"geo_env_km_const\", width = \"50000\", env = somevar), rlayer = regions, maskval = samp_here ) plot(regions, col = gray.colors(9)) points(single_spp[-1], col = \"blue\", cex = 0.7, pch = 19) points(ps1, col = \"red\", cex = 0.7, pch = 19) # Sampling pseudo-absence using a calibration area ca_ps1 <- calib_area( data = single_spp, x = \"x\", y = \"y\", method = c(\"buffer\", width = 50000), crs=crs(somevar) ) plot(regions, col = gray.colors(9)) plot(ca_ps1, add = T) points(single_spp[-1], col = \"blue\", cex = 0.7, pch = 19) ps1 <- sample_pseudoabs( data = single_spp, x = \"x\", y = \"y\", n = nrow(single_spp) * 50, method = \"random\", rlayer = regions, maskval = NULL, calibarea = ca_ps1 ) plot(regions, col = gray.colors(9)) plot(ca_ps1, add = T) points(ps1, col = \"red\", cex = 0.7, pch = 19) points(single_spp[-1], col = \"blue\", cex = 0.7, pch = 19) ps1 <- sample_pseudoabs( data = single_spp, x = \"x\", y = \"y\", n = nrow(single_spp) * 50, method = \"random\", rlayer = regions, maskval = samp_here, calibarea = ca_ps1 ) plot(regions, col = gray.colors(9)) plot(ca_ps1, add = T) points(ps1, col = \"red\", cex = 0.7, pch = 19) points(single_spp[-1], col = \"blue\", cex = 0.7, pch = 19) } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_directory.html","id":null,"dir":"Reference","previous_headings":"","what":"Create directories for saving the outputs of the flexsdm — sdm_directory","title":"Create directories for saving the outputs of the flexsdm — sdm_directory","text":"function assists creating directory system different sub-folders assist organisation modelling process outputs.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_directory.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Create directories for saving the outputs of the flexsdm — sdm_directory","text":"","code":"sdm_directory( main_dir = NULL, projections = NULL, calibration_area = TRUE, algorithm = NULL, ensemble = NULL, threshold = FALSE, return_vector = TRUE )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_directory.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Create directories for saving the outputs of the flexsdm — sdm_directory","text":"main_dir character. Directory path containing main folder saving model inputs outputs. NULL function assumes directory path current working R session creates sub-folder name 'flexsdm_results'. Default NULL projections vector. Vector folder names future scenarios/different regions/time periods save model projections output. calibration_area logical. TRUE, function creates folder 1_Inputs storing calibration area. Default TRUE algorithm vector. Vector model names used. Usage algorithm = c(gam, tune_max, tune_net, esm_glm). \"\" used function creates folders algorithms available flexsdm . .e. 'gam', 'gau', 'gbm', 'glm', 'max', 'net', 'raf', 'svm'. Default NULL ensemble vector. Vector methods used ensemble different models. Usage ensemble = c(\"mean\", \"meanthr\"). Default NULL threshold logical. TRUE sub-folders \"/1_con\", \"/2_bin\" created within algorithm /ensemble folder. Used storing continuous binarized models separately. Default FALSE return_vector logical. TRUE function returns vector path folders. Default TRUE","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_directory.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Create directories for saving the outputs of the flexsdm — sdm_directory","text":"character vector paths created folders","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_directory.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Create directories for saving the outputs of the flexsdm — sdm_directory","text":"sdm_directory function assists saving workflow outputs creating folders (directories) based user specifications, choice algorithms, ensemble methods, model projections new geographic regions periods. function first creates two folders within user-specified project folder, one model inputs (1_Inputs) one model outputs (2_Outputs). Within 1_Inputs, three sub-folders users store model inputs: 1_Occurrences, 2_Predictors, 3_Calibration_area. user chooses include projections modeling framework, 2_Projections subfolder created within 2_Predictors folder store environmental data projection scenarios provided \"projections\" argument. Additionally, sdm_directory offers users enhanced flexibility saving modeling outputs, giving offers users option save results modeling ensemble technique presented flexsdm","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_directory.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Create directories for saving the outputs of the flexsdm — sdm_directory","text":"","code":"if (FALSE) { # \\dontrun{ require(dplyr) # require(sf) # Implement sdm_directory without specific path and project name dirs_1 <- sdm_directory( main_dir = NULL, projections = NULL, calibration_area = TRUE, algorithm = c(\"gam\", \"tune_max\"), ensemble = c(\"mean\", \"meanthr\"), threshold = FALSE, return_vector = TRUE ) dirs_1 dirs_1[1] %>% fs::dir_tree(., recurse = TRUE) unlink(dirs_1[1], recursive = TRUE) # this directory and sub-folder will be removed # Implement sdm_directory with specific path and project name getwd() %>% dirname() dirs_2 <- sdm_directory( main_dir = getwd() %>% dirname() %>% file.path(., \"my_project_name\"), projections = c( \"cnrm_rpc8.5_2050\", \"cnrm_rpc4.5_2050\" ), calibration_area = TRUE, algorithm = \"all\", ensemble = c(\"mean\", \"meanthr\"), threshold = TRUE ) dirs_2[1] %>% fs::dir_tree(., recurse = TRUE) } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_eval.html","id":null,"dir":"Reference","previous_headings":"","what":"Calculate different model performance metrics — sdm_eval","title":"Calculate different model performance metrics — sdm_eval","text":"function calculates threshold dependent independent model performance metrics.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_eval.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Calculate different model performance metrics — sdm_eval","text":"","code":"sdm_eval(p, a, bg = NULL, thr = NULL)"},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_eval.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Calculate different model performance metrics — sdm_eval","text":"p numeric. Predicted suitability presences numeric. Predicted suitability absences bg numeric. Predicted suitability background points, used BOYCE metric. bg set NULL, BOYCE metric calculated presences absences suitabilities values thr character. Threshold criterion used get binary suitability values (.e. 0,1). Used threshold-dependent performance metrics. possible use one threshold type. vector must provided argument. following threshold criteria available: lpt: highest threshold omission. equal_sens_spec: Threshold Sensitivity Specificity equal. max_sens_spec: Threshold sum Sensitivity Specificity highest (aka threshold maximizes TSS). max_jaccard: threshold Jaccard index highest. max_sorensen: threshold Sorensen index highest. max_fpb: threshold FPB (F-measure presence-background data) highest. sensitivity: Threshold based specified Sensitivity value. Usage thr = c('sensitivity', sens='0.6') thr = c('sensitivity'). 'sens' refers Sensitivity value. sensitivity value specified, default value 0.9 one threshold type used, concatenate threshold types, e.g., thr=c('lpt', 'max_sens_spec', 'max_jaccard'), thr=c('lpt', 'max_sens_spec', 'sensitivity', sens='0.8'), thr=c('lpt', 'max_sens_spec', 'sensitivity'). Function use thresholds threshold type specified","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_eval.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Calculate different model performance metrics — sdm_eval","text":"tibble next columns threshold: threshold names thr_value: threshold values n_presences: number presences n_absences: number absences TPR IMAE: performance metrics","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_eval.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Calculate different model performance metrics — sdm_eval","text":"function used evaluating different models approaches base combination presence-absences presence-pseudo-absences background point data suitability predicted model flexsdm modeling function families (fit_, esm_, tune_.) calculates next performance metric: \\* BOYCE calculated based presences background points, case background points provided calculated using presences absences. codes calculating metric adaptation enmSdm package (https://github.com/adamlilith/enmSdm) \\** IMAE calculated 1-(Mean Absolute Error) order consistent metrics higher value given performance metric, greater model's accuracy","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_eval.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Calculate different model performance metrics — sdm_eval","text":"","code":"if (FALSE) { # \\dontrun{ require(dplyr) set.seed(0) p <- rnorm(50, mean = 0.7, sd = 0.3) %>% abs() p[p > 1] <- 1 p[p < 0] <- 0 set.seed(0) a <- rnorm(50, mean = 0.3, sd = 0.2) %>% abs() a[a > 1] <- 1 a[a < 0] <- 0 set.seed(0) backg <- rnorm(1000, mean = 0.4, sd = 0.4) %>% abs() backg[backg > 1] <- 1 backg[backg < 0] <- 0 # Function use without threshold specification e <- sdm_eval(p, a) e # Function use with threshold specification sdm_eval(p, a, thr = \"max_sorensen\") sdm_eval(p, a, thr = c(\"lpt\", \"max_sens_spec\", \"max_jaccard\")) sdm_eval(p, a, thr = c(\"lpt\", \"max_sens_spec\", \"sensitivity\")) sdm_eval(p, a, thr = c(\"lpt\", \"max_sens_spec\", \"sensitivity\", sens = \"0.95\")) # Use of bg argument (it will only be used for calculating BOYCE index) sdm_eval(p, a, thr = \"max_sens_spec\") sdm_eval(p, a, thr = c(\"max_sens_spec\"), bg = backg) # If background will be used to calculate all other metrics # background values can be used in \"a\" argument sdm_eval(p, backg, thr = \"max_sens_spec\") } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_extract.html","id":null,"dir":"Reference","previous_headings":"","what":"Extract environmental data values from a spatial raster based on x and y coordinates — sdm_extract","title":"Extract environmental data values from a spatial raster based on x and y coordinates — sdm_extract","text":"Extract environmental data values spatial raster based x y coordinates","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_extract.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Extract environmental data values from a spatial raster based on x and y coordinates — sdm_extract","text":"","code":"sdm_extract(data, x, y, env_layer, variables = NULL, filter_na = TRUE)"},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_extract.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Extract environmental data values from a spatial raster based on x and y coordinates — sdm_extract","text":"data data.frame. Database species presence, presence-absence, pseudo-absence records x y coordinates x character. Column name spatial x coordinates y character. Column name spatial y coordinates env_layer SpatRaster. Raster raster stack environmental variables. variables character. Vector variable names predictor (environmental) variables Usage variables. = c(\"aet\", \"cwd\", \"tmin\"). variable specified, function return data layers. Default NULL filter_na logical. filter_na = TRUE (default), rows NA values environmental variables removed returned tibble.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_extract.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Extract environmental data values from a spatial raster based on x and y coordinates — sdm_extract","text":"tibble returns original data base additional columns extracted environmental variables xy location SpatRaster object used 'env_layer'","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_extract.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Extract environmental data values from a spatial raster based on x and y coordinates — sdm_extract","text":"","code":"if (FALSE) { # \\dontrun{ require(terra) # Load datasets data(spp) f <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(f) # Extract environmental data from somevar for all locations in spp ex_spp <- sdm_extract( data = spp, x = \"x\", y = \"y\", env_layer = somevar, variables = NULL, filter_na = FALSE ) # Extract environmental for two variables and remove rows with NAs ex_spp2 <- sdm_extract( data = spp, x = \"x\", y = \"y\", env_layer = somevar, variables = c(\"CFP_3\", \"CFP_4\"), filter_na = TRUE ) ex_spp ex_spp2 } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_predict.html","id":null,"dir":"Reference","previous_headings":"","what":"Spatial predictions from individual and ensemble models — sdm_predict","title":"Spatial predictions from individual and ensemble models — sdm_predict","text":"function allows geographical prediction one models constructed fit_ tune_ function set, models fitted esm_ function set (.e., ensemble small models approach), models constructed fit_ensemble function. can return continuous continuous binary predictions one thresholds","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_predict.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Spatial predictions from individual and ensemble models — sdm_predict","text":"","code":"sdm_predict( models, pred, nchunk = 1, thr = NULL, con_thr = FALSE, predict_area = NULL, clamp = TRUE, pred_type = \"cloglog\" )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_predict.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Spatial predictions from individual and ensemble models — sdm_predict","text":"models list one models fitted fit_ tune_ functions. case use models fitted fit_ensemble esm_ family function one model used. Usage models = mglm models = list(mglm, mraf, mgbm) pred SpatRaster. Raster layer predictor variables. Names layers must exactly match used model fitting. nchunk integer. Number chunks split data used predict models (.e., SpatRaster used pred argument). Predicting models chunks helps reduce memory requirements cases models predicted large scales high resolution. Default = 1 thr character. Threshold used get binary suitability values (.e., 0,1). possible use one threshold type. mandatory use threshold/s used fit models. following threshold types available: lpt: highest threshold omission. equal_sens_spec: Threshold sensitivity specificity equal. max_sens_spec: Threshold sum sensitivity specificity highest (aka threshold maximizes TSS). max_jaccard: threshold Jaccard index highest. max_sorensen: threshold Sorensen index highest. max_fpb: threshold FPB highest. sensitivity: Threshold based specified sensitivity value used fit models. : threshold used model outputs used 'models' argument used. Usage thr = c('lpt', 'max_sens_spec', 'max_jaccard'), thr=c('lpt', 'max_sens_spec', 'sensitivity'), thr=''. threshold specified (.e., thr = NULL) function return continuous prediction . Default NULL con_thr logical. true predictions suitability values threshold/s returned. Default = FALSE predict_area SpatVector, SpatialPolygon, SpatialPolygonDataFrame. Spatial polygon used restring prediction given region. Default = NULL clamp logical. set TRUE, predictors features restricted range seen model training. valid Maxent model (see tune_mx fit_mx). Default TRUE. pred_type character. Type response required available \"link\", \"exponential\", \"cloglog\" \"logistic\". valid Maxent model (see tune_mx fit_mx). Default \"cloglog\".","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_predict.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Spatial predictions from individual and ensemble models — sdm_predict","text":"list SpatRaster continuous /binary predictions","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_predict.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Spatial predictions from individual and ensemble models — sdm_predict","text":"","code":"if (FALSE) { # \\dontrun{ require(dplyr) require(terra) data(\"spp\") somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) # Extract data some_sp <- spp %>% filter(species == \"sp3\") some_sp <- sdm_extract( data = some_sp, x = \"x\", y = \"y\", env_layer = somevar ) # Partition some_sp <- part_random( data = some_sp, pr_ab = \"pr_ab\", method = c(method = \"rep_kfold\", folds = 3, replicates = 5) ) ## %######################################################%## # # #### Create different type of models #### # # ## %######################################################%## # Fit some models mglm <- fit_glm( data = some_sp, response = \"pr_ab\", predictors = c(\"CFP_1\", \"CFP_2\", \"CFP_3\", \"CFP_4\"), partition = \".part\", poly = 2 ) mraf <- fit_raf( data = some_sp, response = \"pr_ab\", predictors = c(\"CFP_1\", \"CFP_2\", \"CFP_3\", \"CFP_4\"), partition = \".part\", ) mgbm <- fit_gbm( data = some_sp, response = \"pr_ab\", predictors = c(\"CFP_1\", \"CFP_2\", \"CFP_3\", \"CFP_4\"), partition = \".part\" ) # Fit an ensemble model mensemble <- fit_ensemble( models = list(mglm, mraf, mgbm), ens_method = \"meansup\", thr = NULL, thr_model = \"max_sens_spec\", metric = \"TSS\" ) # Fit a model with the Ensembles of Small Models approach # Without threshold specification and with kfold msmall <- esm_gam( data = some_sp, response = \"pr_ab\", predictors = c(\"CFP_1\", \"CFP_2\", \"CFP_3\", \"CFP_4\"), partition = \".part\", thr = NULL ) ## %######################################################%## # # #### Predict different kind of models #### # # ## %######################################################%## # sdm_predict can be used for predict one or more models fitted with fit_ or tune_ functions # a single model ind_p <- sdm_predict( models = mglm, pred = somevar, thr = \"max_fpb\", con_thr = FALSE, predict_area = NULL ) # a list of models list_p <- sdm_predict( models = list(mglm, mraf, mgbm), pred = somevar, thr = \"max_fpb\", con_thr = FALSE, predict_area = NULL ) # Predict an ensemble model # (only is possilbe use one fit_ensemble) ensemble_p <- sdm_predict( models = mensemble, pred = somevar, thr = \"max_fpb\", con_thr = FALSE, predict_area = NULL ) # Predict an ensemble of small models # (only is possible to use one ensemble of small models) small_p <- sdm_predict( models = msmall, pred = somevar, thr = \"max_fpb\", con_thr = FALSE, predict_area = NULL ) ##%######################################################%## # # #### Predict model using chunks #### # # ##%######################################################%## # Predicting models in chunks helps reduce memory requirements in # cases where models are predicted for large scales and high resolution ind_p <- sdm_predict( models = mglm, pred = somevar, thr = \"max_fpb\", con_thr = FALSE, predict_area = NULL, nchunk = 4 ) } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_summarize.html","id":null,"dir":"Reference","previous_headings":"","what":"Merge model performance tables — sdm_summarize","title":"Merge model performance tables — sdm_summarize","text":"Merge model performance tables","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_summarize.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Merge model performance tables — sdm_summarize","text":"","code":"sdm_summarize(models)"},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_summarize.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Merge model performance tables — sdm_summarize","text":"models list one models fitted fit_ tune_ functions, fit_ensemble output, esm_ family function output. list single several models fitted fit_ tune_ functions object returned fit_ensemble function. Usage models = list(mod1, mod2, mod3)","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_summarize.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Merge model performance tables — sdm_summarize","text":"Combined model performance table input models. Models fit tune include model performance best hyperparameters.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_summarize.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Merge model performance tables — sdm_summarize","text":"","code":"if (FALSE) { # \\dontrun{ data(abies) abies # In this example we will partition the data using the k-fold method abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 5) ) # Build a generalized additive model using fit_gam gam_t1 <- fit_gam( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), predictors_f = c(\"landform\"), partition = \".part\", thr = c(\"max_sens_spec\", \"equal_sens_spec\", \"max_sorensen\") ) gam_t1$performance # Build a generalized linear model using fit_glm glm_t1 <- fit_glm( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), predictors_f = c(\"landform\"), partition = \".part\", thr = c(\"max_sens_spec\", \"equal_sens_spec\", \"max_sorensen\"), poly = 0, inter_order = 0 ) glm_t1$performance # Build a tuned random forest model using tune_raf tune_grid <- expand.grid(mtry = seq(1, 7, 1)) rf_t1 <- tune_raf( data = abies2, response = \"pr_ab\", predictors = c( \"aet\", \"cwd\", \"tmin\", \"ppt_djf\", \"ppt_jja\", \"pH\", \"awc\", \"depth\" ), predictors_f = c(\"landform\"), partition = \".part\", grid = tune_grid, thr = c(\"max_sens_spec\", \"equal_sens_spec\", \"max_sorensen\"), metric = \"TSS\", ) rf_t1$performance # Merge sdm performance tables merge_df <- sdm_summarize(models = list(gam_t1, glm_t1, rf_t1)) merge_df } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/spp.html","id":null,"dir":"Reference","previous_headings":"","what":"A data set containing presences and absences of three virtual species — spp","title":"A data set containing presences and absences of three virtual species — spp","text":"data set containing presences absences three virtual species","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/spp.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"A data set containing presences and absences of three virtual species — spp","text":"","code":"spp"},{"path":"https://sjevelazco.github.io/flexsdm/reference/spp.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"A data set containing presences and absences of three virtual species — spp","text":"tibble 1150 rows 3 variables: species virtual species names x longitude species occurrences y latitude species occurrences pr_ab presences absences denoted 1 0 respectively","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/spp.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"A data set containing presences and absences of three virtual species — spp","text":"","code":"if (FALSE) { # \\dontrun{ require(dplyr) data(\"spp\") spp } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/tune_gbm.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit and validate Generalized Boosted Regression models with exploration of hyper-parameters that optimize performance — tune_gbm","title":"Fit and validate Generalized Boosted Regression models with exploration of hyper-parameters that optimize performance — tune_gbm","text":"Fit validate Generalized Boosted Regression models exploration hyper-parameters optimize performance","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/tune_gbm.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit and validate Generalized Boosted Regression models with exploration of hyper-parameters that optimize performance — tune_gbm","text":"","code":"tune_gbm( data, response, predictors, predictors_f = NULL, fit_formula = NULL, partition, grid = NULL, thr = NULL, metric = \"TSS\", n_cores = 1 )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/tune_gbm.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit and validate Generalized Boosted Regression models with exploration of hyper-parameters that optimize performance — tune_gbm","text":"data data.frame. Database response (0,1) predictors values. response character. Column name species absence-presence data (0,1). predictors character. Vector column names quantitative predictor variables (.e. continuous variables). Usage predictors = c(\"aet\", \"cwd\", \"tmin\") predictors_f character. Vector column names qualitative predictor variables (.e. ordinal nominal variables type). Usage predictors_f = c(\"landform\") fit_formula formula. formula object response predictor variables (e.g. formula(pr_ab ~ aet + ppt_jja + pH + awc + depth + landform)). Note variables used must consistent used response, predictors, predictors_f arguments. Default NULL. partition character. Column name training validation partition groups. grid data.frame. data frame object algorithm hyper-parameter values tested. recommended generate data.frame grid() function. Hyper-parameters needed tuning 'n.trees', 'shrinkage', 'n.minobsinnode'. thr character. Threshold used get binary suitability values (.e. 0,1) needed threshold-dependent performance metrics. possible use one threshold type. Provide vector argument. following threshold types available: lpt: highest threshold omission. equal_sens_spec: Threshold sensitivity specificity equal. max_sens_spec: Threshold sum sensitivity specificity highest (aka threshold maximizes TSS). max_jaccard: threshold Jaccard index highest. max_sorensen: threshold Sorensen index highest. max_fpb: threshold FPB (F-measure presence-background data) highest. sensitivity: Threshold based specified sensitivity value. Usage thr = c('sensitivity', sens='0.6') thr = c('sensitivity'). 'sens' refers sensitivity value. sensitivity value specified, default used 0.9 one threshold type used must concatenate, e.g., thr=c('lpt', 'max_sens_spec', 'max_jaccard'), thr=c('lpt', 'max_sens_spec', 'sensitivity', sens='0.8'), thr=c('lpt', 'max_sens_spec', 'sensitivity'). Function use threshold types threshold specified. metric character. Performance metric used selecting best combination hyper-parameter values. following metrics can used: SORENSEN, JACCARD, FPB, TSS, KAPPA, AUC, BOYCE. TSS used default. n_cores numeric. Number cores use parallelization. Default 1","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/tune_gbm.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit and validate Generalized Boosted Regression models with exploration of hyper-parameters that optimize performance — tune_gbm","text":"list object : model: \"gbm\" class object gbm package. object can used predicting. predictors: tibble quantitative (c column names) qualitative (f column names) variables use modeling. performance: Hyper-parameter values performance metric (see sdm_eval) best hyper-parameter combination. hyper_performance: Performance metric (see sdm_eval) combination hyper-parameters. data_ens: Predicted suitability test partition based best model. database used fit_ensemble","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/tune_gbm.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit and validate Generalized Boosted Regression models with exploration of hyper-parameters that optimize performance — tune_gbm","text":"","code":"if (FALSE) { # \\dontrun{ data(abies) abies # Partition the data with the k-fold method abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 5) ) # pr_ab is the name of the column with species presence and absences (i.e. the response variable) # from aet to landform are the predictors variables (landform is a qualitative variable) # Hyper-parameter values for tuning tune_grid <- expand.grid( n.trees = c(20, 50, 100), shrinkage = c(0.1, 0.5, 1), n.minobsinnode = c(1, 3, 5, 7, 9) ) gbm_t <- tune_gbm( data = abies2, response = \"pr_ab\", predictors = c( \"aet\", \"cwd\", \"tmin\", \"ppt_djf\", \"ppt_jja\", \"ppt_jja\", \"pH\", \"awc\", \"depth\" ), predictors_f = c(\"landform\"), partition = \".part\", grid = tune_grid, thr = \"max_sens_spec\", metric = \"TSS\", n_cores = 1 ) # Outputs gbm_t$model gbm_t$predictors gbm_t$performance gbm_t$data_ens gbm_t$hyper_performance # Graphical exploration of performance of each hyper-parameter setting require(ggplot2) pg <- position_dodge(width = 0.5) ggplot(gbm_t$hyper_performance, aes(factor(n.minobsinnode), TSS_mean, col = factor(shrinkage) )) + geom_errorbar(aes(ymin = TSS_mean - TSS_sd, ymax = TSS_mean + TSS_sd), width = 0.2, position = pg ) + geom_point(position = pg) + geom_line( data = gbm_t$tune_performance, aes(as.numeric(factor(n.minobsinnode)), TSS_mean, col = factor(shrinkage) ), position = pg ) + facet_wrap(. ~ n.trees) + theme(legend.position = \"bottom\") } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/tune_max.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit and validate Maximum Entropy models with exploration of hyper-parameters that optimize performance — tune_max","title":"Fit and validate Maximum Entropy models with exploration of hyper-parameters that optimize performance — tune_max","text":"Fit validate Maximum Entropy models exploration hyper-parameters optimize performance","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/tune_max.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit and validate Maximum Entropy models with exploration of hyper-parameters that optimize performance — tune_max","text":"","code":"tune_max( data, response, predictors, predictors_f = NULL, background = NULL, partition, grid = NULL, thr = NULL, metric = \"TSS\", clamp = TRUE, pred_type = \"cloglog\", n_cores = 1 )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/tune_max.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit and validate Maximum Entropy models with exploration of hyper-parameters that optimize performance — tune_max","text":"data data.frame. Database response (0,1) predictors values. response character. Column name species absence-presence data (0,1). predictors character. Vector column names quantitative predictor variables (.e. continuous variables). Usage predictors = c(\"aet\", \"cwd\", \"tmin\") predictors_f character. Vector column names qualitative predictor variables (.e. ordinal nominal variables type). Usage predictors_f = c(\"landform\") background data.frame. Database response variable column containing 0 values, predictors variables. column names must consistent data partition character. Column name training validation partition groups. grid data.frame. data frame object algorithm hyper-parameters values tested. recommended generate data.frame grid() function. Hyper-parameters needed tuning 'regmult' 'classes' (combination following letters l -linear-, q -quadratic-, h -hinge-, p -product-, t -threshold-). thr character. Threshold used get binary suitability values (.e. 0,1)., needed threshold-dependent performance metrics. one threshold type can used. necessary provide vector argument. following threshold types available: lpt: highest threshold omission. equal_sens_spec: Threshold sensitivity specificity equal. max_sens_spec: Threshold sum sensitivity specificity highest (aka threshold maximizes TSS). max_jaccard: threshold Jaccard index highest. max_sorensen: threshold Sorensen index highest. max_fpb: threshold # FPB (F-measure presence-background data) highest. sensitivity: Threshold based specified sensitivity value. Usage thr = c('sensitivity', sens='0.6') thr = c('sensitivity'). 'sens' refers sensitivity value. sensitivity value specified, default 0.9 used. one threshold type used, concatenate , e.g., thr=c('lpt', 'max_sens_spec', 'max_jaccard'), thr=c('lpt', 'max_sens_spec', 'sensitivity', sens='0.8'), thr=c('lpt', 'max_sens_spec', 'sensitivity'). Function use thresholds threshold specified. metric character. Performance metric used selecting best combination hyper -parameter values. One following metrics can used: SORENSEN, JACCARD, FPB, TSS, KAPPA, AUC, BOYCE. TSS used default. clamp logical. TRUE, predictors features restricted range seen model training. pred_type character. Type response required available \"link\", \"exponential\", \"cloglog\" \"logistic\". Default \"cloglog\" n_cores numeric. Number cores use parallelization. Default 1","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/tune_max.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit and validate Maximum Entropy models with exploration of hyper-parameters that optimize performance — tune_max","text":"list object : model: \"maxnet\" class object maxnet package. object can used predicting. predictors: tibble quantitative (c column names) qualitative (f column names) variables use modeling. performance: Hyper-parameters values performance metrics (see sdm_eval) best hyper-parameters combination. hyper_performance: Performance metrics (see sdm_eval) combination hyper-parameters. data_ens: Predicted suitability test partition based best model. database used fit_ensemble","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/tune_max.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Fit and validate Maximum Entropy models with exploration of hyper-parameters that optimize performance — tune_max","text":"presence-absence (presence-pseudo-absence) data used data argument addition background points, function fit models presences background points validate presences absences. procedure makes maxent comparable presences-absences models (e.g., random forest, support vector machine). presences background points data used, function fit validate model presences background data. presence-absences used data argument without background, function fit model specified data (recommended).","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/tune_max.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit and validate Maximum Entropy models with exploration of hyper-parameters that optimize performance — tune_max","text":"","code":"if (FALSE) { # \\dontrun{ data(\"abies\") data(\"backg\") abies # environmental conditions of presence-absence data backg # environmental conditions of background points # Using k-fold partition method # Remember that the partition method, number of folds or replications must # be the same for presence-absence and background points datasets abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 3) ) abies2 set.seed(1) backg <- dplyr::sample_n(backg, size = 2000, replace = FALSE) backg2 <- part_random( data = backg, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 3) ) backg gridtest <- expand.grid( regmult = seq(0.1, 3, 0.5), classes = c(\"l\", \"lq\", \"lqh\") ) max_t1 <- tune_max( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"pH\", \"awc\", \"depth\"), predictors_f = c(\"landform\"), partition = \".part\", background = backg2, grid = gridtest, thr = \"max_sens_spec\", metric = \"TSS\", clamp = TRUE, pred_type = \"cloglog\", n_cores = 2 # activate two cores to speed up this process ) length(max_t1) max_t1$model max_t1$predictors max_t1$performance max_t1$data_ens } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/tune_net.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit and validate Neural Networks models with exploration of hyper-parameters — tune_net","title":"Fit and validate Neural Networks models with exploration of hyper-parameters — tune_net","text":"Fit validate Neural Networks models exploration hyper-parameters","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/tune_net.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit and validate Neural Networks models with exploration of hyper-parameters — tune_net","text":"","code":"tune_net( data, response, predictors, predictors_f = NULL, fit_formula = NULL, partition, grid = NULL, thr = NULL, metric = \"TSS\", n_cores = 1 )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/tune_net.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit and validate Neural Networks models with exploration of hyper-parameters — tune_net","text":"data data.frame. Database response (0,1) predictors values. response character. Column name species absence-presence data (0,1). predictors character. Vector column names quantitative predictor variables (.e. continuous variables). Usage predictors = c(\"aet\", \"cwd\", \"tmin\") predictors_f character. Vector column names qualitative predictor variables (.e. ordinal nominal variables type). Usage predictors_f = c(\"landform\") fit_formula formula. formula object response predictor variables (e.g. formula(pr_ab ~ aet + ppt_jja + pH + awc + depth + landform)). Note variable names used must consistent used response, predictors, predictors_f arguments. Defaul NULL. partition character. Column name training validation partition groups. grid data.frame. data frame object algorithm hyper-parameters values tested. recommended generate data.frame grid() function. thr character. Threshold used get binary suitability values (.e. 0,1), needed threshold-dependent performance metrics. possible use one threshold type. necessary provide vector argument. following threshold types available: lpt: highest threshold omission. equal_sens_spec: Threshold sensitivity specificity equal. max_sens_spec: Threshold sum sensitivity specificity highest (aka threshold maximizes TSS). max_jaccard: threshold Jaccard index highest. max_sorensen: threshold Sorensen index highest. max_fpb: threshold FPB (F-measure presence-background data) highest. sensitivity: Threshold based specified sensitivity value. Usage thr = c('sensitivity', sens='0.6') thr = c('sensitivity'). 'sens' refers sensitivity value. specified sensitivity values, function use default 0.9. using one threshold type concatenate , e.g., thr=c('lpt', 'max_sens_spec', 'max_jaccard'), thr=c('lpt', 'max_sens_spec', 'sensitivity', sens='0.8'), thr=c('lpt', 'max_sens_spec', 'sensitivity'). Function use thresholds threshold specified. metric character. Performance metric used selecting best combination hyper-parameter values. One following metrics can used: SORENSEN, JACCARD, FPB, TSS, KAPPA, AUC, BOYCE. TSS used default. n_cores numeric. Number cores use parallelization. Default 1","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/tune_net.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit and validate Neural Networks models with exploration of hyper-parameters — tune_net","text":"list object : model: \"nnet\" class object nnet package. object can used predicting. predictors: tibble quantitative (c column names) qualitative (f column names) variables use modeling. performance: Hyper-parameters values performance metric (see sdm_eval) best hyper-parameters combination. hyper_performance: Performance metric (see sdm_eval) combination hyper-parameters. data_ens: Predicted suitability test partition based best model. database used fit_ensemble","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/tune_net.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit and validate Neural Networks models with exploration of hyper-parameters — tune_net","text":"","code":"if (FALSE) { # \\dontrun{ data(abies) abies # Partitioning the data with the k-fold method abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 5) ) # pr_ab columns is species presence and absences (i.e. the response variable) # from aet to landform are the predictors variables (landform is a qualitative variable) # Hyper-parameter values for tuning tune_grid <- expand.grid( size = c(2, 4, 6, 8, 10), decay = c(0.001, 0.05, 0.1, 1, 3, 4, 5, 10) ) net_t <- tune_net( data = abies2, response = \"pr_ab\", predictors = c( \"aet\", \"cwd\", \"tmin\", \"ppt_djf\", \"ppt_jja\", \"pH\", \"awc\", \"depth\" ), predictors_f = c(\"landform\"), partition = \".part\", grid = tune_grid, thr = \"max_sens_spec\", metric = \"TSS\", n_cores = 1 ) # Outputs net_t$model net_t$predictors net_t$performance net_t$hyper_performance net_t$data_ens } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/tune_raf.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit and validate Random Forest models with exploration of hyper-parameters that optimize performance — tune_raf","title":"Fit and validate Random Forest models with exploration of hyper-parameters that optimize performance — tune_raf","text":"Fit validate Random Forest models exploration hyper-parameters optimize performance","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/tune_raf.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit and validate Random Forest models with exploration of hyper-parameters that optimize performance — tune_raf","text":"","code":"tune_raf( data, response, predictors, predictors_f = NULL, fit_formula = NULL, partition, grid = NULL, thr = NULL, metric = \"TSS\", n_cores = 1 )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/tune_raf.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit and validate Random Forest models with exploration of hyper-parameters that optimize performance — tune_raf","text":"data data.frame. Database response (0,1) predictors values. response character. Column name species absence-presence data (0,1). predictors character. Vector column names quantitative predictor variables (.e. continuous variables). Usage predictors = c(\"aet\", \"cwd\", \"tmin\") predictors_f character. Vector column names qualitative predictor variables (.e. ordinal nominal variables type). Usage predictors_f = c(\"landform\") fit_formula formula. formula object response predictor variables (e.g. formula(pr_ab ~ aet + ppt_jja + pH + awc + depth + landform)). Note variables used must consistent used response, predictors, predictors_f arguments. Default NULL partition character. Column name training validation partition groups. grid data.frame. data frame object algorithm hyper-parameters values tested. recommended generate data.frame grid() function. Hyper-parameter needed tuning 'mtry'. maximum mtry exceed total number predictors. thr character. Threshold used get binary suitability values (.e. 0,1), needed threshold-dependent performance metrics. possible use one threshold type. necessary provide vector argument. following threshold types available: lpt: highest threshold omission. equal_sens_spec: Threshold sensitivity specificity equal. max_sens_spec: Threshold sum sensitivity specificity highest (aka threshold maximizes TSS). max_jaccard: threshold Jaccard index highest. max_sorensen: threshold Sorensen index highest. max_fpb: threshold FPB highest. sensitivity: Threshold based specified sensitivity value. Usage thr = c('sensitivity', sens='0.6') thr = c('sensitivity'). 'sens' refers sensitivity value. specified sensitivity values, function use default 0.9 using one threshold type concatenate , e.g., thr=c('lpt', 'max_sens_spec', 'max_jaccard'), thr=c('lpt', 'max_sens_spec', 'sensitivity', sens='0.8'), thr=c('lpt', 'max_sens_spec', 'sensitivity'). Function use thresholds threshold specified. metric character. Performance metric used selecting best combination hyper -parameter values. One following metrics can used: SORENSEN, JACCARD, FPB, TSS, KAPPA, AUC, BOYCE. TSS used default. n_cores numeric. Number cores use parallelization. Default 1","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/tune_raf.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit and validate Random Forest models with exploration of hyper-parameters that optimize performance — tune_raf","text":"list object : model: \"randomForest\" class object randomForest package. object can used predicting. predictors: tibble quantitative (c column names) qualitative (f column names) variables use modeling. performance: Hyper-parameters values performance metric (see sdm_eval) best hyper-parameters combination. hyper_performance: Performance metric (see sdm_eval) combination hyper-parameters. data_ens: Predicted suitability test partition based best model. database used fit_ensemble","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/tune_raf.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit and validate Random Forest models with exploration of hyper-parameters that optimize performance — tune_raf","text":"","code":"if (FALSE) { # \\dontrun{ data(abies) abies # Partition the data with the k-fold method abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 5) ) tune_grid <- expand.grid(mtry = seq(1, 7, 1)) rf_t <- tune_raf( data = abies2, response = \"pr_ab\", predictors = c( \"aet\", \"cwd\", \"tmin\", \"ppt_djf\", \"ppt_jja\", \"pH\", \"awc\", \"depth\" ), predictors_f = c(\"landform\"), partition = \".part\", grid = tune_grid, thr = \"max_sens_spec\", metric = \"TSS\", n_cores = 1 ) # Outputs rf_t$model rf_t$predictors rf_t$performance rf_t$hyper_performance rf_t$data_ens } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/tune_svm.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit and validate Support Vector Machine models with exploration of hyper-parameters that optimize performance — tune_svm","title":"Fit and validate Support Vector Machine models with exploration of hyper-parameters that optimize performance — tune_svm","text":"Fit validate Support Vector Machine models exploration hyper-parameters optimize performance","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/tune_svm.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit and validate Support Vector Machine models with exploration of hyper-parameters that optimize performance — tune_svm","text":"","code":"tune_svm( data, response, predictors, predictors_f = NULL, fit_formula = NULL, partition, grid = NULL, thr = NULL, metric = \"TSS\", n_cores = 1 )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/tune_svm.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit and validate Support Vector Machine models with exploration of hyper-parameters that optimize performance — tune_svm","text":"data data.frame. Database response (0,1) predictors values. response character. Column name species absence-presence data (0,1). predictors character. Vector column names quantitative predictor variables (.e. continuous variables). Usage predictors = c(\"aet\", \"cwd\", \"tmin\") predictors_f character. Vector column names qualitative predictor variables (.e. ordinal nominal variables type). Usage predictors_f = c(\"landform\") fit_formula formula. formula object response predictor variables (e.g. formula(pr_ab ~ aet + ppt_jja + pH + awc + depth + landform)). Note variable names used must consistent used response, predictors, predictors_f arguments. Default NULL partition character. Column name training validation partition groups. grid data.frame. Provide data frame object algorithm hyper-parameters values tested. recommended generate data.frame grid() function. Hyper-parameters needed tuning 'size' 'decay'. thr character. Threshold used get binary suitability values (.e. 0,1). useful threshold-dependent performance metrics. possible use one threshold type. necessary provide vector argument. next threshold area available: lpt: highest threshold omission. equal_sens_spec: Threshold sensitivity specificity equal. max_sens_spec: Threshold sum sensitivity specificity highest (aka threshold maximizes TSS). max_jaccard: threshold Jaccard index highest. max_sorensen: threshold Sorensen index highest. max_fpb: threshold # FPB (F-measure presence-background data) highest. sensitivity: Threshold based specified sensitivity value. Usage thr = c('sensitivity', sens='0.6') thr = c('sensitivity'). 'sens' refers sensitivity value. sensitivity value specified, default used 0.9. case use one threshold type necessary concatenate threshold types, e.g., thr=c('lpt', 'max_sens_spec', 'max_jaccard'), thr=c('lpt', 'max_sens_spec', 'sensitivity', sens='0.8'), thr=c('lpt', 'max_sens_spec', 'sensitivity'). Function use thresholds threshold specified metric character. Performance metric used selecting best combination hyper-parameter values. One following metrics can used: SORENSEN, JACCARD, FPB, TSS, KAPPA, AUC, BOYCE. TSS used default. n_cores numeric. Number cores use parallelization. Default 1","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/tune_svm.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit and validate Support Vector Machine models with exploration of hyper-parameters that optimize performance — tune_svm","text":"list object : model: \"ksvm\" class object kernlab package. object can used predicting. predictors: tibble quantitative (c column names) qualitative (f column names) variables use modeling. performance: Hyper-parameters values performance metric (see sdm_eval) best hyper-parameters combination. hyper_performance: Performance metrics (see sdm_eval) combination hyper-parameters. data_ens: Predicted suitability test partition based best model. database used fit_ensemble","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/tune_svm.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit and validate Support Vector Machine models with exploration of hyper-parameters that optimize performance — tune_svm","text":"","code":"if (FALSE) { # \\dontrun{ data(abies) abies # Partition the data with the k-fold method abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 5) ) # pr_ab column is species presence and absences (i.e. the response variable) # from aet to landform are the predictors variables (landform is a qualitative variable) # Hyper-parameter values for tuning tune_grid <- expand.grid( C = c(2, 4, 8, 16, 20), sigma = c(0.01, 0.1, 0.2, 0.3, 0.4) ) svm_t <- tune_svm( data = abies2, response = \"pr_ab\", predictors = c( \"aet\", \"cwd\", \"tmin\", \"ppt_djf\", \"ppt_jja\", \"pH\", \"awc\", \"depth\" ), predictors_f = c(\"landform\"), partition = \".part\", grid = tune_grid, thr = \"max_sens_spec\", metric = \"TSS\", n_cores = 1 ) # Outputs svm_t$model svm_t$predictors svm_t$performance svm_t$hyper_performance svm_t$data_ens } # }"},{"path":"https://sjevelazco.github.io/flexsdm/news/index.html","id":"flexsdm-135","dir":"Changelog","previous_headings":"","what":"flexsdm 1.3.5","title":"flexsdm 1.3.5","text":"possible restrict cell used perform collinearity reduction analysis geographical area smaller full extent environmental variables correct_clinvar() esm_ family function improved debugged occfilt_geo new argument “rep” control number o repetition filter occurrences","code":""},{"path":"https://sjevelazco.github.io/flexsdm/news/index.html","id":"flexsdm-134","dir":"Changelog","previous_headings":"","what":"flexsdm 1.3.4","title":"flexsdm 1.3.4","text":"rgeos removed dependencies #356 New vignette use different tools explore model extrapolation truncate models added #352 Univariate combinatorial extrapolation metric added extra_eval. Minor bugs fixed project PCA time periods #351 Best grid raster names changed .part part_sblock part_sband Improvements correct_colinvar speed function using maxcell argument Improvements correct_colinvar project PCA time periods","code":""},{"path":"https://sjevelazco.github.io/flexsdm/news/index.html","id":"flexsdm-133","dir":"Changelog","previous_headings":"","what":"flexsdm 1.3.3","title":"flexsdm 1.3.3","text":"Improvements correct_colinvar now possible sample rasters reduce machine memory speed process Improvements sdm_predict possible predict model chunks reduce machine memory p_extra, p_pdp, p_bpdp fixed New function p_bpdp Bivariate Partial Dependent Plot New function data_bpdp Calculate data construct bivariate partial dependence plots Improvements p_dpd Calculate data construct partial dependence plots","code":""},{"path":"https://sjevelazco.github.io/flexsdm/news/index.html","id":"flexsdm-132","dir":"Changelog","previous_headings":"","what":"flexsdm 1.3.2","title":"flexsdm 1.3.2","text":"New function p_extra Graphical exploration extrapolation suitability pattern environmental geographical space New function p_pdp Partial Dependent Plot New function data_pdp Calculate data construct partial dependence plots","code":""},{"path":"https://sjevelazco.github.io/flexsdm/news/index.html","id":"flexsdm-131","dir":"Changelog","previous_headings":"","what":"flexsdm 1.3.1","title":"flexsdm 1.3.1","text":"New argument “crs” added function msdm_posteriori New argument “sp_name” sample_background sample_pseudoabs raster, flexclust, ape, sp removed dependencies Functions using CRS data improved codes possible use numeric value specify threshold msdm_posteriori extra_eval can use tibble SpatRaster object env_calib argument extra_truncate new argument define values used model truncation documentation improved. #","code":""}] +[{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"flexsdm: Overview of Pre-modeling functions","text":"Species distribution modeling (SDM) become standard tool many research areas, including ecology, conservation biology, biogeography, paleobiogeography, epidemiology. SDM active area theoretical methodological research. flexsdm package provides users ability manipulate parameterize models variety ways meet unique research needs. flexibility enables users define complete partial modeling procedure specific modeling situation (e.g., number variables, number records, different algorithms ensemble methods, algorithms tuning, etc.). vignette, users learn first set functions flexsdm package fall “pre-modeling” umbrella (see full list). pre-modeling functions calib_area() Delimit calibration area constructing species distribution models correct_colinvar() Collinearity reduction predictors env_outliers() Integration outliers detection methods environmental space part_random() Data partitioning training testing models part_sblock() Spatial block cross-validation part_sband() Spatial band cross-validation part_senv() Environmental cross-validation plot_res() Plot different resolutions used part_sblock get_block() Transform spatial partition layer spatial properties environmental variables sample_background() Sample background points sample_pseudoabs() Sample pseudo-absence sdm_directory() Create directories saving outputs flexsdm sdm_extract() Extract environmental data based x y coordinates occfilt_env() Perform environmental filtering species occurrences occfilt_geo() Perform geographical filtering species occurrences","code":""},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"installation","dir":"Articles","previous_headings":"","what":"Installation","title":"flexsdm: Overview of Pre-modeling functions","text":"First, install flexsdm package. can install released version flexsdm github :","code":"# devtools::install_github('sjevelazco/flexsdm') library(flexsdm) library(dplyr) #> #> Attaching package: 'dplyr' #> The following objects are masked from 'package:stats': #> #> filter, lag #> The following objects are masked from 'package:base': #> #> intersect, setdiff, setequal, union library(terra) #> terra 1.7.78 #> #> Attaching package: 'terra' #> The following object is masked from 'package:knitr': #> #> spin"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"project-directory-setup","dir":"Articles","previous_headings":"","what":"Project Directory Setup","title":"flexsdm: Overview of Pre-modeling functions","text":"building SDM’s, organizing folders (directories) project save time confusion. project directory main project folder store relevant data results current project. Now, let’s create project directory initial data model results stored. function sdm_directory() can , based types model algorithms want use /types projections like make. First decide computer like store inputs outputs project (main directory) use dir.create() create main directory. Next, specify whether want include folders projections, calibration areas, algorithms, ensembles, thresholds.","code":"my_project <- file.path(file.path(tempdir(), \"flex_sdm_project\")) dir.create(my_project) project_directory <- sdm_directory( main_dir = my_project, projections = NULL, calibration_area = TRUE, algorithm = c(\"fit_max\", \"tune_raf\"), ensemble = c(\"mean\"), threshold = TRUE, return_vector = TRUE )"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"data-species-occurrence-and-background-data","dir":"Articles","previous_headings":"","what":"Data, species occurrence and background data","title":"flexsdm: Overview of Pre-modeling functions","text":"tutorial, using species occurrences available flexsdm package. “spp” example dataset includes pr_ab column (presence = 1, absence = 0), location columns (x, y). can load “spp” data local R environment using code :","code":"data(\"spp\") spp #> # A tibble: 1,150 × 4 #> species x y pr_ab #> #> 1 sp1 -5541. -145138. 0 #> 2 sp1 -51981. 16322. 0 #> 3 sp1 -269871. 69512. 1 #> 4 sp1 -96261. -32008. 0 #> 5 sp1 269589. -566338. 0 #> 6 sp1 29829. -328468. 0 #> 7 sp1 -152691. 393782. 0 #> 8 sp1 -195081. 253652. 0 #> 9 sp1 -951. -277978. 0 #> 10 sp1 145929. -271498. 0 #> # ℹ 1,140 more rows"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"geographic-region","dir":"Articles","previous_headings":"","what":"Geographic region","title":"flexsdm: Overview of Pre-modeling functions","text":"species occurrences located California Floristic Province (far western USA). “regions” dataset can used visualize study area geographic space. points distributed across study area?","code":"regions <- system.file(\"external/regions.tif\", package = \"flexsdm\") regions <- terra::rast(regions) try(plot(regions), silent=TRUE) points(spp[, 2:3], pch = 19, cex = 0.5, col = as.factor(spp$species))"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"calibration-area","dir":"Articles","previous_headings":"","what":"Calibration area","title":"flexsdm: Overview of Pre-modeling functions","text":"important decision SDM delimit model’s calibration area, geographic space use train model(s). Choice calibration area affects modeling steps, including sampling pseudo-absence background points, performance metrics, geographic patterns habitat suitability. want train SDM using entire extent United States interested geographic distribution environmental controls rare plant species found mountaintops Sierra Nevada, California! Let’s use presence locations one species exercise. calib_area() function offers three methods defining calibration area: buffer, mcp, bmcp, mask. briefly go .","code":"spp1 <- spp %>% dplyr::filter(species == \"sp1\") %>% dplyr::filter(pr_ab == 1) %>% dplyr::select(-pr_ab)"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"buffer","dir":"Articles","previous_headings":"Calibration area","what":"1. Buffer","title":"flexsdm: Overview of Pre-modeling functions","text":"calibration area defined using buffers around presence points. User’s can specify distance around points using “width” argument. buffer width value interpreted m CRS longitude/latitude, map units cases.","code":"crs(regions, proj=TRUE) #> [1] \"+proj=aea +lat_0=0 +lon_0=-120 +lat_1=34 +lat_2=40.5 +x_0=0 +y_0=-4000000 +datum=NAD83 +units=m +no_defs\" ca_1 <- calib_area( data = spp1, x = \"x\", y = \"y\", method = c(\"buffer\", width = 40000), crs = crs(regions) ) plot(regions, main = \"Buffer method\") plot(ca_1, add = TRUE) points(spp1[, 2:3], pch = 19, cex = 0.5)"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"minimum-convex-polygon","dir":"Articles","previous_headings":"Calibration area","what":"2. Minimum convex polygon","title":"flexsdm: Overview of Pre-modeling functions","text":"minimum convex polygon (mcp) method produces much simpler shape.","code":"ca_2 <- calib_area( data = spp1, x = \"x\", y = \"y\", method = c(\"mcp\"), crs = crs(regions) ) plot(regions, main = \"Minimum convex polygon method\") plot(ca_2, add = TRUE) points(spp1[, 2:3], pch = 19, cex = 0.5)"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"buffered-minimum-convex-polygon","dir":"Articles","previous_headings":"Calibration area","what":"3. Buffered minimum convex polygon","title":"flexsdm: Overview of Pre-modeling functions","text":"can also create buffer around minimum convex polygon.","code":"ca_3 <- calib_area( data = spp1, x = \"x\", y = \"y\", method = c(\"bmcp\", width = 40000), crs = crs(regions) ) plot(regions, main = \"Buffered minimum convex polygon\") plot(ca_3, add = TRUE) points(spp1[, 2:3], pch = 19, cex = 0.5)"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"mask","dir":"Articles","previous_headings":"Calibration area","what":"4. Mask","title":"flexsdm: Overview of Pre-modeling functions","text":"mask method allows polygons selected intersect species locations delineate calibration area. useful expect species distributions associated ecologically significant (mapped) ecoregions, interested distributions within political boundaries. use random set polygons named “clusters” illustrate mask method. original polygons left polygons contain points (“mask” calibration area) right.","code":"clusters <- system.file(\"external/clusters.shp\", package = \"flexsdm\") clusters <- terra::vect(clusters) ca_4 <- calib_area( data = spp1, x = \"x\", y = \"y\", method = c(\"mask\", clusters, \"clusters\"), crs = crs(regions) ) par(mfrow = c(1, 2)) plot(clusters, main = \"Original polygons\") plot(ca_4, main = \"Polygons with points (mask)\") points(spp1[, 2:3], pch = 19, cex = 0.5)"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"reducing-collinearity-among-the-predictors","dir":"Articles","previous_headings":"","what":"Reducing collinearity among the predictors","title":"flexsdm: Overview of Pre-modeling functions","text":"Predictor collinearity common issue SDMs, can lead model overfitting inaccurate tests significance predictors (De Marco & Nóbrega, 2018; Dormann et al., 2013).","code":""},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"environmental-predictors","dir":"Articles","previous_headings":"Reducing collinearity among the predictors","what":"Environmental predictors","title":"flexsdm: Overview of Pre-modeling functions","text":"use four climatic variables available flexsdm package: actual evapotranspiration (CFP_1), climatic water deficit (CFP_2), maximum temperature warmest month (CFP_3), minimum temperature coldest month (CFP_4). relationship different environmental variables can visualized pairs() function terra package. Several variables highly correlated (.89 predictors tmx tmn). can correct reduce collinearity? function correct_colinvar() four methods deal collinearity: pearson, vif, pca, fa. method returns 1) raster object (SpatRaster) selected predictors 2) useful outputs relevant method. functions used supplementary tools, predictor selection SDMs complicated ultimately based relationship environment species’ biology. said, functions offer options exploring relationships predictor variables can aid predictor selection process. Let’s look method:","code":"somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) names(somevar) <- c(\"aet\", \"cwd\", \"tmx\", \"tmn\") plot(somevar) terra::pairs(somevar)"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"pearson-correlation","dir":"Articles","previous_headings":"Reducing collinearity among the predictors","what":"1. Pearson correlation","title":"flexsdm: Overview of Pre-modeling functions","text":"method returns three objects 1) SpatRaster environmental variables correlation given threshold (default 0.7), 2) names variables correlation given threshold “removed” environmental data, 3) correlation matrix environmental variables. However, strongly urge users use information along knowledge specific species-environment relationships select ecologically-relevant predictors SDMs. example, , modeling distribution plant species water-limited Mediterranean-type ecosystem, may want include climatic water deficit (cwd) actual evapotranspiration (aet). Despite highly correlated, variables capture water availability evaporative demand, respectively (Stephenson 1998). Additionally, minimum absolute temperature strongly controls vegetation distributions (Woodward, Lomas, Kelly 2004), select tmn (minimum temperature coldest month) example. references, see:","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"woodward-f--i--m--r--lomas-and-c--k--kelly--2004--global-climate-and-the-distribution-of-plant-biomes--philosophical-transactions-of-the-royal-society-of-london--series-b-biological-sciences-35914651476-","dir":"Articles","previous_headings":"Reducing collinearity among the predictors > 1. Pearson correlation","what":"2. Woodward, F. I., M. R. Lomas, and C. K. Kelly. 2004. Global climate and the distribution of plant biomes. Philosophical transactions of the Royal Society of London. Series B, Biological sciences 359:1465–1476.","title":"flexsdm: Overview of Pre-modeling functions","text":"","code":"pearson_var <- correct_colinvar(somevar, method = c(\"pearson\", th = \"0.7\")) pearson_var$cor_table #> aet cwd tmx tmn #> aet 0.0000000 0.7689893 0.7924813 0.7845401 #> cwd 0.7689893 0.0000000 0.4168956 0.5881831 #> tmx 0.7924813 0.4168956 0.0000000 0.7323259 #> tmn 0.7845401 0.5881831 0.7323259 0.0000000 pearson_var$cor_variables #> $aet #> [1] \"cwd\" \"tmx\" \"tmn\" #> #> $cwd #> [1] \"aet\" #> #> $tmx #> [1] \"aet\" \"tmn\" #> #> $tmn #> [1] \"aet\" \"tmx\" chosen_variables <- somevar[[c('cwd','aet','tmn')]]"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"variance-inflation-factor","dir":"Articles","previous_headings":"Reducing collinearity among the predictors","what":"2. Variance inflation factor","title":"flexsdm: Overview of Pre-modeling functions","text":"method removes predictors variance inflation factor higher chosen threshold. , users can specify threshold (default 10). method retains predictors aet, tmx, tmn removes cwd. output method matches produced pearson method: 1) environmental layer retained variables, 2) list removed variables, 3) correlation matrix variables.","code":"vif_var <- correct_colinvar(somevar, method = c(\"vif\", th = \"10\")) vif_var$env_layer #> class : SpatRaster #> dimensions : 558, 394, 4 (nrow, ncol, nlyr) #> resolution : 1890, 1890 (x, y) #> extent : -373685.8, 370974.2, -604813.3, 449806.7 (xmin, xmax, ymin, ymax) #> coord. ref. : +proj=aea +lat_0=0 +lon_0=-120 +lat_1=34 +lat_2=40.5 +x_0=0 +y_0=-4000000 +datum=NAD83 +units=m +no_defs #> source : somevar.tif #> names : aet, cwd, tmx, tmn #> min values : 0.000, -9.39489, 22.44685, 0.2591429 #> max values : 1357.865, 14.20047, 614.69125, 64.3747588 vif_var$removed_variables #> NULL vif_var$vif_table #> # A tibble: 4 × 2 #> Variables VIF #> #> 1 aet 7.62 #> 2 cwd 3.29 #> 3 tmx 3.95 #> 4 tmn 2.89"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"principal-component-analysis","dir":"Articles","previous_headings":"Reducing collinearity among the predictors","what":"3. Principal component analysis","title":"flexsdm: Overview of Pre-modeling functions","text":"Finally, “pca” method performs principal components analysis predictors returns axis accounts 95% total variance system. method returns 1) SpatRaster object selected environmental variables, 2) matrix coefficients principal components predictors, 3) tibble cumulative variance explained selected principal components.","code":"pca_var <- correct_colinvar(somevar, method = c(\"pca\")) pca_var$env_layer #> class : SpatRaster #> dimensions : 558, 394, 3 (nrow, ncol, nlyr) #> resolution : 1890, 1890 (x, y) #> extent : -373685.8, 370974.2, -604813.3, 449806.7 (xmin, xmax, ymin, ymax) #> coord. ref. : +proj=aea +lat_0=0 +lon_0=-120 +lat_1=34 +lat_2=40.5 +x_0=0 +y_0=-4000000 +datum=NAD83 +units=m +no_defs #> source(s) : memory #> names : PC1, PC2, PC3 #> min values : -8.453273, -4.260147, -1.525085 #> max values : 2.827164, 3.337545, 4.342864 pca_var$coefficients #> # A tibble: 4 × 5 #> variable PC1 PC2 PC3 PC4 #> #> 1 aet 0.550 -0.0722 0.296 -0.778 #> 2 cwd 0.450 -0.777 0.103 0.429 #> 3 tmx -0.485 -0.594 -0.450 -0.459 #> 4 tmn -0.511 -0.198 0.836 -0.0241 pca_var$cumulative_variance #> # A tibble: 4 × 2 #> PC cvar #> #> 1 1 0.764 #> 2 2 0.915 #> 3 3 0.979 #> 4 4 1"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"factorial-analysis","dir":"Articles","previous_headings":"Reducing collinearity among the predictors","what":"4. Factorial analysis","title":"flexsdm: Overview of Pre-modeling functions","text":"Selecting “fa” method performs factorial analysis reduce dimensionality selects predictor(s) highest correlation axis. outputs method similar produced ‘pca’ method.","code":"fa_var <- correct_colinvar(env_layer = somevar, method = c(\"fa\")) fa_var$env_layer fa_var$number_factors fa_var$removed_variables fa_var$uniqueness fa_var$loadings"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"comments","dir":"Articles","previous_headings":"Reducing collinearity among the predictors","what":"5. Comments","title":"flexsdm: Overview of Pre-modeling functions","text":"flexsdm also possible restrict cell used perform collinearity reduction analysis geographical area smaller full extent environmental variables. See ‘restric_to_region’ ‘restric_pca_proj’ correct_colinvar examples alternative PCA given function help.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"data-filtering","dir":"Articles","previous_headings":"","what":"Data filtering","title":"flexsdm: Overview of Pre-modeling functions","text":"Sample bias species occurrence data common issue ecological studies filtering occurrence data can reduce bias. flexsdm provides two functions different types filtering, based geographical environmental “thinning”, randomly removing points dense (oversampling) geographical environmental space. can improve model performance reduce redundancy data.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"environmental-filtering","dir":"Articles","previous_headings":"Data filtering","what":"Environmental filtering","title":"flexsdm: Overview of Pre-modeling functions","text":"function occfilt_env(), performs environmental filtering species occurrence data. method basically reduces environmental redundancy data based methods outlined Valera et al. (2014). However, function unique flexsdm, able use number environmental dimensions perform PCA filtering. example, use original environmental data (somevar) occurrence data single species (spp1). filtering occurrences, important row species data unique code (example: idd). function also gives user option specifying number classes used split environmental condition. explore results using 5, 8, 12 bins. Increasing number bins increases number occurrence points retained.","code":"spp1$idd <- 1:nrow(spp1) filt_env5 <- occfilt_env( data = spp1, x = \"x\", y = \"y\", id = \"idd\", env_layer = somevar, nbins = 5 ) #> Extracting values from raster ... #> 12 records were removed because they have NAs for some variables #> Number of unfiltered records: 238 #> Number of filtered records: 57 filt_env8 <- occfilt_env( data = spp1, x = \"x\", y = \"y\", id = \"idd\", env_layer = somevar, nbins = 8 ) #> Extracting values from raster ... #> 12 records were removed because they have NAs for some variables #> Number of unfiltered records: 238 #> Number of filtered records: 112 filt_env12 <- occfilt_env( data = spp1, x = \"x\", y = \"y\", id = \"idd\", env_layer = somevar, nbins = 12 ) #> Extracting values from raster ... #> 12 records were removed because they have NAs for some variables #> Number of unfiltered records: 238 #> Number of filtered records: 173 par(mfrow = c(2, 2)) somevar[[1]] %>% plot(main = \"Original occurrence data\") points(spp1 %>% select(x, y)) somevar[[1]] %>% plot(main = \"Filtering with 5 bins\") points(filt_env5 %>% select(x, y)) somevar[[1]] %>% plot(main = \"Filtering with 8 bins\") points(filt_env8 %>% select(x, y)) somevar[[1]] %>% plot(main = \"Filtering with 12 bins\") points(filt_env12 %>% select(x, y))"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"geographical-filtering","dir":"Articles","previous_headings":"Data filtering","what":"Geographical filtering","title":"flexsdm: Overview of Pre-modeling functions","text":"Next, look occfilt_geo(), three alternatives determine distance threshold pair points: “moran” determines threshold distance points minimizes spatial autocorrelation occurrence data; “cellsize” filters occurrences based resolution predictors (specified coarser resolution); finally, “determined” allows users manually determine distance threshold.","code":"filt_geo1 <- occfilt_geo( data = spp1, x = \"x\", y = \"y\", env_layer = somevar, method = c(\"moran\"), prj = crs(somevar) ) #> Extracting values from raster ... #> 16 records were removed because they have NAs for some variables #> Number of unfiltered records: 234 #> Threshold for Moran: 0.1 #> Distance threshold(km): 345.859 #> Number of filtered records: 4 filt_geo2 <- occfilt_geo( data = spp1, x = \"x\", y = \"y\", env_layer = somevar, method = c(\"cellsize\", factor = \"3\"), # coarser resolution than the provided raster prj = crs(somevar) ) #> Extracting values from raster ... #> 16 records were removed because they have NAs for some variables #> Number of unfiltered records: 234 #> Distance threshold(km): 4.617 #> Number of filtered records: 212 filt_geo3 <- occfilt_geo( data = spp1, x = \"x\", y = \"y\", env_layer = somevar, method = c(\"defined\", d = \"30\"), prj = crs(somevar) ) #> Extracting values from raster ... #> 16 records were removed because they have NAs for some variables #> Number of unfiltered records: 234 #> Distance threshold(km): 30 #> Number of filtered records: 78 par(mfrow = c(2, 2)) somevar[[1]] %>% plot(main = \"Original occurrence data\") points(spp1 %>% select(x, y)) somevar[[1]] %>% plot(main = \"Filtering with Moran's I\") points(filt_geo1 %>% select(x, y)) somevar[[1]] %>% plot(main = \"Filtering with cell size\") points(filt_geo2 %>% select(x, y)) somevar[[1]] %>% plot(main = \"Filtering with defined distance (30km)\") points(filt_geo3 %>% select(x, y))"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"data-partitioning","dir":"Articles","previous_headings":"","what":"Data partitioning","title":"flexsdm: Overview of Pre-modeling functions","text":"Data partitioning, splitting data testing training groups, key step building SDMs. flexsdm offers multiple options data partitioning, including part_random(), part_sband(), part_sblock(), part_senv(). Let’s explore methods.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"conventional-data-partitioning-methods-part_random","dir":"Articles","previous_headings":"Data partitioning","what":"1. Conventional data partitioning methods (part_random)","title":"flexsdm: Overview of Pre-modeling functions","text":"part_random() function provides users ability divide species occurrence data based conventional partition methods including k-folds, repeated k-folds, leave-one-cross-validation, bootstrap partitioning. , use “kfold” method 10 folds divide data. results 10 folds occurrence data 25 observations fold.","code":"spp1$pr_ab <- 1 # Add a column with 1 to denote that this is presences only data sp_part1 <- part_random( data = spp1, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 10) ) sp_part1$.part %>% table() #> . #> 1 2 3 4 5 6 7 8 9 10 #> 25 25 25 25 25 25 25 25 25 25"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"spatial-band-cross-validation-part_sband","dir":"Articles","previous_headings":"Data partitioning","what":"2. Spatial band cross-validation (part_sband)","title":"flexsdm: Overview of Pre-modeling functions","text":"part_sband() part_sblock() partition data based position geographic space. Geographically structured data partitioning methods especially useful users want evaluate model transferability different regions time periods. function part_sband tests different numbers spatial partitions using latitudinal longitudinal bands selects best number bands given presence, presence-absence, presence-background dataset. procedure based spatial autocorrelation, environmental similarity, number presence/absence records band partition. function’s output includes 1) tibble presence/absence locations assigned partition number, 2) tibble information best partition, 3) SpatRaster showing selected grid.","code":"set.seed(1) sp_part2 <- part_sband( env_layer = somevar, data = spp1, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", type = \"lat\", # specify bands across different degrees of longitude 'lon' or latitude 'lat'. min_bands = 2, # minimum number of spatial bands to be tested max_bands = 20, # maximum number of spatial bands to be tested n_part = 2, prop = 0.5 ) #> 12 rows were excluded from database because NAs were found #> The following number of bands will be tested: #> 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 #> Creating basic raster mask... #> Searching for the optimal number of bands... plot(sp_part2$grid, col = gray.colors(20)) points(sp_part2$part[c(\"x\", \"y\")], col = rainbow(8)[sp_part2$part$.part], cex = 0.9, pch = c(1, 19)[sp_part2$part$pr_ab + 1] )"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"spatial-block-cross-validation-part_sblock","dir":"Articles","previous_headings":"Data partitioning","what":"3. Spatial block cross-validation (part_sblock)","title":"flexsdm: Overview of Pre-modeling functions","text":"part_sblock() function similar part_sband() instead bands explores spatial blocks different raster cells sizes returns one best suited input dataset. , can see data divided different “blocks” training testing. However, notice grid partition produced part_sblock different resolution original environmental variables. want map layer properties (.e. resolution, extent, NAs) original environmental variables, apply get_block() function grid resulting part_sblock(). layer can really useful generating pseudo-absence background sample points, explore next section.","code":"sp_part3 <- part_sblock( env_layer = somevar, data = spp1, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", min_res_mult = 10, # Minimum value used for multiplying raster resolution and define the finest resolution to be tested max_res_mult = 500, # Maximum value used for multiplying raster resolution and define the coarsest resolution to be tested num_grids = 30, # Number of grid to be tested between min_res_mult X (raster resolution) and max_res_mult X (raster resolution) n_part = 2, # Number of partitions prop = 0.5 # Proportion of points used for testing autocorrelation between groupds (0-1) ) #> 12 rows were excluded from database because NAs were found #> The following grid cell sizes will be tested: #> 18900 | 50834.48 | 82768.97 | 114703.45 | 146637.93 | 178572.41 | 210506.9 | 242441.38 | 274375.86 | 306310.34 | 338244.83 | 370179.31 | 402113.79 | 434048.28 | 465982.76 | 497917.24 | 529851.72 | 561786.21 | 593720.69 | 625655.17 | 657589.66 | 689524.14 | 721458.62 | 753393.1 | 785327.59 | 817262.07 | 849196.55 | 881131.03 | 913065.52 | 945000 #> Creating basic raster mask... #> Searching for the optimal grid size... plot(sp_part3$grid) points(sp_part3$part[c(\"x\", \"y\")], col = c(\"blue\", \"red\")[sp_part3$part$.part], cex = 0.5, pch = 19 ) terra::res(sp_part3$grid) #> [1] 881131 881131 terra::res(somevar) #> [1] 1890 1890 grid_env <- get_block(env_layer = somevar, best_grid = sp_part3$grid) plot(grid_env) # this is a block layer with the same layer # properties as environmental variables. points(sp_part3$part[c(\"x\", \"y\")], col = c(\"blue\", \"red\")[sp_part3$part$.part], cex = 0.5, pch = 19 )"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"environmental-and-spatial-cross-validation-part_senv","dir":"Articles","previous_headings":"Data partitioning","what":"4. Environmental and spatial cross-validation (part_senv)","title":"flexsdm: Overview of Pre-modeling functions","text":"final partitioning function flexsdm part_senv(), explores different numbers environmental partitions based K-means clustering algorithm returns one best-suited particular dataset, considering spatial autocorrelation, environmental similarity, number presence /absence records partition. map shows partitioning based environmental spatial factors.","code":"sp_part4 <- part_senv( env_layer = somevar, data = spp1, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", min_n_groups = 2, # Minimum number of groups to be tested max_n_groups = 10, # Maximum number of groups to be tested prop = 0.5 # Proportion of points used for testing autocorrelation between groups (0-1) ) #> 12 rows were excluded from database because NAs were found #> The following grid cell sizes will be tested: #> 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 #> Searching best partition... plot(regions, col = gray.colors(9)) points(sp_part4$part[c(\"x\", \"y\")], col = hcl.colors(length(unique(sp_part4$part)))[sp_part4$part$.part], cex = 1, pch = 19 )"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"background-and-pseudo-absence-sampling","dir":"Articles","previous_headings":"","what":"Background and pseudo-absence sampling","title":"flexsdm: Overview of Pre-modeling functions","text":"Presence-occurrence data quite common ecology researchers may adequate “absence” data species interest. Sometimes building species distribution models, need able generate background pseudo-absence points modeling goals. flexsdm package allows users using sample_background() sample_pseudoabs().","code":""},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"sample-background","dir":"Articles","previous_headings":"Background and pseudo-absence sampling","what":"1. Sample background","title":"flexsdm: Overview of Pre-modeling functions","text":"function sample_background() allows slection background sample points based different geographic restrictions sampling methods. , sample set background points based earlier spatial block partitioning using “random” method. Using lapply() case ensures generate background points spatial blocks (n = 2). also specifying want ten times amount background points original occurrences calibration area buffer area around presence points (see section “Calibration area”).","code":"p_data <- sp_part3$part # presence data from spatial block partition example set.seed(10) bg <- lapply(1:2, function(x) { sample_background( data = p_data, x = \"x\", y = \"y\", n = sum(p_data == x) * 10, # number of background points to be sampled method = \"random\", rlayer = grid_env, maskval = x, calibarea = ca_1 # A SpatVector which delimit the calibration area used for a given species ) }) %>% bind_rows() %>% mutate(pr_ab = 0) par(mfrow = c(2, 1)) plot(grid_env, main = \"Presence points\") plot(ca_1, add = TRUE) points(p_data, cex = .7, pch = 19) plot(grid_env, main = \"Background points\") plot(ca_1, add = TRUE) points(bg, cex = .1, pch = 19)"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"sample-pseudo-absences","dir":"Articles","previous_headings":"Background and pseudo-absence sampling","what":"2. Sample pseudo-absences","title":"flexsdm: Overview of Pre-modeling functions","text":"Similarly, function sample_pseudoabs allows random pseudo-absence sampling based environmental /geographical constraints. example, specifying method = “env_const” selects pseudo-absences environmentally constrained regions lower suitability values predicted Bioclim model. Additionally, function allows users specify calibration area generate pseudo-absence points. , use buffer area around presence points (ca_1) show might look like. can see, generated pseudo-absence points general vicinity presence points, concentrated areas lower environmental suitability. specific method chosen sampling background /pseudo-absence points vary depending research goals.","code":"set.seed(10) psa <- lapply(1:2, function(x) { sample_pseudoabs( data = p_data, x = \"x\", y = \"y\", n = sum(p_data == x), # number of pseudo-absence points to be sampled method = c(\"env_const\", env = somevar), rlayer = grid_env, maskval = x, calibarea = ca_1 ) }) %>% bind_rows() %>% mutate(pr_ab = 0) #> Extents do not match, raster layers used were croped to minimum extent #> Extents do not match, raster layers used were croped to minimum extent par(mfrow = c(2, 1)) plot(grid_env, main = \"Presence points\") plot(ca_1, add = TRUE) points(p_data, cex = .7, pch = 19) plot(grid_env, main = \"Pseudo-absence points\") plot(ca_1, add = TRUE) points(psa, cex = .7, pch = 19)"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v01_pre_modeling.html","id":"extracting-environmental-values","dir":"Articles","previous_headings":"","what":"Extracting environmental values","title":"flexsdm: Overview of Pre-modeling functions","text":"Finally, modeling species geographic distributions, must extract environmental data presences + absences/pseudo-absences/background point locations. function sdm_extract() extracts environmental data values based x y coordinates returns tibble original data + additional columns extracted environmental variables locations. Let’s original presence points (spp1) background locations (bg). #=========#=========#=========#=========#=========#=========#=========# Vignette still construction changes #=========#=========#=========#=========#=========#=========#=========#","code":"all_points <- bind_rows(spp1 %>% dplyr::select(-idd), bg) ex_spp <- sdm_extract( data = all_points, x = \"x\", y = \"y\", env_layer = somevar, # Raster with environmental variables variables = NULL, # Vector with the variable names of predictor variables Usage variables. = c(\"aet\", \"cwd\", \"tmin\"). If no variable is specified, function will return data for all layers. filter_na = TRUE ) ex_spp"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v02_modeling.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"flexsdm: Overview of Modeling functions","text":"Species distribution modeling (SDM) become standard tool multiple research areas, including ecology, conservation biology, biogeography, paleobiogeography, epidemiology. SDM area active theoretical methodological research. flexsdm package provides users ability manipulate parameterize models variety ways meet unique research needs. flexibility enables users define complete partial modeling procedure specific modeling situations (e.g., number variables, number records, different algorithms ensemble methods, algorithms tuning, etc.). vignette, users learn second set functions flexsdm package fall “modeling” umbrella. functions designed construct validate different types models can grouped fit_* , tune_* , esm_* family functions. addition function perform ensemble modeling. fit_* functions construct validate models default hyper-parameter values. tune_* functions construct validate models searching best combination hyper-parameter values, esm_ functions can used constructing validating Ensemble Small Models. Finally, fit_ensemble() function fitting validating ensemble models. functions model construction validation: fit_* functions family fit_gam() Fit validate Generalized Additive Models fit_gau() Fit validate Gaussian Process models fit_gbm() Fit validate Generalized Boosted Regression models fit_glm() Fit validate Generalized Linear Models fit_max() Fit validate Maximum Entropy models fit_net() Fit validate Neural Networks models fit_raf() Fit validate Random Forest models fit_svm() Fit validate Support Vector Machine models tune_* functions family tune_gbm() Fit validate Generalized Boosted Regression models exploration hyper-parameters tune_max() Fit validate Maximum Entropy models exploration hyper-parameters tune_net() Fit validate Neural Networks models exploration hyper-parameters tune_raf() Fit validate Random Forest models exploration hyper-parameters tune_svm() Fit validate Support Vector Machine models exploration hyper-parameters model ensemble fit_ensemble() Fit validate ensemble models different ensemble methods esm_* functions family esm_gam() Fit validate Generalized Additive Models Ensemble Small Model approach esm_gau() Fit validate Gaussian Process models Models Ensemble Small Model approach esm_gbm() Fit validate Generalized Boosted Regression models Ensemble Small Model approach esm_glm() Fit validate Generalized Linear Models Ensemble Small Model approach esm_max() Fit validate Maximum Entropy models Ensemble Small Model approach esm_net() Fit validate Neural Networks models Ensemble Small Model approach esm_svm() Fit validate Support Vector Machine models Ensemble Small Model approach","code":""},{"path":"https://sjevelazco.github.io/flexsdm/articles/v02_modeling.html","id":"installation","dir":"Articles","previous_headings":"","what":"Installation","title":"flexsdm: Overview of Modeling functions","text":"First, install flexsdm package. can install released version flexsdm github :","code":"# devtools::install_github('sjevelazco/flexsdm') require(flexsdm) #> Loading required package: flexsdm require(terra) #> Loading required package: terra #> terra 1.7.78 #> #> Attaching package: 'terra' #> The following object is masked from 'package:knitr': #> #> spin require(dplyr) #> Loading required package: dplyr #> #> Attaching package: 'dplyr' #> The following objects are masked from 'package:terra': #> #> intersect, union #> The following objects are masked from 'package:stats': #> #> filter, lag #> The following objects are masked from 'package:base': #> #> intersect, setdiff, setequal, union"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v02_modeling.html","id":"project-directory-setup","dir":"Articles","previous_headings":"","what":"Project directory setup","title":"flexsdm: Overview of Modeling functions","text":"Decide computer like store inputs outputs project (main directory). Use existing one use dir.create() create main directory. specify whether include folders projections, calibration areas, algorithms, ensembles, thresholds. details see Vignette 01_pre_modeling","code":""},{"path":"https://sjevelazco.github.io/flexsdm/articles/v02_modeling.html","id":"data-species-occurrence-and-background-data","dir":"Articles","previous_headings":"","what":"Data, species occurrence and background data","title":"flexsdm: Overview of Modeling functions","text":"tutorial, using species occurrences environmental data available flexsdm package. “abies” example dataset includes pr_ab column (presence = 1, absence = 0), location columns (x, y) environmental data. can load “abies” data local R environment using code : (EXAMPLE LOOKS LITTLE STRANGE ALSO USING BACKGROUND DATA, ABIES DATASET CLEARLY ABSENCES…) want replace abies dataset data, make sure dataset contains environmental conditions related presence-absence data. use pre-modeling family function k-fold partition method (used cross-validation). partition method number folds replications must presence-absence background points datasets. Now, abies2 object new column called “.part” 5 k-folds (1, 2, 3, 4, 5), indicating partition record (row) member . Next, apply partition method number folds environmental conditions background points. backg2 object new column called “.part” 5 k-folds (1, 2, 3, 4, 5).","code":"data(\"abies\") data(\"backg\") dplyr::glimpse(abies) #> Rows: 1,400 #> Columns: 13 #> $ id 715, 5680, 7907, 1850, 1702, 10036, 12384, 6513, 9884, 8651, … #> $ pr_ab 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0… #> $ x -95417.134, 98986.536, 121474.257, -39976.221, 111372.261, -2… #> $ y 314240.13, -159415.18, -99463.44, -17456.11, -91404.05, 39222… #> $ aet 323.1133, 447.5567, 182.2833, 372.3867, 209.4567, 308.3000, 5… #> $ cwd 546.1400, 815.4033, 271.1800, 946.2933, 398.5500, 534.9533, 3… #> $ tmin 1.2433, 9.4267, -4.9500, 8.7767, -4.0333, 4.6600, 4.3800, 4.9… #> $ ppt_djf 62.7257, 129.6406, 150.7003, 116.0236, 164.9327, 166.2220, 48… #> $ ppt_jja 17.7941, 6.4317, 11.2294, 2.7020, 9.2686, 16.5310, 41.2494, 8… #> $ pH 5.773341, 5.600000, 0.000000, 6.411796, 0.000000, 5.700000, 5… #> $ awc 0.10837019, 0.16000000, 0.00000000, 0.09719457, 0.00000000, 0… #> $ depth 152.000000, 201.000000, 0.000000, 59.759930, 0.000000, 112.99… #> $ landform 7, 11, 15, 14, 15, 15, 7, 15, 4, 10, 6, 10, 10, 15, 10, 11, 1… dplyr::glimpse(backg) #> Rows: 5,000 #> Columns: 13 #> $ pr_ab 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, … #> $ x 160779.16, 36849.16, -240170.84, -152420.84, -193190.84, … #> $ y -449968.33, 24151.67, 90031.67, -143518.33, 24151.67, 223… #> $ aet 280.4567, 259.7800, 400.1767, 367.4833, 397.3667, 385.263… #> $ cwd 1137.2433, 381.5367, 699.6500, 843.4467, 842.3833, 637.35… #> $ tmin 13.5100, -3.1733, 8.6800, 9.0133, 8.9700, 4.9333, 6.2933,… #> $ ppt_djf 71.2741, 171.4537, 285.0893, 72.0309, 125.2467, 226.1534,… #> $ ppt_jja 1.1920, 17.5193, 5.0158, 1.2047, 1.9778, 8.1554, 18.4182,… #> $ pH 0.0000000, 0.2122687, 5.7222223, 7.5350823, 6.1963525, 5.… #> $ awc 0.000000000, 0.003473487, 0.080370426, 0.170000002, 0.131… #> $ depth 0.00000, 201.00000, 50.07409, 154.39426, 122.39575, 56.17… #> $ percent_clay 0.0000000, 0.4438345, 18.4111176, 46.9751244, 37.1873169,… #> $ landform 13, 10, 6, 6, 10, 14, 8, 14, 6, 7, 11, 14, 14, 10, 6, 6, … abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 5) ) dplyr::glimpse(abies2) #> Rows: 1,400 #> Columns: 14 #> $ id 715, 5680, 7907, 1850, 1702, 10036, 12384, 6513, 9884, 8651, … #> $ pr_ab 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0… #> $ x -95417.134, 98986.536, 121474.257, -39976.221, 111372.261, -2… #> $ y 314240.13, -159415.18, -99463.44, -17456.11, -91404.05, 39222… #> $ aet 323.1133, 447.5567, 182.2833, 372.3867, 209.4567, 308.3000, 5… #> $ cwd 546.1400, 815.4033, 271.1800, 946.2933, 398.5500, 534.9533, 3… #> $ tmin 1.2433, 9.4267, -4.9500, 8.7767, -4.0333, 4.6600, 4.3800, 4.9… #> $ ppt_djf 62.7257, 129.6406, 150.7003, 116.0236, 164.9327, 166.2220, 48… #> $ ppt_jja 17.7941, 6.4317, 11.2294, 2.7020, 9.2686, 16.5310, 41.2494, 8… #> $ pH 5.773341, 5.600000, 0.000000, 6.411796, 0.000000, 5.700000, 5… #> $ awc 0.10837019, 0.16000000, 0.00000000, 0.09719457, 0.00000000, 0… #> $ depth 152.000000, 201.000000, 0.000000, 59.759930, 0.000000, 112.99… #> $ landform 7, 11, 15, 14, 15, 15, 7, 15, 4, 10, 6, 10, 10, 15, 10, 11, 1… #> $ .part 3, 2, 5, 3, 5, 4, 2, 1, 2, 2, 1, 2, 1, 2, 2, 2, 5, 4, 5, 1, 5… backg2 <- part_random( data = backg, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 5) ) dplyr::glimpse(backg2) #> Rows: 5,000 #> Columns: 14 #> $ pr_ab 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, … #> $ x 160779.16, 36849.16, -240170.84, -152420.84, -193190.84, … #> $ y -449968.33, 24151.67, 90031.67, -143518.33, 24151.67, 223… #> $ aet 280.4567, 259.7800, 400.1767, 367.4833, 397.3667, 385.263… #> $ cwd 1137.2433, 381.5367, 699.6500, 843.4467, 842.3833, 637.35… #> $ tmin 13.5100, -3.1733, 8.6800, 9.0133, 8.9700, 4.9333, 6.2933,… #> $ ppt_djf 71.2741, 171.4537, 285.0893, 72.0309, 125.2467, 226.1534,… #> $ ppt_jja 1.1920, 17.5193, 5.0158, 1.2047, 1.9778, 8.1554, 18.4182,… #> $ pH 0.0000000, 0.2122687, 5.7222223, 7.5350823, 6.1963525, 5.… #> $ awc 0.000000000, 0.003473487, 0.080370426, 0.170000002, 0.131… #> $ depth 0.00000, 201.00000, 50.07409, 154.39426, 122.39575, 56.17… #> $ percent_clay 0.0000000, 0.4438345, 18.4111176, 46.9751244, 37.1873169,… #> $ landform 13, 10, 6, 6, 10, 14, 8, 14, 6, 7, 11, 14, 14, 10, 6, 6, … #> $ .part 4, 4, 1, 5, 5, 2, 5, 3, 2, 5, 4, 1, 4, 1, 5, 1, 1, 5, 4, …"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v02_modeling.html","id":"fit-and-validate-models","dir":"Articles","previous_headings":"Data, species occurrence and background data","what":"1. Fit and validate models","title":"flexsdm: Overview of Modeling functions","text":"fit validate models: . maximum entropy model default hyper-parameter values (flexsdm::fit_max) II. random forest model exploration hyper-parameters (flexsdm::tune_raf). . Maximum Entropy models default hyper-parameter values. function returns list object following elements: model: “MaxEnt” class object. object can used predicting. predictors: tibble quantitative (c column names) qualitative (f column names) variables use modeling. performance: performance metric (see sdm_eval). metrics threshold dependent calculated based threshold specified argument. can see selected threshold values. Predicted suitability test partition (row) based best model. database used fit_ensemble. II- Random forest models exploration hyper-parameters. First, create data.frame provides hyper-parameters values tested. recommended generate data.frame. Hyper-parameter needed tuning ‘mtry’. maximum mtry must equal total number predictors. use data object abies2, k-fold partition method: Let’s see output object contains. function returns list object following elements: model: “randomForest” class object. object can used see formula details, basic summary o fthe model, predicting. predictors: tibble quantitative (c column names) qualitative (f column names) variables use modeling. performance: performance metric (see sdm_eval). metrics threshold dependent calculated based threshold specified argument. can see selected threshold values. Predicted suitability test partition (row) based best model. database used fit_ensemble. model objects can used flexsdm::fit_ensemble().","code":"max_t1 <- fit_max( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), predictors_f = c(\"landform\"), partition = \".part\", background = backg2, thr = c(\"max_sens_spec\", \"equal_sens_spec\", \"max_sorensen\"), clamp = TRUE, classes = \"default\", pred_type = \"cloglog\", regmult = 1 ) #> Formula used for model fitting: #> ~aet + ppt_jja + pH + awc + depth + I(aet^2) + I(ppt_jja^2) + I(pH^2) + I(awc^2) + I(depth^2) + hinge(aet) + hinge(ppt_jja) + hinge(pH) + hinge(awc) + hinge(depth) + ppt_jja:aet + pH:aet + awc:aet + depth:aet + pH:ppt_jja + awc:ppt_jja + depth:ppt_jja + awc:pH + depth:pH + depth:awc + categorical(landform) - 1 #> Replica number: 1/1 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 names(max_t1) #> [1] \"model\" \"predictors\" \"performance\" \"data_ens\" options(max.print = 20) max_t1$model #> #> Call: glmnet::glmnet(x = mm, y = as.factor(p), family = \"binomial\", weights = weights, lambda = 10^(seq(4, 0, length.out = 200)) * sum(reg)/length(reg) * sum(p)/sum(weights), standardize = F, penalty.factor = reg) #> #> Df %Dev Lambda #> 1 0 0.00 21.3700 #> 2 0 0.00 20.4100 #> 3 0 0.00 19.4800 #> 4 0 0.00 18.6000 #> 5 0 0.00 17.7600 #> 6 0 0.00 16.9600 #> [ reached getOption(\"max.print\") -- omitted 194 rows ] max_t1$predictors #> # A tibble: 1 × 6 #> c1 c2 c3 c4 c5 f #> #> 1 aet ppt_jja pH awc depth landform max_t1$performance #> # A tibble: 3 × 25 #> model threshold thr_value n_presences n_absences TPR_mean TPR_sd TNR_mean #> #> 1 max equal_sens_sp… 0.573 700 700 0.674 0.0164 0.674 #> 2 max max_sens_spec 0.416 700 700 0.909 0.0260 0.52 #> 3 max max_sorensen 0.335 700 700 0.95 0.0101 0.469 #> # ℹ 17 more variables: TNR_sd , SORENSEN_mean , SORENSEN_sd , #> # JACCARD_mean , JACCARD_sd , FPB_mean , FPB_sd , #> # OR_mean , OR_sd , TSS_mean , TSS_sd , AUC_mean , #> # AUC_sd , BOYCE_mean , BOYCE_sd , IMAE_mean , #> # IMAE_sd max_t1$data_ens #> # A tibble: 1,400 × 5 #> rnames replicates part pr_ab pred #> #> 1 8 .part 1 0 0.600 #> 2 11 .part 1 0 0.237 #> 3 13 .part 1 0 0.0483 #> 4 20 .part 1 0 0.115 #> 5 32 .part 1 0 0.716 #> 6 33 .part 1 0 0.0430 #> 7 48 .part 1 0 0.143 #> 8 55 .part 1 0 0.726 #> 9 65 .part 1 0 0.850 #> 10 75 .part 1 0 0.308 #> # ℹ 1,390 more rows tune_grid <- expand.grid(mtry = seq(1, 7, 1)) rf_t <- tune_raf( data = abies2, response = \"pr_ab\", predictors = c( \"aet\", \"cwd\", \"tmin\", \"ppt_djf\", \"ppt_jja\", \"pH\", \"awc\", \"depth\" ), predictors_f = c(\"landform\"), partition = \".part\", grid = tune_grid, thr = \"max_sens_spec\", metric = \"TSS\", ) #> Formula used for model fitting: #> pr_ab ~ aet + cwd + tmin + ppt_djf + ppt_jja + pH + awc + depth + landform #> Tuning model... #> Replica number: 1/1 #> Formula used for model fitting: #> pr_ab ~ aet + cwd + tmin + ppt_djf + ppt_jja + pH + awc + depth + landform #> Replica number: 1/1 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 names(rf_t) #> [1] \"model\" \"predictors\" \"performance\" #> [4] \"hyper_performance\" \"data_ens\" rf_t$model #> #> Call: #> randomForest(formula = formula1, data = data, mtry = mtry, ntree = 500, importance = FALSE, ) #> Type of random forest: classification #> Number of trees: 500 #> No. of variables tried at each split: 3 #> #> OOB estimate of error rate: 11.64% #> Confusion matrix: #> 0 1 class.error #> 0 605 95 0.13571429 #> 1 68 632 0.09714286 rf_t$predictors #> # A tibble: 1 × 9 #> c1 c2 c3 c4 c5 c6 c7 c8 f #> #> 1 aet cwd tmin ppt_djf ppt_jja pH awc depth landform rf_t$performance #> # A tibble: 1 × 26 #> mtry model threshold thr_value n_presences n_absences TPR_mean TPR_sd #> #> 1 3 raf max_sens_spec 0.638 700 700 0.911 0.0314 #> # ℹ 18 more variables: TNR_mean , TNR_sd , SORENSEN_mean , #> # SORENSEN_sd , JACCARD_mean , JACCARD_sd , FPB_mean , #> # FPB_sd , OR_mean , OR_sd , TSS_mean , TSS_sd , #> # AUC_mean , AUC_sd , BOYCE_mean , BOYCE_sd , #> # IMAE_mean , IMAE_sd rf_t$data_ens #> # A tibble: 1,400 × 5 #> rnames replicates part pr_ab pred #> #> 1 8 .part 1 0 0.118 #> 2 11 .part 1 0 0.116 #> 3 13 .part 1 0 0.006 #> 4 20 .part 1 0 0.412 #> 5 32 .part 1 0 0.128 #> 6 33 .part 1 0 0.032 #> 7 48 .part 1 0 0.008 #> 8 55 .part 1 0 0.072 #> 9 65 .part 1 0 0.366 #> 10 75 .part 1 0 0.088 #> # ℹ 1,390 more rows"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v02_modeling.html","id":"model-ensemble","dir":"Articles","previous_headings":"Data, species occurrence and background data","what":"2. Model Ensemble","title":"flexsdm: Overview of Modeling functions","text":"example fit validate ensemble model using two model objects just created.","code":"# Fit and validate ensemble model an_ensemble <- fit_ensemble( models = list(max_t1, rf_t), ens_method = \"meansup\", thr = NULL, thr_model = \"max_sens_spec\", metric = \"TSS\" ) #> | | | 0% | |======================================================================| 100% # Outputs names(an_ensemble) #> [1] \"models\" \"thr_metric\" \"predictors\" \"performance\" an_ensemble$thr_metric #> [1] \"max_sens_spec\" \"TSS_mean\" an_ensemble$predictors #> # A tibble: 2 × 9 #> c1 c2 c3 c4 c5 f c6 c7 c8 #> #> 1 aet ppt_jja pH awc depth landform NA NA NA #> 2 aet cwd tmin ppt_djf ppt_jja landform pH awc depth an_ensemble$performance #> # A tibble: 7 × 25 #> model threshold thr_value n_presences n_absences TPR_mean TPR_sd TNR_mean #> #> 1 meansup equal_sens_… 0.568 700 700 0.879 0.0267 0.879 #> 2 meansup lpt 0.022 700 700 1 0 0.407 #> 3 meansup max_fpb 0.486 700 700 0.923 0.0234 0.859 #> 4 meansup max_jaccard 0.486 700 700 0.923 0.0234 0.859 #> 5 meansup max_sens_sp… 0.486 700 700 0.911 0.0314 0.87 #> 6 meansup max_sorensen 0.486 700 700 0.923 0.0234 0.859 #> 7 meansup sensitivity 0.53 700 700 0.9 0 0.863 #> # ℹ 17 more variables: TNR_sd , SORENSEN_mean , SORENSEN_sd , #> # JACCARD_mean , JACCARD_sd , FPB_mean , FPB_sd , #> # OR_mean , OR_sd , TSS_mean , TSS_sd , AUC_mean , #> # AUC_sd , BOYCE_mean , BOYCE_sd , IMAE_mean , #> # IMAE_sd "},{"path":"https://sjevelazco.github.io/flexsdm/articles/v02_modeling.html","id":"fit-and-validate-models-with-ensemble-of-small-model-approach","dir":"Articles","previous_headings":"Data, species occurrence and background data","what":"3. Fit and validate models with Ensemble of Small Model approach","title":"flexsdm: Overview of Modeling functions","text":"method consists creating bivariate models pair-wise combinations predictors perform ensemble based average suitability weighted Somers’ D metric (D = 2 x (AUC -0.5)). ESM recommended modeling species occurrences. function allow categorical variables use types variables problematic applied species occurrences. detail see Breiner et al. (2015, 2018) can use different methods flexsdm::part_random function according data. See part_random details. function constructs Generalized Additive Models using Ensembles Small Models (ESM) approach (Breiner et al., 2015, 2018). function returns list object following elements: esm_model: list “GAM” class object bivariate model. object can used predicting using ESM approachwith sdm_predict function. predictors: tibble variables use modeling. performance: Performance metric (see sdm_eval). threshold dependent metrics calculated based threshold specified argument. Now, test rep_kfold partition method. method ‘folds’ refers number partitions data partitioning ‘replicate’ refers number replicates. assume values >=1. use new rep_kfold partition gam model Test random bootstrap partitioning. method ‘replicate’ refers number replicates (assumes value >=1), ‘proportion’ refers proportion occurrences used model fitting (assumes value >0 <=1). method can configure proportion training testing data according species occurrences. example, proportion=‘0.7’ indicates 70% data used model training, 30% used model testing. method, function return .partX columns “train” “test” words entries. Use new rep_kfold partition gam model #=========#=========#=========#=========#=========#=========#=========# Vignette still construction changes #=========#=========#=========#=========#=========#=========#=========#","code":"data(\"abies\") library(dplyr) # Create a smaller subset of occurrences set.seed(10) abies2 <- abies %>% na.omit() %>% group_by(pr_ab) %>% dplyr::slice_sample(n = 10) %>% group_by() # Using k-fold partition method for model cross validation abies2 <- part_random( data = abies2, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 3) ) abies2 #> # A tibble: 20 × 14 #> id pr_ab x y aet cwd tmin ppt_djf ppt_jja pH awc #> #> 1 12040 0 -308909. 384248. 573. 332. 4.84 521. 48.8 5.63 0.108 #> 2 10361 0 -254286. 417158. 260. 469. 2.93 151. 15.1 6.20 0.0950 #> 3 9402 0 -286979. 386206. 587. 376. 6.45 333. 15.7 5.5 0.160 #> 4 9815 0 -291849. 445595. 443. 455. 4.39 332. 19.1 6 0.0700 #> 5 10524 0 -256658. 184438. 355. 568. 5.87 303. 10.6 5.20 0.0800 #> 6 8860 0 121343. -164170. 354. 733. 3.97 182. 9.83 0 0 #> 7 6431 0 107903. -122968. 461. 578. 4.87 161. 7.66 5.90 0.0900 #> 8 11730 0 -333903. 431238. 561. 364. 6.73 387. 25.2 5.80 0.130 #> 9 808 0 -150163. 357180. 339. 564. 2.64 220. 15.3 6.40 0.100 #> 10 11054 0 -293663. 340981. 477. 396. 3.89 332. 26.4 4.60 0.0634 #> 11 2960 1 -49273. 181752. 512. 275. 0.920 319. 17.3 5.92 0.0900 #> 12 3065 1 126907. -198892. 322. 544. 0.700 203. 10.6 5.60 0.110 #> 13 5527 1 116751. -181089. 261. 537. 0.363 178. 7.43 0 0 #> 14 4035 1 -31777. 115940. 394. 440. 2.07 298. 11.2 6.01 0.0769 #> 15 4081 1 -5158. 90159. 301. 502. 0.703 203. 14.6 6.11 0.0633 #> 16 3087 1 102151. -143976. 299. 425. -2.08 205. 13.4 3.88 0.110 #> 17 3495 1 -19586. 89803. 438. 419. 2.13 189. 15.2 6.19 0.0959 #> 18 4441 1 49405. -60502. 362. 582. 2.42 218. 7.84 5.64 0.0786 #> 19 301 1 -132516. 270845. 367. 196. -2.56 422. 26.3 6.70 0.0300 #> 20 3162 1 59905. -53634. 319. 626. 1.99 212. 4.50 4.51 0.0396 #> # ℹ 3 more variables: depth , landform , .part # We set the model without threshold specification and with the kfold created above esm_gam_t1 <- esm_gam( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"cwd\", \"tmin\", \"ppt_djf\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), partition = \".part\", thr = NULL ) #> #> Model has more coefficients than data used for training it. Try to reduce k names(esm_gam_t1) #> NULL options(max.print = 10) # If you don't want to see printed all the output esm_gam_t1$esm_model #> NULL esm_gam_t1$predictors #> NULL esm_gam_t1$performance #> NULL # Remove the previous k-fold partition abies2 <- abies2 %>% select(-starts_with(\".\")) # Test with rep_kfold partition using 3 folds and 5 replicates set.seed(10) abies2 <- part_random( data = abies2, pr_ab = \"pr_ab\", method = c(method = \"rep_kfold\", folds = 3, replicates = 5) ) abies2 #> # A tibble: 20 × 18 #> id pr_ab x y aet cwd tmin ppt_djf ppt_jja pH awc #> #> 1 12040 0 -308909. 384248. 573. 332. 4.84 521. 48.8 5.63 0.108 #> 2 10361 0 -254286. 417158. 260. 469. 2.93 151. 15.1 6.20 0.0950 #> 3 9402 0 -286979. 386206. 587. 376. 6.45 333. 15.7 5.5 0.160 #> 4 9815 0 -291849. 445595. 443. 455. 4.39 332. 19.1 6 0.0700 #> 5 10524 0 -256658. 184438. 355. 568. 5.87 303. 10.6 5.20 0.0800 #> 6 8860 0 121343. -164170. 354. 733. 3.97 182. 9.83 0 0 #> 7 6431 0 107903. -122968. 461. 578. 4.87 161. 7.66 5.90 0.0900 #> 8 11730 0 -333903. 431238. 561. 364. 6.73 387. 25.2 5.80 0.130 #> 9 808 0 -150163. 357180. 339. 564. 2.64 220. 15.3 6.40 0.100 #> 10 11054 0 -293663. 340981. 477. 396. 3.89 332. 26.4 4.60 0.0634 #> 11 2960 1 -49273. 181752. 512. 275. 0.920 319. 17.3 5.92 0.0900 #> 12 3065 1 126907. -198892. 322. 544. 0.700 203. 10.6 5.60 0.110 #> 13 5527 1 116751. -181089. 261. 537. 0.363 178. 7.43 0 0 #> 14 4035 1 -31777. 115940. 394. 440. 2.07 298. 11.2 6.01 0.0769 #> 15 4081 1 -5158. 90159. 301. 502. 0.703 203. 14.6 6.11 0.0633 #> 16 3087 1 102151. -143976. 299. 425. -2.08 205. 13.4 3.88 0.110 #> 17 3495 1 -19586. 89803. 438. 419. 2.13 189. 15.2 6.19 0.0959 #> 18 4441 1 49405. -60502. 362. 582. 2.42 218. 7.84 5.64 0.0786 #> 19 301 1 -132516. 270845. 367. 196. -2.56 422. 26.3 6.70 0.0300 #> 20 3162 1 59905. -53634. 319. 626. 1.99 212. 4.50 4.51 0.0396 #> # ℹ 7 more variables: depth , landform , .part1 , .part2 , #> # .part3 , .part4 , .part5 esm_gam_t2 <- esm_gam( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"cwd\", \"tmin\", \"ppt_djf\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), partition = \".part\", thr = NULL ) #> #> Model has more coefficients than data used for training it. Try to reduce k # Remove the previous k-fold partition abies2 <- abies2 %>% select(-starts_with(\".\")) # Test with bootstrap partition using 10 replicates set.seed(10) abies2 <- part_random( data = abies2, pr_ab = \"pr_ab\", method = c(method = \"boot\", replicates = 10, proportion = 0.7) ) abies2 #> # A tibble: 20 × 23 #> id pr_ab x y aet cwd tmin ppt_djf ppt_jja pH awc #> #> 1 12040 0 -308909. 384248. 573. 332. 4.84 521. 48.8 5.63 0.108 #> 2 10361 0 -254286. 417158. 260. 469. 2.93 151. 15.1 6.20 0.0950 #> 3 9402 0 -286979. 386206. 587. 376. 6.45 333. 15.7 5.5 0.160 #> 4 9815 0 -291849. 445595. 443. 455. 4.39 332. 19.1 6 0.0700 #> 5 10524 0 -256658. 184438. 355. 568. 5.87 303. 10.6 5.20 0.0800 #> 6 8860 0 121343. -164170. 354. 733. 3.97 182. 9.83 0 0 #> 7 6431 0 107903. -122968. 461. 578. 4.87 161. 7.66 5.90 0.0900 #> 8 11730 0 -333903. 431238. 561. 364. 6.73 387. 25.2 5.80 0.130 #> 9 808 0 -150163. 357180. 339. 564. 2.64 220. 15.3 6.40 0.100 #> 10 11054 0 -293663. 340981. 477. 396. 3.89 332. 26.4 4.60 0.0634 #> 11 2960 1 -49273. 181752. 512. 275. 0.920 319. 17.3 5.92 0.0900 #> 12 3065 1 126907. -198892. 322. 544. 0.700 203. 10.6 5.60 0.110 #> 13 5527 1 116751. -181089. 261. 537. 0.363 178. 7.43 0 0 #> 14 4035 1 -31777. 115940. 394. 440. 2.07 298. 11.2 6.01 0.0769 #> 15 4081 1 -5158. 90159. 301. 502. 0.703 203. 14.6 6.11 0.0633 #> 16 3087 1 102151. -143976. 299. 425. -2.08 205. 13.4 3.88 0.110 #> 17 3495 1 -19586. 89803. 438. 419. 2.13 189. 15.2 6.19 0.0959 #> 18 4441 1 49405. -60502. 362. 582. 2.42 218. 7.84 5.64 0.0786 #> 19 301 1 -132516. 270845. 367. 196. -2.56 422. 26.3 6.70 0.0300 #> 20 3162 1 59905. -53634. 319. 626. 1.99 212. 4.50 4.51 0.0396 #> # ℹ 12 more variables: depth , landform , .part1 , .part2 , #> # .part3 , .part4 , .part5 , .part6 , .part7 , #> # .part8 , .part9 , .part10 esm_gam_t3 <- esm_gam( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"cwd\", \"tmin\", \"ppt_djf\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), partition = \".part\", thr = NULL ) #> #> Model has more coefficients than data used for training it. Try to reduce k"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v03_post_modeling.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"flexsdm: Overview of Post-modeling functions","text":"Species distribution modeling (SDM) become standard tool multiple research areas, including ecology, conservation biology, biogeography, paleobiogeography, epidemiology. SDM area active theoretical methodological research flexsdm package provides users ability manipulate parameterize models variety ways meet unique research needs. flexibility enables users define complete partial modeling procedure specific modeling situations (e.g., number variables, number records, different algorithms ensemble methods, algorithms tuning, etc.). vignette, users learn post-modeling set functions flexsdm package. functions designed aim assisting flexsdm user predicting, evaluating, correcting SDMs. functions created model prediction, evaluation correction: Post-modeling functions sdm_predict() Spatial predictions individual ensemble models sdm_summarize() Merge model performance tables interp() Raster interpolation SDM predictions two time periods extra_eval() Measure model extrapolation extra_correct() Constraint suitability values given extrapolation value msdm_priori() Create spatial predictor variables reduce overprediction species distribution models msdm_posteriori() Methods correct overprediction species distribution models based occurrences suitability patterns","code":""},{"path":"https://sjevelazco.github.io/flexsdm/articles/v03_post_modeling.html","id":"installation","dir":"Articles","previous_headings":"","what":"Installation","title":"flexsdm: Overview of Post-modeling functions","text":"Install flexsdm package. can install released version flexsdm github :","code":"# devtools::install_github('sjevelazco/flexsdm') library(flexsdm) library(dplyr) #> #> Attaching package: 'dplyr' #> The following objects are masked from 'package:stats': #> #> filter, lag #> The following objects are masked from 'package:base': #> #> intersect, setdiff, setequal, union library(terra) #> terra 1.7.78 #> #> Attaching package: 'terra' #> The following object is masked from 'package:knitr': #> #> spin"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v03_post_modeling.html","id":"project-directory-setup","dir":"Articles","previous_headings":"","what":"Project directory setup","title":"flexsdm: Overview of Post-modeling functions","text":"Decide computer like store inputs outputs project (main directory). Use existing one use dir.create() create main directory. specify whether include folders projections, calibration areas, algorithms, ensembles, thresholds. details see Vignette 01_pre_modeling","code":""},{"path":"https://sjevelazco.github.io/flexsdm/articles/v03_post_modeling.html","id":"species-occurrence-presenceabsense-and-environmental-data","dir":"Articles","previous_headings":"","what":"Species occurrence, presence/absense and environmental data","title":"flexsdm: Overview of Post-modeling functions","text":"tutorial, using “spp” example dataset includes pr_ab (presence = 1, absence = 0), location (x, y) data 3 plant species found California raster environmental data. can load data local R environment using code : want replace spp dataset data, make sure contains coordinates, species presence = 1 / absence = 0 raster environmental data. First, prepare occurrences, environmental conditions partitions Next, fit different models","code":"data(\"spp\") somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) # Select only one species some_sp <- spp %>% filter(species == \"sp3\") # Extract the environmental condition from the rsater for sp3 some_sp <- sdm_extract( data = some_sp, x = \"x\", y = \"y\", env_layer = somevar ) #> 4 rows were excluded from database because NAs were found # Make a partition defining the method, folds and replicates some_sp <- part_random( data = some_sp, pr_ab = \"pr_ab\", method = c(method = \"rep_kfold\", folds = 3, replicates = 5) ) # Fit and validate a [generalized linear model](https://sjevelazco.github.io/flexsdm/reference/fit_glm.html) mglm <- fit_glm( data = some_sp, response = \"pr_ab\", predictors = c(\"CFP_1\", \"CFP_2\", \"CFP_3\", \"CFP_4\"), partition = \".part\", poly = 2 ) #> Formula used for model fitting: #> pr_ab ~ CFP_1 + CFP_2 + CFP_3 + CFP_4 + I(CFP_1^2) + I(CFP_2^2) + I(CFP_3^2) + I(CFP_4^2) #> Replica number: 1/5 #> Partition number: 1/3 #> Partition number: 2/3 #> Partition number: 3/3 #> Replica number: 2/5 #> Partition number: 1/3 #> Partition number: 2/3 #> Partition number: 3/3 #> Replica number: 3/5 #> Partition number: 1/3 #> Partition number: 2/3 #> Partition number: 3/3 #> Replica number: 4/5 #> Partition number: 1/3 #> Partition number: 2/3 #> Partition number: 3/3 #> Replica number: 5/5 #> Partition number: 1/3 #> Partition number: 2/3 #> Partition number: 3/3 # Fit and validate a [random forest model](https://sjevelazco.github.io/flexsdm/reference/fit_raf.html) mraf <- fit_raf( data = some_sp, response = \"pr_ab\", predictors = c(\"CFP_1\", \"CFP_2\", \"CFP_3\", \"CFP_4\"), partition = \".part\", ) #> Formula used for model fitting: #> pr_ab ~ CFP_1 + CFP_2 + CFP_3 + CFP_4 #> Replica number: 1/5 #> Partition number: 1/3 #> Partition number: 2/3 #> Partition number: 3/3 #> Replica number: 2/5 #> Partition number: 1/3 #> Partition number: 2/3 #> Partition number: 3/3 #> Replica number: 3/5 #> Partition number: 1/3 #> Partition number: 2/3 #> Partition number: 3/3 #> Replica number: 4/5 #> Partition number: 1/3 #> Partition number: 2/3 #> Partition number: 3/3 #> Replica number: 5/5 #> Partition number: 1/3 #> Partition number: 2/3 #> Partition number: 3/3 # Fit and validate a [general boosted regression model](https://sjevelazco.github.io/flexsdm/reference/fit_gbm.html) mgbm <- fit_gbm( data = some_sp, response = \"pr_ab\", predictors = c(\"CFP_1\", \"CFP_2\", \"CFP_3\", \"CFP_4\"), partition = \".part\" ) #> Formula used for model fitting: #> pr_ab ~ CFP_1 + CFP_2 + CFP_3 + CFP_4 #> Replica number: 1/5 #> Partition number: 1/3 #> Partition number: 2/3 #> Partition number: 3/3 #> Replica number: 2/5 #> Partition number: 1/3 #> Partition number: 2/3 #> Partition number: 3/3 #> Replica number: 3/5 #> Partition number: 1/3 #> Partition number: 2/3 #> Partition number: 3/3 #> Replica number: 4/5 #> Partition number: 1/3 #> Partition number: 2/3 #> Partition number: 3/3 #> Replica number: 5/5 #> Partition number: 1/3 #> Partition number: 2/3 #> Partition number: 3/3"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v03_post_modeling.html","id":"fit-and-ensemble-the-models-above","dir":"Articles","previous_headings":"Species occurrence, presence/absense and environmental data","what":"1. Fit and ensemble the models above","title":"flexsdm: Overview of Post-modeling functions","text":"can also fit model using Ensembles Small Models approach. example, fit without threshold specification k-fold cross-validation. Finally, can predict different kinds models data (some_sp). sdm_predict can used predicting one models fitted fit_ tune_ functions. output list SpatRaster continuous /binary predictions.","code":"# Fit and ensemble the models. To choose the arguments that best fit your own data, see all options available in [fit_ensemble](https://sjevelazco.github.io/flexsdm/reference/fit_ensemble.html) mensemble <- fit_ensemble( models = list(mglm, mraf, mgbm), ens_method = \"meansup\", thr = NULL, thr_model = \"max_sens_spec\", metric = \"TSS\" ) #> | | | 0% | |======================================================================| 100% msmall <- esm_gam( data = some_sp, response = \"pr_ab\", predictors = c(\"CFP_1\", \"CFP_2\", \"CFP_3\", \"CFP_4\"), partition = \".part\", thr = NULL ) #> | | | 0% | |============ | 17% | |======================= | 33% | |=================================== | 50% | |=============================================== | 67% | |========================================================== | 83% | |======================================================================| 100% # Predict using a single model, which is an mglm model in this example, # and a threshold type for binary predictions ind_p <- sdm_predict( models = mglm, pred = somevar, thr = \"max_fpb\", con_thr = FALSE, predict_area = NULL ) #> Predicting individual models # Inspect the object. It's a SpatRaster with 2 layers: glm, max_fpb # These are the continuous and binary prediction from the model ind_p #> $glm #> class : SpatRaster #> dimensions : 558, 394, 2 (nrow, ncol, nlyr) #> resolution : 1890, 1890 (x, y) #> extent : -373685.8, 370974.2, -604813.3, 449806.7 (xmin, xmax, ymin, ymax) #> coord. ref. : +proj=aea +lat_0=0 +lon_0=-120 +lat_1=34 +lat_2=40.5 +x_0=0 +y_0=-4000000 +datum=NAD83 +units=m +no_defs #> source(s) : memory #> varnames : somevar #> somevar #> names : glm, max_fpb #> min values : 2.220446e-16, TRUE #> max values : 1.000000e+00, TRUE # Plot to see this layers ind_p_rst <- terra::rast(ind_p) plot(ind_p_rst) # Predict a list of more than one model, specifying a threshold type list_p <- sdm_predict( models = list(mglm, mraf, mgbm), pred = somevar, thr = \"max_fpb\", con_thr = FALSE, predict_area = NULL ) #> Predicting list of individual models # Inspect the object. It's a list with 3 SpatRaster, one for each model, # each of which contains 2 layers, for the continuous and thresholded binary predictions. list_p #> $glm #> class : SpatRaster #> dimensions : 558, 394, 2 (nrow, ncol, nlyr) #> resolution : 1890, 1890 (x, y) #> extent : -373685.8, 370974.2, -604813.3, 449806.7 (xmin, xmax, ymin, ymax) #> coord. ref. : +proj=aea +lat_0=0 +lon_0=-120 +lat_1=34 +lat_2=40.5 +x_0=0 +y_0=-4000000 +datum=NAD83 +units=m +no_defs #> source(s) : memory #> varnames : somevar #> somevar #> names : glm, max_fpb #> min values : 2.220446e-16, TRUE #> max values : 1.000000e+00, TRUE #> #> $raf #> class : SpatRaster #> dimensions : 558, 394, 2 (nrow, ncol, nlyr) #> resolution : 1890, 1890 (x, y) #> extent : -373685.8, 370974.2, -604813.3, 449806.7 (xmin, xmax, ymin, ymax) #> coord. ref. : +proj=aea +lat_0=0 +lon_0=-120 +lat_1=34 +lat_2=40.5 +x_0=0 +y_0=-4000000 +datum=NAD83 +units=m +no_defs #> source(s) : memory #> varnames : somevar #> somevar #> names : raf, max_fpb #> min values : 0, FALSE #> max values : 1, TRUE #> #> $gbm #> class : SpatRaster #> dimensions : 558, 394, 2 (nrow, ncol, nlyr) #> resolution : 1890, 1890 (x, y) #> extent : -373685.8, 370974.2, -604813.3, 449806.7 (xmin, xmax, ymin, ymax) #> coord. ref. : +proj=aea +lat_0=0 +lon_0=-120 +lat_1=34 +lat_2=40.5 +x_0=0 +y_0=-4000000 +datum=NAD83 +units=m +no_defs #> source(s) : memory #> varnames : somevar #> somevar #> names : gbm, max_fpb #> min values : 0.0002949323, FALSE #> max values : 0.9986537352, TRUE # Plot to see this layers list_p_rst <- terra::rast(list_p) plot(list_p_rst) # Predict an ensemble model. This is only possible using one fit_ensemble object. It's not possible to include e.g., list(fit_ensemble1, fit_ensemble2) in the model argument. ensemble_p <- sdm_predict( models = mensemble, pred = somevar, thr = \"max_fpb\", con_thr = FALSE, predict_area = NULL ) #> Predicting ensembles # Inspect the object. It's a SpatRaster with 2 layers, mensemble and max_fpb # These are the continuous and binary prediction from the ensemble model ensemble_p #> $meansup #> class : SpatRaster #> dimensions : 558, 394, 2 (nrow, ncol, nlyr) #> resolution : 1890, 1890 (x, y) #> extent : -373685.8, 370974.2, -604813.3, 449806.7 (xmin, xmax, ymin, ymax) #> coord. ref. : +proj=aea +lat_0=0 +lon_0=-120 +lat_1=34 +lat_2=40.5 +x_0=0 +y_0=-4000000 +datum=NAD83 +units=m +no_defs #> source(s) : memory #> varnames : somevar #> somevar #> names : meansup, max_fpb #> min values : 0, FALSE #> max values : 1, TRUE # Plot to see this layers ensemble_p_rst <- terra::rast(ensemble_p) plot(ensemble_p_rst) # Predict an ensembles of small models. small_p <- sdm_predict( models = msmall, pred = somevar, thr = \"max_fpb\", con_thr = FALSE, predict_area = NULL ) #> Predicting ensemble of small models # Inspect the object It's a SpatRaster with 2 layers, msmall and max_fpb # These are the continuous and binary prediction from the ESM model small_p #> $esm_gam #> class : SpatRaster #> dimensions : 558, 394, 2 (nrow, ncol, nlyr) #> resolution : 1890, 1890 (x, y) #> extent : -373685.8, 370974.2, -604813.3, 449806.7 (xmin, xmax, ymin, ymax) #> coord. ref. : +proj=aea +lat_0=0 +lon_0=-120 +lat_1=34 +lat_2=40.5 +x_0=0 +y_0=-4000000 +datum=NAD83 +units=m +no_defs #> source(s) : memory #> names : esm_gam, max_fpb #> min values : 2.476531e-05, FALSE #> max values : 1.000000e+00, TRUE # Plot to see this layers small_p_rst <- terra::rast(small_p) plot(small_p_rst)"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v03_post_modeling.html","id":"merge-model-performance-tables","dir":"Articles","previous_headings":"Species occurrence, presence/absense and environmental data","what":"2. Merge model performance tables","title":"flexsdm: Overview of Post-modeling functions","text":"function combines model performance tables input models. function requires list one models fitted fit_ tune_ functions, fit_ensemble output, esm_ family function output. Build models use performance table merge Finally, merge three sdm performance tables.","code":"# Load abies data data(abies) abies #> # A tibble: 1,400 × 13 #> id pr_ab x y aet cwd tmin ppt_djf ppt_jja pH awc #> #> 1 715 0 -95417. 314240. 323. 546. 1.24 62.7 17.8 5.77 0.108 #> 2 5680 0 98987. -159415. 448. 815. 9.43 130. 6.43 5.60 0.160 #> 3 7907 0 121474. -99463. 182. 271. -4.95 151. 11.2 0 0 #> 4 1850 0 -39976. -17456. 372. 946. 8.78 116. 2.70 6.41 0.0972 #> 5 1702 0 111372. -91404. 209. 399. -4.03 165. 9.27 0 0 #> 6 10036 0 -255715. 392229. 308. 535. 4.66 166. 16.5 5.70 0.0777 #> 7 12384 0 -311765. 380213. 568. 352. 4.38 480. 41.2 5.80 0.110 #> 8 6513 0 111360. -120229. 327. 633. 4.93 163. 8.91 1.18 0.0116 #> 9 9884 0 -284326. 442136. 377. 446. 3.99 296. 16.8 5.96 0.0900 #> 10 8651 0 137640. -110538. 215. 265. -4.62 180. 9.57 0 0 #> # ℹ 1,390 more rows #> # ℹ 2 more variables: depth , landform # We will partition the data with the k-fold method abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 5) ) # Build a generalized additive model, and a generalized linear model using fit_ family functions gam_t1 <- fit_gam( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), predictors_f = c(\"landform\"), partition = \".part\", thr = c(\"max_sens_spec\", \"equal_sens_spec\", \"max_sorensen\") ) #> Formula used for model fitting: #> pr_ab ~ s(aet, k = -1) + s(ppt_jja, k = -1) + s(pH, k = -1) + s(awc, k = -1) + s(depth, k = -1) + landform #> Replica number: 1/1 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 glm_t1 <- fit_glm( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), predictors_f = c(\"landform\"), partition = \".part\", thr = c(\"max_sens_spec\", \"equal_sens_spec\", \"max_sorensen\"), poly = 0, inter_order = 0 ) #> Formula used for model fitting: #> pr_ab ~ aet + ppt_jja + pH + awc + depth + landform #> Replica number: 1/1 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 # Build a tuned model using tune_ family functions # Prepare the grid object to use in grid argument tune_grid <- expand.grid(mtry = seq(1, 7, 1)) # Build a tuned random forest model rf_t1 <- tune_raf( data = abies2, response = \"pr_ab\", predictors = c( \"aet\", \"cwd\", \"tmin\", \"ppt_djf\", \"ppt_jja\", \"pH\", \"awc\", \"depth\" ), predictors_f = c(\"landform\"), partition = \".part\", grid = tune_grid, thr = c(\"max_sens_spec\", \"equal_sens_spec\", \"max_sorensen\"), metric = \"TSS\", ) #> Formula used for model fitting: #> pr_ab ~ aet + cwd + tmin + ppt_djf + ppt_jja + pH + awc + depth + landform #> Tuning model... #> Replica number: 1/1 #> Formula used for model fitting: #> pr_ab ~ aet + cwd + tmin + ppt_djf + ppt_jja + pH + awc + depth + landform #> Replica number: 1/1 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 rf_t1$performance #> # A tibble: 1 × 26 #> mtry model threshold thr_value n_presences n_absences TPR_mean TPR_sd #> #> 1 3 raf max_sens_spec 0.638 700 700 0.916 0.0430 #> # ℹ 18 more variables: TNR_mean , TNR_sd , SORENSEN_mean , #> # SORENSEN_sd , JACCARD_mean , JACCARD_sd , FPB_mean , #> # FPB_sd , OR_mean , OR_sd , TSS_mean , TSS_sd , #> # AUC_mean , AUC_sd , BOYCE_mean , BOYCE_sd , #> # IMAE_mean , IMAE_sd # Note in rf_t1$performance the best model was the one with mtry = 3 and threshold = 'max_sens_spec' merge_df <- sdm_summarize(models = list(gam_t1, glm_t1, rf_t1)) merge_df #> # A tibble: 7 × 27 #> model_ID model threshold thr_value n_presences n_absences TPR_mean TPR_sd #> #> 1 1 gam equal_sens_sp… 0.540 700 700 0.737 0.0366 #> 2 1 gam max_sens_spec 0.530 700 700 0.751 0.0461 #> 3 1 gam max_sorensen 0.359 700 700 0.864 0.0580 #> 4 2 glm equal_sens_sp… 0.523 700 700 0.663 0.0583 #> 5 2 glm max_sens_spec 0.463 700 700 0.803 0.111 #> 6 2 glm max_sorensen 0.356 700 700 0.876 0.0436 #> 7 3 raf max_sens_spec 0.638 700 700 0.916 0.0430 #> # ℹ 19 more variables: TNR_mean , TNR_sd , SORENSEN_mean , #> # SORENSEN_sd , JACCARD_mean , JACCARD_sd , FPB_mean , #> # FPB_sd , OR_mean , OR_sd , TSS_mean , TSS_sd , #> # AUC_mean , AUC_sd , BOYCE_mean , BOYCE_sd , #> # IMAE_mean , IMAE_sd , mtry "},{"path":"https://sjevelazco.github.io/flexsdm/articles/v03_post_modeling.html","id":"raster-interpolation-between-two-time-periods","dir":"Articles","previous_headings":"Species occurrence, presence/absense and environmental data","what":"3. Raster interpolation between two time periods","title":"flexsdm: Overview of Post-modeling functions","text":"function useful calculating projected suitability values two time periods simple interpolation using two raster objects suitability values. useful , example, SDM projected future past time period (using maps predictor variables, climate variables, different time periods), user requires estimate suitability intermediate time periods. example may needed input types models risk analysis. function returns SpatRaster dir_save used NULL. However, user specifies dir_save, function save interpolated raster files given directory. function create object interpolated values n annual layers ranging initial final year. resolution dimensions result object remain initial final maps. example, nine annual (2011-2019) interpolated maps generated initial (2010) final (2020) prediction maps. cell starting value 1 ending value 0 changed increments (1-0)/((2020-2010)-1), given interpolated values 0.9, 0.8, 0.7…0.1","code":"library(terra) library(dplyr) f <- system.file(\"external/suit_time_step.tif\", package = \"flexsdm\") abma <- terra::rast(f) plot(abma) int <- interp( r1 = abma[[1]], # set the raster of initial year r2 = abma[[2]], # set the raster of final year y1 = 2010, # set the numeric initial year y2 = 2020, # set the numeric final year rastername = \"Abies\", dir_save = NULL ) # Layers in the abma SpatRaster names(abma) #> [1] \"current\" \"future\" # plot(abma) # Layers in the int SpatRaster int #> class : SpatRaster #> dimensions : 558, 394, 11 (nrow, ncol, nlyr) #> resolution : 1890, 1890 (x, y) #> extent : -373685.8, 370974.2, -604813.3, 449806.7 (xmin, xmax, ymin, ymax) #> coord. ref. : +proj=aea +lat_0=0 +lon_0=-120 +lat_1=34 +lat_2=40.5 +x_0=0 +y_0=-4000000 +datum=NAD83 +units=m +no_defs #> source(s) : memory #> varnames : suit_time_step #> suit_time_step #> suit_time_step #> ... #> names : Abies_2010, Abies_2011, Abies_2012, Abies_2013, Abies_2014, Abies_2015, ... #> min values : 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.0000000, ... #> max values : 0.9756107, 0.9606077, 0.9504615, 0.9440073, 0.9442941, 0.9463548, ... plot(int)"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v03_post_modeling.html","id":"measure-model-extrapolation","dir":"Articles","previous_headings":"Species occurrence, presence/absense and environmental data","what":"4. Measure model extrapolation","title":"flexsdm: Overview of Post-modeling functions","text":"function measures extent model extrapolation comparing data used modeling calibration area model projection using approach proposed Velazco et al., prep. accessible area defines calibration area used extract environmental conditions","code":"library(dplyr) library(terra) data(spp) f <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(f) # Inspect the unique values for species spp$species %>% unique() #> [1] \"sp1\" \"sp2\" \"sp3\" # Subset spp data into a tibble only with coordinates for sp3 and pr_ab == 1 sp <- spp %>% dplyr::filter(species == \"sp3\", pr_ab == 1) %>% dplyr::select(x, y) # Define accessible area for sp3 based on a buffer with around each point that is related to dispersal ability or some other ecological criterion ca <- calib_area( sp, x = \"x\", y = \"y\", method = c(\"buffer\", width = 30000), crs = crs(somevar) ) # Plot the SpatRaster, occurrences and accessible area plot(somevar$CFP_1) points(sp) plot(ca, add = T) somevar_ca <- somevar %>% crop(., ca) %>% mask(., ca) # Plot environmental conditions of the calibration area plot(somevar_ca) xp <- extra_eval( training_data = somevar_ca, projection_data = somevar, n_cores = 1, aggreg_factor = 3 ) # Plot the SpatRaster object with the extrapolation values measured in percentage plot(xp)"},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/articles/v03_post_modeling.html","id":"create-spatial-predictor-variables-to-reduce-overprediction-of-species-distribution-models","dir":"Articles","previous_headings":"Species occurrence, presence/absense and environmental data","what":"6. Create spatial predictor variables to reduce overprediction of species distribution models","title":"flexsdm: Overview of Post-modeling functions","text":"function creates geographical predictor variables , together environmental variables, can used construct constrained species distribution models. function returns SpatRaster object, used together environmental variables construct species distribution models. ‘xy’ approach creates single pair raster layers can used species share study region. Otherwise, ‘cml’, ‘min’, ‘ker’ create species-specific raster layer. Next, use different methods according data.","code":"library(dplyr) library(terra) data(\"spp\") somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) # Select the presences of one species (sp3) occ <- spp %>% dplyr::filter(species == \"sp3\", pr_ab == 1) # Select a raster layer to be used as a basic raster a_variable <- somevar[[1]] plot(a_variable) points(occ %>% dplyr::select(x, y)) # Use xy method m_xy <- msdm_priori( data = occ, x = \"x\", y = \"y\", method = \"xy\", env_layer = a_variable ) plot(m_xy) # Explore the object. This method assumes that spatial structure can partially explain species distribution (Bahn & Mcgill, 2007). Therefore, the result are two raster layers containing the latitude and longitude of pixels, respectively. This method could be used for all species set that share the same study area region. m_xy #> class : SpatRaster #> dimensions : 558, 394, 2 (nrow, ncol, nlyr) #> resolution : 1890, 1890 (x, y) #> extent : -373685.8, 370974.2, -604813.3, 449806.7 (xmin, xmax, ymin, ymax) #> coord. ref. : +proj=aea +lat_0=0 +lon_0=-120 +lat_1=34 +lat_2=40.5 +x_0=0 +y_0=-4000000 +datum=NAD83 +units=m +no_defs #> source(s) : memory #> varnames : somevar #> somevar #> names : msdm_lon, msdm_lat #> min values : -370850.8, -601978.3 #> max values : 368139.2, 448861.7 m_cml <- msdm_priori( data = occ, x = \"x\", y = \"y\", method = \"cml\", env_layer = a_variable ) plot(m_cml) # Explore the object. This method assumes that pixels closer to presences are likely included in species distributions. The results is a raster layer containing the sum of euclidean geographic distances from each pixel to all occurrences of a species. m_cml #> class : SpatRaster #> dimensions : 558, 394, 1 (nrow, ncol, nlyr) #> resolution : 1890, 1890 (x, y) #> extent : -373685.8, 370974.2, -604813.3, 449806.7 (xmin, xmax, ymin, ymax) #> coord. ref. : +proj=aea +lat_0=0 +lon_0=-120 +lat_1=34 +lat_2=40.5 +x_0=0 +y_0=-4000000 +datum=NAD83 +units=m +no_defs #> source(s) : memory #> varname : somevar #> name : msdm_cml #> min value : 0 #> max value : 1"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v03_post_modeling.html","id":"methods-to-correct-overprediction-of-species-distribution-models-based-on-occurrences-and-suitability-patterns","dir":"Articles","previous_headings":"Species occurrence, presence/absense and environmental data","what":"7. Methods to correct overprediction of species distribution models based on occurrences and suitability patterns","title":"flexsdm: Overview of Post-modeling functions","text":"methods designed reduce overprediction species distribution models based posteriori method (see Mendes et al 2020), .e., combination patterns species occurrences predicted suitability. First, prepare data Next, fit predict model Next, let’s predict model plot map Finally, perform correction avoid models overpredictions. #=========#=========#=========#=========#=========#=========#=========# Vignette still construction changes #=========#=========#=========#=========#=========#=========#=========#","code":"library(dplyr) library(terra) data(\"spp\") somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) # Prepare data for modeling a species set.seed(10) occ <- spp %>% dplyr::filter(species == \"sp2\") %>% # filter using only sp2 sdm_extract( data = ., x = \"x\", y = \"y\", env_layer = somevar, filter_na = TRUE ) %>% # extract variables values from the raster layer part_random(., pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 10) ) # add columns with partition #> 6 rows were excluded from database because NAs were found m_glm <- fit_glm( data = occ, response = \"pr_ab\", predictors = names(somevar), partition = \".part\", thr = \"equal_sens_spec\", ) #> Formula used for model fitting: #> pr_ab ~ CFP_1 + CFP_2 + CFP_3 + CFP_4 + I(CFP_1^2) + I(CFP_2^2) + I(CFP_3^2) + I(CFP_4^2) #> Replica number: 1/1 #> Partition number: 1/10 #> Partition number: 2/10 #> Partition number: 3/10 #> Partition number: 4/10 #> Partition number: 5/10 #> Partition number: 6/10 #> Partition number: 7/10 #> Partition number: 8/10 #> Partition number: 9/10 #> Partition number: 10/10 # Predict this model m_pred <- sdm_predict(models = m_glm, pred = somevar, thr = NULL, con_thr = FALSE) #> Predicting individual models # Predicting individual models plot(m_pred[[1]]) # Using mcp method. The Minimum Convex Polygon (mcp) method excludes from SDMs climate suitable pixels that do not intercept a minimum convex polygon, with interior angles smaller than 180, enclosing all occurrences of a species. m_mcp <- msdm_posteriori( records = occ, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", method = \"mcp\", cont_suit = m_pred[[1]], thr = \"equal_sens_spec\", buffer = NULL ) plot(m_mcp) # Using bmcp method. The Buffered Minimum Convex Polygon (bmcp) method is similar to the 'mcp' except by the inclusion of a buffer zone surrounding minimum convex polygons. m_bmcp <- msdm_posteriori( records = occ, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", method = \"bmcp\", cont_suit = m_pred[[1]], thr = \"equal_sens_spec\", buffer = 30000, crs = crs(m_pred[[1]]) ) plot(m_bmcp) # Using obr method. The Occurrences Based Restriction (obr) method assumes that suitable patches intercepting species occurrences are more likely a part of species distributions than suitable patches that do not intercept any occurrence. m_obr <- msdm_posteriori( records = occ, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", method = \"obr\", cont_suit = m_pred[[1]], thr = \"equal_sens_spec\", buffer = NULL ) plot(m_obr) # Using pres method. The only occurrences based restriction (pres) method only retains those pixels in suitability patches intercepting occurrences. m_pres <- msdm_posteriori( records = occ, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", method = \"pres\", cont_suit = m_pred[[1]], thr = \"equal_sens_spec\", buffer = NULL ) plot(m_pres) # Using lq method. The Lower Quantile (lq) method works whenever a suitable pixel is within a k patch, i.e., not within this lower quartile, the suitability of the pixel is reduced to zero. This means that 75% of k patches were withdrawn from the model. m_lq <- msdm_posteriori( records = occ, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", method = \"lq\", cont_suit = m_pred[[1]], thr = \"equal_sens_spec\", buffer = NULL ) plot(m_lq)"},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/articles/v04_Red_fir_example.html","id":"study-species-overview-of-methods","dir":"Articles","previous_headings":"Example of full modeling process","what":"Study species & overview of methods","title":"flexsdm: Red Fir example","text":", used flexsdm package model current distribution California red fir (Abies magnifica). Red fir high-elevation conifer species ’s geographic range extends Sierra Nevada California, USA, southern portion Cascade Range Oregon. species, used presence data compiled several public datasets curated natural resources agencies. built distribution models using four hydro-climatic variables: actual evapotranspiration, climatic water deficit, maximum temperature warmest month, minimum temperature coldest month. variables resampled (aggregated) 1890 m spatial resolution improve processing time.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/articles/v04_Red_fir_example.html","id":"delimit-of-a-calibration-area","dir":"Articles","previous_headings":"Example of full modeling process","what":"Delimit of a calibration area","title":"flexsdm: Red Fir example","text":"Delimiting calibration area (aka accessible area) essential step SDMs methodological theoretical terms. calibration area affect several characteristics SDM like range environmental variables, number absences, distribution background points pseudo-absences, unfortunately, performance metrics like AUC TSS. several ways delimit calibration area. calib_area(). used method calibration area delimited 100-km buffer around presences (shown figure ).","code":"# devtools::install_github('sjevelazco/flexsdm') library(flexsdm) library(terra) library(dplyr) somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) # environmental data names(somevar) <- c(\"aet\", \"cwd\", \"tmx\", \"tmn\") data(abies) abies_p <- abies %>% select(x, y, pr_ab) %>% filter(pr_ab == 1) # filter only for presence locations ca <- calib_area( data = abies_p, x = 'x', y = 'y', method = c('buffer', width = 100000), crs = crs(somevar) ) # create a calibration area with 100 km buffer around occurrence points # visualize the species occurrences layer1 <- somevar[[1]] layer1[!is.na(layer1)] <- 1 plot(layer1, col=\"gray80\", legend=FALSE, axes=FALSE) plot(crop(ca, layer1), add=TRUE) points(abies_p[,c(\"x\", \"y\")], col = \"#00000480\")"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v04_Red_fir_example.html","id":"occurrence-filtering","dir":"Articles","previous_headings":"Example of full modeling process","what":"Occurrence filtering","title":"flexsdm: Red Fir example","text":"Sample bias species occurrence data long recognized issue SDM. However, environmental filtering observation data can improve model predictions reducing redundancy environmental (e.g. climatic) hyper-space (Varela et al. 2014). use function occfilt_env() thin red fir occurrences based environmental space. function unique flexsdm, contrast packages able use number environmental dimensions perform PCA filtering. Next apply environmental occurrence filtering using 8 bins display resulting filtered occurrence data","code":"abies_p$id <- 1:nrow(abies_p) # adding unique id to each row abies_pf <- abies_p %>% occfilt_env( data = ., x = \"x\", y = \"y\", id = \"id\", nbins = 8, env_layer = somevar ) %>% left_join(abies_p, by = c(\"id\", \"x\", \"y\")) #> Extracting values from raster ... #> 27 records were removed because they have NAs for some variables #> Number of unfiltered records: 673 #> Number of filtered records: 216 plot(layer1, col=\"gray80\", legend=FALSE, axes=FALSE) plot(crop(ca, layer1), add=TRUE) points(abies_p[,c(\"x\", \"y\")], col = \"#00000480\") points(abies_pf[,c(\"x\", \"y\")], col = \"#5DC86180\")"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v04_Red_fir_example.html","id":"block-partition-with-4-folds","dir":"Articles","previous_headings":"Example of full modeling process","what":"Block partition with 4 folds","title":"flexsdm: Red Fir example","text":"Data partitioning, splitting data testing training groups, key step building SDMs. flexsdm offers multiple options data partitioning use spatial block method. Geographically structured data partitioning methods especially useful users want evaluate model transferability different regions time periods. part_sblock() function explores spatial blocks different raster cells sizes returns one best suited input datset based spatial autocorrelation, environmental similarity, number presence/absence records block partition. function’s output provides users 1) tibble presence/absence locations assigned partition number, 2) tibble information best partition, 3) SpatRaster showing selected grid. want divide data 4 different partitions using spatial block method.","code":"set.seed(10) occ_part <- abies_pf %>% part_sblock( data = ., env_layer = somevar, pr_ab = \"pr_ab\", x = \"x\", y = \"y\", n_part = 4, min_res_mult = 3, max_res_mult = 200, num_grids = 30, prop = 1 ) #> The following grid cell sizes will be tested: #> 5670 | 18508.97 | 31347.93 | 44186.9 | 57025.86 | 69864.83 | 82703.79 | 95542.76 | 108381.72 | 121220.69 | 134059.66 | 146898.62 | 159737.59 | 172576.55 | 185415.52 | 198254.48 | 211093.45 | 223932.41 | 236771.38 | 249610.34 | 262449.31 | 275288.28 | 288127.24 | 300966.21 | 313805.17 | 326644.14 | 339483.1 | 352322.07 | 365161.03 | 378000 #> Creating basic raster mask... #> Searching for the optimal grid size... abies_pf <- occ_part$part # Transform best block partition to a raster layer with same resolution and extent than # predictor variables block_layer <- get_block(env_layer = somevar, best_grid = occ_part$grid) cl <- c(\"#64146D\", \"#9E2962\", \"#F47C15\", \"#FCFFA4\") plot(block_layer, col=cl, legend=FALSE, axes=FALSE) points(abies_pf[,c(\"x\", \"y\")]) # Number of presences per block abies_pf %>% dplyr::group_by(.part) %>% dplyr::count() #> # A tibble: 4 × 2 #> # Groups: .part [4] #> .part n #> #> 1 1 38 #> 2 2 59 #> 3 3 33 #> 4 4 86 # Additional information of the best block occ_part$best_part_info #> # A tibble: 1 × 5 #> n_grid cell_size spa_auto env_sim sd_p #> #> 1 14 172577. 0.5 173. 24.1"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v04_Red_fir_example.html","id":"pseudo-absencebackground-points-using-partition-previously-created-as-a-mask","dir":"Articles","previous_headings":"Example of full modeling process","what":"Pseudo-absence/background points (using partition previously created as a mask)","title":"flexsdm: Red Fir example","text":"example, species presence data. However, SDM methods require either pseudo-absence background data. , use spatial block partition just created generate pseudo-absence background points. Extract environmental data presence-absence background data . View distributions present points, pseudo-absence points, background points using blocks reference map.","code":"# Spatial blocks where species occurs # Sample background points throughout study area with random method, allocating 10X the number of presences a background set.seed(10) bg <- lapply(1:4, function(x) { sample_background( data = abies_pf, x = \"x\", y = \"y\", n = sum(abies_pf$.part == x) * 10, method = \"random\", rlayer = block_layer, maskval = x, calibarea = ca ) }) %>% bind_rows() bg <- sdm_extract(data = bg, x = \"x\", y = \"y\", env_layer = block_layer) # Sample a number of pseudo-absences equal to the presence in each partition set.seed(10) psa <- lapply(1:4, function(x) { sample_pseudoabs( data = abies_pf, x = \"x\", y = \"y\", n = sum(abies_pf$.part == x), method = \"random\", rlayer = block_layer, maskval = x, calibarea = ca ) }) %>% bind_rows() psa <- sdm_extract(data = psa, x = \"x\", y = \"y\", env_layer = block_layer) cl <- c(\"#280B50\", \"#9E2962\", \"#F47C15\", \"#FCFFA4\") plot(block_layer, col=\"gray80\", legend=FALSE, axes=FALSE) points(bg[,c(\"x\", \"y\")], col=cl[bg$.part], cex=0.8) # Background points points(psa[,c(\"x\", \"y\")], bg=cl[psa$.part], cex=0.8, pch=21) # Pseudo-absences # Bind a presences and pseudo-absences abies_pa <- bind_rows(abies_pf, psa) abies_pa # Presence-Pseudo-absence database #> # A tibble: 432 × 4 #> x y pr_ab .part #> #> 1 -12558. 68530. 1 2 #> 2 115217. -145937. 1 4 #> 3 3634. 22501. 1 2 #> 4 44972. -60781. 1 2 #> 5 -34463. 160313. 1 3 #> 6 83108. -27300. 1 2 #> 7 124877. -176319. 1 4 #> 8 118707. -179991. 1 4 #> 9 126141. -176302. 1 4 #> 10 -49722. 141124. 1 3 #> # ℹ 422 more rows bg # Background points #> # A tibble: 2,160 × 4 #> x y pr_ab .part #> #> 1 -153501. 392162. 0 1 #> 2 -89241. 263642. 0 1 #> 3 -89241. 27392. 0 1 #> 4 -130821. 331682. 0 1 #> 5 -132711. 339242. 0 1 #> 6 -51441. -63328. 0 1 #> 7 -59001. 67082. 0 1 #> 8 -32541. -51988. 0 1 #> 9 -96801. 932. 0 1 #> 10 -47661. -31198. 0 1 #> # ℹ 2,150 more rows abies_pa <- abies_pa %>% sdm_extract( data = ., x = \"x\", y = \"y\", env_layer = somevar, filter_na = TRUE ) bg <- bg %>% sdm_extract( data = ., x = \"x\", y = \"y\", env_layer = somevar, filter_na = TRUE )"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v04_Red_fir_example.html","id":"fit-models-with-tune_max-fit_gau-and-fit_glm","dir":"Articles","previous_headings":"Example of full modeling process","what":"Fit models with tune_max, fit_gau, and fit_glm","title":"flexsdm: Red Fir example","text":"Now, fit models. flexsdm package offers wide range modeling options, traditional statistical methods like GLMs GAMs, machine learning methods like random forests support vector machines. modeling method, flexsdm provides fit_ tune_ functions, allow users use default settings adjust hyperparameters depending research goals. , test tune_max() (tuned Maximum Entropy model), fit_gau() (fit Guassian Process model), fit_glm (fit Generalized Linear Model). model, selected three threshold values generate binary suitability predictions: threshold maximizes TSS (max_sens_spec), threshold sensitivity specificity equal (equal_sens_spec), threshold Sorenson index highest (max_sorenson). example, selected TSS performance metric used selecting best combination hyper-parameter values tuned Maximum Entropy model.","code":"t_max <- tune_max( data = abies_pa, response = \"pr_ab\", predictors = names(somevar), background = bg, partition = \".part\", grid = expand.grid( regmult = seq(0.1, 3, 0.5), classes = c(\"l\", \"lq\", \"lqhpt\") ), thr = c(\"max_sens_spec\", \"equal_sens_spec\", \"max_sorensen\"), metric = \"TSS\", clamp = TRUE, pred_type = \"cloglog\" ) #> Tuning model... #> Replica number: 1/1 #> Partition number: 1/4 #> Partition number: 2/4 #> Partition number: 3/4 #> Partition number: 4/4 #> Fitting best model #> Formula used for model fitting: #> ~aet + cwd + tmx + tmn + I(aet^2) + I(cwd^2) + I(tmx^2) + I(tmn^2) + hinge(aet) + hinge(cwd) + hinge(tmx) + hinge(tmn) + thresholds(aet) + thresholds(cwd) + thresholds(tmx) + thresholds(tmn) + cwd:aet + tmx:aet + tmn:aet + tmx:cwd + tmn:cwd + tmn:tmx - 1 #> Replica number: 1/1 #> Partition number: 1/4 #> Partition number: 2/4 #> Partition number: 3/4 #> Partition number: 4/4 f_gau <- fit_gau( data = abies_pa, response = \"pr_ab\", predictors = names(somevar), partition = \".part\", thr = c(\"max_sens_spec\", \"equal_sens_spec\", \"max_sorensen\") ) #> Replica number: 1/1 #> Partition number: 1/4 #> Partition number: 2/4 #> Partition number: 3/4 #> Partition number: 4/4 f_glm <- fit_glm( data = abies_pa, response = \"pr_ab\", predictors = names(somevar), partition = \".part\", thr = c(\"max_sens_spec\", \"equal_sens_spec\", \"max_sorensen\"), poly = 2 ) #> Formula used for model fitting: #> pr_ab ~ aet + cwd + tmx + tmn + I(aet^2) + I(cwd^2) + I(tmx^2) + I(tmn^2) #> Replica number: 1/1 #> Partition number: 1/4 #> Partition number: 2/4 #> Partition number: 3/4 #> Partition number: 4/4"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v04_Red_fir_example.html","id":"fit-an-ensemble-model","dir":"Articles","previous_headings":"Example of full modeling process","what":"Fit an ensemble model","title":"flexsdm: Red Fir example","text":"Spatial predictions different SDM algorithms can vary substantially, ensemble modeling become increasingly popular. fit_ensemble() function, users can easily produce ensemble SDM based individual fit_ tune_ models included package. example, fit ensemble model red fir based weighted average three individual models. used threshold values performance metric implemented individual models. output flexsdm model objects allows easily compare metrics across models, AUC TSS. example, can use sdm_summarize() function merge model performance tables.","code":"ens_m <- fit_ensemble( models = list(t_max, f_gau, f_glm), ens_method = \"meanw\", thr = c(\"max_sens_spec\", \"equal_sens_spec\", \"max_sorensen\"), thr_model = \"max_sens_spec\", metric = \"TSS\" ) #> | | | 0% | |======================================================================| 100% ens_m$performance #> # A tibble: 3 × 25 #> model threshold thr_value n_presences n_absences TPR_mean TPR_sd TNR_mean #> #> 1 meanw equal_sens_sp… 0.582 216 216 0.787 0.0795 0.808 #> 2 meanw max_sens_spec 0.470 216 216 0.949 0.0162 0.752 #> 3 meanw max_sorensen 0.449 216 216 0.963 0.0143 0.738 #> # ℹ 17 more variables: TNR_sd , SORENSEN_mean , SORENSEN_sd , #> # JACCARD_mean , JACCARD_sd , FPB_mean , FPB_sd , #> # OR_mean , OR_sd , TSS_mean , TSS_sd , AUC_mean , #> # AUC_sd , BOYCE_mean , BOYCE_sd , IMAE_mean , #> # IMAE_sd model_perf <- sdm_summarize(list(t_max, f_gau, f_glm, ens_m)) model_perf #> # A tibble: 10 × 28 #> model_ID model threshold thr_value n_presences n_absences TPR_mean TPR_sd #> #> 1 1 max max_sens_spec 0.364 216 216 0.954 0.0316 #> 2 2 gau equal_sens_s… 0.643 216 216 0.784 0.0890 #> 3 2 gau max_sens_spec 0.471 216 216 0.952 0.0122 #> 4 2 gau max_sorensen 0.471 216 216 0.964 0.0108 #> 5 3 glm equal_sens_s… 0.649 216 216 0.800 0.0851 #> 6 3 glm max_sens_spec 0.554 216 216 0.954 0.0493 #> 7 3 glm max_sorensen 0.423 216 216 0.977 0.0379 #> 8 4 meanw equal_sens_s… 0.582 216 216 0.787 0.0795 #> 9 4 meanw max_sens_spec 0.470 216 216 0.949 0.0162 #> 10 4 meanw max_sorensen 0.449 216 216 0.963 0.0143 #> # ℹ 20 more variables: TNR_mean , TNR_sd , SORENSEN_mean , #> # SORENSEN_sd , JACCARD_mean , JACCARD_sd , FPB_mean , #> # FPB_sd , OR_mean , OR_sd , TSS_mean , TSS_sd , #> # AUC_mean , AUC_sd , BOYCE_mean , BOYCE_sd , #> # IMAE_mean , IMAE_sd , regmult , classes "},{"path":"https://sjevelazco.github.io/flexsdm/articles/v04_Red_fir_example.html","id":"project-the-ensemble-model","dir":"Articles","previous_headings":"Example of full modeling process","what":"Project the ensemble model","title":"flexsdm: Red Fir example","text":"Next project ensemble model space across entire extent environmental layer, California Floristic Province, using sdm_predict() function. function can use predict species suitability across area species’ current future suitability. example, project ensemble model one threshold, though users option project multiple models multiple threshold values. , also specify want function return SpatRast continuous suitability values threshold (con_thr = TRUE).","code":"pr_1 <- sdm_predict( models = ens_m, pred = somevar, thr = \"max_sens_spec\", con_thr = TRUE, predict_area = NULL ) #> Predicting ensembles unconstrained <- pr_1$meanw[[1]] names(unconstrained) <- \"unconstrained\" cl <- c(\"#FDE725\", \"#B3DC2B\", \"#6DCC57\", \"#36B677\", \"#1F9D87\", \"#25818E\", \"#30678D\", \"#3D4988\", \"#462777\", \"#440154\") plot(unconstrained, col=cl, legend=FALSE, axes=FALSE)"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v04_Red_fir_example.html","id":"constrain-the-model-with-msdm_posterior","dir":"Articles","previous_headings":"Example of full modeling process","what":"Constrain the model with msdm_posterior","title":"flexsdm: Red Fir example","text":"Finally, flexsdm offers users function help correct overprediction SDM based occurrence records suitability patterns. example constrained ensemble model using method “occurrence based restriction”, assumes suitable patches intercept species occurrences likely part species distributions suitable patches intercept occurrences. methods msdm_posteriori() function work presences important always use original database (.e., presences spatially environmentally filtered). methods available msdm_posteriori() function based Mendes et al. (2020). #=========#=========#=========#=========#=========#=========#=========# Vignette still construction changes #=========#=========#=========#=========#=========#=========#=========#","code":"thr_val <- ens_m$performance %>% dplyr::filter(threshold == \"max_sens_spec\") %>% pull(thr_value) m_pres <- msdm_posteriori( records = abies_p, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", cont_suit = pr_1$meanw[[1]], method = c(\"obr\"), thr = c(\"sensitivity\", sens = thr_val), buffer = NULL ) constrained <- m_pres$meanw[[1]] names(constrained) <- \"constrained\" cl <- c(\"#FDE725\", \"#B3DC2B\", \"#6DCC57\", \"#36B677\", \"#1F9D87\", \"#25818E\", \"#30678D\", \"#3D4988\", \"#462777\", \"#440154\") plot(constrained, col=cl, legend=FALSE, axes=FALSE)"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v05_Rare_species_example.html","id":"intro","dir":"Articles","previous_headings":"","what":"Intro","title":"flexsdm: Modeling a rare species","text":"Creating SDMs rare poorly known species can difficult task. Occurrence data often limited observation, can lead model overfitting, especially using many predictor variables build models. However, researchers often interested building SDMs rare species, often threatened need conservation action. address issues associated modeling spatial distributions rare species, Lomba et al. (2010) Breiner et al. (2015) proposed method “ensemble small models” ESM. ESM, many bivariate models pairwise combinations predictor variable, ensemble performed. flexsdm, ensemble created using average suitability across “small models”, weighted Somers’ D (D = 2 * (AUC-.5)). important note method allow use categorical variables (soil type). practical applications ESMs include identifying areas reintroduction rare species areas establishing new populations, especially face climate change. example, Dubos et al. (2021) used variation ESM identify areas may remain suitable climate change two rare species Madagascar: golden mantella frog (Mantella aurantiaca) Manapany day gecko (Phelsuma inexpectata). example, walk process comparing ESM traditional modeling approaches Hesperocyparis stephensonii (Cuyamaca cypress), conifer tree species endemic southern California. species listed Critically Endangered IUCN found headwaters King Creek San Diego County. Cedar Fire 2003 left 30-40 surviving trees. hypothetical example, searching suitable areas might possible establish new populations species, hopes decreasing species’ future extinction risk.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/articles/v05_Rare_species_example.html","id":"data","dir":"Articles","previous_headings":"Intro","what":"Data","title":"flexsdm: Modeling a rare species","text":"models, use four environmental variables influence plant distributions California: available evapotranspiration (aet), climatic water deficit (cwd), maximum temperature warmest month (tmx), minimum temperature coldest month (tmn). occurrence data include 21 geo-referenced observations downloaded online database Calflora.","code":"# devtools::install_github('sjevelazco/flexsdm') library(flexsdm) library(terra) library(dplyr) # environmental data somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) names(somevar) <- c(\"aet\", \"cwd\", \"tmx\", \"tmn\") # species occurence data (presence-only) data(hespero) hespero <- hespero %>% dplyr::select(-id) # California ecoregions regions <- system.file(\"external/regions.tif\", package = \"flexsdm\") regions <- terra::rast(regions) regions <- as.polygons(regions) sp_region <- terra::subset(regions, regions$category == \"SCR\") # ecoregion where *Hesperocyparis stephensonii* is found # visualize the species occurrences plot( sp_region, col = \"gray80\", legend = FALSE, axes = FALSE, main = \"Hesperocyparis stephensonii occurrences\" ) points(hespero[, c(\"x\", \"y\")], col = \"black\", pch = 16) cols <- rep(\"gray80\", 8) cols[regions$category == \"SCR\"] <- \"yellow\" terra::inset( regions, loc = \"bottomleft\", scale = .3, col = cols )"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v05_Rare_species_example.html","id":"delimit-calibration-area","dir":"Articles","previous_headings":"Intro","what":"Delimit calibration area","title":"flexsdm: Modeling a rare species","text":"First, must define model’s calibration area. flexsdm package offers several methods defining model calibration area. , use 25-km buffer areas around presence points select pseudo-absence locations.","code":"ca <- calib_area( data = hespero, x = \"x\", y = \"y\", method = c('buffer', width=25000), crs = crs(somevar) ) # visualize the species occurrences & calibration area plot( sp_region, col = \"gray80\", legend = FALSE, axes = FALSE, main = \"Calibration area and occurrences\") plot(ca, add=TRUE) points(hespero[,c(\"x\", \"y\")], col = \"black\", pch = 16)"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v05_Rare_species_example.html","id":"create-pseudo-absence-data","dir":"Articles","previous_headings":"Intro","what":"Create pseudo-absence data","title":"flexsdm: Modeling a rare species","text":"often case rare species, species presence data. However, SDM methods require either pseudo-absence background data. , use calibration area produce pseudo-absence data can used SDMs.","code":"# Sample the same number of species presences set.seed(10) psa <- sample_pseudoabs( data = hespero, x = \"x\", y = \"y\", n = sum(hespero$pr_ab), # selecting number of pseudo-absence points that is equal to number of presences method = \"random\", rlayer = somevar, calibarea = ca ) # Visualize species presences and pseudo-absences plot( sp_region, col = \"gray80\", legend = FALSE, axes = FALSE, xlim = c(289347, 353284), ylim = c(-598052, -520709), main = \"Presence = yellow, Pseudo-absence = black\") plot(ca, add=TRUE) points(psa[,c(\"x\", \"y\")], cex=0.8, pch=16, col = \"black\") # Pseudo-absences points(hespero[,c(\"x\", \"y\")], col = \"yellow\", pch = 16, cex = 1.5) # Presences # Bind a presences and pseudo-absences hespero_pa <- bind_rows(hespero, psa) hespero_pa # Presence-Pseudo-absence database #> # A tibble: 42 × 3 #> x y pr_ab #> #> 1 316923. -557843. 1 #> 2 317155. -559234. 1 #> 3 316960. -558186. 1 #> 4 314347. -559648. 1 #> 5 317348. -557349. 1 #> 6 316753. -559679. 1 #> 7 316777. -558644. 1 #> 8 317050. -559043. 1 #> 9 316655. -559928. 1 #> 10 316418. -567439. 1 #> # ℹ 32 more rows"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v05_Rare_species_example.html","id":"partition-data-for-evaluating-models","dir":"Articles","previous_headings":"Intro","what":"Partition data for evaluating models","title":"flexsdm: Modeling a rare species","text":"evaluate model performance, need specify data testing training. flexsdm offers range random spatial random data partition methods evaluating SDMs. use repeated K-fold cross-validation, suitable partition approach performing ESM.","code":"set.seed(10) # Repeated K-fold method hespero_pa2 <- part_random( data = hespero_pa, pr_ab = \"pr_ab\", method = c(method = \"rep_kfold\", folds = 5, replicates = 10) )"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v05_Rare_species_example.html","id":"extracting-environmental-values","dir":"Articles","previous_headings":"Intro","what":"Extracting environmental values","title":"flexsdm: Modeling a rare species","text":"Next, extract values four environmental predictors presence pseudo-absence locations.","code":"hespero_pa3 <- sdm_extract( data = hespero_pa2, x = 'x', y = 'y', env_layer = somevar, variables = c('aet', 'cwd', 'tmx', 'tmn') )"},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/articles/v05_Rare_species_example.html","id":"standard-models","dir":"Articles","previous_headings":"Intro > Modeling","what":"Standard models","title":"flexsdm: Modeling a rare species","text":"First, let’s use three standard algorithms model distribution Hesperocyparis stephensonii: GLM, GBM, SVM. case, use calibration area making predictions.","code":"mglm <- fit_glm( data = hespero_pa3, response = 'pr_ab', predictors = c('aet', 'cwd', 'tmx', 'tmn'), partition = '.part', thr = 'max_sens_spec' ) #> Formula used for model fitting: #> pr_ab ~ aet + cwd + tmx + tmn + I(aet^2) + I(cwd^2) + I(tmx^2) + I(tmn^2) #> Replica number: 1/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 2/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 3/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 4/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 5/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 6/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 7/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 8/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 9/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 10/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 mgbm <- fit_gbm( data = hespero_pa3, response = 'pr_ab', predictors = c('aet', 'cwd', 'tmx', 'tmn'), partition = '.part', thr = 'max_sens_spec' ) #> Formula used for model fitting: #> pr_ab ~ aet + cwd + tmx + tmn #> Replica number: 1/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 2/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 3/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 4/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 5/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 6/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 7/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 8/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 9/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 10/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 msvm <- fit_svm( data = hespero_pa3, response = 'pr_ab', predictors = c('aet', 'cwd', 'tmx', 'tmn'), partition = '.part', thr = 'max_sens_spec' ) #> Formula used for model fitting: #> pr_ab ~ aet + cwd + tmx + tmn #> Replica number: 1/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 2/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 3/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 4/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 5/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 6/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 7/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 8/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 9/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 #> Replica number: 10/10 #> Partition number: 1/5 #> Partition number: 2/5 #> Partition number: 3/5 #> Partition number: 4/5 #> Partition number: 5/5 mpred <- sdm_predict( models = list(mglm, mgbm, msvm), pred = somevar, con_thr = TRUE, predict_area = ca ) #> Predicting list of individual models"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v05_Rare_species_example.html","id":"ensemble-of-small-models","dir":"Articles","previous_headings":"Intro > Modeling","what":"Ensemble of small models","title":"flexsdm: Modeling a rare species","text":"Now let’s try algorithms ESM approach. Note predicting ESM, possible process one time.","code":"eglm <- esm_glm( data = hespero_pa3, response = 'pr_ab', predictors = c('aet', 'cwd', 'tmx', 'tmn'), partition = '.part', thr = 'max_sens_spec' ) #> | | | 0% | |============ | 17% | |======================= | 33% | |=================================== | 50% | |=============================================== | 67% | |========================================================== | 83% | |======================================================================| 100% egbm <- esm_gbm( data = hespero_pa3, response = 'pr_ab', predictors = c('aet', 'cwd', 'tmx', 'tmn'), partition = '.part', thr = 'max_sens_spec' ) #> | | | 0% | |============ | 17% | |======================= | 33% | |=================================== | 50% | |=============================================== | 67% | |========================================================== | 83% | |======================================================================| 100% esvm <- esm_svm( data = hespero_pa3, response = 'pr_ab', predictors = c('aet', 'cwd', 'tmx', 'tmn'), partition = '.part', thr = 'max_sens_spec' ) #> | | | 0% | |============ | 17% | |======================= | 33% | |=================================== | 50% | |=============================================== | 67% | |========================================================== | 83% | |======================================================================| 100% eglm_pred <- sdm_predict( models = eglm , pred = somevar, con_thr = TRUE, predict_area = ca ) #> Predicting ensemble of small models egbm_pred <- sdm_predict( models = egbm , pred = somevar, con_thr = TRUE, predict_area = ca ) #> Predicting ensemble of small models esvm_pred <- sdm_predict( models = esvm, pred = somevar, con_thr = TRUE, predict_area = ca ) #> Predicting ensemble of small models"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v05_Rare_species_example.html","id":"comparing-our-models","dir":"Articles","previous_headings":"Intro","what":"Comparing our models","title":"flexsdm: Modeling a rare species","text":"First, let’s take look spatial predictions models. spatial outputs suggest standard models tend predict broader areas high suitability values ESMs. Next, look performance metrics models, based repeated k-folds cross-validation partition method. can easily done using “sdm_summarize()” function flexsdm. , can see AUC, TSS, Jaccard index higher ESMs corresponding standard model. However, Boyce index Inverse Mean Absolute Error slightly higher standard models.","code":"par(mfrow = c(3, 2)) plot(mpred$glm, main = 'Standard GLM') #points(hespero$x, hespero$y, pch = 19) plot(eglm_pred[[1]], main = 'ESM GLM') #points(hespero$x, hespero$y, pch = 19) plot(mpred$gbm, main = 'Standard GBM') #points(hespero$x, hespero$y, pch = 19) plot(egbm_pred[[1]], main = 'ESM GBM') #points(hespero$x, hespero$y, pch = 19) plot(mpred$svm, main = 'Standard SVM') #points(hespero$x, hespero$y, pch = 19) plot(esvm_pred[[1]], main = 'ESM SVM') #points(hespero$x, hespero$y, pch = 19) merge_df <- sdm_summarize(models = list(mglm, mgbm, msvm, eglm, egbm, esvm)) knitr::kable( merge_df %>% dplyr::select( model, AUC = AUC_mean, TSS = TSS_mean, JACCARD = JACCARD_mean, BOYCE = BOYCE_mean, IMAE = IMAE_mean ) )"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v05_Rare_species_example.html","id":"conclusions","dir":"Articles","previous_headings":"Intro","what":"Conclusions","title":"flexsdm: Modeling a rare species","text":"Modeling decisions context-dependent must made case--case basis. However, ESM useful approach practitioners interested modeling rare species want avoid common model overfitting issues. always producing SDMs “real-world” applications, important consider spatial prediction patterns along multiple model performance metrics.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/articles/v05_Rare_species_example.html","id":"references","dir":"Articles","previous_headings":"Intro","what":"References","title":"flexsdm: Modeling a rare species","text":"Lomba, ., L. Pellissier, C. Randin, J. Vicente, F. Moreira, J. Honrado, . Guisan. 2010. Overcoming rare species modelling paradox: novel hierarchical framework applied Iberian endemic plant. Biological conservation 143:2647–2657. https://doi.org/10.1016/j.biocon.2010.07.007 Breiner, F. T., Guisan, ., Bergamini, ., & Nobis, M. P. (2015). Overcoming limitations modelling rare species using ensembles small models. Methods Ecology Evolution, 6(10), 1210–1218. https://doi.org/10.1111/2041-210X.12403 Breiner, F. T., Nobis, M. P., Bergamini, ., & Guisan, . (2018). Optimizing ensembles small models predicting distribution species occurrences. Methods Ecology Evolution, 9(4), 802–808. https://doi.org/10.1111/2041-210X.12957 Dubos, N., Montfort, F., Grinand, C., Nourtier, M., Deso, G., Probst, J.-M., Razafimanahaka, J. H., Andriantsimanarilafy, R. R., Rakotondrasoa, E. F., Razafindraibe, P., Jenkins, R., & Crottini, . (2021). narrow-ranging species doomed extinction? Projected dramatic decline future climate suitability two highly threatened species. Perspectives Ecology Conservation, S2530064421000894. https://doi.org/10.1016/j.pecon.2021.10.002","code":""},{"path":"https://sjevelazco.github.io/flexsdm/articles/v06_Extrapolation_example.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"flexsdm: Tools to explore extrapolation in SDMs","text":"Many SDM applications require model extrapolation, e.g., predictions beyond range data set used fit model. example, models often must extrapolate predicting habitat suitability novel environmental conditions induced climate change predicting spread invasive species outside native range based species-environment relationship observed native range. flexsdm, offer new approach (known Shape) evaluating extrapolation truncating spatial predictions based degree extrapolation measured. Shape model-agnostic approach calculating degree extrapolation given projection data point multivariate distance nearest training data point – capturing often complex shape data within environmental space. distances relativized factor reflects dispersion training data environmental space. implemented flexsdm, Shape approach also incorporates adjustable threshold allow binary discrimination acceptable unacceptable degrees extrapolation, based user’s needs applications. information Shape metric, recommend reading article Velazco et al., 2023. vignette, walk evaluate model extrapolation Hesperocyparis stephensonii (Cuyamaca cypress), conifer tree species endemic southern California. species listed Critically Endangered IUCN extremely restricted distribution, found headwaters King Creek San Diego County. Note: tutorial follows generally workflow vignette modeling distribution rare species using ensemble small models (ESM). However, instead constructing ESMs, evaluate model extrapolation predict models extent California Floristic Province (CFP).","code":""},{"path":"https://sjevelazco.github.io/flexsdm/articles/v06_Extrapolation_example.html","id":"data","dir":"Articles","previous_headings":"","what":"Data","title":"flexsdm: Tools to explore extrapolation in SDMs","text":"models, use four environmental variables influence plant distributions California: available evapotranspiration (aet), climatic water deficit (cwd), maximum temperature warmest month (tmx), minimum temperature coldest month (tmn). occurrence data include 21 geo-referenced observations downloaded online database Calflora.","code":"library(flexsdm) library(terra) library(dplyr) library(patchwork) # environmental data somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) names(somevar) <- c(\"cwd\", \"tmn\", \"aet\", \"ppt_jja\") # species occurence data (presence-only) data(hespero) hespero <- hespero %>% dplyr::select(-id) # California ecoregions regions <- system.file(\"external/regions.tif\", package = \"flexsdm\") regions <- terra::rast(regions) regions <- terra::as.polygons(regions) sp_region <- terra::subset(regions, regions$category == \"SCR\") # ecoregion where *Hesperocyparis stephensonii* is found # visualize the species occurrences plot( sp_region, col = \"gray80\", legend = FALSE, axes = FALSE, main = \"Hesperocyparis stephensonii occurrences\" ) points(hespero[, c(\"x\", \"y\")], col = \"black\", pch = 16) cols <- rep(\"gray80\", 8) cols[regions$category == \"SCR\"] <- \"yellow\" terra::inset( regions, loc = \"bottomleft\", scale = .3, col = cols )"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v06_Extrapolation_example.html","id":"delimit-calibration-area","dir":"Articles","previous_headings":"","what":"Delimit calibration area","title":"flexsdm: Tools to explore extrapolation in SDMs","text":"First, must define model’s calibration area. flexsdm package offers several methods defining model calibration area. , use 25-km buffer areas around presence points select pseudo-absence locations.","code":"ca <- calib_area( data = hespero, x = \"x\", y = \"y\", method = c(\"buffer\", width = 25000), crs = crs(somevar) ) # visualize the species occurrences & calibration area plot( sp_region, col = \"gray80\", legend = FALSE, axes = FALSE, main = \"Calibration area and occurrences\" ) plot(ca, add = TRUE) points(hespero[, c(\"x\", \"y\")], col = \"black\", pch = 16)"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v06_Extrapolation_example.html","id":"create-pseudo-absence-data","dir":"Articles","previous_headings":"","what":"Create pseudo-absence data","title":"flexsdm: Tools to explore extrapolation in SDMs","text":"often case rare species, species presence data. However, SDM methods require either pseudo-absence background point data. , use calibration area produce pseudo-absence data can used SDMs.","code":"# Sample the same number of species presences set.seed(10) psa <- sample_pseudoabs( data = hespero, x = \"x\", y = \"y\", n = sum(hespero$pr_ab), # number of pseudo-absence points equal to number of presences method = \"random\", rlayer = somevar, calibarea = ca ) # Visualize species presences and pseudo-absences plot( sp_region, col = \"gray80\", legend = FALSE, axes = FALSE, xlim = c(289347, 353284), ylim = c(-598052, -520709), main = \"Presence = yellow, Pseudo-absence = black\" ) plot(ca, add = TRUE) points(psa[, c(\"x\", \"y\")], cex = 0.8, pch = 16, col = \"black\") # Pseudo-absences points(hespero[, c(\"x\", \"y\")], col = \"yellow\", pch = 16, cex = 1.5) # Presences # Bind a presences and pseudo-absences hespero_pa <- bind_rows(hespero, psa) hespero_pa # Presence-Pseudo-absence database #> # A tibble: 42 × 3 #> x y pr_ab #> #> 1 316923. -557843. 1 #> 2 317155. -559234. 1 #> 3 316960. -558186. 1 #> 4 314347. -559648. 1 #> 5 317348. -557349. 1 #> 6 316753. -559679. 1 #> 7 316777. -558644. 1 #> 8 317050. -559043. 1 #> 9 316655. -559928. 1 #> 10 316418. -567439. 1 #> # ℹ 32 more rows"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v06_Extrapolation_example.html","id":"partition-data-for-evaluating-models","dir":"Articles","previous_headings":"","what":"Partition data for evaluating models","title":"flexsdm: Tools to explore extrapolation in SDMs","text":"evaluate model performance, need specify data testing training. flexsdm offers range random spatial random data partition methods evaluating SDMs. use repeated K-fold cross-validation, suitable partition approach validating SDM data.","code":"set.seed(10) # Repeated K-fold method hespero_pa2 <- part_random( data = hespero_pa, pr_ab = \"pr_ab\", method = c(method = \"rep_kfold\", folds = 5, replicates = 10) )"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v06_Extrapolation_example.html","id":"extracting-environmental-values","dir":"Articles","previous_headings":"","what":"Extracting environmental values","title":"flexsdm: Tools to explore extrapolation in SDMs","text":"Next, extract values four environmental predictors presence pseudo-absence locations.","code":"hespero_pa3 <- sdm_extract( data = hespero_pa2, x = \"x\", y = \"y\", env_layer = somevar, variables = c(\"cwd\", \"tmn\", \"aet\", \"ppt_jja\") )"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v06_Extrapolation_example.html","id":"modeling","dir":"Articles","previous_headings":"","what":"Modeling","title":"flexsdm: Tools to explore extrapolation in SDMs","text":"Let’s use three standard algorithms model distribution Hesperocyparis stephensonii: GLM, GBM, SVM. case, use extent CFP prediction area can evaluate model extrapolation across broad geographic area.","code":"mglm <- fit_glm( data = hespero_pa3, response = \"pr_ab\", predictors = c(\"cwd\", \"tmn\", \"aet\", \"ppt_jja\"), partition = \".part\", thr = \"max_sens_spec\" ) mgbm <- fit_gbm( data = hespero_pa3, response = \"pr_ab\", predictors = c(\"cwd\", \"tmn\", \"aet\", \"ppt_jja\"), partition = \".part\", thr = \"max_sens_spec\" ) msvm <- fit_svm( data = hespero_pa3, response = \"pr_ab\", predictors = c(\"cwd\", \"tmn\", \"aet\", \"ppt_jja\"), partition = \".part\", thr = \"max_sens_spec\" ) mpred <- sdm_predict( models = list(mglm, mgbm, msvm), pred = somevar, con_thr = TRUE, predict_area = NULL )"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v06_Extrapolation_example.html","id":"comparing-our-models","dir":"Articles","previous_headings":"","what":"Comparing our models","title":"flexsdm: Tools to explore extrapolation in SDMs","text":"First, let’s take look spatial predictions models. GLM GBM predict lot suitable habitat far species found!","code":"par(mfrow = c(1, 3)) plot(mpred$glm, main = \"GLM\") # points(hespero$x, hespero$y, pch = 19) plot(mpred$gbm, main = \"GBM\") # points(hespero$x, hespero$y, pch = 19) plot(mpred$svm, main = \"SVM\") # points(hespero$x, hespero$y, pch = 19)"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v06_Extrapolation_example.html","id":"partial-dependence-plots-to-explore-the-impact-of-predictor-conditions-on-suitability","dir":"Articles","previous_headings":"","what":"Partial dependence plots to explore the impact of predictor conditions on suitability","title":"flexsdm: Tools to explore extrapolation in SDMs","text":"Extrapolation reflects issue model handles novel data. , see three algorithms explored tutorial predict pretty different geographic patterns habitat suitability based occurrence/pseudo-absence data environmental predictors. Let’s take look partial dependence plots see marginal effect environmental predictors suitability looks like test models. function allows visualize model may extrapolate outside environmental conditions used training, visualizing “projection” data different color. case, environmental predictors cover extent CFP. flexsdm allows users plot univariate partial dependence plots (p_pdp) bivariate partial dependence plots (p_bpdp); shown model. Note: p_bpdp function allows users option show boundaries training data using either rectangle convex hull approach. use convex hull approach. Uni bivariate partial dependence plots GLM: Uni bivariate partial dependence plots GBM: Uni bivariate partial dependence plots SVM: plots show really interesting story! notably, GLM GBM show consistently high habitat suitability areas much higher actual evapotranspiration narrow range values used train model. However, SVM seems best job estimating high habitat suitability environmental values outside training data. Importantly, models can behave differently depending modeling situation context.","code":"p_pdp(model = mglm$model, training_data = hespero_pa3, projection_data = somevar) p_bpdp(model = mglm$model, training_data = hespero_pa3, training_boundaries = \"convexh\") p_pdp(model = mgbm$model, training_data = hespero_pa3, projection_data = somevar) p_bpdp(model = mgbm$model, training_data = hespero_pa3, training_boundaries = \"convexh\", resolution = 100) p_pdp(model = msvm$model, training_data = hespero_pa3, projection_data = somevar) p_bpdp(model = msvm$model, training_data = hespero_pa3, training_boundaries = \"convexh\")"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v06_Extrapolation_example.html","id":"extrapolation-evaluation","dir":"Articles","previous_headings":"","what":"Extrapolation evaluation","title":"flexsdm: Tools to explore extrapolation in SDMs","text":"Remember species highly restricted southern California! However, two models (GLM GBM) predict high habitat suitability throughout parts CFP, SVM provides conservative predictions. see GLM GBM tend predict high habitat suitability areas environmentally different training conditions. models extrapolating environmental space? Let’s find using “extra_eval” function SDM. function requires input model training data, column specifying presence vs. absence locations, projection data (can SpatRaster tibble containing data used model projection – can reflect larger region, separate region, different time period used model training), metric calculating degree extrapolation (default Mahalanobis distance, though euclidean also option- explore ), number cores parallel processing, aggregation factor, case want measure extrapolation large data set. First look degree extrapolation geographic space using Shape method based Mahalanobis distance. Also distinguish univariate combinatorial extrapolation. Using Mahalanobis distance: output extra_eval function SpatRaster, showing degree extrapolation across projection area, estimated Shape method. can also explore extrapolation suitability patterns environmental geographic space, using just one function. , use p_extra function. function plots ggplot object. Let’s start extrapolation evaluation. plots show areas high extrapolation (dark blue) far training data (shown black) environmental geographic space. higher extrapolation values extrapolation area northwestern portion CFP. Let’s explore univariate combinatorial extrapolation. former defined projecting data outside range training conditions, combinatorial extrapolation area projecting data within range training conditions.","code":"xp_m <- extra_eval( training_data = hespero_pa3, pr_ab = \"pr_ab\", projection_data = somevar, metric = \"mahalanobis\", univar_comb = TRUE, n_cores = 1, aggreg_factor = 1 ) xp_m #> class : SpatRaster #> dimensions : 558, 394, 2 (nrow, ncol, nlyr) #> resolution : 1890, 1890 (x, y) #> extent : -373685.8, 370974.2, -604813.3, 449806.7 (xmin, xmax, ymin, ymax) #> coord. ref. : +proj=aea +lat_0=0 +lon_0=-120 +lat_1=34 +lat_2=40.5 +x_0=0 +y_0=-4000000 +datum=NAD83 +units=m +no_defs #> source(s) : memory #> names : extrapolation, uni_comb #> min values : 0.000, 1 #> max values : 3730.677, 2 cl <- c(\"#FDE725\", \"#B3DC2B\", \"#6DCC57\", \"#36B677\", \"#1F9D87\", \"#25818E\", \"#30678D\", \"#3D4988\", \"#462777\", \"#440154\") par(mfrow = c(1, 2)) plot(xp_m$extrapolation, main = \"Shape metric\", col = cl) plot(xp_m$uni_comb, main = \"Univariate (1) and \\n combinatorial (2) extrapolation\", col = cl) p_extra( training_data = hespero_pa3, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", color_p = \"black\", extra_suit_data = xp_m, projection_data = somevar, geo_space = TRUE, prop_points = 0.05 ) #> Number of cell used to plot 3642 (5%) p_extra( training_data = hespero_pa3, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", color_p = \"black\", extra_suit_data = xp_m$uni_comb, projection_data = somevar, geo_space = TRUE, prop_points = 0.05, color_gradient = c(\"#B3DC2B\", \"#30678D\"), alpha_p = 0.2 ) #> Number of cell used to plot 3642 (5%)"},{"path":"https://sjevelazco.github.io/flexsdm/articles/v06_Extrapolation_example.html","id":"truncating-sdms-predictions-based-on-extrapolation-thresholds","dir":"Articles","previous_headings":"","what":"Truncating SDMs predictions based on extrapolation thresholds","title":"flexsdm: Tools to explore extrapolation in SDMs","text":"Depending user’s end goal, may want exclude suitability values environmentally “” far modeling training data. Shape method allows select extrapolation threshold exclude suitability values. truncating models can use p_extra function explore binary extrapolation patter environmental geographical space. test values 50, 100, 500, comparison. Values 1 (yellow one) depict environmental geographical regions constraint models suitability (truncate). Note lower threshold, restrictive environmental geographic regions used constrain model. Now use function extra_truncate truncate suitability predictions made GLM, GBM, SVM based extrapolation thresholds explored previously. note, threshold selection user-dependent, function allows select multiple thresholds one time compare outputs. Users can also select “trunc_value” within extra_truncate function, specifies value assigned cells exceed extrapolation threshold (also specified function). default 0 users also choose another value reduce suitability. Based maps, can see lower extrapolation threshold, restricted habitat suitability patterns, higher values retain greater amount suitable habitat. Selecting best threshold depend modeling goals objectives, . Want learn Shape extrapolation metrics? Read article “Velazco, S. J. E., Brooke, M. R., De Marco Jr., P., Regan, H. M., & Franklin, J. (2023). far can extrapolate species distribution model? Exploring Shape, novel method. Ecography, 11, e06992. https://doi.org/10.1111/ecog.06992”","code":"p_extra( training_data = hespero_pa3, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", color_p = \"black\", extra_suit_data = as.numeric(xp_m$extrapolation < 50), projection_data = somevar, geo_space = TRUE, prop_points = 0.05, color_gradient = c(\"gray\", \"#FDE725\"), alpha_p = 0.5 ) + plot_annotation(subtitle = \"Binary extrapolation pattern with using a threshold of 50\") #> Number of cell used to plot 3642 (5%) p_extra( training_data = hespero_pa3, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", color_p = \"black\", extra_suit_data = as.numeric(xp_m$extrapolation < 100), projection_data = somevar, geo_space = TRUE, prop_points = 0.05, color_gradient = c(\"gray\", \"#FDE725\"), alpha_p = 0.5 ) + plot_annotation(subtitle = \"Binary extrapolation pattern with using a threshold of 100\") #> Number of cell used to plot 3642 (5%) p_extra( training_data = hespero_pa3, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", color_p = \"black\", extra_suit_data = as.numeric(xp_m$extrapolation < 500), projection_data = somevar, geo_space = TRUE, prop_points = 0.05, color_gradient = c(\"gray\", \"#FDE725\"), alpha_p = 0.5 ) + plot_annotation(subtitle = \"Binary extrapolation pattern with using a threshold of 500\") #> Number of cell used to plot 3642 (5%) glm_trunc <- extra_truncate( suit = mpred$glm, extra = xp_m, threshold = c(50, 100, 500), trunc_value = 0 ) gbm_trunc <- extra_truncate( suit = mpred$gbm, extra = xp_m, threshold = c(50, 100, 500), trunc_value = 0 ) svm_trunc <- extra_truncate( suit = mpred$svm, extra = xp_m, threshold = c(50, 100, 500), trunc_value = 0 ) par(mfrow = c(3, 3)) plot(glm_trunc$`50`, main = \"GLM; extra threshold = 50\", col = cl) plot(glm_trunc$`100`, main = \"GLM; extra threshold = 100\", col = cl) plot(glm_trunc$`500`, main = \"GLM; extra threshold = 500\", col = cl) plot(gbm_trunc$`50`, main = \"GBM; extra threshold = 50\", col = cl) plot(gbm_trunc$`100`, main = \"GBM; extra threshold = 100\", col = cl) plot(gbm_trunc$`500`, main = \"GBM; extra threshold = 500\", col = cl) plot(svm_trunc$`50`, main = \"SVM; extra threshold = 50\", col = cl) plot(svm_trunc$`100`, main = \"SVM; extra threshold = 100\", col = cl) plot(svm_trunc$`500`, main = \"SVM; extra threshold = 500\", col = cl)"},{"path":"https://sjevelazco.github.io/flexsdm/authors.html","id":null,"dir":"","previous_headings":"","what":"Authors","title":"Authors and Citation","text":"Santiago J.E. Velazco. Author, maintainer. Brooke Rose. Author. André F.. Andrade. Author. Ignacio Minoli. Author. Janet Franklin. Author.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/authors.html","id":"citation","dir":"","previous_headings":"","what":"Citation","title":"Authors and Citation","text":"Velazco, S.J.E., Rose, M.B., Andrade, .F.., Minoli, ., Franklin, J. (2022). flexsdm: R package supporting comprehensive flexible species distribution modelling workflow. Methods Ecology Evolution, 13(8) 1661-1669. https://doi.org/10.1111/2041-210X.13874","code":"@Article{, title = {flexsdm: An R package for supporting a comprehensive and flexible species distribution modelling workflow}, author = {Santiago J.E. Velazco and Brooke Rose and André F.A. Andrade and Ignacio Minoli and Janet Franklin}, journal = {Methods in Ecology and Evolution}, year = {2022}, volume = {13}, number = {8}, pages = {1661-1669}, url = {https://onlinelibrary.wiley.com/doi/10.1111/2041-210X.13874}, }"},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/index.html","id":"overview","dir":"","previous_headings":"","what":"Overview","title":"Tools for Data Preparation, Fitting, Prediction, Evaluation, and Post-Processing of Species Distribution Models","text":"Species distribution modeling become standard tool several research areas ecology, conservation biology, biogeography, paleobiogeography, epidemiology. Species distribution modeling area active research theoretical methodological aspects. One exciting features flexsdm high manipulation parametrization capacity based different functions arguments. attributes enable users define complete partial modeling workflow specific modeling situation (e.g., number variables, number records, different algorithms, algorithms tuning, ensemble methods).","code":""},{"path":"https://sjevelazco.github.io/flexsdm/index.html","id":"structure-of-flexsdm","dir":"","previous_headings":"","what":"Structure of flexsdm","title":"Tools for Data Preparation, Fitting, Prediction, Evaluation, and Post-Processing of Species Distribution Models","text":"functions flexsdm package organized three major modeling steps","code":""},{"path":"https://sjevelazco.github.io/flexsdm/index.html","id":"id_1-pre-modeling-functions","dir":"","previous_headings":"","what":"1. Pre-modeling functions","title":"Tools for Data Preparation, Fitting, Prediction, Evaluation, and Post-Processing of Species Distribution Models","text":"Set tools prepare modeling input data (e.g., species occurrences thinning, sample pseudo-absences background points, delimitation calibration area). calib_area() Delimit calibration area constructing species distribution models correct_colinvar() Collinearity reduction predictors env_outliers() Integration outliers detection methods environmental space part_random() Data partitioning training testing models part_sblock() Spatial block cross validation part_sband() Spatial band cross validation part_senv() Environmental cross-validation plot_res() Plot different resolutions used part_sblock get_block() Transform spatial partition layer spatial properties environmental variables sample_background() Sample background points sample_pseudoabs() Sampel pseudo-absence sdm_directory() Create directories saving outputs flexsdm sdm_extract() Extract environmental data based x y coordinates occfilt_env() Perform environmental filtering species occurrences occfilt_geo() Perform geographical filtering species occurrences","code":""},{"path":"https://sjevelazco.github.io/flexsdm/index.html","id":"id_2-modeling-functions","dir":"","previous_headings":"","what":"2. Modeling functions","title":"Tools for Data Preparation, Fitting, Prediction, Evaluation, and Post-Processing of Species Distribution Models","text":"includes functions related modeling construction validation. Several can grouped fit_*, tune_*, esm_* family functions. fit_* construct validate models default hyper-parameter values. tune_* construct validate models searching best hyper-parameter values combination. esm_ construct validate Ensemble Small Models.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/index.html","id":"model-evaluation","dir":"","previous_headings":"2. Modeling functions","what":"Model evaluation","title":"Tools for Data Preparation, Fitting, Prediction, Evaluation, and Post-Processing of Species Distribution Models","text":"sdm_eval() Calculate different model performance metrics","code":""},{"path":"https://sjevelazco.github.io/flexsdm/index.html","id":"fit_-functions-family","dir":"","previous_headings":"2. Modeling functions","what":"fit_* functions family","title":"Tools for Data Preparation, Fitting, Prediction, Evaluation, and Post-Processing of Species Distribution Models","text":"fit_gam() Fit validate Generalized Additive Models fit_gau() Fit validate Gaussian Process models fit_gbm() Fit validate Generalized Boosted Regression models fit_glm() Fit validate Generalized Linear Models fit_max() Fit validate Maximum Entropy models fit_net() Fit validate Neural Networks models fit_raf() Fit validate Random Forest models fit_svm() Fit validate Support Vector Machine models","code":""},{"path":"https://sjevelazco.github.io/flexsdm/index.html","id":"tune_-functions-family","dir":"","previous_headings":"2. Modeling functions","what":"tune_* functions family","title":"Tools for Data Preparation, Fitting, Prediction, Evaluation, and Post-Processing of Species Distribution Models","text":"tune_gbm() Fit validate Generalized Boosted Regression models exploration hyper-parameters tune_max() Fit validate Maximum Entropy models exploration hyper-parameters tune_net() Fit validate Neural Networks models exploration hyper-parameters tune_raf() Fit validate Random Forest models exploration hyper-parameters tune_svm() Fit validate Support Vector Machine models exploration hyper-parameters","code":""},{"path":"https://sjevelazco.github.io/flexsdm/index.html","id":"model-ensemble","dir":"","previous_headings":"2. Modeling functions","what":"Model ensemble","title":"Tools for Data Preparation, Fitting, Prediction, Evaluation, and Post-Processing of Species Distribution Models","text":"fit_ensemble() Fit validate ensemble models different ensemble methods","code":""},{"path":"https://sjevelazco.github.io/flexsdm/index.html","id":"esm_-functions-family","dir":"","previous_headings":"2. Modeling functions","what":"esm_* functions family","title":"Tools for Data Preparation, Fitting, Prediction, Evaluation, and Post-Processing of Species Distribution Models","text":"esm_gam() Fit validate Generalized Additive Models Ensemble Small Model approach esm_gau() Fit validate Gaussian Process models Models Ensemble Small Model approach esm_gbm() Fit validate Generalized Boosted Regression models Ensemble Small Model approach esm_glm() Fit validate Generalized Linear Models Ensemble Small Model approach esm_max() Fit validate Maximum Entropy models Ensemble Small Model approach esm_net() Fit validate Neural Networks models Ensemble Small Model approach esm_svm() Fit validate Support Vector Machine models Ensemble Small Model approach","code":""},{"path":"https://sjevelazco.github.io/flexsdm/index.html","id":"id_3-post-modeling-functions","dir":"","previous_headings":"","what":"3. Post-modeling functions","title":"Tools for Data Preparation, Fitting, Prediction, Evaluation, and Post-Processing of Species Distribution Models","text":"Tools related models’ geographical predictions, evaluation, correction. sdm_predict() Spatial predictions individual ensemble model sdm_summarize() Merge model performance tables interp() Raster interpolation two time periods extra_eval() Measure model extrapolation extra_truncate() Constraint suitability values given extrapolation value msdm_priori() Create spatial predictor variables reduce overprediction species distribution models msdm_posteriori() Methods correct overprediction species distribution models based occurrences suitability patterns.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/index.html","id":"id_4-graphical-model-exploration","dir":"","previous_headings":"","what":"4. Graphical model exploration","title":"Tools for Data Preparation, Fitting, Prediction, Evaluation, and Post-Processing of Species Distribution Models","text":"Useful tools visually explore models’ geographical environemtal predictions, model extrapolation, partial depnendece plot. p_pdp() Create partial dependence plot(s) explore marginal effect predictors suitability p_bpdp() Create partial dependence surface plot(s) explore bivariate marginal effect predictors suitability p_extra() Graphical exploration extrapolation suitability pattern environmental geographical space data_pdp() Calculate data construct partial dependence plots data_bpdp() Calculate data construct partial dependence surface plots","code":""},{"path":"https://sjevelazco.github.io/flexsdm/index.html","id":"installation","dir":"","previous_headings":"","what":"Installation","title":"Tools for Data Preparation, Fitting, Prediction, Evaluation, and Post-Processing of Species Distribution Models","text":"can install development version flexsdm github ⚠️ NOTE: version 1.4-22 terra package causing errors trying instal flexsdm. Please, first install version ≥ 1.5-12 terra package available CRAN development version terra flexsdm.","code":"# install.packages(\"remotes\") # For Windows and Mac OS operating systems remotes::install_github(\"sjevelazco/flexsdm\") # For Linux operating system remotes::install_github(\"sjevelazco/flexsdm@HEAD\")"},{"path":"https://sjevelazco.github.io/flexsdm/index.html","id":"package-website","dir":"","previous_headings":"","what":"Package website","title":"Tools for Data Preparation, Fitting, Prediction, Evaluation, and Post-Processing of Species Distribution Models","text":"See package website (https://sjevelazco.github.io/flexsdm/) functions explanation vignettes.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/index.html","id":"package-citation","dir":"","previous_headings":"","what":"Package citation","title":"Tools for Data Preparation, Fitting, Prediction, Evaluation, and Post-Processing of Species Distribution Models","text":"Velazco, S.J.E., Rose, M.B., Andrade, .F.., Minoli, ., Franklin, J. (2022). flexsdm: R package supporting comprehensive flexible species distribution modelling workflow. Methods Ecology Evolution, 13(8) 1661–1669. https://doi.org/10.1111/2041-210X.13874 Test package give us feedback send e-mail sjevelazco@gmail.com.","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/pkg_citation/index.html","id":null,"dir":"Pkg_citation","previous_headings":"","what":"Function reference","title":"Function reference","text":"abies data set containing localities environmental condition Abies (fir tree) species California, USA backg data set containing environmental conditions background points calib_area() Delimit calibration area constructing species distribution models correct_colinvar() Collinearity reduction predictor variables data_bpdp() Calculate data construct partial dependence surface plots data_pdp() Calculate data construct partial dependence plots env_outliers() Integration outliers detection methods environmental space esm_gam() Fit validate Generalized Additive Models based Ensembles Small Models approach esm_gau() Fit validate Gaussian Process models based Ensembles Small Models approach esm_gbm() Fit validate Generalized Boosted Regression models based Ensembles Small Models approach esm_glm() Fit validate Generalized Linear Models based Ensembles Small Models approach esm_max() Fit validate Maximum Entropy Models based Ensemble Small Model approach esm_net() Fit validate Neural Networks based Ensembles Small Models approach esm_svm() Fit validate Support Vector Machine models based Ensembles Small Models approach extra_eval() Measure model extrapolation based Shape extrapolation metric extra_truncate() Truncate suitability predictions based extrapolation value fit_ensemble() Ensemble model fitting validation fit_gam() Fit validate Generalized Additive Models fit_gau() Fit validate Gaussian Process models fit_gbm() Fit validate Generalized Boosted Regression models fit_glm() Fit validate Generalized Linear Models fit_max() Fit validate Maximum Entropy models fit_net() Fit validate Neural Networks models fit_raf() Fit validate Random Forests models fit_svm() Fit validate Support Vector Machine models get_block() Transform spatial partition layer spatial properties environmental variables hespero data set containing localities Hesperocyparis stephensonii species California, USA homogenize_na() Homogenize cells NAs across layers interp() Raster interpolation two time periods msdm_posteriori() Methods correct overprediction species distribution models based occurrences suitability patterns. msdm_priori() Create spatial predictor variables reduce overprediction species distribution models occfilt_env() Perform environmental filtering species occurrences occfilt_geo() Perform geographical filtering species occurrences part_random() Conventional data partitioning methods part_sband() Spatial band cross-validation part_sblock() Spatial block cross-validation part_senv() Environmental spatial cross-validation plot_res() Plot different resolutions used part_sblock p_bpdp() Bivariate partial dependence plot p_extra() Graphical exploration extrapolation suitability pattern environmental geographical space p_pdp() Partial Dependent Plot sample_background() Sample background points sample_pseudoabs() Sample pseudo-absences sdm_directory() Create directories saving outputs flexsdm sdm_eval() Calculate different model performance metrics sdm_extract() Extract environmental data values spatial raster based x y coordinates sdm_predict() Spatial predictions individual ensemble models sdm_summarize() Merge model performance tables spp data set containing presences absences three virtual species tune_gbm() Fit validate Generalized Boosted Regression models exploration hyper-parameters optimize performance tune_max() Fit validate Maximum Entropy models exploration hyper-parameters optimize performance tune_net() Fit validate Neural Networks models exploration hyper-parameters tune_raf() Fit validate Random Forest models exploration hyper-parameters optimize performance tune_svm() Fit validate Support Vector Machine models exploration hyper-parameters optimize performance","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/abies.html","id":null,"dir":"Reference","previous_headings":"","what":"A data set containing localities and environmental condition of an Abies (fir tree) species in California, USA — abies","title":"A data set containing localities and environmental condition of an Abies (fir tree) species in California, USA — abies","text":"data set containing localities environmental condition Abies (fir tree) species California, USA","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/abies.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"A data set containing localities and environmental condition of an Abies (fir tree) species in California, USA — abies","text":"","code":"abies"},{"path":"https://sjevelazco.github.io/flexsdm/reference/abies.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"A data set containing localities and environmental condition of an Abies (fir tree) species in California, USA — abies","text":"tibble object 5000 rows 10 variables: ID presences absences records ID pr_ab presence absences denoted 1 0 respectively x y columns coordinates Albers Equal Area Conic coordinate system column aet landform columns values environmental variables locality","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/abies.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"A data set containing localities and environmental condition of an Abies (fir tree) species in California, USA — abies","text":"","code":"if (FALSE) { # \\dontrun{ require(dplyr) data(\"abies\") abies } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/backg.html","id":null,"dir":"Reference","previous_headings":"","what":"A data set containing environmental conditions of background points — backg","title":"A data set containing environmental conditions of background points — backg","text":"data set containing environmental conditions background points","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/backg.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"A data set containing environmental conditions of background points — backg","text":"","code":"backg"},{"path":"https://sjevelazco.github.io/flexsdm/reference/backg.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"A data set containing environmental conditions of background points — backg","text":"tibble object 5000 rows 10 variables: pr_ab background point denoted 0 x y columns geographical coordinates column aet landform columns values environmental variables coordinate locations","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/backg.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"A data set containing environmental conditions of background points — backg","text":"","code":"if (FALSE) { # \\dontrun{ require(dplyr) data(\"backg\") backg } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/calib_area.html","id":null,"dir":"Reference","previous_headings":"","what":"Delimit calibration area for constructing species distribution models — calib_area","title":"Delimit calibration area for constructing species distribution models — calib_area","text":"function offers different methods define calibration area. output used flexsdm functions like sample_backgroud, sample_pseudoabs, sdm_predict, among others","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/calib_area.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Delimit calibration area for constructing species distribution models — calib_area","text":"","code":"calib_area(data, x, y, method, groups = NULL, crs = NULL)"},{"path":"https://sjevelazco.github.io/flexsdm/reference/calib_area.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Delimit calibration area for constructing species distribution models — calib_area","text":"data data.frame tibble. Database presences x character. Column name longitude data y character. Column name latitude data method character. Method used delimiting calibration area. necessary concatenate (c()) different objects argument. following methods implemented: buffer: calibration area defined buffer around presences. Usage method = c('buffer', width=40000). value buffer width m must provided CRS longitude/latitude, map units cases mcp: calibration area defined minimum convex polygon. Usage method = 'mcp'. bmcp: calibration area defined buffered minimum convex polygon buffer width. Usage method = c('bmcp', width=40000). value buffer width m must provided CRS longitude/latitude, map units cases mask: calibration area defined selected polygons spatial vector object intersected presences. Usage method = c(\"mask\", clusters, \"DN\"). second concatenated element must SpatVector, third element character column name SpatVector used filtering polygons. groups character. Column name indicating differentiated subsets points. used mcp bmcp method. Default NULL crs character. Coordinate reference system used transforming occurrences outputs. set NULL, result mask method crs SpatVector used. Define crs mandatory buffer, mcp bmcp method.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/calib_area.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Delimit calibration area for constructing species distribution models — calib_area","text":"SpatVector","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/calib_area.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Delimit calibration area for constructing species distribution models — calib_area","text":"","code":"if (FALSE) { # \\dontrun{ require(terra) require(dplyr) data(\"spp\") clusters <- system.file(\"external/clusters.shp\", package = \"flexsdm\") clusters <- terra::vect(clusters) single_spp <- spp %>% dplyr::filter(species == \"sp1\") %>% dplyr::filter(pr_ab == 1) %>% dplyr::select(-pr_ab) plot(clusters) points(single_spp[-1], col=\"red\") crs(clusters, proj=TRUE) # coordinate reference system (CRS) used for this points database # note that the unit of this CRS is in m, consequently the buffer width # will be interpreted in m too # buffer method ca_1 <- calib_area( data = single_spp, x = \"x\", y = \"y\", method = c(\"buffer\", width = 40000), crs = crs(clusters) ) plot(ca_1) points(single_spp[, 2:3], pch = 19, cex = 0.5) # mcp method ca_2 <- calib_area( data = single_spp, x = \"x\", y = \"y\", method = \"mcp\", crs = crs(clusters) ) plot(ca_2) points(single_spp[, 2:3], pch = 19, cex = 0.5) # mcp method for different groups single_spp <- single_spp %>% mutate(groups = ifelse(x > 150000, \"a\", \"b\")) plot(single_spp[, 2:3], pch = 19, col = \"blue\") points(single_spp[single_spp$groups == \"a\", 2:3], col = \"red\", pch = 19) points(single_spp[, 2:3]) ca_2.1 <- calib_area( data = single_spp, x = \"x\", y = \"y\", method = c(\"mcp\"), crs = crs(clusters), groups = \"groups\" ) plot(ca_2.1) points(single_spp[, 2:3], pch = 19, cex = 0.5) # bmcp method ca_3 <- calib_area( data = single_spp, x = \"x\", y = \"y\", method = c(\"bmcp\", width = 30000), crs = crs(clusters) ) plot(ca_3) points(single_spp[, 2:3], pch = 19, cex = 0.5) # bmcp method for different groups ca_3.1 <- calib_area( data = single_spp, x = \"x\", y = \"y\", method = c(\"bmcp\", width = 30000), crs = crs(clusters), groups = \"groups\" ) plot(ca_3.1) points(single_spp[, 2:3], pch = 19, cex = 0.5) # mask method plot(clusters) names(clusters) ca_3.1 <- calib_area( data = single_spp, x = \"x\", y = \"y\", method = c(\"mask\", clusters, \"clusters\"), ) plot(ca_3.1) points(single_spp[, 2:3], pch = 19, cex = 0.5, col = \"red\") } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/correct_colinvar.html","id":null,"dir":"Reference","previous_headings":"","what":"Collinearity reduction of predictor variables — correct_colinvar","title":"Collinearity reduction of predictor variables — correct_colinvar","text":"Collinearity reduction predictor variables","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/correct_colinvar.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Collinearity reduction of predictor variables — correct_colinvar","text":"","code":"correct_colinvar( env_layer, method, proj = NULL, save_proj = NULL, restric_to_region = NULL, restric_pca_proj = FALSE, maxcell = NULL )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/correct_colinvar.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Collinearity reduction of predictor variables — correct_colinvar","text":"env_layer SpatRaster object class SpatRaster containing predictors. function allow categorical variables method character. Collinearity reduction method. necessary provide vector argument. next methods implemented: pearson: Highlights correlated variables according Pearson correlation. threshold maximum correlation must specified. Otherwise, threshold 0.7 defined default. Usage method = c('pearson', th='0.7'). vif: Select variables Variance Inflation Factor, threshold can specified user. Otherwise, threshold 10 defined default.Usage method = c('vif', th = '10'). pca: Perform Principal Component Analysis use principal components new predictors. selected components account 95% whole variation system. Usage method = c('pca'). fa: Perform Factorial Analysis select, original predictors, number factors defined Broken-Stick variables highest correlation factors selected. Usage method = c('fa'). proj character. used pca method. Path folder contains sub-folders different projection scenarios. Variables names must names raster used env_layer argument. Usage proj = \"C:/User/Desktop/Projections\" (see Details use argument) save_proj character. Directory save PCA projection. Default NULL. restric_to_region SpatVector. Area used restrict cells env_layer moment perform collinearity reduction. Default: NULL. restric_pca_proj logical. Area used restrict geographically PCA projection within SpatVector used restric_to_region. use PCA analysis. Default: FALSE. maxcell numeric. Number raster cells randomly sampled. Taking sample useful reduce memory usage large rasters. NULL, function use raster cells. Default NULL. Usage maxcell = 50000.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/correct_colinvar.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Collinearity reduction of predictor variables — correct_colinvar","text":"#' 'pearson', returns list following elements: cor_table: matrix object pairwise correlation values environmental variables cor_variables: list object length number environmental values containing pairwise relations exceeded correlation threshold one environmental variables 'vif' method, returns list following elements: env_layer: SpatRaster object selected environmental variables removed_variables: character vector removed environmental variables vif_table: data frame VIF values environmental variables 'pca' method, returns list following elements: env_layer: SpatRaster scores selected principal component (PC) sum 95% whole variation original environmental variables coefficients: matrix coefficient principal component (PC) predictors cumulative_variance: tibble cumulative variance explained selected principal component (PC) 'fa' method, returns list following elements: env_layer: SpatRaster scores selected variables due correlation factors. number_factors: number factors selected according Broken-Stick criteria, removed_variables: removed variables, uniqueness: uniqueness environmental variable according factorial analysis, loadings: environmental variables loadings chosen factors","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/correct_colinvar.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Collinearity reduction of predictor variables — correct_colinvar","text":"case environmental variables current conditions time periods (future present), recommended perform PCA analysis current environmental condition project PCA time periods. , necessary use “proj” argument. Path folder (e.g., projections) contains sub-folders different projection scenarios (e.g., years emissions). Within sub-folder must stored single multiband rasters environmental variables. example: C:/Users/my_pc/projections/ ├── MRIESM_2050_ssp126 │ └── var1.tif │ └── var2.tif │ └── var3.tif ├── MRIESM_2080_ssp585 │ └── var1.tif │ └── var2.tif │ └── var3.tif ├── UKESM_2050_ssp370 │ └── var1.tif │ └── var2.tif │ └── var3.tif pca method run time projections, correct_colinvar function create Projection_PCA (exact path path object returned function) system sub-folders multiband raster principal components (pcs.tif) C:/Users/my_pc/Projection_PCA/ ├── MRIESM_2050_ssp126 │ └── pcs.tif # multiband tif principal components ├── MRIESM_2080_ssp585 │ └── pcs.tif ├── UKESM_2050_ssp370 │ └── pcs.tif","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/correct_colinvar.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Collinearity reduction of predictor variables — correct_colinvar","text":"","code":"if (FALSE) { # \\dontrun{ require(terra) require(dplyr) somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) # Perform pearson collinearity control var <- correct_colinvar(env_layer = somevar, method = c(\"pearson\", th = \"0.7\")) var$cor_table var$cor_variables # For all correct_colinvar methods it is possible to take a sample or raster to reduce memory var <- correct_colinvar(env_layer = somevar, method = c(\"pearson\", th = \"0.7\"), maxcell = 10000) var$cor_table var$cor_variables # Perform vif collinearity control var <- correct_colinvar(env_layer = somevar, method = c(\"vif\", th = \"8\")) var$env_layer var$removed_variables var$vif_table # Perform pca collinearity control var <- correct_colinvar(env_layer = somevar, method = c(\"pca\")) plot(var$env_layer) var$env_layer var$coefficients var$cumulative_variance # Perform pca collinearity control with different projections ## Below will be created a set of folders to simulate the structure of the directory where ## environmental variables are stored for different scenarios dir_sc <- file.path(tempdir(), \"projections\") dir.create(dir_sc) dir_sc <- file.path(dir_sc, c('scenario_1', 'scenario_2')) sapply(dir_sc, dir.create) somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) terra::writeRaster(somevar, file.path(dir_sc[1], \"somevar.tif\"), overwrite=TRUE) terra::writeRaster(somevar, file.path(dir_sc[2], \"somevar.tif\"), overwrite=TRUE) ## Perform pca with projections dir_w_proj <- dirname(dir_sc[1]) dir_w_proj var <- correct_colinvar(env_layer = somevar, method = \"pca\", proj = dir_w_proj) var$env_layer var$coefficients var$cumulative_variance var$proj # Perform fa colinearity control var <- correct_colinvar(env_layer = somevar, method = c(\"fa\")) var$env_layer var$number_factors var$removed_variables var$uniqueness var$loadings ##%######################################################%## # # #### Other option to perform PCA #### #### considering cell restricted to a region #### # # ##%######################################################%## # Define a calibration area abies2 <- abies %>% dplyr::select(x, y, pr_ab) %>% dplyr::filter(pr_ab==1) plot(somevar[[1]]) points(abies2[-3]) ca <- calib_area(abies2, x = \"x\", y = \"y\", method = c(\"mcp\"), crs=crs(somevar)) plot(ca, add=T) # Full geographical range to perform PCA pca_fr <- correct_colinvar(env_layer = somevar , method = c(\"pca\"), maxcell = NULL, restric_to_region = NULL, restric_pca_proj = FALSE) # Perform PCA only with cell delimited by polygon used in restric_to_region pca_rr <- correct_colinvar(env_layer = somevar , method = c(\"pca\"), maxcell = NULL, restric_to_region = ca, restric_pca_proj = FALSE) # Perform and predicted PCA only with cell delimited by polygon used in restric_to_region pca_rrp <- correct_colinvar(env_layer = somevar , method = c(\"pca\"), maxcell = NULL, restric_to_region = ca, restric_pca_proj = TRUE) plot(pca_fr$env_layer) # PCA with all cells plot(pca_rr$env_layer) # PCA with calibration area cell but predicted for entire region plot(pca_rrp$env_layer) # PCA performed and predicted for cells within calibration area (ca) } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/data_bpdp.html","id":null,"dir":"Reference","previous_headings":"","what":"Calculate data to construct partial dependence surface plots — data_bpdp","title":"Calculate data to construct partial dependence surface plots — data_bpdp","text":"Calculate data construct Partial dependence surface plot (.e., bivariate dependence plot) two predictor set","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/data_bpdp.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Calculate data to construct partial dependence surface plots — data_bpdp","text":"","code":"data_bpdp( model, predictors, resolution = 50, training_data = NULL, training_boundaries = NULL, projection_data = NULL, clamping = FALSE )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/data_bpdp.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Calculate data to construct partial dependence surface plots — data_bpdp","text":"model model object class \"gam\", \"gbm\", \"glm\", \"graf\", \"ksvm\", \"ksvm\", \"maxnet”, “nnet\", \"randomForest\" model can found first element list returned function fit_, tune_, esm_ function families predictors character. Vector two predictor name(s) plot. NULL predictors plotted. Default NULL resolution numeric. Number equally spaced points predict continuous predictors. Default 50 training_data data.frame. Database response (0,1) predictor values used fit model. Default NULL training_boundaries character. Plot training conditions boundaries based training data (.e., presences, presences absences, etc). training_boundaries = \"convexh\", function delimit training environmental region based convex-hull. training_boundaries = \"rectangle\", function delimit training environmental region based four straight lines. used methods necessary provide data training_data argument. NULL predictors used. Default NULL. projection_data SpatRaster. Raster layer environmental variables used model projection. Default NULL clamping logical. Perform clamping. maxent models. Default FALSE","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/data_bpdp.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Calculate data to construct partial dependence surface plots — data_bpdp","text":"list two tibbles \"pdpdata\" \"resid\". pspdata: data construct partial dependence surface plot, first two column includes values selected environmental variables, third column predicted suitability. training_boundaries: data plot boundaries training data.","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/data_bpdp.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Calculate data to construct partial dependence surface plots — data_bpdp","text":"","code":"if (FALSE) { # \\dontrun{ library(terra) library(dplyr) somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) # environmental data names(somevar) <- c(\"aet\", \"cwd\", \"tmx\", \"tmn\") data(abies) abies2 <- abies %>% select(x, y, pr_ab) abies2 <- sdm_extract(abies2, x = \"x\", y = \"y\", env_layer = somevar ) abies2 <- part_random(abies2, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 5) ) m <- fit_svm( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"cwd\", \"tmx\", \"tmn\"), partition = \".part\", thr = c(\"max_sens_spec\") ) df <- data_bpdp( model = m$model, predictors = c(\"aet\", \"cwd\"), resolution = 50, projection_data = somevar, training_boundaries = \"rectangle\", training_data = abies2, clamping = TRUE ) df names(df) df$pspdata df$training_boundaries # see p_bpdp to construct partial dependence plot with ggplot2 } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/data_pdp.html","id":null,"dir":"Reference","previous_headings":"","what":"Calculate data to construct partial dependence plots — data_pdp","title":"Calculate data to construct partial dependence plots — data_pdp","text":"Calculate data construct partial dependence plots given predictor","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/data_pdp.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Calculate data to construct partial dependence plots — data_pdp","text":"","code":"data_pdp( model, predictors, resolution = 50, resid = FALSE, training_data = NULL, projection_data = NULL, clamping = FALSE )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/data_pdp.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Calculate data to construct partial dependence plots — data_pdp","text":"model model object class \"gam\", \"gbm\", \"glm\", \"graf\", \"ksvm\", \"ksvm\", \"maxnet”, “nnet\", \"randomForest\" model can found first element list returned function fit_, tune_, esm_ function families predictors character. Vector predictor name. resolution numeric. Number equally spaced points predict continuous predictors. Default 50 resid logical. Calculate residuals based training data. Default FALSE training_data data.frame. Database response (0,1) predictor values used fit model. Default NULL projection_data SpatRaster. Raster layer environmental variables used model projection. argument used, function calculate partial dependence curves distinguishing conditions used training projection conditions (.e., projection data present projection area training). Default NULL clamping logical. Perform clamping. maxent models. Default FALSE","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/data_pdp.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Calculate data to construct partial dependence plots — data_pdp","text":"list two tibbles \"pdpdata\" \"resid\". pdpdata: data construct partial dependence plots, first column includes values selected environmental variable, second column predicted suitability, third column range type, two values Training Projecting, referring suitability calculated within outside range training conditions. Third column returned \"projection_data\" argument used resid: data plot residuals. first column includes values selected environmental variable second column predicted suitability.","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/data_pdp.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Calculate data to construct partial dependence plots — data_pdp","text":"","code":"if (FALSE) { # \\dontrun{ library(terra) library(dplyr) somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) # environmental data names(somevar) <- c(\"aet\", \"cwd\", \"tmx\", \"tmn\") data(abies) abies2 <- abies %>% select(x, y, pr_ab) abies2 <- sdm_extract(abies2, x = \"x\", y = \"y\", env_layer = somevar ) abies2 <- part_random(abies2, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 5) ) svm_t1 <- fit_svm( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"cwd\", \"tmx\", \"tmn\"), partition = \".part\", thr = c(\"max_sens_spec\") ) df <- data_pdp( model = svm_t1$model, predictors = c(\"aet\"), resolution = 100, resid = TRUE, projection_data = somevar, training_data = abies2, clamping = FALSE ) df names(df) df$pdpdata df$resid plot(df$pdpdata[1:2], type = \"l\") points(df$resid[1:2], cex = 0.5) # see p_pdp to construct partial dependence plot with ggplot2 } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/data_psp.html","id":null,"dir":"Reference","previous_headings":"","what":"Calculate data to construct partial dependence surface plots — data_psp","title":"Calculate data to construct partial dependence surface plots — data_psp","text":"Calculate data construct Partial dependence surface plot (.e., bivariate dependence plot) two predictor set","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/data_psp.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Calculate data to construct partial dependence surface plots — data_psp","text":"","code":"data_psp( model, predictors, resolution = 50, training_data = NULL, pchull = FALSE, projection_data = NULL, clamping = FALSE )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/data_psp.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Calculate data to construct partial dependence surface plots — data_psp","text":"model model object class \"gam\", \"gbm\", \"glm\", \"graf\", \"ksvm\", \"ksvm\", \"maxnet”, “nnet\", \"randomForest\" model can found first element list returned function fit_, tune_, esm_ function families predictors character. Vector two predictor name(s) plot. NULL predictors plotted. Default NULL resolution numeric. Number equally spaced points predict continuous predictors. Default 50 training_data data.frame. Database response (0,1) predictor values used fit model. Default NULL pchull logical. Extract convex-hull limit training data. Default FALSE projection_data SpatRaster. Raster layer environmental variables used model projection. Default NULL clamping logical. Perform clamping. maxent models. Default FALSE","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/data_psp.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Calculate data to construct partial dependence surface plots — data_psp","text":"list two tibbles \"pdpdata\" \"resid\". pspdata: data construct partial dependence surface plot, first two column includes values selected environmental variables, third column predicted suitability. pchull: data plot residuals convex hull polygon bounding calibration data.","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/data_psp.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Calculate data to construct partial dependence surface plots — data_psp","text":"","code":"if (FALSE) { library(terra) library(dplyr) somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) # environmental data names(somevar) <- c(\"aet\", \"cwd\", \"tmx\", \"tmn\") data(abies) abies2 <- abies %>% select(x, y, pr_ab) abies2 <- sdm_extract(abies2, x = \"x\", y = \"y\", env_layer = somevar ) abies2 <- part_random(abies2, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 5) ) m <- fit_svm( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"cwd\", \"tmx\", \"tmn\"), partition = \".part\", thr = c(\"max_sens_spec\") ) df <- data_psp( model = m$model, predictors = c(\"aet\", \"cwd\"), resolution = 50, projection_data = somevar, pchull = TRUE, training_data = abies2, clamping = TRUE ) df names(df) df$pspdata df$pchull # see p_psp to construct partial dependence plot with ggplot2 }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/env_outliers.html","id":null,"dir":"Reference","previous_headings":"","what":"Integration of outliers detection methods in environmental space — env_outliers","title":"Integration of outliers detection methods in environmental space — env_outliers","text":"function performs different methods detecting outliers species distribution data based environmental conditions occurrences. methods need presence absence data (e.g. Two-class Support Vector Machine Random Forest) use presences (e.g. Reverse Jackknife, Box-plot, Random Forest outliers) . Outlier detection can useful procedure occurrence data cleaning (Chapman 2005, Liu et al., 2018).","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/env_outliers.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Integration of outliers detection methods in environmental space — env_outliers","text":"","code":"env_outliers(data, x, y, pr_ab, id, env_layer)"},{"path":"https://sjevelazco.github.io/flexsdm/reference/env_outliers.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Integration of outliers detection methods in environmental space — env_outliers","text":"data data.frame tibble presence (presence-absence) records, coordinates x character. Column name longitude data. y character. Column name latitude data. pr_ab character. Column name presence absence data (.e. 1 0) id character. Column name row id. row (record) must unique code. env_layer SpatRaster. Raster environmental variables","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/env_outliers.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Integration of outliers detection methods in environmental space — env_outliers","text":"tibble object database used 'data' argument seven additional columns, 1 0 denote presence detected outliers .out_bxpt: outliers detected Box-plot method .out_jack: outliers detected Reverse Jackknife method .out_svm: outliers detected Support Vector Machine method .out_rf: outliers detected Random Forest method .out_rfout: outliers detected Random Forest Outliers method .out_sum: frequency presences records detected outliers based previews methods (values 0 6).","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/env_outliers.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Integration of outliers detection methods in environmental space — env_outliers","text":"function apply outliers detection methods occurrence data. Box-plot Reverse Jackknife method test outliers variable individually, occurrence behaves outlier least one variable highlighted outlier. user uses presence data, Support Vector Machine Random Forest Methods performed. Support Vector Machine Random Forest performed default hyper-parameter values. case species < 7 occurrences, function perform methods (.e. additional columns 0 values); nonetheless, return tibble additional columns 0 1. information methods, see Chapman (2005), Liu et al. (2018), Velazco et al. (2022).","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/env_outliers.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Integration of outliers detection methods in environmental space — env_outliers","text":"Chapman, . D. (2005). Principles methods data cleaning: Primary Species Species- Occurrence Data. version 1.0. Report Global Biodiversity Information Facility, Copenhagen. p72. http://www.gbif.org/document/80528 Liu, C., White, M., & Newell, G. (2018). Detecting outliers species distribution data. Journal Biogeography, 45(1), 164 - 176. https://doi.org/10.1111/jbi.13122 Velazco, S.J.E.; Bedrij, N..; Keller, H..; Rojas, J.L.; Ribeiro, B.R.; De Marco, P. (2022) Quantifying role protected areas safeguarding uses biodiversity. Biological Conservation, xx(xx) xx-xx. https://doi.org/10.1016/j.biocon.2022.109525","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/env_outliers.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Integration of outliers detection methods in environmental space — env_outliers","text":"","code":"if (FALSE) { # \\dontrun{ require(dplyr) require(terra) require(ggplot2) # Environmental variables somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) # Species occurrences data(\"spp\") spp spp1 <- spp %>% dplyr::filter(species == \"sp1\") somevar[[1]] %>% plot() points(spp1 %>% filter(pr_ab == 1) %>% select(x, y), col = \"blue\", pch = 19) points(spp1 %>% filter(pr_ab == 0) %>% select(x, y), col = \"red\", cex = 0.5) spp1 <- spp1 %>% mutate(idd = 1:nrow(spp1)) # Detect outliers outs_1 <- env_outliers( data = spp1, pr_ab = \"pr_ab\", x = \"x\", y = \"y\", id = \"idd\", env_layer = somevar ) # How many outliers were detected by different methods? out_pa <- outs_1 %>% dplyr::select(starts_with(\".\"), -.out_sum) %>% apply(., 2, function(x) sum(x, na.rm = T)) out_pa # How many outliers were detected by the sum of different methods? outs_1 %>% dplyr::group_by(.out_sum) %>% dplyr::count() # Let explor where are locate records highlighted as outliers outs_1 %>% dplyr::filter(pr_ab == 1, .out_sum > 0) %>% ggplot(aes(x, y)) + geom_point(aes(col = factor(.out_sum))) + facet_wrap(. ~ factor(.out_sum)) # Detect outliers only with presences outs_2 <- env_outliers( data = spp1 %>% dplyr::filter(pr_ab == 1), pr_ab = \"pr_ab\", x = \"x\", y = \"y\", id = \"idd\", env_layer = somevar ) # How many outliers were detected by different methods out_p <- outs_2 %>% dplyr::select(starts_with(\".\"), -.out_sum) %>% apply(., 2, function(x) sum(x, na.rm = T)) # How many outliers were detected by the sum of different methods? outs_2 %>% dplyr::group_by(.out_sum) %>% dplyr::count() # Let explor where are locate records highlighted as outliers outs_2 %>% dplyr::filter(pr_ab == 1, .out_sum > 0) %>% ggplot(aes(x, y)) + geom_point(aes(col = factor(.out_sum))) + facet_wrap(. ~ factor(.out_sum)) # Comparison of function outputs when using it with # presences-absences or only presences data. bind_rows(out_p, out_pa) # Because the second case only were used presences, outliers methods # based in Random Forest (.out_rf) and Support Vector Machines (.out_svm) # were not performed. } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_gam.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit and validate Generalized Additive Models based on Ensembles of Small Models approach — esm_gam","title":"Fit and validate Generalized Additive Models based on Ensembles of Small Models approach — esm_gam","text":"function constructs Generalized Additive Models using Ensembles Small Models (ESM) approach (Breiner et al., 2015, 2018).","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_gam.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit and validate Generalized Additive Models based on Ensembles of Small Models approach — esm_gam","text":"","code":"esm_gam(data, response, predictors, partition, thr = NULL, k = 3)"},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_gam.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit and validate Generalized Additive Models based on Ensembles of Small Models approach — esm_gam","text":"data data.frame. Database response (0,1) predictors values. response character. Column name species absence-presence data (0,1) predictors character. Vector column names quantitative predictor variables (.e. continuous variables). function allow categorical variables can construct models continuous variables. Usage predictors = c(\"aet\", \"cwd\", \"tmin\"). partition character. Column name training validation partition groups. thr character. Threshold used get binary suitability values (.e. 0,1). useful threshold-dependent performance metrics. possible use one threshold type. necessary provide vector argument. following threshold criteria available: equal_sens_spec: Threshold sensitivity specificity equal. max_sens_spec: Threshold sum sensitivity specificity highest (aka threshold maximizes TSS). max_jaccard: threshold Jaccard index highest. max_sorensen: threshold Sorensen index highest. max_fpb: threshold FPB (F-measure presence-background data) highest. sensitivity: Threshold based specified sensitivity value. Usage thr = c('sensitivity', sens='0.6') thr = c('sensitivity'). 'sens' refers sensitivity value. sensitivity value specified, default value 0.9. user wants include one threshold type, necessary concatenate threshold types, e.g., thr=c('max_sens_spec', 'max_jaccard'), thr=c('max_sens_spec', 'sensitivity', sens='0.8'), thr=c('max_sens_spec', 'sensitivity'). Function use thresholds threshold specified k integer. dimension basis used represent smooth term. Default 3. ESM proposed fit models little data, recommend using small values parameter.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_gam.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit and validate Generalized Additive Models based on Ensembles of Small Models approach — esm_gam","text":"list object : esm_model: list \"gam\" class object mgcv package bivariate model. object can used predicting ensemble small models sdm_predict function. predictors: tibble variables use modeling. performance: Performance metrics (see sdm_eval). Threshold dependent metrics calculated based threshold specified argument.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_gam.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Fit and validate Generalized Additive Models based on Ensembles of Small Models approach — esm_gam","text":"method consists creating bivariate models pair-wise combinations predictors perform ensemble based average suitability weighted Somers' D metric (D = 2 x (AUC -0.5)). ESM recommended modeling species occurrences. function allow categorical variables use types variables problematic using occurrences. detail see Breiner et al. (2015, 2018). function fits GAM using mgvc package, Binomial distribution family thin plate regression spline smoothing basis (see ?mgvc::s).","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_gam.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Fit and validate Generalized Additive Models based on Ensembles of Small Models approach — esm_gam","text":"Breiner, F. T., Guisan, ., Bergamini, ., & Nobis, M. P. (2015). Overcoming limitations modelling rare species using ensembles small models. Methods Ecology Evolution, 6(10), 1210-218. https://doi.org/10.1111/2041-210X.12403 Breiner, F. T., Nobis, M. P., Bergamini, ., & Guisan, . (2018). Optimizing ensembles small models predicting distribution species occurrences. Methods Ecology Evolution, 9(4), 802-808. https://doi.org/10.1111/2041-210X.12957","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_gam.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit and validate Generalized Additive Models based on Ensembles of Small Models approach — esm_gam","text":"","code":"if (FALSE) { # \\dontrun{ data(\"abies\") require(dplyr) # Using k-fold partition method set.seed(10) abies2 <- abies %>% na.omit() %>% group_by(pr_ab) %>% dplyr::slice_sample(n = 10) %>% group_by() abies2 <- part_random( data = abies2, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 3) ) abies2 # Without threshold specification and with kfold esm_gam_t1 <- esm_gam( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"cwd\", \"tmin\", \"ppt_djf\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), partition = \".part\", thr = NULL ) esm_gam_t1$esm_model # bivariate model esm_gam_t1$predictors esm_gam_t1$performance # Test with rep_kfold partition abies2 <- abies2 %>% select(-starts_with(\".\")) set.seed(10) abies2 <- part_random( data = abies2, pr_ab = \"pr_ab\", method = c(method = \"rep_kfold\", folds = 3, replicates = 5) ) abies2 esm_gam_t2 <- esm_gam( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"cwd\", \"tmin\", \"ppt_djf\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), partition = \".part\", thr = NULL ) esm_gam_t2$esm_model # bivariate model esm_gam_t2$predictors esm_gam_t2$performance # Test with other bootstrap abies2 <- abies2 %>% select(-starts_with(\".\")) set.seed(10) abies2 <- part_random( data = abies2, pr_ab = \"pr_ab\", method = c(method = \"boot\", replicates = 10, proportion = 0.7) ) abies2 esm_gam_t3 <- esm_gam( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"cwd\", \"tmin\", \"ppt_djf\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), partition = \".part\", thr = NULL ) esm_gam_t3$esm_model # bivariate model esm_gam_t3$predictors esm_gam_t3$performance } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_gau.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit and validate Gaussian Process models based on Ensembles of Small Models approach — esm_gau","title":"Fit and validate Gaussian Process models based on Ensembles of Small Models approach — esm_gau","text":"function constructs Gaussian Process models using Ensembles Small Models (ESM) approach (Breiner et al., 2015, 2018).","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_gau.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit and validate Gaussian Process models based on Ensembles of Small Models approach — esm_gau","text":"","code":"esm_gau(data, response, predictors, partition, thr = NULL, background = NULL)"},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_gau.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit and validate Gaussian Process models based on Ensembles of Small Models approach — esm_gau","text":"data data.frame. Database response (0,1) predictors values. response character. Column name species absence-presence data (0,1) predictors character. Vector column names quantitative predictor variables (.e. continuous variables). function allow categorical variables can construct models continuous variables. Usage predictors = c(\"aet\", \"cwd\", \"tmin\") partition character. Column name training validation partition groups. thr character. Threshold used get binary suitability values (.e. 0,1). useful threshold-dependent performance metrics. possible use one threshold type. necessary provide vector argument. following threshold criteria available: equal_sens_spec: Threshold sensitivity specificity equal. max_sens_spec: Threshold sum sensitivity specificity highest (aka threshold maximizes TSS). max_jaccard: threshold Jaccard index highest. max_sorensen: threshold Sorensen index highest. max_fpb: threshold FPB (F-measure presence-background data) highest. sensitivity: Threshold based specified sensitivity value. Usage thr = c('sensitivity', sens='0.6') thr = c('sensitivity'). 'sens' refers sensitivity value. sensitivity value specified, default value 0.9. user wants include one threshold type, necessary concatenate threshold types, e.g., thr=c('max_sens_spec', 'max_jaccard'), thr=c('max_sens_spec', 'sensitivity', sens='0.8'), thr=c('max_sens_spec', 'sensitivity'). Function use thresholds threshold specified background data.frame. Database response column 0 predictors variables. column names must consistent data. Default NULL","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_gau.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit and validate Gaussian Process models based on Ensembles of Small Models approach — esm_gau","text":"list object : esm_model: list \"graf\" class object bivariate model. object can used predicting ensembles small models sdm_predict function. predictors: tibble variables use modeling. performance: Performance metric (see sdm_eval). threshold dependent metric calculated based threshold specified argument.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_gau.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Fit and validate Gaussian Process models based on Ensembles of Small Models approach — esm_gau","text":"method consists creating bivariate models pair-wise combinations predictors performs ensemble based average suitability weighted Somers' D metric (D = 2 x (AUC -0.5)). ESM recommended modeling species occurrences. function allow categorical variables use types variables problematic using occurrences. detail see Breiner et al. (2015, 2018).","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_gau.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Fit and validate Gaussian Process models based on Ensembles of Small Models approach — esm_gau","text":"Breiner, F. T., Guisan, ., Bergamini, ., & Nobis, M. P. (2015). Overcoming limitations modelling rare species using ensembles small models. Methods Ecology Evolution, 6(10), 1210-218. https://doi.org/10.1111/2041-210X.12403 Breiner, F. T., Nobis, M. P., Bergamini, ., & Guisan, . (2018). Optimizing ensembles small models predicting distribution species occurrences. Methods Ecology Evolution, 9(4), 802-808. https://doi.org/10.1111/2041-210X.12957","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_gau.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit and validate Gaussian Process models based on Ensembles of Small Models approach — esm_gau","text":"","code":"if (FALSE) { # \\dontrun{ data(\"abies\") require(dplyr) # Using k-fold partition method set.seed(10) abies2 <- abies %>% na.omit() %>% group_by(pr_ab) %>% dplyr::slice_sample(n = 10) %>% group_by() abies2 <- part_random( data = abies2, pr_ab = \"pr_ab\", method = c(method = \"rep_kfold\", folds = 3, replicates = 5) ) abies2 # Without threshold specification and with kfold esm_gau_t1 <- esm_gau( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"cwd\", \"tmin\", \"ppt_djf\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), partition = \".part\", thr = NULL ) esm_gau_t1$esm_model # bivariate model esm_gau_t1$predictors esm_gau_t1$performance } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_gbm.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit and validate Generalized Boosted Regression models based on Ensembles of Small Models approach — esm_gbm","title":"Fit and validate Generalized Boosted Regression models based on Ensembles of Small Models approach — esm_gbm","text":"function constructs Generalized Boosted Regression using Ensembles Small Models (ESM) approach (Breiner et al., 2015, 2018).","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_gbm.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit and validate Generalized Boosted Regression models based on Ensembles of Small Models approach — esm_gbm","text":"","code":"esm_gbm( data, response, predictors, partition, thr = NULL, n_trees = 100, n_minobsinnode = NULL, shrinkage = 0.1 )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_gbm.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit and validate Generalized Boosted Regression models based on Ensembles of Small Models approach — esm_gbm","text":"data data.frame. Database response (0,1) predictors values. response character. Column name species absence-presence data (0,1) predictors character. Vector column names quantitative predictor variables (.e. continuous variables). can construct models continuous variables allow categorical variables. Usage predictors = c(\"aet\", \"cwd\", \"tmin\") partition character. Column name training validation partition groups. thr character. Threshold used get binary suitability values (.e. 0,1). useful threshold-dependent performance metrics. possible use one threshold type. necessary provide vector argument. following threshold criteria available: equal_sens_spec: Threshold sensitivity specificity equal. max_sens_spec: Threshold sum sensitivity specificity highest (aka threshold maximizes TSS). max_jaccard: threshold Jaccard index highest. max_sorensen: threshold Sorensen index highest. max_fpb: threshold FPB (F-measure presence-background data) highest. sensitivity: Threshold based specified sensitivity value. Usage thr = c('sensitivity', sens='0.6') thr = c('sensitivity'). 'sens' refers sensitivity value. sensitivity value specified, default value 0.9. case use one threshold type necessary concatenate threshold types, e.g., thr=c('max_sens_spec', 'max_jaccard'), thr=c('max_sens_spec', 'sensitivity', sens='0.8'), thr=c('max_sens_spec', 'sensitivity'). Function use thresholds threshold specified. n_trees Integer specifying total number trees fit. equivalent number iterations number basis functions additive expansion. Default 100. n_minobsinnode Integer specifying minimum number observations terminal nodes trees. Note actual number observations, total weight. n_minobsinnode NULL, parameter assume value equal nrow(data)*0.5/4. Default NULL. shrinkage Numeric. parameter applied tree expansion. Also known learning rate step-size reduction; 0.001 0.1 usually works, smaller learning rate typically requires trees. Default 0.1.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_gbm.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit and validate Generalized Boosted Regression models based on Ensembles of Small Models approach — esm_gbm","text":"list object : esm_model: list \"gbm\" class object gbm package bivariate model. object can used predicting ensembles small models sdm_predict function. predictors: tibble variables use modeling. performance: Performance metrics (see sdm_eval). Threshold dependent metrics calculated based threshold specified thr argument.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_gbm.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Fit and validate Generalized Boosted Regression models based on Ensembles of Small Models approach — esm_gbm","text":"method consists creating bivariate models pair-wise combinations predictors perform ensemble based average suitability weighted Somers' D metric (D = 2 x (AUC -0.5)). ESM recommended modeling species occurrences. function allow categorical variables use types variables problematic using occurrences. detail see Breiner et al. (2015, 2018).","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_gbm.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Fit and validate Generalized Boosted Regression models based on Ensembles of Small Models approach — esm_gbm","text":"Breiner, F. T., Guisan, ., Bergamini, ., & Nobis, M. P. (2015). Overcoming limitations modelling rare species using ensembles small models. Methods Ecology Evolution, 6(10), 1210-218. https://doi.org/10.1111/2041-210X.12403 Breiner, F. T., Nobis, M. P., Bergamini, ., & Guisan, . (2018). Optimizing ensembles small models predicting distribution species occurrences. Methods Ecology Evolution, 9(4), 802-808. https://doi.org/10.1111/2041-210X.12957","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_gbm.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit and validate Generalized Boosted Regression models based on Ensembles of Small Models approach — esm_gbm","text":"","code":"if (FALSE) { # \\dontrun{ data(\"abies\") require(dplyr) # Using k-fold partition method set.seed(10) abies2 <- abies %>% na.omit() %>% group_by(pr_ab) %>% dplyr::slice_sample(n = 10) %>% group_by() abies2 <- part_random( data = abies2, pr_ab = \"pr_ab\", method = c(method = \"rep_kfold\", folds = 3, replicates = 5) ) abies2 # Without threshold specification and with kfold esm_gbm_t1 <- esm_gbm( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"cwd\", \"tmin\", \"ppt_djf\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), partition = \".part\", thr = NULL, n_trees = 100, n_minobsinnode = NULL, shrinkage = 0.1 ) esm_gbm_t1$esm_model # bivariate model esm_gbm_t1$predictors esm_gbm_t1$performance } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_glm.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit and validate Generalized Linear Models based on Ensembles of Small Models approach — esm_glm","title":"Fit and validate Generalized Linear Models based on Ensembles of Small Models approach — esm_glm","text":"function constructs Generalized Linear Models using Ensembles Small Models (ESM) approach (Breiner et al., 2015, 2018).","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_glm.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit and validate Generalized Linear Models based on Ensembles of Small Models approach — esm_glm","text":"","code":"esm_glm( data, response, predictors, partition, thr = NULL, poly = 0, inter_order = 0 )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_glm.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit and validate Generalized Linear Models based on Ensembles of Small Models approach — esm_glm","text":"data data.frame. Database response (0,1) predictors values. response character. Column name species absence-presence data (0,1). predictors character. Vector column names quantitative predictor variables (.e. continuous variables). can construct models continuous variables allow categorical variables. Usage predictors = c(\"aet\", \"cwd\", \"tmin\"). partition character. Column name training validation partition groups. thr character. Threshold used get binary suitability values (.e. 0,1). useful threshold-dependent performance metrics. possible use one threshold type. necessary provide vector argument. following threshold criteria available: equal_sens_spec: Threshold sensitivity specificity equal. max_sens_spec: Threshold sum sensitivity specificity highest (aka threshold maximizes TSS). max_jaccard: threshold Jaccard highest. max_sorensen: threshold Sorensen highest. max_fpb: threshold FPB (F-measure presence-background data) highest. sensitivity: Threshold based specified sensitivity value. Usage thr = c('sensitivity', sens='0.6') thr = c('sensitivity'). 'sens' refers sensitivity value. sensitivity value specified, default value 0.9. user wants include one threshold type, necessary concatenate threshold types, e.g., thr=c('max_sens_spec', 'max_jaccard'), thr=c('max_sens_spec', 'sensitivity', sens='0.8'), thr=c('max_sens_spec', 'sensitivity'). Function use thresholds threshold specified poly integer >= 2. used values >= 2 model use polynomials continuous variables (.e. used predictors argument). Default 0. ESM constructed occurrences recommended use polynomials avoid overfitting. inter_order integer >= 0. interaction order explanatory variables. Default 0. ESM constructed occurrences recommended use interaction terms.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_glm.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit and validate Generalized Linear Models based on Ensembles of Small Models approach — esm_glm","text":"list object : esm_model: list \"glm\" class object stats package bivariate model. object can used predicting ensembles small models sdm_predict function. predictors: tibble variables use modeling. performance: Performance metric (see sdm_eval). threshold dependent metric calculated based threshold specified thr argument.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_glm.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Fit and validate Generalized Linear Models based on Ensembles of Small Models approach — esm_glm","text":"method consists creating bivariate models pair-wise combinations predictors perform ensemble based average suitability weighted Somers' D metric (D = 2 x (AUC -0.5)). ESM recommended modeling species occurrences. function allow categorical variables use types variables problematic using occurrences. detail see Breiner et al. (2015, 2018).","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_glm.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Fit and validate Generalized Linear Models based on Ensembles of Small Models approach — esm_glm","text":"Breiner, F. T., Guisan, ., Bergamini, ., & Nobis, M. P. (2015). Overcoming limitations modelling rare species using ensembles small models. Methods Ecology Evolution, 6(10), 1210-218. https://doi.org/10.1111/2041-210X.12403 Breiner, F. T., Nobis, M. P., Bergamini, ., & Guisan, . (2018). Optimizing ensembles small models predicting distribution species occurrences. Methods Ecology Evolution, 9(4), 802-808. https://doi.org/10.1111/2041-210X.12957","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_glm.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit and validate Generalized Linear Models based on Ensembles of Small Models approach — esm_glm","text":"","code":"if (FALSE) { # \\dontrun{ data(\"abies\") require(dplyr) # Using k-fold partition method set.seed(10) abies2 <- abies %>% na.omit() %>% group_by(pr_ab) %>% dplyr::slice_sample(n = 10) %>% group_by() abies2 <- part_random( data = abies2, pr_ab = \"pr_ab\", method = c(method = \"rep_kfold\", folds = 3, replicates = 5) ) abies2 # Without threshold specification and with kfold esm_glm_t1 <- esm_glm( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"cwd\", \"tmin\", \"ppt_djf\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), partition = \".part\", thr = NULL, poly = 0, inter_order = 0 ) esm_glm_t1$esm_model # bivariate model esm_glm_t1$predictors esm_glm_t1$performance } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_max.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit and validate Maximum Entropy Models based on Ensemble of Small of Model approach — esm_max","title":"Fit and validate Maximum Entropy Models based on Ensemble of Small of Model approach — esm_max","text":"function constructs Maxent Models using Ensemble Small Model (ESM) approach (Breiner et al., 2015, 2018).","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_max.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit and validate Maximum Entropy Models based on Ensemble of Small of Model approach — esm_max","text":"","code":"esm_max( data, response, predictors, partition, thr = NULL, background = NULL, clamp = TRUE, classes = \"default\", pred_type = \"cloglog\", regmult = 2.5 )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_max.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit and validate Maximum Entropy Models based on Ensemble of Small of Model approach — esm_max","text":"data data.frame. Database response (0,1) predictors values. response character. Column name species absence-presence data (0,1) predictors character. Vector column names quantitative predictor variables (.e. continuous variables). function can construct models continuous variables, allow categorical variables Usage predictors = c(\"aet\", \"cwd\", \"tmin\"). partition character. Column name training validation partition groups. thr character. Threshold used get binary suitability values (.e. 0,1). useful threshold-dependent performance metrics. possible use one threshold type. necessary provide vector argument. following threshold criteria available: equal_sens_spec: Threshold sensitivity specificity equal. max_sens_spec: Threshold sum sensitivity specificity highest (aka threshold maximizes TSS). max_jaccard: threshold Jaccard highest. max_sorensen: threshold Sorensen highest. max_fpb: threshold FPB (F-measure presence-background data) highest. sensitivity: Threshold based specified sensitivity value. Usage thr = c('sensitivity', sens='0.6') thr = c('sensitivity'). 'sens' refers sensitivity value. sensitivity value specified, default 0.9 user wants include one threshold type, necessary concatenate threshold types, e.g., thr=c('max_sens_spec', 'max_jaccard'), thr=c('max_sens_spec', 'sensitivity', sens='0.8'), thr=c('max_sens_spec', 'sensitivity'). Function use thresholds threshold specified. background data.frame. Database response column 0 predictors variables. column names must consistent data. Default NULL clamp logical. set TRUE, predictors features restricted range seen model training. classes character. single feature combinations . Features symbolized letters: l (linear), q (quadratic), h (hinge), p (product), t (threshold). Usage classes = \"lpq\". Default \"default\" (see details). pred_type character. Type response required available \"link\", \"exponential\", \"cloglog\" \"logistic\". Default \"cloglog\" regmult numeric. constant adjust regularization. ESM used modeling species records default value 2.5","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_max.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit and validate Maximum Entropy Models based on Ensemble of Small of Model approach — esm_max","text":"list object : esm_model: list \"maxnet\" class object maxnet package bivariate model. object can used predicting ensembles small models sdm_predict function. predictors: tibble variables use modeling. performance: Performance metrics (see sdm_eval). threshold dependent metric calculated based threshold specified argument.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_max.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Fit and validate Maximum Entropy Models based on Ensemble of Small of Model approach — esm_max","text":"method consists creating bivariate models pair-wise combinations predictors perform ensemble based average suitability weighted Somers' D metric (D = 2 x (AUC -0.5)). ESM recommended modeling species occurrences. function allow categorical variables use types variables problematic using occurrences. detail see Breiner et al. (2015, 2018). function use default regularization multiplier equal 2.5 (see Breiner et al., 2018) argument “classes” set default MaxEnt use different features combination depending number presences (np) follow rule: np < 10 classes = \"l\", np 10 15 classes = \"lq\", np 15 80 classes = \"lqh\", np >= 80 classes = \"lqph\" presence-absence (presence-pseudo-absence) data used data argument addition background points, function fit models presences background points validate presences absences. procedure makes maxent comparable presences-absences models (e.g., random forest, support vector machine). presences background points data used, function fit validate model presences background data. presence-absences used data argument without background, function fit model specified data (recommended).","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_max.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Fit and validate Maximum Entropy Models based on Ensemble of Small of Model approach — esm_max","text":"Breiner, F. T., Guisan, ., Bergamini, ., & Nobis, M. P. (2015). Overcoming limitations modelling rare species using ensembles small models. Methods Ecology Evolution, 6(10), 1210-218. https://doi.org/10.1111/2041-210X.12403 Breiner, F. T., Nobis, M. P., Bergamini, ., & Guisan, . (2018). Optimizing ensembles small models predicting distribution species occurrences. Methods Ecology Evolution, 9(4), 802-808. https://doi.org/10.1111/2041-210X.12957","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_max.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit and validate Maximum Entropy Models based on Ensemble of Small of Model approach — esm_max","text":"","code":"if (FALSE) { # \\dontrun{ data(\"abies\") data(\"backg\") require(dplyr) # Using k-fold partition method set.seed(10) abies2 <- abies %>% na.omit() %>% group_by(pr_ab) %>% dplyr::slice_sample(n = 10) %>% group_by() abies2 <- part_random( data = abies2, pr_ab = \"pr_ab\", method = c(method = \"rep_kfold\", folds = 5, replicates = 5) ) abies2 set.seed(10) backg2 <- backg %>% na.omit() %>% group_by(pr_ab) %>% dplyr::slice_sample(n = 100) %>% group_by() backg2 <- part_random( data = backg2, pr_ab = \"pr_ab\", method = c(method = \"rep_kfold\", folds = 5, replicates = 5) ) backg2 # Without threshold specification and with kfold esm_max_t1 <- esm_max( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"cwd\", \"tmin\", \"ppt_djf\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), partition = \".part\", thr = NULL, background = backg2, clamp = TRUE, classes = \"default\", pred_type = \"cloglog\", regmult = 1 ) esm_max_t1$esm_model # bivariate model esm_max_t1$predictors esm_max_t1$performance } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_net.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit and validate Neural Networks based on Ensembles of Small of Models approach — esm_net","title":"Fit and validate Neural Networks based on Ensembles of Small of Models approach — esm_net","text":"function constructs Neural Networks using Ensembles Small Models (ESM) approach (Breiner et al., 2015, 2018).","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_net.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit and validate Neural Networks based on Ensembles of Small of Models approach — esm_net","text":"","code":"esm_net(data, response, predictors, partition, thr = NULL, size = 2, decay = 0)"},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_net.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit and validate Neural Networks based on Ensembles of Small of Models approach — esm_net","text":"data data.frame. Database response (0,1) predictors values. response character. Column name species absence-presence data (0,1) predictors character. Vector column names quantitative predictor variables (.e. continuous variables). function can construct models continuous variables allow categorical variables. Usage predictors = c(\"aet\", \"cwd\", \"tmin\"). partition character. Column name training validation partition groups. thr character. Threshold used get binary suitability values (.e. 0,1). useful threshold-dependent performance metrics. possible use one threshold type. necessary provide vector argument. following threshold criteria available: equal_sens_spec: Threshold sensitivity specificity equal. max_sens_spec: Threshold sum sensitivity specificity highest (aka threshold maximizes TSS). max_jaccard: threshold Jaccard index highest. max_sorensen: threshold Sorensen index highest. max_fpb: threshold FPB (F-measure presence-background data) highest. sensitivity: Threshold based specified sensitivity value. Usage thr = c('sensitivity', sens='0.6') thr = c('sensitivity'). 'sens' refers sensitivity value. sensitivity values specified, default used 0.9 user wants include one threshold type, necessary concatenate threshold types, e.g., thr=c('max_sens_spec', 'max_jaccard'), thr=c('max_sens_spec', 'sensitivity', sens='0.8'), thr=c('max_sens_spec', 'sensitivity'). Function use thresholds threshold specified size numeric. Number units hidden layer. Can zero skip-layer units. Default 2. decay numeric. Parameter weight decay. Default 0.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_net.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit and validate Neural Networks based on Ensembles of Small of Models approach — esm_net","text":"list object : esm_model: list \"nnet\" class object nnet package bivariate model. object can used predicting ensemble small model sdm_predict function. predictors: tibble variables use modeling. performance: Performance metric (see sdm_eval). threshold dependent metric calculated based threshold specified thr argument.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_net.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Fit and validate Neural Networks based on Ensembles of Small of Models approach — esm_net","text":"method consists creating bivariate models pair-wise combinations predictors perform ensemble based average suitability weighted Somers' D metric (D = 2 x (AUC -0.5)). ESM recommended modeling species occurrences. function allow categorical variables use types variables problematic using occurrences. detail see Breiner et al. (2015, 2018).","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_net.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Fit and validate Neural Networks based on Ensembles of Small of Models approach — esm_net","text":"Breiner, F. T., Guisan, ., Bergamini, ., & Nobis, M. P. (2015). Overcoming limitations modelling rare species using ensembles small models. Methods Ecology Evolution, 6(10), 1210-218. https://doi.org/10.1111/2041-210X.12403 Breiner, F. T., Nobis, M. P., Bergamini, ., & Guisan, . (2018). Optimizing ensembles small models predicting distribution species occurrences. Methods Ecology Evolution, 9(4), 802-808. https://doi.org/10.1111/2041-210X.12957","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_net.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit and validate Neural Networks based on Ensembles of Small of Models approach — esm_net","text":"","code":"if (FALSE) { # \\dontrun{ data(\"abies\") require(dplyr) # Using k-fold partition method set.seed(10) abies2 <- abies %>% na.omit() %>% group_by(pr_ab) %>% dplyr::slice_sample(n = 10) %>% group_by() abies2 <- part_random( data = abies2, pr_ab = \"pr_ab\", method = c(method = \"rep_kfold\", folds = 3, replicates = 5) ) abies2 # Without threshold specification and with kfold esm_net_t1 <- esm_net( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"cwd\", \"tmin\", \"ppt_djf\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), partition = \".part\", thr = NULL ) esm_net_t1$esm_model # bivariate model esm_net_t1$predictors esm_net_t1$performance } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_svm.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit and validate Support Vector Machine models based on Ensembles of Small of Models approach — esm_svm","title":"Fit and validate Support Vector Machine models based on Ensembles of Small of Models approach — esm_svm","text":"function constructs Support Vector Machine models using Ensembles Small Models (ESM) approach (Breiner et al., 2015, 2018).","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_svm.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit and validate Support Vector Machine models based on Ensembles of Small of Models approach — esm_svm","text":"","code":"esm_svm( data, response, predictors, partition, thr = NULL, sigma = \"automatic\", C = 1 )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_svm.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit and validate Support Vector Machine models based on Ensembles of Small of Models approach — esm_svm","text":"data data.frame. Database response (0,1) predictors values. response character. Column name species absence-presence data (0,1). predictors character. Vector column names quantitative predictor variables (.e. continuous variables). function can construct models continuous variables allow categorical variables. Usage predictors = c(\"aet\", \"cwd\", \"tmin\"). partition character. Column name training validation partition groups. thr character. Threshold used get binary suitability values (.e. 0,1). useful threshold-dependent performance metrics. possible use one threshold type. necessary provide vector argument. following threshold criteria available: equal_sens_spec: Threshold sensitivity specificity equal. max_sens_spec: Threshold sum sensitivity specificity highest (aka threshold maximizes TSS). max_jaccard: threshold Jaccard index highest. max_sorensen: threshold Sorensen index highest. max_fpb: threshold FPB (F-measure presence-background data) highest. sensitivity: Threshold based specified sensitivity value. Usage thr = c('sensitivity', sens='0.6') thr = c('sensitivity'). 'sens' refers sensitivity value. sensitivity value specified, default 0.9 user wants include one threshold type, necessary concatenate threshold types, e.g., thr=c('max_sens_spec', 'max_jaccard'), thr=c('max_sens_spec', 'sensitivity', sens='0.8'), thr=c('max_sens_spec', 'sensitivity'). Function use thresholds threshold specified sigma numeric. Inverse kernel width Radial Basis kernel function \"rbfdot\". Default \"automatic\". C numeric. Cost constraints violation, 'C' constant regularization term Lagrange formulation. Default 1","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_svm.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit and validate Support Vector Machine models based on Ensembles of Small of Models approach — esm_svm","text":"list object : esm_model: list \"ksvm\" class object ksvm package bivariate model. object can used predicting ensemble small model sdm_predict function. predictors: tibble variables use modeling. performance: Performance metric (see sdm_eval). threshold dependent metric calculated based threshold specified thr argument.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_svm.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Fit and validate Support Vector Machine models based on Ensembles of Small of Models approach — esm_svm","text":"method consists creating bivariate models pair-wise combinations predictors perform ensemble based average suitability weighted Somers' D metric (D = 2 x (AUC -0.5)). ESM recommended modeling species occurrences. function allow categorical variables use types variables problematic using occurrences. detail see Breiner et al. (2015, 2018). function constructs 'C-svc' classification type uses Radial Basis kernel \"Gaussian\" function (rbfdot). See details ksvm","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_svm.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Fit and validate Support Vector Machine models based on Ensembles of Small of Models approach — esm_svm","text":"Breiner, F. T., Guisan, ., Bergamini, ., & Nobis, M. P. (2015). Overcoming limitations modelling rare species using ensembles small models. Methods Ecology Evolution, 6(10), 1210-218. https://doi.org/10.1111/2041-210X.12403 Breiner, F. T., Nobis, M. P., Bergamini, ., & Guisan, . (2018). Optimizing ensembles small models predicting distribution species occurrences. Methods Ecology Evolution, 9(4), 802-808. https://doi.org/10.1111/2041-210X.12957","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/esm_svm.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit and validate Support Vector Machine models based on Ensembles of Small of Models approach — esm_svm","text":"","code":"if (FALSE) { # \\dontrun{ data(\"abies\") require(dplyr) # Using k-fold partition method set.seed(10) abies2 <- abies %>% na.omit() %>% group_by(pr_ab) %>% dplyr::slice_sample(n = 10) %>% group_by() abies2 <- part_random( data = abies2, pr_ab = \"pr_ab\", method = c(method = \"rep_kfold\", folds = 3, replicates = 5) ) abies2 # Without threshold specification and with kfold esm_svm_t1 <- esm_svm( data = abies2, response = \"pr_ab\", predictors = c( \"aet\", \"cwd\", \"tmin\", \"ppt_djf\", \"ppt_jja\", \"pH\", \"awc\", \"depth\" ), partition = \".part\", thr = NULL ) esm_svm_t1$esm_model # bivariate model esm_svm_t1$predictors esm_svm_t1$performance } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/extra_eval.html","id":null,"dir":"Reference","previous_headings":"","what":"Measure model extrapolation based on Shape extrapolation metric — extra_eval","title":"Measure model extrapolation based on Shape extrapolation metric — extra_eval","text":"Measure extrapolation comparing environmental data used modeling calibration area model projection. function use Shape metric proposed Velazco et al., 2023","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/extra_eval.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Measure model extrapolation based on Shape extrapolation metric — extra_eval","text":"","code":"extra_eval( training_data, pr_ab, projection_data, metric = \"mahalanobis\", univar_comb = FALSE, n_cores = 1, aggreg_factor = 1 )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/extra_eval.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Measure model extrapolation based on Shape extrapolation metric — extra_eval","text":"training_data data.frame tibble environmental conditions presence absence (background points pseudo-absences) used constructing models pr_ab character. Column name presence absence (background points pseudo-absences) data (.e., 1 0) projection_data SpatRaster, data.frame tibble environmental condition used projecting model (e.g., larger, encompassing region, spatially separate region, different time period). data.frame tibble used function return tibble object. Otherwise, SpatRaster object. metric character. Metric used measure degree extrapolation. Default = mahalanobis. mahalanobis: Degree extrapolation calculated based Mahalanobis distance. euclidean: Degree extrapolation calculated based Euclidean distance. univar_comb logical. true, function add layer column distinguish univariate (.e., projection data outside range training conditions) combinatorial extrapolation (.e., projection data within range training conditions) using values 1 2, respectively. Default FALSE n_cores numeric. Number cores use parallelization. Default 1 aggreg_factor positive integer. Aggregation factor expressed number cells direction reduce raster resolution. Use value higher 1 useful measuring extrapolation using raster high number cells. resolution output raster object used 'projection_data' argument. Default 1, .e., default, changes made resolution environmental variables.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/extra_eval.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Measure model extrapolation based on Shape extrapolation metric — extra_eval","text":"SpatRaster tibble object extrapolation values measured Shape metric. Also possible estimate univariate combinatorial extrapolation metric (see `univar_comb` argument).","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/extra_eval.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Measure model extrapolation based on Shape extrapolation metric — extra_eval","text":"function measure model extrapolation base Shape metric (Velazco et al., 2023). Shape model-agnostic approach calculates extrapolation degree given projection data point multivariate distance nearest training data point. distances relativized factor reflects dispersion training data environmental space. Distinct approaches (e.g., MESS-Multivariate Environmental Similarity Surfaces, EO-Environmental Overlap, MOP-Mobility-Oriented Parity, EXDET-Extrapolation Detection, AOA-Area Applicability), Shape incorporates adjustable threshold control binary discrimination acceptable unacceptable extrapolation degrees (see extra_truncate). See vignette flexsdm website details Shape metric, model truncation, tools explore model extrapolation.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/extra_eval.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Measure model extrapolation based on Shape extrapolation metric — extra_eval","text":"Velazco, S.J.E., Brooke, M.R., De Marco Jr., P., Regan, H.M. Franklin, J. 2023. far can extrapolate species distribution model? Exploring Shape, novel method. Ecography: e06992. https://doi.org/10.1111/ecog.06992","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/extra_eval.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Measure model extrapolation based on Shape extrapolation metric — extra_eval","text":"","code":"if (FALSE) { # \\dontrun{ require(dplyr) require(terra) data(spp) f <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(f) names(somevar) <- c(\"aet\", \"cwd\", \"tmx\", \"tmn\") spp$species %>% unique() sp <- spp %>% dplyr::filter(species == \"sp3\", pr_ab == 1) %>% dplyr::select(x, y, pr_ab) # Calibration area based on some criterion such as dispersal ability ca <- calib_area(sp, x = \"x\", y = \"y\", method = c(\"bmcp\", width = 50000), crs = crs(somevar)) plot(somevar[[1]]) points(sp) plot(ca, add = T) # Sampling pseudo-absences set.seed(10) psa <- sample_pseudoabs( data = sp, x = \"x\", y = \"y\", n = nrow(sp) * 2, method = \"random\", rlayer = somevar, calibarea = ca ) # Merge presences and absences databases to get a complete calibration data sp_pa <- dplyr::bind_rows(sp, psa) sp_pa # Get environmental condition of calibration area sp_pa_2 <- sdm_extract(data = sp_pa, x = \"x\", y = \"y\", env_layer = somevar) sp_pa_2 # Measure degree of extrapolation based on Mahalanobis and # for a projection area based on a SpatRaster object extr <- extra_eval( training_data = sp_pa_2, projection_data = somevar, pr_ab = \"pr_ab\", n_cores = 1, aggreg_factor = 1, metric = \"mahalanobis\" ) plot(extr, main = \"Extrapolation pattern\") # Let's fit, predict and truncate a model with extra_truncate sp_pa_2 <- part_random( data = sp_pa_2, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 5) ) a_model <- fit_glm( data = sp_pa_2, response = \"pr_ab\", predictors = c(\"aet\", \"cwd\", \"tmx\", \"tmn\"), partition = \".part\", thr = c(\"max_sorensen\") ) predsuit <- sdm_predict(models = a_model, pred = somevar, thr = \"max_sorensen\") predsuit # list with a raster with two layer plot(predsuit[[1]]) # Truncate a model based on a given value of extrapolation # using 'extra_truncate' function par(mfrow = c(1, 2)) plot(extr, main = \"Extrapolation\") plot(predsuit[[1]][[1]], main = \"Suitability\") par(mfrow = c(1, 1)) predsuit_2 <- extra_truncate( suit = predsuit[[1]], extra = extr, threshold = c(50, 100, 200) ) predsuit_2 # a list of continuous and binary models with # different truncated at different extrapolation thresholds plot(predsuit_2$`50`) plot(predsuit_2$`100`) plot(predsuit_2$`200`) ##%######################################################%## #### Measure degree of extrapolation for #### #### projection area based on data.frame #### ##%######################################################%## extr_df <- extra_eval( training_data = sp_pa_2, projection_data = as.data.frame(somevar, xy=TRUE), pr_ab = \"pr_ab\", n_cores = 1, aggreg_factor = 1, metric = \"mahalanobis\" ) extr_df # see 'p_extra()' to explore extrapolation or suitability pattern in the # environmental and/or geographical space ##%######################################################%## #### Explore Shape metric with #### #### univariate and combinatorial extrapolation #### ##%######################################################%## extr <- extra_eval( training_data = sp_pa_2, projection_data = somevar, pr_ab = \"pr_ab\", n_cores = 1, aggreg_factor = 1, metric = \"mahalanobis\", univar_comb = TRUE ) extr plot(extr) # In the second layer, values equal to 1 and 2 # depict univariate and combinatorial extrapolation, respectively } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/extra_exclude.html","id":null,"dir":"Reference","previous_headings":"","what":"Constraint of suitability based on extrapolation — extra_exclude","title":"Constraint of suitability based on extrapolation — extra_exclude","text":"Exclusion suitability values less given extrapolation value (EXPERIMENTAL)","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/extra_exclude.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Constraint of suitability based on extrapolation — extra_exclude","text":"","code":"extra_exclude(suit, extra, threshold = 50)"},{"path":"https://sjevelazco.github.io/flexsdm/reference/extra_exclude.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Constraint of suitability based on extrapolation — extra_exclude","text":"suit SpatRaster suitability values extra SpatRaster extrapolation values measured percentage (output extra_eval function) threshold numeric. Vector one values used correct extrapolation. Default 50% (FUNCTION SET PROJECTED SUITABILITY VALUES LESS THRESHOLD ZERO? UNCLEAR. PLEASE EXPLICIT)","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/extra_exclude.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Constraint of suitability based on extrapolation — extra_exclude","text":"SpatRaster object corrected suitability values","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/extra_exclude.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Constraint of suitability based on extrapolation — extra_exclude","text":"","code":"if (FALSE) { # see examples in extra_eval function }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/extra_truncate.html","id":null,"dir":"Reference","previous_headings":"","what":"Truncate suitability predictions based on an extrapolation value — extra_truncate","title":"Truncate suitability predictions based on an extrapolation value — extra_truncate","text":"Exclusion suitability predictions environmental conditions assumed extrapolative.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/extra_truncate.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Truncate suitability predictions based on an extrapolation value — extra_truncate","text":"","code":"extra_truncate(suit, extra, threshold = 50, trunc_value = 0)"},{"path":"https://sjevelazco.github.io/flexsdm/reference/extra_truncate.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Truncate suitability predictions based on an extrapolation value — extra_truncate","text":"suit SpatRaster suitability values extra SpatRaster extrapolation values preferable measured extra_eval function threshold numeric. Vector one extrapolation values used truncate suitability Default 50% trunc_value numeric. Numeric value used cells assumed extrapolative","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/extra_truncate.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Truncate suitability predictions based on an extrapolation value — extra_truncate","text":"SpatRaster object truncated suitability values","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/extra_truncate.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Truncate suitability predictions based on an extrapolation value — extra_truncate","text":"Exclusion suitability predictions environmental conditions assumed extrapolative. function possible use metric measuring degree extrapolation (e.g., MESS-Multivariate Environmental Similarity Surfaces, EO-Environmental Overlap, MOP-Mobility-Oriented Parity, EXDET-Extrapolation Detection, AOA-Area Applicability). However, recommend use Shape approach (see extra_eval, Velazco et al., 2023). function truncates suitability predictions assigning given value, generally 0 NA. Usage trunc_value = NA. Default 0. cells assumed extrapolative, .e., higher given threshold given extrapolation metric. See vignette flexsdm website details Shape metric, model truncation, tools explore model extrapolation.","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/extra_truncate.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Truncate suitability predictions based on an extrapolation value — extra_truncate","text":"","code":"if (FALSE) { # \\dontrun{ # see examples in extra_eval function } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_ensemble.html","id":null,"dir":"Reference","previous_headings":"","what":"Ensemble model fitting and validation — fit_ensemble","title":"Ensemble model fitting and validation — fit_ensemble","text":"Ensemble model fitting validation","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_ensemble.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Ensemble model fitting and validation — fit_ensemble","text":"","code":"fit_ensemble( models, ens_method = c(\"mean\", \"meanw\", \"meansup\", \"meanthr\", \"median\"), thr = NULL, thr_model = NULL, metric = NULL )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_ensemble.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Ensemble model fitting and validation — fit_ensemble","text":"models list. list models fitted fit_ tune_ function family. Models used ensemble must presences-absences records, partition methods, threshold types. ens_method character. Method used create ensemble different models. vector must provided argument. meansup, meanw pcasup method, necessary provide evaluation metric threshold 'metric' 'thr_model' arguments respectively. default following ensemble methods performed: mean: Simple average different models. meanw: Weighted average models based performance. evaluation metric threshold type must provided. meansup: Average best models (evaluation metric average). evaluation metric must provided. meanthr: Averaging performed cells suitability values selected threshold. median: Median different models. Usage ensemble = \"meanthr\". several ensemble methods implemented necessary concatenate , e.g., ensemble = c(\"meanw\", \"meanthr\", \"median\") thr character. Threshold used get binary suitability values (.e. 0,1). useful threshold-dependent performance metrics. possible use one threshold criterion. vector must provided argument. following threshold criteria available: lpt: highest threshold omission. equal_sens_spec: Threshold sensitivity specificity equal. max_sens_spec: Threshold sum sensitivity specificity highest (aka threshold maximizes TSS). max_jaccard: threshold Jaccard highest. max_sorensen: threshold Sorensen highest. max_fpb: threshold FPB (F-measure presence-background data) highest. sensitivity: Threshold based specified sensitivity value. Usage thr = c('sensitivity', sens='0.6') thr = c('sensitivity'). 'sens' refers sensitivity value. sensitivity values specified, default 0.9. case using one threshold type necessary concatenate threshold types, e.g., thr=c('lpt', 'max_sens_spec', 'max_jaccard'), thr=c('lpt', 'max_sens_spec', 'sensitivity', sens='0.8'), thr=c('lpt', 'max_sens_spec', 'sensitivity'). Function use thresholds threshold specified. thr_model character. threshold needed conduct meanw, meandsup, meanthr ensemble methods. mandatory use one threshold, must threshold used fit models used \"models\" argument. Usage thr_model = 'equal_sens_spec' metric character. Performance metric used selecting best combination hyper-parameter values. One following metrics can used: SORENSEN, JACCARD, FPB, TSS, KAPPA, AUC, IMAE, BOYCE. Default TSS. Usage metric = BOYCE","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_ensemble.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Ensemble model fitting and validation — fit_ensemble","text":"list object : models: list models used performing ensemble. thr_metric: Threshold metric specified function. predictors: tibble quantitative (column names c) qualitative (column names f) variables used models. performance: tibble performance metrics (see sdm_eval). metrics threshold-dependent calculated based threshold specified argument.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_ensemble.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Ensemble model fitting and validation — fit_ensemble","text":"","code":"if (FALSE) { # \\dontrun{ require(dplyr) require(terra) # Environmental variables somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) # Species occurrences data(\"spp\") set.seed(1) some_sp <- spp %>% dplyr::filter(species == \"sp2\") %>% sdm_extract( data = ., x = \"x\", y = \"y\", env_layer = somevar, variables = names(somevar), filter_na = TRUE ) %>% part_random( data = ., pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 3) ) # gam mglm <- fit_glm( data = some_sp, response = \"pr_ab\", predictors = c(\"CFP_1\", \"CFP_2\", \"CFP_3\", \"CFP_4\"), partition = \".part\", poly = 2 ) mraf <- fit_raf( data = some_sp, response = \"pr_ab\", predictors = c(\"CFP_1\", \"CFP_2\", \"CFP_3\", \"CFP_4\"), partition = \".part\", ) mgbm <- fit_gbm( data = some_sp, response = \"pr_ab\", predictors = c(\"CFP_1\", \"CFP_2\", \"CFP_3\", \"CFP_4\"), partition = \".part\" ) # Fit and validate ensemble model mensemble <- fit_ensemble( models = list(mglm, mraf, mgbm), ens_method = \"meansup\", thr = NULL, thr_model = \"max_sens_spec\", metric = \"TSS\" ) } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_gam.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit and validate Generalized Additive Models — fit_gam","title":"Fit and validate Generalized Additive Models — fit_gam","text":"Fit validate Generalized Additive Models","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_gam.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit and validate Generalized Additive Models — fit_gam","text":"","code":"fit_gam( data, response, predictors, predictors_f = NULL, select_pred = FALSE, partition, thr = NULL, fit_formula = NULL, k = -1 )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_gam.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit and validate Generalized Additive Models — fit_gam","text":"data data.frame. Database response (0,1) predictors values. response character. Column name species absence-presence data (0,1). predictors character. Vector column names quantitative predictor variables (.e. continuous variables). Usage predictors = c(\"aet\", \"cwd\", \"tmin\") predictors_f character. Vector column names qualitative predictor variables (.e. ordinal nominal variables; factors). Usage predictors_f = c(\"landform\") select_pred logical. Perform predictor selection. Default FALSE. partition character. Column name training validation partition groups. thr character. Threshold used get binary suitability values (.e. 0,1). useful threshold-dependent performance metrics. possible use one threshold type. necessary provide vector argument. following threshold criteria available: lpt: highest threshold omission. equal_sens_spec: Threshold sensitivity specificity equal. max_sens_spec: Threshold sum sensitivity specificity highest (aka threshold maximizes TSS). max_jaccard: threshold Jaccard index highest. max_sorensen: threshold Sorensen index highest. max_fpb: threshold FPB (F-measure presence-background data) highest. sensitivity: Threshold based specified sensitivity value. Usage thr = c('sensitivity', sens='0.6') thr = c('sensitivity'). 'sens' refers sensitivity value. sensitivity value specified, default used 0.9. one threshold type used must concatenated, e.g., thr=c('lpt', 'max_sens_spec', 'max_jaccard'), thr=c('lpt', 'max_sens_spec', 'sensitivity', sens='0.8'), thr=c('lpt', 'max_sens_spec', 'sensitivity'). Function use threshold types none specified. fit_formula formula. formula object response predictor variables (e.g. formula(pr_ab ~ aet + ppt_jja + pH + awc + depth + landform)). Note variables used must consistent used response, predictors, predictors_f arguments k integer. dimension basis used represent smooth term. Default -1 (.e., k=10). See help ?mgcv::s.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_gam.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit and validate Generalized Additive Models — fit_gam","text":"list object : model: \"gam\" class object mgcv package. object can used predicting. predictors: tibble quantitative (c column names) qualitative (f column names) variables use modeling. performance: Performance metric (see sdm_eval). Threshold dependent metrics calculated based threshold specified argument. data_ens: Predicted suitability test partition. database used fit_ensemble","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_gam.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Fit and validate Generalized Additive Models — fit_gam","text":"function fits GAM using mgvc package, Binomial distribution family thin plate regression spline smoothing basis (see ?mgvc::s).","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_gam.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit and validate Generalized Additive Models — fit_gam","text":"","code":"if (FALSE) { # \\dontrun{ data(\"abies\") # Using k-fold partition method abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 10) ) abies2 gam_t1 <- fit_gam( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), predictors_f = c(\"landform\"), select_pred = FALSE, partition = \".part\", thr = \"max_sens_spec\" ) gam_t1$model gam_t1$predictors gam_t1$performance # Specifying the formula explicitly require(mgcv) gam_t2 <- fit_gam( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), predictors_f = c(\"landform\"), select_pred = FALSE, partition = \".part\", thr = \"max_sens_spec\", fit_formula = stats::formula(pr_ab ~ s(aet) + s(ppt_jja) + s(pH) + landform) ) gam_t2$model gam_t2$predictors gam_t2$performance %>% dplyr::select(ends_with(\"_mean\")) # Using repeated k-fold partition method abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"rep_kfold\", folds = 5, replicates = 5) ) abies2 gam_t3 <- fit_gam( data = abies2, response = \"pr_ab\", predictors = c(\"ppt_jja\", \"pH\", \"awc\"), predictors_f = c(\"landform\"), select_pred = FALSE, partition = \".part\", thr = \"max_sens_spec\" ) gam_t3 } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_gau.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit and validate Gaussian Process models — fit_gau","title":"Fit and validate Gaussian Process models — fit_gau","text":"Fit validate Gaussian Process models","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_gau.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit and validate Gaussian Process models — fit_gau","text":"","code":"fit_gau( data, response, predictors, predictors_f = NULL, background = NULL, partition, thr = NULL )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_gau.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit and validate Gaussian Process models — fit_gau","text":"data data.frame. Database response (0,1) predictors values. response character. Column name species absence-presence data (0,1). predictors character. Vector column names quantitative predictor variables (.e. continuous variables). Usage predictors = c(\"aet\", \"cwd\", \"tmin\") predictors_f character. Vector column names qualitative predictor variables (.e. ordinal nominal variables type). Usage predictors_f = c(\"landform\") background data.frame. Database response column 0 predictors variables. column names must consistent data partition character. Column name training validation partition groups. thr character. Threshold used get binary suitability values (.e. 0,1), useful threshold-dependent performance metrics. possible use one threshold type. vector must provided argument. following threshold criteria available: lpt: highest threshold omission. equal_sens_spec: Threshold sensitivity specificity equal. max_sens_spec: Threshold sum sensitivity specificity highest (aka threshold maximizes TSS). max_jaccard: threshold Jaccard index highest. max_sorensen: threshold Sorensen index highest. max_fpb: threshold FPB (F-measure presence-background data) highest. sensitivity: Threshold based specified sensitivity value. Usage thr = c('sensitivity', sens='0.6') thr = c('sensitivity'). 'sens' refers sensitivity value. sensitivity value specified, default used 0.9. one threshold type used must concatenated, e.g., thr=c('lpt', 'max_sens_spec', 'max_jaccard'), thr=c('lpt', 'max_sens_spec', 'sensitivity', sens='0.8'), thr=c('lpt', 'max_sens_spec', 'sensitivity'). Function use threshold criteria none specified.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_gau.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit and validate Gaussian Process models — fit_gau","text":"list object : model: \"graf\" class object. object can used predicting. predictors: tibble quantitative (c column names) qualitative (f column names) variables use modeling. performance: Performance metrics (see sdm_eval). Threshold dependent metrics calculated based threshold criteria specified argument. data_ens: Predicted suitability test partition. database used fit_ensemble","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_gau.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit and validate Gaussian Process models — fit_gau","text":"","code":"if (FALSE) { # \\dontrun{ data(\"abies\") # Using k-fold partition method abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 3) ) abies2 bg <- abies2 bg$pr_ab <- 0 gaup_t1 <- fit_gau( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), predictors_f = c(\"landform\"), partition = \".part\", background = bg, thr = c(\"max_sens_spec\", \"equal_sens_spec\", \"max_sorensen\") ) gaup_t1$model gaup_t1$predictors gaup_t1$performance gaup_t1$data_ens # Using bootstrap partition method only with presence-absence abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"boot\", replicates = 5, proportion = 0.7) ) abies2 gaup_t2 <- fit_gau( data = abies2, response = \"pr_ab\", predictors = c(\"ppt_jja\", \"pH\", \"awc\"), predictors_f = c(\"landform\"), partition = \".part\", thr = c(type = c(\"lpt\", \"max_sens_spec\", \"sensitivity\"), sens = \"0.8\") ) gaup_t2 } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_gbm.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit and validate Generalized Boosted Regression models — fit_gbm","title":"Fit and validate Generalized Boosted Regression models — fit_gbm","text":"Fit validate Generalized Boosted Regression models","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_gbm.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit and validate Generalized Boosted Regression models — fit_gbm","text":"","code":"fit_gbm( data, response, predictors, predictors_f = NULL, fit_formula = NULL, partition, thr = NULL, n_trees = 100, n_minobsinnode = as.integer(nrow(data) * 0.5/4), shrinkage = 0.1 )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_gbm.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit and validate Generalized Boosted Regression models — fit_gbm","text":"data data.frame. Database response (0,1) predictors values. response character. Column name species absence-presence data (0,1). predictors character. Vector column names quantitative predictor variables (.e. continuous variables). Usage predictors = c(\"aet\", \"cwd\", \"tmin\") predictors_f character. Vector column names qualitative predictor variables (.e. ordinal nominal variables type). Usage predictors_f = c(\"landform\") fit_formula formula. formula object response predictor variables (e.g. formula(pr_ab ~ aet + ppt_jja + pH + awc + depth + landform)). Note variables used must consistent used response, predictors, predictors_f arguments. Default NULL. partition character. Column name training validation partition groups. thr character. Threshold used get binary suitability values (.e. 0,1) needed threshold-dependent performance metrics. possible use one threshold type. necessary provide vector argument. following threshold criteria available: lpt: highest threshold omission. equal_sens_spec: Threshold sensitivity specificity equal. max_sens_spec: Threshold sum sensitivity specificity highest (aka threshold maximizes TSS). max_jaccard: threshold Jaccard index highest. max_sorensen: threshold Sorensen index highest. max_fpb: threshold FPB (F-measure presence-background data) highest. sensitivity: Threshold based specified sensitivity value. Usage thr = c('sensitivity', sens='0.6') thr = c('sensitivity'). 'sens' refers sensitivity value. sensitivity value specified, default used 0.9 one threshold type used must concatenated, e.g., thr=c('lpt', 'max_sens_spec', 'max_jaccard'), thr=c('lpt', 'max_sens_spec', 'sensitivity', sens='0.8'), thr=c('lpt', 'max_sens_spec', 'sensitivity'). Function use thresholds threshold specified. n_trees Integer specifying total number trees fit. equivalent number iterations number basis functions additive expansion. Default 100. n_minobsinnode Integer specifying minimum number observations terminal nodes trees. Note actual number observations, total weight. default value used nrow(data)*0.5/4 shrinkage Numeric. parameter applied tree expansion. Also known learning rate step-size reduction; 0.001 0.1 usually works, smaller learning rate typically requires trees. Default 0.1.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_gbm.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit and validate Generalized Boosted Regression models — fit_gbm","text":"list object : model: \"gbm\" class object gbm package. object can used predicting. predictors: tibble quantitative (c column names) qualitative (f column names) variables use modeling. performance: Performance metric (see sdm_eval). Threshold dependent metrics calculated based threshold specified thr argument. data_ens: Predicted suitability test partition based best model. database used fit_ensemble","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_gbm.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit and validate Generalized Boosted Regression models — fit_gbm","text":"","code":"if (FALSE) { # \\dontrun{ data(\"abies\") # Using k-fold partition method abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 10) ) abies2 gbm_t1 <- fit_gbm( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), predictors_f = c(\"landform\"), partition = \".part\", thr = c(\"max_sens_spec\", \"equal_sens_spec\", \"max_sorensen\") ) gbm_t1$model gbm_t1$predictors gbm_t1$performance gbm_t1$data_ens # Using bootstrap partition method abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"boot\", replicates = 10, proportion = 0.7) ) abies2 gbm_t2 <- fit_gbm( data = abies2, response = \"pr_ab\", predictors = c(\"ppt_jja\", \"pH\", \"awc\"), predictors_f = c(\"landform\"), partition = \".part\", thr = \"max_sens_spec\" ) gbm_t2 } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_glm.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit and validate Generalized Linear Models — fit_glm","title":"Fit and validate Generalized Linear Models — fit_glm","text":"Fit validate Generalized Linear Models","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_glm.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit and validate Generalized Linear Models — fit_glm","text":"","code":"fit_glm( data, response, predictors, predictors_f = NULL, select_pred = FALSE, partition, thr = NULL, fit_formula = NULL, poly = 2, inter_order = 0 )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_glm.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit and validate Generalized Linear Models — fit_glm","text":"data data.frame. Database response (0,1) predictors values. response character. Column name species absence-presence data (0,1). predictors character. Vector column names quantitative predictor variables (.e. continuous variables). Usage predictors = c(\"aet\", \"cwd\", \"tmin\") predictors_f character. Vector column names qualitative predictor variables (.e. ordinal nominal variables type). Usage predictors_f = c(\"landform\") select_pred logical. Perform predictor selection. TRUE predictors selected based backward step wise approach. Default FALSE. partition character. Column name training validation partition groups. thr character. Threshold used get binary suitability values (.e. 0,1), needed threshold-dependent performance metrics. one threshold type can used. necessary provide vector argument. following threshold criteria available: lpt: highest threshold omission. equal_sens_spec: Threshold sensitivity specificity equal. max_sens_spec: Threshold sum sensitivity specificity highest (aka threshold maximizes TSS). max_jaccard: threshold Jaccard index highest. max_sorensen: threshold Sorensen index highest. max_fpb: threshold FPB (F-measure presence-background data) highest. sensitivity: Threshold based specified sensitivity value. Usage thr = c('sensitivity', sens='0.6') thr = c('sensitivity'). 'sens' refers sensitivity value. specified sensitivity values, function use default 0.9 one threshold type used must concatenated, e.g., thr=c('lpt', 'max_sens_spec', 'max_jaccard'), thr=c('lpt', 'max_sens_spec', 'sensitivity', sens='0.8'), thr=c('lpt', 'max_sens_spec', 'sensitivity'). Function use thresholds threshold specified. fit_formula formula. formula object response predictor variables (e.g. formula(pr_ab ~ aet + ppt_jja + pH + awc + depth + landform)). Note variables used must consistent used response, predictors, predictors_f arguments poly integer >= 2. used values >= 2 model use polynomials continuous variables (.e. used predictors argument). Default 0. inter_order integer >= 0. interaction order explanatory variables. Default 0.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_glm.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit and validate Generalized Linear Models — fit_glm","text":"list object : model: \"glm\" class object stats package. object can used predicting. predictors: tibble quantitative (c column names) qualitative (f column names) variables use modeling. performance: Performance metrics (see sdm_eval). Threshold dependent metric calculated based threshold specified thr argument . data_ens: Predicted suitability test partition. database used fit_ensemble","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_glm.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit and validate Generalized Linear Models — fit_glm","text":"","code":"if (FALSE) { # \\dontrun{ data(\"abies\") abies # Using k-fold partition method abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 5) ) abies2 glm_t1 <- fit_glm( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), predictors_f = c(\"landform\"), select_pred = FALSE, partition = \".part\", thr = c(\"max_sens_spec\", \"equal_sens_spec\", \"max_sorensen\"), poly = 0, inter_order = 0 ) glm_t1$model glm_t1$predictors glm_t1$performance glm_t1$data_ens # Using second order polynomial terms and first-order interaction terms glm_t2 <- fit_glm( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), predictors_f = c(\"landform\"), select_pred = FALSE, partition = \".part\", thr = c(\"max_sens_spec\", \"equal_sens_spec\", \"max_sorensen\"), poly = 2, inter_order = 1 ) # Using repeated k-fold partition method abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"rep_kfold\", folds = 3, replicates = 5) ) abies2 # Using third order polynomial terms and second-order interaction terms glm_t3 <- fit_glm( data = abies2, response = \"pr_ab\", predictors = c(\"ppt_jja\", \"pH\", \"awc\"), predictors_f = c(\"landform\"), select_pred = FALSE, partition = \".part\", thr = c(\"max_sens_spec\", \"equal_sens_spec\", \"max_sorensen\"), poly = 3, inter_order = 2 ) } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_max.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit and validate Maximum Entropy models — fit_max","title":"Fit and validate Maximum Entropy models — fit_max","text":"Fit validate Maximum Entropy models","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_max.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit and validate Maximum Entropy models — fit_max","text":"","code":"fit_max( data, response, predictors, predictors_f = NULL, fit_formula = NULL, partition, background = NULL, thr = NULL, clamp = TRUE, classes = \"default\", pred_type = \"cloglog\", regmult = 1 )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_max.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit and validate Maximum Entropy models — fit_max","text":"data data.frame. Database response (0,1) predictors values. response character. Column name species absence-presence data (0,1). predictors character. Vector column names quantitative predictor variables (.e. continuous variables). Usage predictors = c(\"aet\", \"cwd\", \"tmin\") predictors_f character. Vector column names qualitative predictor variables (.e. ordinal nominal variables type). Usage predictors_f = c(\"landform\") fit_formula formula. formula object response predictor variables. See maxnet.formula function maxnet package. Note variables used must consistent used response, predictors, predictors_f arguments. Default NULL. partition character. Column name training validation partition groups. background data.frame. Database including rows 0 values response column predictors variables. column names must consistent data. Default NULL thr character. Threshold used get binary suitability values (.e. 0,1), needed threshold-dependent performance metrics. one threshold type can used. necessary provide vector argument. following threshold criteria available: lpt: highest threshold omission. equal_sens_spec: Threshold sensitivity specificity equal. max_sens_spec: Threshold sum sensitivity specificity highest (aka threshold maximizes TSS). max_jaccard: threshold Jaccard index highest. max_sorensen: threshold Sorensen index highest. max_fpb: threshold FPB (F-measure presence-background data) highest. sensitivity: Threshold based specified sensitivity value. Usage thr = c('sensitivity', sens='0.6') thr = c('sensitivity'). 'sens' refers sensitivity value. sensitivity values specified default used 0.9. one threshold type used must concatenated, e.g., thr=c('lpt', 'max_sens_spec', 'max_jaccard'), thr=c('lpt', 'max_sens_spec', 'sensitivity', sens='0.8'), thr=c('lpt', 'max_sens_spec', 'sensitivity'). Function use thresholds threshold specified. clamp logical. TRUE, predictors features restricted range seen model training. classes character. single feature combinations . Features symbolized letters: l (linear), q (quadratic), h (hinge), p (product), t (threshold). Usage classes = \"lpq\". Default \"default\" (see details). pred_type character. Type response required available \"link\", \"exponential\", \"cloglog\" \"logistic\". Default \"cloglog\" regmult numeric. constant adjust regularization. Default 1.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_max.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit and validate Maximum Entropy models — fit_max","text":"list object : model: \"maxnet\" class object maxnet package. object can used predicting. predictors: tibble quantitative (c column names) qualitative (f column names) variables use modeling. performance: Performance metrics (see sdm_eval). Threshold dependent metrics calculated based threshold specified thr argument. data_ens: Predicted suitability test partition based best model. database used fit_ensemble","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_max.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Fit and validate Maximum Entropy models — fit_max","text":"argument “classes” set default MaxEnt use different features combination depending number presences (np) follow rule: np < 10 classes = \"l\", np 10 15 classes = \"lq\", np 15 80 classes = \"lqh\", np >= 80 classes = \"lqph\" presence-absence (presence-pseudo-absence) data used data argument addition background points, function fit models presences background points validate presences absences. procedure makes maxent comparable presences-absences models (e.g., random forest, support vector machine). presences background points data used, function fit validate model presences background data. presence-absences used data argument without background, function fit model specified data (recommended).","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_max.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit and validate Maximum Entropy models — fit_max","text":"","code":"if (FALSE) { # \\dontrun{ data(\"abies\") data(\"backg\") abies # environmental conditions of presence-absence data backg # environmental conditions of background points # Using k-fold partition method # Note that the partition method, number of folds or replications must # be the same for presence-absence and background points datasets abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 5) ) abies2 backg2 <- part_random( data = backg, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 5) ) backg2 max_t1 <- fit_max( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), predictors_f = c(\"landform\"), partition = \".part\", background = backg2, thr = c(\"max_sens_spec\", \"equal_sens_spec\", \"max_sorensen\"), clamp = TRUE, classes = \"default\", pred_type = \"cloglog\", regmult = 1 ) length(max_t1) max_t1$model max_t1$predictors max_t1$performance max_t1$data_ens } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_net.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit and validate Neural Networks models — fit_net","title":"Fit and validate Neural Networks models — fit_net","text":"Fit validate Neural Networks models","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_net.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit and validate Neural Networks models — fit_net","text":"","code":"fit_net( data, response, predictors, predictors_f = NULL, fit_formula = NULL, partition, thr = NULL, size = 2, decay = 0.1 )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_net.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit and validate Neural Networks models — fit_net","text":"data data.frame. Database response (0,1) predictors values. response character. Column name species absence-presence data (0,1). predictors character. Vector column names quantitative predictor variables (.e. continuous variables). Usage predictors = c(\"aet\", \"cwd\", \"tmin\") predictors_f character. Vector column names qualitative predictor variables (.e. ordinal nominal variables type). Usage predictors_f = c(\"landform\") fit_formula formula. formula object response predictor variables (e.g. formula(pr_ab ~ aet + ppt_jja + pH + awc + depth + landform)). Note variables used must consistent used response, predictors, predictors_f arguments. Defaul NULL. partition character. Column name training validation partition groups. thr character. Threshold used get binary suitability values (.e. 0,1)., needed threshold-dependent performance metrics. one threshold type can specified. necessary provide vector argument. following threshold criteria available: lpt: highest threshold omission. equal_sens_spec: Threshold sensitivity specificity equal. max_sens_spec: Threshold sum sensitivity specificity highest (aka threshold maximizes TSS). max_jaccard: threshold Jaccard index highest. max_sorensen: threshold Sorensen index highest. max_fpb: threshold FPB (F-measure presence-background data) highest. sensitivity: Threshold based specified sensitivity value. Usage thr = c('sensitivity', sens='0.6') thr = c('sensitivity'). 'sens' refers sensitivity value. sensitivity value specified, default 0.9 one threshold type used must concatenated, e.g., thr=c('lpt', 'max_sens_spec', 'max_jaccard'), thr=c('lpt', 'max_sens_spec', 'sensitivity', sens='0.8'), thr=c('lpt', 'max_sens_spec', 'sensitivity'). Function use thresholds threshold specified. size numeric. Number units hidden layer. Can zero skip-layer units. Default 2. decay numeric. Parameter weight decay. Default 0.1.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_net.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit and validate Neural Networks models — fit_net","text":"list object : model: \"nnet.formula\" \"nnet\" class object nnet package. object can used predicting. predictors: tibble quantitative (c column names) qualitative (f column names) variables use modeling. performance: Performance metrics (see sdm_eval). Threshold dependent metric calculated based threshold specified argument. data_ens: Predicted suitability test partition. database used fit_ensemble","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_net.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit and validate Neural Networks models — fit_net","text":"","code":"if (FALSE) { # \\dontrun{ data(\"abies\") # Using k-fold partition method abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 10) ) abies2 nnet_t1 <- fit_net( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), predictors_f = c(\"landform\"), partition = \".part\", thr = c(\"max_sens_spec\", \"equal_sens_spec\", \"max_sorensen\"), fit_formula = NULL ) nnet_t1$model nnet_t1$predictors nnet_t1$performance nnet_t1$data_ens # Using bootstrap partition method and only with presence-absence # and get performance for several method abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"boot\", replicates = 10, proportion = 0.7) ) abies2 nnet_t2 <- fit_net( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), predictors_f = c(\"landform\"), partition = \".part\", thr = c(\"max_sens_spec\", \"equal_sens_spec\", \"max_sorensen\"), fit_formula = NULL ) nnet_t2 } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_raf.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit and validate Random Forests models — fit_raf","title":"Fit and validate Random Forests models — fit_raf","text":"Fit validate Random Forests models","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_raf.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit and validate Random Forests models — fit_raf","text":"","code":"fit_raf( data, response, predictors, predictors_f = NULL, fit_formula = NULL, partition, thr = NULL, mtry = sqrt(length(c(predictors, predictors_f))) )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_raf.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit and validate Random Forests models — fit_raf","text":"data data.frame. Database response (0,1) predictors values. response character. Column name species absence-presence data (0,1). predictors character. Vector column names quantitative predictor variables (.e. continuous variables). Usage predictors = c(\"aet\", \"cwd\", \"tmin\") predictors_f character. Vector column names qualitative predictor variables (.e. ordinal nominal variables type). Usage predictors_f = c(\"landform\") fit_formula formula. formula object response predictor variables (e.g. formula(pr_ab ~ aet + ppt_jja + pH + awc + depth + landform)). Note variables used must consistent used response, predictors, predictors_f arguments. Default NULL partition character. Column name training validation partition groups. thr character. Threshold used get binary suitability values (.e. 0,1), needed threshold-dependent performance metrics. one threshold type can used. necessary provide vector argument. following threshold criteria available: lpt: highest threshold omission. equal_sens_spec: Threshold sensitivity specificity equal. max_sens_spec: Threshold sum sensitivity specificity highest (aka threshold maximizes TSS). max_jaccard: threshold Jaccard highest. max_sorensen: threshold Sorensen highest. max_fpb: threshold FPB (F-measure presence-background data) highest. sensitivity: Threshold based specified sensitivity value. Usage thr = c('sensitivity', sens='0.6') thr = c('sensitivity'). 'sens' refers sensitivity value. specified sensitivity values, function use default 0.9 one threshold type used must concatenated, e.g., thr=c('lpt', 'max_sens_spec', 'max_jaccard'), thr=c('lpt', 'max_sens_spec', 'sensitivity', sens='0.8'), thr=c('lpt', 'max_sens_spec', 'sensitivity'). Function use thresholds threshold specified. mtry numeric. Number variables randomly sampled candidates split. Default sqrt(length(c(predictors, predictors_f)))","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_raf.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit and validate Random Forests models — fit_raf","text":"list object : model: \"randomForest\" class object randomForest package. object can used predicting. predictors: tibble quantitative (c column names) qualitative (f column names) variables use modeling. performance: Performance metrics (see sdm_eval). Threshold dependent metrics calculated based threshold specified argument. data_ens: Predicted suitability test partition. database used fit_ensemble","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_raf.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit and validate Random Forests models — fit_raf","text":"","code":"if (FALSE) { # \\dontrun{ data(\"abies\") # Using k-fold partition method abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 10) ) abies2 rf_t1 <- fit_raf( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), predictors_f = c(\"landform\"), partition = \".part\", thr = c(\"max_sens_spec\", \"equal_sens_spec\", \"max_sorensen\"), fit_formula = NULL ) rf_t1$model rf_t1$predictors rf_t1$performance rf_t1$data_ens # Using bootstrap partition method and only with presence-absence # and get performance for several method abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"boot\", replicates = 10, proportion = 0.7) ) abies2 rf_t2 <- fit_raf( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), predictors_f = c(\"landform\"), partition = \".part\", thr = c(\"max_sens_spec\", \"equal_sens_spec\", \"max_sorensen\"), fit_formula = NULL ) rf_t2 } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_svm.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit and validate Support Vector Machine models — fit_svm","title":"Fit and validate Support Vector Machine models — fit_svm","text":"Fit validate Support Vector Machine models","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_svm.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit and validate Support Vector Machine models — fit_svm","text":"","code":"fit_svm( data, response, predictors, predictors_f = NULL, fit_formula = NULL, partition, thr = NULL, sigma = \"automatic\", C = 1 )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_svm.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit and validate Support Vector Machine models — fit_svm","text":"data data.frame. Database response (0,1) predictors values. response character. Column name species absence-presence data (0,1). predictors character. Vector column names quantitative predictor variables (.e. continuous variables). Usage predictors = c(\"aet\", \"cwd\", \"tmin\") predictors_f character. Vector column names qualitative predictor variables (.e. ordinal nominal variables type). Usage predictors_f = c(\"landform\") fit_formula formula. formula object response predictor variables (e.g. formula(pr_ab ~ aet + ppt_jja + pH + awc + depth + landform)). Note variables used must consistent used response, predictors, predictors_f arguments partition character. Column name training validation partition groups. thr character. Threshold used get binary suitability values (.e. 0,1) needed threshold-dependent performance metrics. one threshold type can used. necessary provide vector argument. following threshold criteria available: lpt: highest threshold omission. equal_sens_spec: Threshold sensitivity specificity equal. max_sens_spec: Threshold sum sensitivity specificity highest (aka threshold maximizes TSS). max_jaccard: threshold Jaccard index highest. max_sorensen: threshold Sorensen index highest. max_fpb: threshold FPB (F-measure presence-background data) highest. sensitivity: Threshold based specified sensitivity value. Usage thr = c('sensitivity', sens='0.6') thr = c('sensitivity'). 'sens' refers sensitivity value. sensitivity value specified, default used 0.9 one threshold type used must concatenated, e.g., thr=c('lpt', 'max_sens_spec', 'max_jaccard'), thr=c('lpt', 'max_sens_spec', 'sensitivity', sens='0.8'), thr=c('lpt', 'max_sens_spec', 'sensitivity'). Function use thresholds threshold specified. sigma numeric. Inverse kernel width Radial Basis kernel function \"rbfdot\". Default \"automatic\". C numeric. Cost constraints violation, 'C'-constant regularization term Lagrange formulation. Default 1","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_svm.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit and validate Support Vector Machine models — fit_svm","text":"list object : model: \"ksvm\" class object kernlab package. object can used predicting. predictors: tibble quantitative (c column names) qualitative (f column names) variables use modeling. performance: Performance metric (see sdm_eval). Threshold dependent metrics calculated based threshold specified argument. data_ens: Predicted suitability test partition based best model. database used fit_ensemble","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_svm.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Fit and validate Support Vector Machine models — fit_svm","text":"function constructs 'C-svc' classification type uses Radial Basis kernel \"Gaussian\" function (rbfdot). See details details ksvm.","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/fit_svm.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit and validate Support Vector Machine models — fit_svm","text":"","code":"if (FALSE) { # \\dontrun{ data(\"abies\") # Using k-fold partition method abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 5) ) abies2 svm_t1 <- fit_svm( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), predictors_f = c(\"landform\"), partition = \".part\", thr = c(\"max_sens_spec\", \"equal_sens_spec\", \"max_sorensen\"), fit_formula = NULL ) names(svm_t1) svm_t1$model svm_t1$predictors svm_t1$performance svm_t1$data_ens # Using bootstrap partition method and only with presence-absence # and get performance for several method abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"boot\", replicates = 10, proportion = 0.7) ) abies2 svm_t2 <- fit_svm( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), predictors_f = c(\"landform\"), partition = \".part\", thr = c(\"max_sens_spec\", \"equal_sens_spec\", \"max_sorensen\"), fit_formula = NULL ) svm_t2 } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/get_block.html","id":null,"dir":"Reference","previous_headings":"","what":"Transform a spatial partition layer to the same spatial properties as environmental variables — get_block","title":"Transform a spatial partition layer to the same spatial properties as environmental variables — get_block","text":"Transform spatial partition layer spatial properties environmental variables","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/get_block.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Transform a spatial partition layer to the same spatial properties as environmental variables — get_block","text":"","code":"get_block(env_layer, best_grid)"},{"path":"https://sjevelazco.github.io/flexsdm/reference/get_block.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Transform a spatial partition layer to the same spatial properties as environmental variables — get_block","text":"env_layer SpatRaster object environmental variables used block_partition band_partition function. Function always select first layer best_grid SpatRaster object returned block_partition band_partition","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/get_block.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Transform a spatial partition layer to the same spatial properties as environmental variables — get_block","text":"SpatRaster layer resolution extent environmental variables","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/get_block.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Transform a spatial partition layer to the same spatial properties as environmental variables — get_block","text":"Transform layer originating function block_partition band_partition spatial properties environmental variables","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/get_block.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Transform a spatial partition layer to the same spatial properties as environmental variables — get_block","text":"","code":"if (FALSE) { # \\dontrun{ require(dplyr) require(terra) data(spp) f <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(f) # Example for a single species single_spp <- spp %>% dplyr::filter(species == \"sp3\") part <- part_sblock( env_layer = somevar, data = single_spp, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", min_res_mult = 100, max_res_mult = 500, num_grids = 10, min_occ = 5, n_part = 2 ) grid_env <- get_block(env_layer = somevar, best_grid = part$grid) grid_env part$grid plot(part$grid) plot(grid_env) } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/hespero.html","id":null,"dir":"Reference","previous_headings":"","what":"A data set containing localities of Hesperocyparis stephensonii species in California, USA — hespero","title":"A data set containing localities of Hesperocyparis stephensonii species in California, USA — hespero","text":"data set containing localities Hesperocyparis stephensonii species California, USA","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/hespero.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"A data set containing localities of Hesperocyparis stephensonii species in California, USA — hespero","text":"","code":"hespero"},{"path":"https://sjevelazco.github.io/flexsdm/reference/hespero.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"A data set containing localities of Hesperocyparis stephensonii species in California, USA — hespero","text":"tibble object 14 rows 4 variables: ID presences records ID x y columns coordinates Albers Equal Area Conic coordinate system pr_ab presence denoted 1","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/hespero.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"A data set containing localities of Hesperocyparis stephensonii species in California, USA — hespero","text":"","code":"if (FALSE) { # \\dontrun{ require(dplyr) data(\"hespero\") hespero } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/homogenize_na.html","id":null,"dir":"Reference","previous_headings":"","what":"Homogenize cells with NAs across all layers — homogenize_na","title":"Homogenize cells with NAs across all layers — homogenize_na","text":"Homogenize cells NAs across layers","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/homogenize_na.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Homogenize cells with NAs across all layers — homogenize_na","text":"","code":"homogenize_na(x)"},{"path":"https://sjevelazco.github.io/flexsdm/reference/homogenize_na.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Homogenize cells with NAs across all layers — homogenize_na","text":"x SpatRaster.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/homogenize_na.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Homogenize cells with NAs across all layers — homogenize_na","text":"SpatRaster","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/homogenize_na.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Homogenize cells with NAs across all layers — homogenize_na","text":"Homogenize cells NAs across layers SpatRaster resulting SpatRaster layers cells NAa","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/homogenize_na.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Homogenize cells with NAs across all layers — homogenize_na","text":"","code":"if (FALSE) { # \\dontrun{ #' require(terra) somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) somevar2 <- homogenize_na(somevar) par(mfrow = c(2, 1)) plot(somevar$CFP_4) plot(somevar2$CFP_4) par(mfrow = c(1, 1)) # In somevar2 all layers have the same cells with NAs } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/interp.html","id":null,"dir":"Reference","previous_headings":"","what":"Raster interpolation between two time periods — interp","title":"Raster interpolation between two time periods — interp","text":"function interpolates values year two specified years simple interpolation using two raster objects containing e.g. habitat suitability values predicted using species distribution model.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/interp.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Raster interpolation between two time periods — interp","text":"","code":"interp(r1, r2, y1, y2, rastername = NULL, dir_save = NULL)"},{"path":"https://sjevelazco.github.io/flexsdm/reference/interp.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Raster interpolation between two time periods — interp","text":"r1 SpatRaster. Raster object initial year r2 SpatRaster. Raster object final year y1 numeric. Initial year y2 numeric. Final year rastername character. Word used prefix raster file name. Default NULL dir_save character. Directory path name folder raster files saved. NULL, function return SpatRaster object, else, save raster given directory. Default NULL","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/interp.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Raster interpolation between two time periods — interp","text":"dir_save NULL, function returns SpatRaster suitability interpolation year. dir_save used, function outputs saved directory specified dir_save.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/interp.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Raster interpolation between two time periods — interp","text":"function interpolates suitability values assuming annual changes suitability linear. function useful linking SDM output based averaged climate data climate change scenarios models require suitability values disaggregated time periods, population dynamics (Keith et al., 2008; Conlisk et al., 2013; Syphard et al., 2013).","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/interp.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Raster interpolation between two time periods — interp","text":"Keith, D.., Akçakaya, H.R., Thuiller, W., Midgley, G.F., Pearson, R.G., Phillips, S.J., Regan, H.M., Araujo, M.B. & Rebelo, T.G. (2008) Predicting extinction risks climate change: coupling stochastic population models dynamic bioclimatic habitat models. Biology Letters, 4, 560-563. Conlisk, E., Syphard, .D., Franklin, J., Flint, L., Flint, . & Regan, H.M. (2013) Management implications uncertainty assessing impacts multiple landscape-scale threats species persistence using linked modeling approach. Global Change Biology 3, 858-869. Syphard, .D., Regan, H.M., Franklin, J. & Swab, R. (2013) functional type vulnerability multiple threats depend spatial context Mediterranean-climate regions? Diversity Distributions, 19, 1263-1274.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/interp.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Raster interpolation between two time periods — interp","text":"","code":"if (FALSE) { # \\dontrun{ require(terra) require(dplyr) f <- system.file(\"external/suit_time_step.tif\", package = \"flexsdm\") abma <- terra::rast(f) plot(abma) int <- interp( r1 = abma[[1]], r2 = abma[[2]], y1 = 2010, y2 = 2020, rastername = \"Abies\", dir_save = NULL ) int } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/msdm_posteriori.html","id":null,"dir":"Reference","previous_headings":"","what":"Methods to correct overprediction of species distribution models based on occurrences and suitability patterns. — msdm_posteriori","title":"Methods to correct overprediction of species distribution models based on occurrences and suitability patterns. — msdm_posteriori","text":"methods reduce overprediction species distribution models based posteriori methods (see Mendes et al 2020), .e., combination patterns species occurrences predicted suitability","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/msdm_posteriori.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Methods to correct overprediction of species distribution models based on occurrences and suitability patterns. — msdm_posteriori","text":"","code":"msdm_posteriori( records, x, y, pr_ab, cont_suit, method = c(\"obr\", \"pres\", \"lq\", \"mcp\", \"bmcp\"), thr = \"equal_sens_spec\", buffer = NULL, crs = NULL )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/msdm_posteriori.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Methods to correct overprediction of species distribution models based on occurrences and suitability patterns. — msdm_posteriori","text":"records tibble data.frame. database spatial coordinates species presences absences (pseudo-absence) used create species distribution models. x character. Column name spatial x coordinates. y character. Column name spatial y coordinates. pr_ab character. Column name presence absence data (.e. 1 0) cont_suit SpatRaster. Raster continuous suitability predictions \"species_specific\" type calculates minimum pairwise-distances occurrences selects maximum distance, .e., value buffer maximum distance minimum distance. procedure depends spatial pattern species' occurrences; thus, species, value buffer width calculated (usage buffer=\"species_specific\"). method character. character string indicating constraint method used. thr character numeric. Threshold used get binary suitability values (.e. 0,1), needed threshold-dependent performance metrics. one threshold type can specified. necessary provide vector argument. following threshold criteria available: lpt: highest threshold omission. equal_sens_spec: Threshold sensitivity specificity equal. max_sens_spec: Threshold sum sensitivity specificity highest (aka threshold maximizes TSS). max_jaccard: threshold Jaccard index highest. max_sorensen: threshold Sorensen index highest. max_fpb: threshold FPB highest. sensitivity: Threshold based specified sensitivity value. Usage thr = c('sensitivity', sens='0.6') thr = c('sensitivity'). 'sens' refers sensitivity value. specified sensitivity values, function use default 0.9 Also, possible specifying threshold value using numeric values (thr = 0.623). Default \"equal_sens_spec\". buffer numeric. Buffer width use 'bmcp' approach. buffer width interpreted m Coordinate reference system used \"crs\" argument longitude/latitude, map units cases. Usage buffer=50000. Default NULL crs character. Coordinate reference system used calculating buffer \"bmcp\" method.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/msdm_posteriori.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Methods to correct overprediction of species distribution models based on occurrences and suitability patterns. — msdm_posteriori","text":"function return SpatRaster continuous binary prediction.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/msdm_posteriori.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Methods to correct overprediction of species distribution models based on occurrences and suitability patterns. — msdm_posteriori","text":"function help reduce overprediction species distribution models based combination patterns species occurrences predicted suitability. recommended use approaches current distribution models projected different time periods (past future). Five methods implemented: Abbreviation list SDM: species distribution model l: suitability patches intercept species occurrences k: suitability patches intercept species occurrences T: threshold distances used select suitability patches methods reduce overprediction species distribution models already fitted based occurrences suitability patterns species (see 'thr' arguments) Method 'obr' (Occurrences Based Restriction). method assumes suitable patches intercepting species occurrences (l) likely part species distributions suitable patches intercept occurrence (k). Distance k patches closest l patch calculated, k patches removed exceed species-specific distance threshold SDMs models. threshold (T) calculated maximum distance vector minimum pairwise distances occurrences. Whenever suitable pixel within k patch distance T closest l patch, suitability pixel reduced zero. assumed simple threshold surrogate species-specific dispersal ability. T low, either species sampled throughout distribution, species geographically restricted, justifying narrow inclusion k patches (Mendes et al., 2020). Method 'pres' (occurrences based restriction). restrictive variant 'obr' method. retains pixels suitability patches intercepting occurrences (k) (Mendes et al., 2020). Method 'lq' (Lower Quantile). method similar 'obr' method, except procedure define distance threshold withdrawn k patches, lower quartile distance k patches closest l patch. Whenever suitable pixel within k patch, .e., within lower quartile, suitability pixel reduced zero. means 75% k patches withdrawn model (Mendes et al., 2020). Method 'mcp' (Minimum Convex Polygon). Compiled adapted Kremen et al. (2008), method excludes SDM predictions suitable pixels intercept minimum convex polygon, interior angles smaller 180, enclosing occurrences species. Method 'bmcp' (Buffered Minimum Convex Polygon). Compiled adapted Kremen et al. (2008), similar 'mcp' method except inclusion buffer zone surrounding minimum convex polygons. method buffer width value must provided \"buffer\" argument CRS \"crs\" argument. methodological performance information methods see Mendes et al. (2020). using one constraining methods, cite Mendes et al (2020).","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/msdm_posteriori.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Methods to correct overprediction of species distribution models based on occurrences and suitability patterns. — msdm_posteriori","text":"Mendes, P.; Velazco S.J.E.; Andrade, .F..; De Marco, P. (2020) Dealing overprediction species distribution models: adding distance constraints can improve model accuracy, Ecological Modelling, press. https://doi.org/10.1016/j.ecolmodel.2020.109180 Kremen, C., Cameron, ., Moilanen, ., Phillips, S. J., Thomas, C. D., Beentje, H., . Zjhra, M. L. (2008). Aligning Conservation Priorities Across Taxa Madagascar High-Resolution Planning Tools. Science, 320(5873), 222-226. doi:10.1126/science.1155193","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/msdm_posteriori.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Methods to correct overprediction of species distribution models based on occurrences and suitability patterns. — msdm_posteriori","text":"","code":"if (FALSE) { # \\dontrun{ require(dplyr) require(terra) data(\"spp\") somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) # Preparing data for modeling a species set.seed(10) occ <- spp %>% dplyr::filter(species == \"sp2\") %>% # filter a species sdm_extract( data = ., x = \"x\", y = \"y\", env_layer = somevar, filter_na = TRUE ) %>% # extrac variables values part_random(., pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 10) ) # add columns with partition # Fit a model m_glm <- fit_glm( data = occ, response = \"pr_ab\", predictors = names(somevar), partition = \".part\", thr = \"equal_sens_spec\", ) # Lets predict this model m_pred <- sdm_predict(models = m_glm, pred = somevar, thr = NULL, con_thr = FALSE) plot(m_pred[[1]]) m_pred[[1]] %>% plot() # Lets extract the raster from this list m_pred <- m_pred[[1]] ### bmcp method m_bmcp <- msdm_posteriori( records = occ, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", method = \"bmcp\", cont_suit = m_pred, thr = \"equal_sens_spec\", buffer = 30000, crs=crs(m_pred) ) plot(m_bmcp) ### mcp method m_mcp <- msdm_posteriori( records = occ, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", method = \"mcp\", cont_suit = m_pred, thr = \"equal_sens_spec\", buffer = NULL ) plot(m_mcp) ### pres method m_pres <- msdm_posteriori( records = occ, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", method = \"pres\", cont_suit = m_pred, thr = \"equal_sens_spec\", buffer = NULL ) plot(m_pres) ### lq method m_lq <- msdm_posteriori( records = occ, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", method = \"lq\", cont_suit = m_pred, thr = \"equal_sens_spec\", buffer = NULL ) plot(m_lq) ### obr method m_obr <- msdm_posteriori( records = occ, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", method = \"obr\", cont_suit = m_pred, thr = \"equal_sens_spec\", buffer = NULL ) plot(m_obr) } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/msdm_priori.html","id":null,"dir":"Reference","previous_headings":"","what":"Create spatial predictor variables to reduce overprediction of species distribution models — msdm_priori","title":"Create spatial predictor variables to reduce overprediction of species distribution models — msdm_priori","text":"function creates geographical predictor variables , together environmental variables, can used construct constrained species distribution models.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/msdm_priori.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Create spatial predictor variables to reduce overprediction of species distribution models — msdm_priori","text":"","code":"msdm_priori(data, x, y, method = c(\"xy\", \"min\", \"cml\", \"ker\"), env_layer)"},{"path":"https://sjevelazco.github.io/flexsdm/reference/msdm_priori.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Create spatial predictor variables to reduce overprediction of species distribution models — msdm_priori","text":"data tibble data.frame. database geographical coordinates species presences. x character. Column name spatial x coordinates. y character. Column name spatial y coordinates. method character. character string indicating MSDM method used. following methods available: 'xy', 'min', 'cml', 'ker'. Usage method = 'cml' env_layer raster layer used construct species distribution models. object used create constraining variables resolution, extent, pattern empty cells environmental variables. advisable use raster environmental layer used create species distribution models avoid mismatch (e.g. resolution, extent, cells NA) environmental constraining variables.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/msdm_priori.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Create spatial predictor variables to reduce overprediction of species distribution models — msdm_priori","text":"function returns SpatRaster object. raster/s used together environmental variables construct species distribution models. 'xy' approach creates single pair raster layers can used species share study region. Otherwise, 'cml', 'min', 'ker' create species-specific raster layer.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/msdm_priori.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Create spatial predictor variables to reduce overprediction of species distribution models — msdm_priori","text":"function creates geographical predictor variables , together environmental variables, can used construct constrained species distribution models. recommended use approaches create models projected current conditions different time periods (past future). Four methods implemented: xy (Latlong method). method assumes spatial structure can partially explain species distribution (Bahn & McGill, 2007). Therefore, two raster layers created, containing latitude longitude pixels, respectively. raster layers included covariates environmental layers construct species distribution models. method interact species occurrence generic given study region; reason, possible use method species set share study region. min (Nearest neighbor distance method). Compiled adapted Allouche et al. (2008), method calculates cell Euclidean geographic distance nearest presence point. cml (Cumulative distance method). Compiled adapted Allouche et al. (2008), method assumes pixels closer presences likely included species distributions. Therefore, raster layer created containing sum Euclidean geographic distances pixel occurrences species. Obtained values normalized vary zero one. raster layer included environmental layers construct species distribution models. ker (Kernel method). Compiled adapted Allouche et al. (2008), method, like cml, assumes pixels located areas higher density occurrences likely included actual species distribution. Thus, raster layer created containing Gaussian values based density occurrences species. standard deviation Gaussian distribution maximum value vector minimum distances pairs occurrences species. Gaussian values normalized vary zero one. raster layer included environmental layers construct species distribution models. See Mendes et al. (2020) methodological performance details. used one constraining method cite Mendes et al 2020.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/msdm_priori.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Create spatial predictor variables to reduce overprediction of species distribution models — msdm_priori","text":"Mendes, P.; Velazco S.J.E.; Andrade, .F..; De Marco, P. (2020) Dealing overprediction species distribution models: adding distance constraints can improve model accuracy, Ecological Modelling, press. https://doi.org/10.1016/j.ecolmodel.2020.109180 Allouche, O.; Steinitz, O.; Rotem, D.; Rosenfeld, .; Kadmon, R. (2008). Incorporating distance constraints species distribution models. Journal Applied Ecology, 45(2), 599-609. doi:10.1111/j.1365-2664.2007.01445.x Bahn, V.; McGill, B. J. (2007). Can niche-based distribution models outperform spatial interpolation? Global Ecology Biogeography, 16(6), 733-742. doi:10.1111/j.1466-8238.2007.00331.x","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/msdm_priori.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Create spatial predictor variables to reduce overprediction of species distribution models — msdm_priori","text":"","code":"if (FALSE) { # \\dontrun{ require(dplyr) require(terra) data(\"spp\") somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) # Select the presences of a species occ <- spp %>% dplyr::filter(species == \"sp3\", pr_ab == 1) # Select a raster layer to be used as a basic raster a_variable <- somevar[[1]] plot(a_variable) points(occ %>% dplyr::select(x, y)) ### xy method m_xy <- msdm_priori( data = occ, x = \"x\", y = \"y\", method = \"xy\", env_layer = a_variable ) plot(m_xy) ### min method m_min <- msdm_priori( data = occ, x = \"x\", y = \"y\", method = \"min\", env_layer = a_variable ) plot(m_min) ### cml method m_cml <- msdm_priori( data = occ, x = \"x\", y = \"y\", method = \"cml\", env_layer = a_variable ) plot(m_cml) ### ker method m_ker <- msdm_priori( data = occ, x = \"x\", y = \"y\", method = \"ker\", env_layer = a_variable ) plot(m_ker) } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/occfilt_env.html","id":null,"dir":"Reference","previous_headings":"","what":"Perform environmental filtering on species occurrences — occfilt_env","title":"Perform environmental filtering on species occurrences — occfilt_env","text":"function perform filtering species occurrences based environmental conditions.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/occfilt_env.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Perform environmental filtering on species occurrences — occfilt_env","text":"","code":"occfilt_env(data, x, y, id, env_layer, nbins)"},{"path":"https://sjevelazco.github.io/flexsdm/reference/occfilt_env.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Perform environmental filtering on species occurrences — occfilt_env","text":"data data.frame. Data.frame tibble object presences (presence-absence) records, coordinates x character. Column name spatial x coordinates y character. Column name spatial y coordinates id character. Column names rows id. important row unique code. env_layer SpatRaster. Rasters environmental conditions nbins integer. number classes used split environmental condition","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/occfilt_env.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Perform environmental filtering on species occurrences — occfilt_env","text":"tibble object data environmentally filtered","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/occfilt_env.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Perform environmental filtering on species occurrences — occfilt_env","text":"function uses approach adapted approach proposed Varela et al. (2014). consists filtering occurrences environmental space. First, regular multidimensional grid created environmental space. multidimensional grid determined environmental variables (always use continuous variables) grid cell size defined number bins, used dividing variable range interval classes (Varela et al. 2014; Castellanos et al., 2019). number bins set \"nbins\" argument. , single occurrence randomly selected within cell multidimensional grid. Consider trade-number bins number filtered records number bins decreases, cell size grids increases, number filtered records decreases (Castellanos et al., 2019). occfilt_env works number dimensions (variables) original variables without performing PCA beforehand. greater number predictor variables (.e., number dimensions multidimensional environmental grid) greater number bins, greater time processing computer memory used. Therefore, recommended use small number bins 2-5 ten variables used. Environmental filters sensitive number bins. procedure selecting number bins used Velazco et al. (2020). selection consists testing different numbers bins, calculating average spatial autocorrelation among variables (based Moran’s index), selecting lowest average spatial autocorrelation highest number occurrences. Note greater number bins, greater records retained","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/occfilt_env.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Perform environmental filtering on species occurrences — occfilt_env","text":"Castellanos, . ., Huntley, J. W., Voelker, G., & Lawing, . M. (2019). Environmental filtering improves ecological niche models across multiple scales. Methods Ecology Evolution, 10(4), 481-492. https://doi.org/10.1111/2041-210X.13142 Varela, S., Anderson, R. P., Garcia-Valdes, R., & Fernandez-Gonzalez, F. (2014). Environmental filters reduce effects sampling bias improve predictions ecological niche models. Ecography, 37, 1084-1091. https://doi.org/10.1111/j.1600-0587.2013.00441.x Velazco, S. J. E., Svenning, J-C., Ribeiro, B. R., & Laureto, L. M. O. (2020). opportunities threats conserve phylogenetic diversity Neotropical palms. Diversity Distributions, 27, 512–523. https://doi.org/10.1111/ddi.13215","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/occfilt_env.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Perform environmental filtering on species occurrences — occfilt_env","text":"","code":"if (FALSE) { # \\dontrun{ require(terra) require(dplyr) # Environmental variables somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) plot(somevar) # Species occurrences data(\"spp\") spp spp1 <- spp %>% dplyr::filter(species == \"sp1\", pr_ab == 1) somevar[[1]] %>% plot() points(spp1 %>% select(x, y)) spp1$idd <- 1:nrow(spp1) # split environmental variables into 5 bins filtered_1 <- occfilt_env( data = spp1, x = \"x\", y = \"y\", id = \"idd\", env_layer = somevar, nbins = 5 ) # split into 8 bins filtered_2 <- occfilt_env( data = spp1, x = \"x\", y = \"y\", id = \"idd\", env_layer = somevar, nbins = 8 ) # split into 12 bins filtered_3 <- occfilt_env( data = spp1, x = \"x\", y = \"y\", id = \"idd\", env_layer = somevar, nbins = 12 ) # note that the higher the nbins parameter the more # classes must be processed (4 variables, 30 bins = 923521 classes) # While the greater the greater the number of bins, the greater records retained } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/occfilt_geo.html","id":null,"dir":"Reference","previous_headings":"","what":"Perform geographical filtering on species occurrences — occfilt_geo","title":"Perform geographical filtering on species occurrences — occfilt_geo","text":"function perform geographical filtering species occurrences based different approach define minimum nearest-neighbor distance points.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/occfilt_geo.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Perform geographical filtering on species occurrences — occfilt_geo","text":"","code":"occfilt_geo( data, x, y, env_layer, method, prj = \"+proj=longlat +datum=WGS84\", reps = 20 )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/occfilt_geo.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Perform geographical filtering on species occurrences — occfilt_geo","text":"data data.frame. Data.frame tibble object presences (presence-absence) records, coordinates x character. Column name longitude data y character. Column name latitude data env_layer SpatRaster. Raster variables used fit model method character. Method perform geographical thinning. Pairs points filtered based geographical distance criteria.following methods available: moran: records filtered based smallest distance reduces Moran's values lower 0.1. Latlong = TRUE occurrences geographical projection. Usage method: method = c('moran'). cellsize: records filtered based resolution environmental variables can aggregated coarser resolution defined factor. Usage method: method = c('cellsize', factor = '2'). defined: records filtered based distance value (d) provided km. Usage method: method = c('defined', d = 300). prj character. Projection string (PROJ4) occurrences. necessary projection used WGS84 (\"+proj=longlat +datum=WGS84\"). Default \"+proj=longlat +datum=WGS84\" reps integer. Number times repeat thinning process. Default 20","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/occfilt_geo.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Perform geographical filtering on species occurrences — occfilt_geo","text":"tibble object data filtered geographically","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/occfilt_geo.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Perform geographical filtering on species occurrences — occfilt_geo","text":"function three alternatives implemented determine distance threshold pair points: 1-\"moran\" determines minimum nearest-neighbor distance minimizes spatial autocorrelation occurrence data, following Moran's semivariogram. Principal Component Analysis environmental variables performed first Principal Component used calculate semivariograms. , method allow use continuous variables. Sometimes, method can () greatly reduce number presences. 2-\"cellsize\" filters occurrences based predictors' resolution. method calculate distance first two cells environmental variable use distance minimum nearest-neighbor distance filter occurrences. resolution raster aggregated based values used \"factor\". Thus, distance used filtering can adjusted represent larger grid size. 3-\"determined\" method uses minimum nearest-neighbor distance specified km. third method \"thin\" function spThin package used (Aiello-Lammens et al., 2015) following argument settings reps = 20, write.files = FALSE, locs.thinned.list.return = TRUE, write.log.file = FALSE.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/occfilt_geo.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Perform geographical filtering on species occurrences — occfilt_geo","text":"Aiello-Lammens, M. E., Boria, R. ., Radosavljevic, ., Vilela, B., & Anderson, R. P. (2015). spThin: R package spatial thinning species occurrence records use ecological niche models. Ecography, 38(5), 541-545. https://doi.org/10.1111/ecog.01132","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/occfilt_geo.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Perform geographical filtering on species occurrences — occfilt_geo","text":"","code":"if (FALSE) { # \\dontrun{ require(terra) require(dplyr) # Environmental variables somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) plot(somevar) # Species occurrences data(\"spp\") spp spp1 <- spp %>% dplyr::filter(species == \"sp1\", pr_ab == 1) somevar[[1]] %>% plot() points(spp1 %>% select(x, y)) # Using Moran method filtered_1 <- occfilt_geo( data = spp1, x = \"x\", y = \"y\", env_layer = somevar, method = c(\"moran\"), prj = crs(somevar) ) somevar[[1]] %>% plot(col = gray.colors(10)) points(spp1 %>% select(x, y)) # raw data points(filtered_1 %>% select(x, y), pch = 19, col = \"yellow\") # filtered data # Using cellsize method filtered_2 <- occfilt_geo( data = spp1, x = \"x\", y = \"y\", env_layer = somevar, method = c(\"cellsize\", factor = \"3\"), prj = crs(somevar) ) somevar[[1]] %>% plot(col = gray.colors(10)) points(spp1 %>% select(x, y)) # raw data points(filtered_2 %>% select(x, y), pch = 19, col = \"yellow\") # filtered data # Using defined method filtered_3 <- occfilt_geo( data = spp1, x = \"x\", y = \"y\", env_layer = somevar, method = c(\"defined\", d = \"30\"), prj = crs(somevar) ) somevar[[1]] %>% plot(col = gray.colors(10)) points(spp1 %>% select(x, y)) # raw data points(filtered_3 %>% select(x, y), pch = 19, col = \"yellow\") # filtered data } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_random.html","id":null,"dir":"Reference","previous_headings":"","what":"Conventional data partitioning methods — part_random","title":"Conventional data partitioning methods — part_random","text":"function provides different conventional (randomized, non-spatial) partitioning methods based cross validation folds (kfold, rep_kfold, loocv), well bootstrap (boot)","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_random.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Conventional data partitioning methods — part_random","text":"","code":"part_random(data, pr_ab, method = NULL)"},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_random.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Conventional data partitioning methods — part_random","text":"data data.frame. Database presences, presence-absence, pseudo-absence, records given species pr_ab character. Column name \"data\" presences, presence-absence, pseudo-absence. Presences must represented 1 absences 0 method character. Vector data partitioning method used. Usage part=c(method= 'kfold', folds='5'). Methods include: kfold: Random partitioning k-folds cross-validation. 'folds' refers number folds data partitioning, assumes value >=1. Usage method = c(method = \"kfold\", folds = 10). rep_kfold: Random partitioning repeated k-folds cross-validation. Usage method = c(method = \"rep_kfold\", folds = 10, replicates=10). 'folds' refers number folds data partitioning, assumes value >=1. 'replicate' refers number replicates, assumes value >=1. loocv: Leave-one-cross-validation (.k.. Jackknife). special case k-fold cross validation number partitions equal number records. Usage method = c(method = \"loocv\"). boot: Random bootstrap partitioning. Usage method=c(method='boot', replicates='2', proportion='0.7'). 'replicate' refers number replicates, assumes value >=1. 'proportion' refers proportion occurrences used model fitting, assumes value >0 <=1. example proportion='0.7' mean 70% data used model training, 30% used model testing.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_random.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Conventional data partitioning methods — part_random","text":"tibble object information used 'data' argument additional columns named .part containing partition groups. rep_kfold boot method return many \".part\" columns replicated defined. rest methods, single .part column returned. kfold, rep_kfold, loocv partition methods, groups defined integers. contrast, boot method, partition groups defined characters 'train' 'test'.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_random.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Conventional data partitioning methods — part_random","text":"Fielding, . H., & Bell, J. F. (1997). review methods assessment prediction errors conservation presence/absence models. Environmental Conservation, 24(1), 38-49. https://doi.org/10.1017/S0376892997000088","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_random.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Conventional data partitioning methods — part_random","text":"","code":"if (FALSE) { # \\dontrun{ data(\"abies\") abies$partition <- NULL abies <- tibble(abies) # K-fold method abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 10) ) abies2 # Repeated K-fold method abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"rep_kfold\", folds = 10, replicates = 10) ) abies2 # Leave-one-out cross-validation (loocv) method abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"loocv\") ) abies2 # Bootstrap method abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"boot\", replicates = 50, proportion = 0.7) ) abies2 abies2$.part1 %>% table() # Note that for this method .partX columns have train and test words. } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_sband.html","id":null,"dir":"Reference","previous_headings":"","what":"Spatial band cross-validation — part_sband","title":"Spatial band cross-validation — part_sband","text":"function explores different numbers spatial bands returns suitable value given presence presence-absence database. selection best number bands performed automatically considering spatial autocorrelation, environmental similarity, number presence absence records partition.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_sband.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Spatial band cross-validation — part_sband","text":"","code":"part_sband( env_layer, data, x, y, pr_ab, type = \"lon\", n_part = 2, min_bands = 2, max_bands = 20, min_occ = 10, prop = 0.5 )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_sband.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Spatial band cross-validation — part_sband","text":"env_layer SpatRaster. Raster environmental variable. Used evaluate spatial autocorrelation environmental similarity training testing partitions. function calculate dissimilarity based Euclidean distances, can used continuous environmental variables data data.frame. Data.frame tibble object presences (presence-absence, presence-pseudo-absence) records, coordinates x character. Column name spatial x coordinates y character. Column name spatial y coordinates pr_ab character. Column presences, presence-absence, -pseudo-absence. Presences must represented 1 absences 0 type character. Specify bands across different degrees longitude 'lon' latitude 'lat'. Default 'lon'. n_part integer. Number partition. Default 2, values 2 yet implemented. min_bands integer. Minimum number spatial bands tested, default 2. max_bands integer. Maximum number spatial bands tested, default 20. min_occ numeric. Minimum number presences absences partition fold. min_occ value base number predictors order avoid -fitting error fitting models given fold. Default 10. prop numeric. Proportion points used testing autocorrelation groups (values > 0 <=1). smaller number , faster function work. Default 0.5","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_sband.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Spatial band cross-validation — part_sband","text":"list : part: tibble object information used 'data' arguments additional column .part partition group. best_part_info: tibble information best partition. contains number best partition (n_grid), number bands (n_bands), standard deviation presences (sd_p), standard deviation absences (sd_a), Moran's spatial autocorrelation (spa_auto), environmental similarity based Euclidean distance (env_sim). grid: SpatRaster object bands","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_sband.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Spatial band cross-validation — part_sband","text":"part_sbands function allows testing different numbers partitions using range latitudinal longitudinal bands. function explores range numbers bands given number partitions automatically selects best number bands given presence, presence-absences, presence-pseudo-absences dataset. Selection number bands based optimization procedure explores partitions three dimensions determined spatial autocorrelation (measured Moran's ), environmental similarity (Euclidean distance), difference amount data among partition groups (Standard Deviation - SD; Velazco et al., 2019). procedure iterative; first select partitions autocorrelation values less lowest quartile Morans , environmental similarity values greater third quartile Euclidean distances, difference amount data less lowest quartile SD. selection repeated one partition retained (Velazco et al., 2019). main benefits partition selection ) subjective, ii) balances environmental similarity special autocorrelation partitions groups, iii) controls selection partitions little data may problematic model fitting (\"min_occ\" argument). Partitions geographically structured tend evaluate model transferability directly conventional ones (e.g., performed part_random) (Roberts et al., 2017; Santini et al., 2021), relevant models used projections regions outside calibration area time periods. Band partitions can option species best partition found part_sblock species distributed linearly (e.g., species inhabit coastlines). function can interact get_block, sample_background, sample_pseudoabs sampling background points pseudo-absences within spatial partition broups","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_sband.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Spatial band cross-validation — part_sband","text":"Roberts, D. R., Bahn, V., Ciuti, S., Boyce, M. S., Elith, J., Guillera-Arroita, G., Hauenstein, S., Lahoz-Monfort, J. J., Schroder, B., Thuiller, W., Warton, D. ., Wintle, B. ., Hartig, F., & Dormann, C. F. (2017). Cross-validation strategies data temporal, spatial, hierarchical, phylogenetic structure. Ecography, 40, 913-929. https://doi.org/10.1111/ecog.02881 Santini, L., Benitez-Lopez, ., Maiorano, L., Cengic, M., & Huijbregts, M. . J. (2021). Assessing reliability species distribution projections climate change research. Diversity Distributions, ddi.13252. https://doi.org/10.1111/ddi.13252 Velazco, S. J. E., Villalobos, F., Galvao, F., & De Marco Junior, P. (2019). dark scenario Cerrado plant species: Effects future climate, land use protected areas ineffectiveness. Diversity Distributions, 25(4), 660-673. https://doi.org/10.1111/ddi.12886","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_sband.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Spatial band cross-validation — part_sband","text":"","code":"if (FALSE) { # \\dontrun{ require(terra) require(dplyr) # Load datasets data(spp) f <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(f) # Example of two longitudinal partitions with presences and absences single_spp <- spp %>% dplyr::filter(species == \"sp1\") part_1 <- part_sband( env_layer = somevar, data = single_spp, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", type = \"lon\", min_bands = 2, max_bands = 20, n_part = 2, min_occ = 10, prop = 0.5 ) part_1$part # database with partition fold (.part) part_1$part %>% group_by(pr_ab, .part) %>% count() # number of presences and absences in each fold part_1$best_part_info # information of the best partition part_1$grid # raster with folds # Explore grid object and presences and absences points plot(part_1$grid, col = gray.colors(20)) points(part_1$part[c(\"x\", \"y\")], col = rainbow(8)[part_1$part$.part], cex = 0.9, pch = c(1, 19)[part_1$part$pr_ab + 1] ) # Example of four latitudinal partition and only presences single_spp <- spp %>% dplyr::filter(species == \"sp1\", pr_ab == 1) part_2 <- part_sband( env_layer = somevar, data = single_spp, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", type = \"lat\", min_bands = 8, max_bands = 40, n_part = 8, min_occ = 10, prop = 0.5 ) part_2$part part_2$best_part_info part_2$grid # Explore Grid object and presences points plot(part_2$grid, col = gray.colors(20)) points(part_2$part[c(\"x\", \"y\")], col = rainbow(8)[part_2$part$.part], cex = 0.5, pch = 19 ) } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_sblock.html","id":null,"dir":"Reference","previous_headings":"","what":"Spatial block cross-validation — part_sblock","title":"Spatial block cross-validation — part_sblock","text":"function explores spatial blocks different cell sizes returns suitable size given presence presence-absence database. selection best grid size performed automatically considering spatial autocorrelation, environmental similarity, number presence absence records partition.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_sblock.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Spatial block cross-validation — part_sblock","text":"","code":"part_sblock( env_layer, data, x, y, pr_ab, n_part = 3, min_res_mult = 3, max_res_mult = 200, num_grids = 30, min_occ = 10, prop = 0.5 )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_sblock.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Spatial block cross-validation — part_sblock","text":"env_layer SpatRaster. Raster environmental variable. Used evaluate spatial autocorrelation environmental similarity training testing partitions. function calculate dissimilarity based Euclidean distances, can used continuous environmental variables data data.frame. Data.frame tibble object presence (presence-absence, presences-pseudo-absence) records, coordinates x character. Column name spatial x coordinates y character. Column name spatial y coordinates pr_ab character. Column presence, presence-absence, pseudo-absence records. Presences must represented 1 absences 0 n_part integer. Number partition. Default 2. min_res_mult integer. Minimum value used multiplying raster resolution define finest resolution tested, default 3. max_res_mult integer. Maximum value used multiplying raster resolution define coarsest resolution tested, default 200. num_grids integer. Number grid tested min_res_mult X (raster resolution) max_res_mult X (raster resolution), default 30 min_occ numeric. Minimum number presences absences partition fold. min_occ value base amount predictors order avoid -fitting error fitting models given fold. Default 10. prop numeric. Proportion point used testing autocorrelation groups (values > 0 <=1). smaller proportion , faster function work. Default 0.5","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_sblock.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Spatial block cross-validation — part_sblock","text":"list : part: tibble object information used 'data' arguments additional column .part partition group. best_part_info: tibble information best partition. contains number best partition (n_grid), cell size (cell_size), standard deviation presences (sd_p), standard deviation absences (sd_a), Moran's spatial autocorrelation (spa_auto), environmental similarity based Euclidean distance (env_sim). grid: SpatRaster object blocks","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_sblock.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Spatial block cross-validation — part_sblock","text":"part_sblock allows test different numbers partitions using square blocks (like checkerboard). function explores range block sizes automatically selects best size given given presence, presence-absences, presence-pseudo-absences dataset. Number partition selection based optimization procedure explores partition size three dimensions determined spatial autocorrelation (measured Moran's ), environmental similarity (Euclidean distance), difference amount data among partition groups (Standard Deviation - SD; Velazco et al., 2019). procedure iteratively select partitions, first partitions autocorrelation values less lowest quartile Morans , environmental similarity values greater third quartile Euclidean distances difference amount data less lowest quartile SD. selection repeated one partition retained (Velazco et al., 2019). main benefit partition selection ) subjective, ii) balances environmental similarity special autocorrelation partitions, iii) controls selection partitions data may problematic model fitting (\"min_occ\" argument). Geographically structured partitions tend evaluate model transferability directly conventional ones (e.g., performed part_random) (Roberts et al., 2017; Santini et al., 2021), relevant models used projections regions outside calibration area time periods. function can interact get_block, sample_background, sample_pseudoabs sampling background points pseudo-absences within spatial partition broups","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_sblock.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Spatial block cross-validation — part_sblock","text":"Roberts, D. R., Bahn, V., Ciuti, S., Boyce, M. S., Elith, J., Guillera-Arroita, G., Hauenstein, S., Lahoz-Monfort, J. J., Schroder, B., Thuiller, W., Warton, D. ., Wintle, B. ., Hartig, F., & Dormann, C. F. (2017). Cross-validation strategies data temporal, spatial, hierarchical, phylogenetic structure. Ecography, 40, 913-929. https://doi.org/10.1111/ecog.02881 Santini, L., Benitez-Lopez, ., Maiorano, L., Cengic, M., & Huijbregts, M. . J. (2021). Assessing reliability species distribution projections climate change research. Diversity Distributions, ddi.13252. https://doi.org/10.1111/ddi.13252 Velazco, S. J. E., Villalobos, F., Galvao, F., & De Marco Junior, P. (2019). dark scenario Cerrado plant species: Effects future climate, land use protected areas ineffectiveness. Diversity Distributions, 25(4), 660-673. https://doi.org/10.1111/ddi.12886","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_sblock.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Spatial block cross-validation — part_sblock","text":"","code":"if (FALSE) { # \\dontrun{ require(terra) require(dplyr) # Load datasets data(spp) f <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(f) # Example for one single species single_spp <- spp %>% dplyr::filter(species == \"sp3\") part <- part_sblock( env_layer = somevar, data = single_spp, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", min_res_mult = 10, max_res_mult = 500, num_grids = 30, n_part = 2, min_occ = 5, prop = 0.5 ) part part$part # database with partition fold (.part) part$part %>% group_by(pr_ab, .part) %>% count() # number of presences and absences in each fold part$best_part_info # information of the best partition part$grid # raster with folds # Explore the Grid object plot(part$grid) points(part$part[c(\"x\", \"y\")], col = c(\"blue\", \"red\")[part$part$.part], cex = 0.5, pch = 19 ) terra::res(part$grid) terra::res(somevar) # Note that this is a layer with block partition, but it has a # different resolution than the original environmental variables. # If you wish have a layer with the same properties # (i.e. resolution, extent, NAs) as your original environmental # variables you can use the \\code{\\link{get_block}} function. grid_env <- get_block(env_layer = somevar, best_grid = part$grid) plot(grid_env) # this is a block layer with the same layer # properties as environmental variables. points(part$part[c(\"x\", \"y\")], col = c(\"blue\", \"red\")[part$part$.part], cex = 0.5, pch = 19 ) # This layer is very useful if you need to sample # pseudo_absence or background point # See examples in \\code{\\link{backgroudp}} and \\code{\\link{pseudoabs}} # Example of a higher number of partitions part <- part_sblock( env_layer = somevar, data = single_spp, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", min_res_mult = 10, max_res_mult = 500, num_grids = 30, n_part = 4, min_occ = 2, prop = 0.5 ) # Explore the Grid object plot(part$grid, col = gray.colors(4)) points(part$part[c(\"x\", \"y\")], col = rainbow(n = 4)[part$part$.part], cex = 0.5, pch = 19 ) # Using these functions with several species spp2 <- split(spp, spp$species) class(spp2) length(spp2) names(spp2) part_list <- lapply(spp2, function(x) { result <- part_sblock( env_layer = somevar, data = x, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", min_res_mult = 10, max_res_mult = 500, num_grids = 30, n_part = 2, min_occ = 5, prop = 0.5 ) result }) part_list$sp3 # For this dataset a suitable partition was not found # Create a single database for all species occ_part <- lapply(part_list, function(x) { if (!length(x) > 0) { x[[1]] } }) %>% dplyr::bind_rows(.id = \"species\") occ_part # Get the best grid info for all species grid_info <- dplyr::bind_rows(lapply( part_list, function(x) x[[2]] ), .id = \"species\") # Get the best grid layer for all species grid_layer <- lapply(part_list, function(x) x$grid) grid_layer2 <- lapply(grid_layer, function(x) { get_block(env_layer = somevar[[1]], best_grid = x) }) grid_layer2 <- terra::rast(grid_layer2) grid_layer2 plot(grid_layer2) # Block partition for presences-only database single_spp <- spp %>% dplyr::filter(species == \"sp1\", pr_ab == 1) single_spp single_spp$pr_ab %>% unique() # only presences part <- part_sblock( env_layer = somevar, data = single_spp, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", min_res_mult = 10, max_res_mult = 500, num_grids = 30, n_part = 4, min_occ = 10, prop = 0.5 ) part$part %>% dim() part$best_part_info part$grid plot(part$grid) points( part$part[c(\"x\", \"y\")], col = c(\"blue\", \"red\", \"green\", \"black\")[part$part$.part], cex = 0.5, ) } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_senv.html","id":null,"dir":"Reference","previous_headings":"","what":"Environmental and spatial cross-validation — part_senv","title":"Environmental and spatial cross-validation — part_senv","text":"function explores different numbers environmental partitions (clusters) based K-means clustering algorithm returns number partitions best suited given presence, presence-absences, presence-pseudo-absences database. Selection best number partitions performed automatically considering spatial autocorrelation, environmental similarity, number presence /absence records partition.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_senv.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Environmental and spatial cross-validation — part_senv","text":"","code":"part_senv( env_layer, data, x, y, pr_ab, min_n_groups = 2, max_n_groups = 10, min_occ = 10, prop = 0.5 )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_senv.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Environmental and spatial cross-validation — part_senv","text":"env_layer SpatRaster. Raster environmental variable. used evaluate spatial autocorrelation environmental similarity training testing partitions. function calculate dissimilarity based Euclidean distances, can used continuous variables data data.frame. Data.frame tibble object presence (presence-absence, presences-pseudo-absence) records, coordinates x character. Column name spatial x coordinates y character. Column name spatial y coordinates pr_ab character. Column presences, presence-absence, pseudo-absence. Presences must represented 1 absences 0 min_n_groups integer. Minimum number groups tested. Default 2. max_n_groups integer. Maximum number groups tested. Default 10. min_occ numeric. Minimum number presences absences partition fold. min_occ value base amount predictors order avoid -fitting error fitting models given fold. Default 10. prop numeric. Proportion point used testing autocorrelation groups (values > 0 <=1). smaller number , faster function work. Default 0.5","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_senv.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Environmental and spatial cross-validation — part_senv","text":"list : part: tibble object information used 'data' arguments additional column .part partition group. best_part_info: tibble information best partition. contains number partition (n_groups), standard deviation presences (sd_p), standard deviation absences (sd_a), Moran's spatial autocorrelation (spa_auto) environmental similarity based Euclidean distance (env_sim)","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_senv.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Environmental and spatial cross-validation — part_senv","text":"part_sblock allows test different numbers partitions defined envirnomental clusters delimited K-mean cluster algorithm. function explores range environmental clusters automatically selects best number cluster given given presence, presence-absences, presence-pseudo-absences dataset. selection number clusters based optimization procedure explores partition size three dimensions determined spatial autocorrelation (measured Moran's ), environmental similarity (Euclidean distance), difference amount data among clusters (Standard Deviation - SD; Velazco et al., 2019). procedure cyclically select partitions autocorrelation values less lowest quartile Morans , environmental similarity values greater third quartile Euclidean distances difference amount data less lowest quartile SD. selection repeated one partition retained (Velazco et al., 2019). main benefit partition selection ) subjective, ii) balances environmental similarity special autocorrelation partitions, iii) controls partition selection data may problematic model fitting (\"min_occ\" argument).. Partitions geographically structured tend evaluate model transferability directly conventional ones (e.g., performed part_random) (Roberts et al., 2017; Santini et al., 2021), relevant models want used projections regions outside calibration area periods. function can interact get_block, sample_background, sample_pseudoabs sampling background points pseudo-absences within spatial partition broups","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_senv.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Environmental and spatial cross-validation — part_senv","text":"Roberts, D. R., Bahn, V., Ciuti, S., Boyce, M. S., Elith, J., Guillera-Arroita, G., Hauenstein, S., Lahoz-Monfort, J. J., Schroder, B., Thuiller, W., Warton, D. ., Wintle, B. ., Hartig, F., & Dormann, C. F. (2017). Cross-validation strategies data temporal, spatial, hierarchical, phylogenetic structure. Ecography, 40, 913-929. https://doi.org/10.1111/ecog.02881 Santini, L., Benitez-Lopez, ., Maiorano, L., Cengic, M., & Huijbregts, M. . J. (2021). Assessing reliability species distribution projections climate change research. Diversity Distributions, ddi.13252. https://doi.org/10.1111/ddi.13252 Velazco, S. J. E., Villalobos, F., Galvao, F., & De Marco Junior, P. (2019). dark scenario Cerrado plant species: Effects future climate, land use protected areas ineffectiveness. Diversity Distributions, 25(4), 660-673. https://doi.org/10.1111/ddi.12886","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/part_senv.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Environmental and spatial cross-validation — part_senv","text":"","code":"if (FALSE) { # \\dontrun{ require(terra) require(ggplot2) f <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(f) # Select a species spp1 <- spp %>% dplyr::filter(species == \"sp1\") part1 <- part_senv( env_layer = somevar, data = spp1, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", min_n_groups = 2, max_n_groups = 10, min_occ = 10, prop = 0.2 ) part1 ggplot(part1$part, aes(x, y, col = factor(.part))) + geom_point(aes(shape = factor(pr_ab))) ggplot(part1$part, aes(x, y, col = factor(.part))) + geom_point(aes(shape = factor(pr_ab))) + facet_wrap(. ~ .part) ggplot(part1$part, aes(x, y, col = factor(.part))) + geom_point(aes(shape = factor(pr_ab))) + facet_wrap(. ~ pr_ab) } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/pdp_data.html","id":null,"dir":"Reference","previous_headings":"","what":"Calculate data to construct partial dependence plots — pdp_data","title":"Calculate data to construct partial dependence plots — pdp_data","text":"Calculate data construct partial dependence plots given predictor","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/pdp_data.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Calculate data to construct partial dependence plots — pdp_data","text":"","code":"pdp_data( model, predictors, resolution = 50, resid = FALSE, training_data = NULL, projection_data = NULL, clamping = FALSE )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/pdp_data.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Calculate data to construct partial dependence plots — pdp_data","text":"model model object class \"gam\", \"gbm\", \"glm\", \"graf\", \"ksvm\", \"ksvm\", \"maxnet”, “nnet\", \"randomForest\" model can found first element list returned function fit_, tune_, esm_ function families predictors character. Vector predictor name(s) plot. NULL predictors plotted. Default NULL resolution numeric. Number equally spaced points predict continuous predictors. Default 50 resid logical. Calculate residuals based training data. Default FALSE training_data data.frame. Database response (0,1) predictor values used fit model. Default NULL projection_data SpatRaster. Raster layer environmental variables used model projection. argument used, function calculate partial dependence curves distinguishing conditions used training projection conditions (.e., projection data present projection area training). Default NULL clamping logical. Perform clamping. maxent models. Default FALSE","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/pdp_data.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Calculate data to construct partial dependence plots — pdp_data","text":"list two tibbles \"pdpdata\" \"resid\". #' pdpdata: data construct partial dependence plots, first column includes values selected environmental variable, second column predicted suitability, third column range type, two values Training Projecting, referring suitability calculated within outside range training conditions. Third column returned \"projection_data\" argument used resid: data plot residuals. first column includes values selected environmental variable second column predicted suitability.","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/pdp_data.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Calculate data to construct partial dependence plots — pdp_data","text":"","code":"if (FALSE) { library(terra) library(dplyr) somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) # environmental data names(somevar) <- c(\"aet\", \"cwd\", \"tmx\", \"tmn\") data(abies) abies2 <- abies %>% select(x, y, pr_ab) abies2 <- sdm_extract(abies2, x = \"x\", y = \"y\", env_layer = somevar ) abies2 <- part_random(abies2, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 5) ) svm_t1 <- fit_svm( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"cwd\", \"tmx\", \"tmn\"), partition = \".part\", thr = c(\"max_sens_spec\") ) df <- pdp_data( model = svm_t1$model, predictors = c(\"aet\"), resolution = 100, resid = TRUE, projection_data = somevar, training_data = abies2, clamping = FALSE ) df names(df) df$pdpdata df$resid plot(df$pdpdata[1:2], type = \"l\") points(df$resid[1:2], cex = 0.5) # see p_pdp to construct partial dependence plot with ggplot2 }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/plot_res.html","id":null,"dir":"Reference","previous_headings":"","what":"Plot different resolutions to be used in part_sblock — plot_res","title":"Plot different resolutions to be used in part_sblock — plot_res","text":"function useful display maximum minimum resolution want test block_partition function. Note resolution tested fine, plot display may take long time.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/plot_res.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Plot different resolutions to be used in part_sblock — plot_res","text":"","code":"plot_res(r, res_mult)"},{"path":"https://sjevelazco.github.io/flexsdm/reference/plot_res.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Plot different resolutions to be used in part_sblock — plot_res","text":"r SpatRaster. raster layer, preferably layer environmental variables used res_mult numeric. Maximum minimum resolution tested.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/plot_res.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Plot different resolutions to be used in part_sblock — plot_res","text":"plot original raster overlapped grid resolution used","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/plot_res.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Plot different resolutions to be used in part_sblock — plot_res","text":"","code":"if (FALSE) { # \\dontrun{ f <- system.file(\"external/somevar.tif\", package = \"flexsdm\") r <- terra::rast(f) r <- r$CFP_1 plot_res(r, res_mult = 100) plot_res(r, res_mult = 200) } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/p_bpdp.html","id":null,"dir":"Reference","previous_headings":"","what":"Bivariate partial dependence plot — p_bpdp","title":"Bivariate partial dependence plot — p_bpdp","text":"Create bivariate partial dependence plot(s) explore bivariate marginal effect predictors suitability","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/p_bpdp.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Bivariate partial dependence plot — p_bpdp","text":"","code":"p_bpdp( model, predictors = NULL, resolution = 50, training_data = NULL, training_boundaries = NULL, projection_data = NULL, clamping = FALSE, color_gradient = c(\"#000004\", \"#1B0A40\", \"#4A0C69\", \"#781B6C\", \"#A42C5F\", \"#CD4345\", \"#EC6824\", \"#FA990B\", \"#F7CF3D\", \"#FCFFA4\"), color_training_boundaries = \"white\", theme = ggplot2::theme_classic() )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/p_bpdp.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Bivariate partial dependence plot — p_bpdp","text":"model model object class \"gam\", \"gbm\", \"glm\", \"graf\", \"ksvm\", \"ksvm\", \"maxnet”, “nnet\", \"randomForest\" model can found first element list returned function fit_, tune_, esm_ function families predictors character. Vector predictor names calculate partial dependence plots. NULL predictors used. Default NULL resolution numeric. Number equally spaced points predict suitability values continuous predictors. Default 50 training_data data.frame. Database response (0,1) predictor values used fit model. Default NULL training_boundaries character. Plot training conditions boundaries based training data (.e., presences, presences absences, etc). training_boundaries = \"convexh\", function delimit training environmental region based convex-hull. training_boundaries = \"rectangle\", function delimit training environmental region based four straight lines. used methods necessary provide data training_data argument. NULL predictors used. Default NULL. projection_data SpatRaster. Raster layer environmental variables used model projection. Default NULL clamping logical. Perform clamping. maxent models. Default FALSE color_gradient character. vector range colors plot. Default c(\"#FDE725\", \"#B3DC2B\", \"#6DCC57\", \"#36B677\", \"#1F9D87\", \"#25818E\", \"#30678D\", \"#3D4988\", \"#462777\", \"#440154\") color_training_boundaries character. vector one color used color points residuals, Default \"white\" theme ggplot2 theme. Default ggplot2::theme_classic()","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/p_bpdp.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Bivariate partial dependence plot — p_bpdp","text":"function creates partial dependent surface plots explore bivariate marginal effect predictors suitability. projection_data used, function extract minimum maximum values found region time period model projected. Partial dependence surface plot used interpret model explore model extrapolate outside environmental conditions used train model (convex hull polygon).","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/p_bpdp.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Bivariate partial dependence plot — p_bpdp","text":"","code":"if (FALSE) { # \\dontrun{ library(terra) library(dplyr) somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) # environmental data names(somevar) <- c(\"aet\", \"cwd\", \"tmx\", \"tmn\") data(abies) # set seed abies2 <- abies %>% dplyr::select(x, y, pr_ab) %>% dplyr::group_by(pr_ab) %>% dplyr::slice_sample(prop = 0.5) abies2 <- sdm_extract(abies2, x = \"x\", y = \"y\", env_layer = somevar ) abies2 <- part_random(abies2, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 5) ) svm_t1 <- fit_svm( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"cwd\", \"tmx\", \"tmn\"), partition = \".part\", thr = c(\"max_sens_spec\") ) # Partial depence surface plot p_bpdp(model = svm_t1$model, training_data = abies2) p_bpdp(model = svm_t1$model, training_data = abies2, predictors = c(\"aet\", \"cwd\")) p_bpdp(model = svm_t1$model, training_data = abies2, resolution = 10) p_bpdp(model = svm_t1$model, training_data = abies2, resolution = 70) # With training condition boundaires p_bpdp(model = svm_t1$model, training_data = abies2, training_boundaries = \"convexh\") p_bpdp(model = svm_t1$model, training_data = abies2, training_boundaries = \"rectangle\", color_training_boundaries = \"yellow\") p_bpdp( model = svm_t1$model, training_data = abies2, training_boundaries = \"convexh\", color_training_boundaries = \"orange\", color_gradient = c(\"#00007F\", \"#007FFF\", \"#7FFF7F\", \"#FF7F00\", \"#7F0000\") ) # With projection data p_bpdp( model = svm_t1$model, training_data = abies2, training_boundaries = \"rectangle\", projection_data = somevar, # a SpatRaster used to predict or project the model color_training_boundaries = \"white\", color_gradient = c(\"#00007F\", \"#007FFF\", \"#7FFF7F\", \"#FF7F00\", \"#7F0000\") ) # Bivariate partial dependence plot for training and projection condition plot(somevar[[1]], main = \"Projection area\") p_bpdp(model = svm_t1$model, training_data = abies2, projection_data = somevar, # a SpatRaster used to predict or project the model training_boundaries = \"convexh\") # Bivariate partial dependece plot with categorical variables somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) # environmental data names(somevar) <- c(\"aet\", \"cwd\", \"tmx\", \"tmn\") cat <- system.file(\"external/clusters.shp\", package = \"flexsdm\") cat <- terra::vect(cat) cat$clusters <- paste0(\"c\", cat$clusters) cat <- terra::rasterize(cat, somevar, field = \"clusters\") somevar <- c(somevar, cat) plot(somevar) # set seed abies2 <- abies %>% dplyr::select(x, y, pr_ab) %>% dplyr::group_by(pr_ab) %>% dplyr::slice_sample(prop = 0.5) abies2 <- sdm_extract( data = abies2, x = \"x\", y = \"y\", env_layer = somevar ) abies2 <- part_random(abies2, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 5) ) svm_t1 <- fit_svm( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"cwd\", \"tmx\", \"tmn\"), predictors_f = \"clusters\", partition = \".part\", thr = c(\"max_sens_spec\") ) p_bpdp(model = svm_t1$model, training_data = abies2, training_boundaries = \"convexh\") } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/p_extra.html","id":null,"dir":"Reference","previous_headings":"","what":"Graphical exploration of extrapolation or suitability pattern in the environmental and geographical space — p_extra","title":"Graphical exploration of extrapolation or suitability pattern in the environmental and geographical space — p_extra","text":"Graphical exploration extrapolation suitability pattern environmental geographical space","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/p_extra.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Graphical exploration of extrapolation or suitability pattern in the environmental and geographical space — p_extra","text":"","code":"p_extra( training_data, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", extra_suit_data, projection_data, predictors = NULL, geo_space = TRUE, geo_position = \"right\", prop_points = 0.2, maxcells = 1e+05, alpha_p = 0.5, color_p = \"black\", alpha_gradient = 0.5, color_gradient = c(\"#FDE725\", \"#B3DC2B\", \"#6DCC57\", \"#36B677\", \"#1F9D87\", \"#25818E\", \"#30678D\", \"#3D4988\", \"#462777\", \"#440154\"), theme = ggplot2::theme_classic() )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/p_extra.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Graphical exploration of extrapolation or suitability pattern in the environmental and geographical space — p_extra","text":"training_data data.frame. Database response (0,1) predictor values used fit model. x character. Column name spatial x coordinates y character. Column name spatial y coordinates pr_ab character. Column name species absence-presence, pseudo-absence-presence, background-presence data (0,1). extra_suit_data SpatRaster. Raster layer extrapolation suitability values. extra_suit_data must resolution extent projection_data projection_data SpatRaster. Raster layer environmental variables used model projection. projection_data must resolution extent extra_suit_data predictors character. Vector predictor name(s) calculate partial dependence plots. NULL predictors used. Default NULL. geo_space logical. TRUE produced map. Default TRUE geo_position character. Map position regarding plot environmental space, right, left, bottom, upper. Default \"right\" prop_points numeric. Proportion cells extra_suit_data projection_data select plotting. default. 0.5. maxcells integer. Maximum number cells used plot geographical space. Default 100000 alpha_p numeric. value 0 1 control transparency presence-absence points. Lower values corresponding transparent colors. Default 0.5 color_p character. vector color used color presence-absence points. Default \"black\" alpha_gradient numeric. value 0 1 control transparency projection data Lower values corresponding transparent colors. Default 0.5 color_gradient character. vector colors used color projection data. Default c( \"#FDE725\", \"#B3DC2B\", \"#6DCC57\", \"#36B677\", \"#1F9D87\", \"#25818E\", \"#30678D\", \"#3D4988\", \"#462777\", \"#440154\") theme ggplot2 theme. Default ggplot2::theme_classic()","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/p_extra.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Graphical exploration of extrapolation or suitability pattern in the environmental and geographical space — p_extra","text":"plot","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/p_extra.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Graphical exploration of extrapolation or suitability pattern in the environmental and geographical space — p_extra","text":"","code":"if (FALSE) { # \\dontrun{ require(dplyr) require(terra) require(ggplot2) data(spp) f <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(f) names(somevar) <- c(\"aet\", \"cwd\", \"tmx\", \"tmn\") spp$species %>% unique() sp <- spp %>% dplyr::filter(species == \"sp2\", pr_ab == 1) %>% dplyr::select(x, y, pr_ab) # Calibration area based on some criterion such as dispersal ability ca <- calib_area(sp, x = \"x\", y = \"y\", method = c(\"buffer\", width = 50000), crs = crs(somevar)) plot(somevar[[1]]) points(sp) plot(ca, add = T) # Sampling pseudo-absences set.seed(10) psa <- sample_pseudoabs( data = sp, x = \"x\", y = \"y\", n = nrow(sp) * 2, method = \"random\", rlayer = somevar, calibarea = ca ) # Merge presences and abasences databases to get a complete calibration data sp_pa <- dplyr::bind_rows(sp, psa) sp_pa # Get environmental condition of calibration area sp_pa_2 <- sdm_extract(data = sp_pa, x = \"x\", y = \"y\", env_layer = somevar) sp_pa_2 # Measure extrapolation based on calibration data (presence and pseudo-absences) # using SHAPE metric extr <- extra_eval( training_data = sp_pa_2, pr_ab = \"pr_ab\", projection_data = somevar, metric = \"mahalanobis\", univar_comb = FALSE, n_cores = 1, aggreg_factor = 1 ) plot(extr) ## %######################################################%## #### Explore extrapolation in the #### #### environmental and geographical space #### ## %######################################################%## p_extra( training_data = sp_pa_2, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", extra_suit_data = extr, projection_data = somevar, geo_space = TRUE, prop_points = 0.05 ) p_extra( training_data = sp_pa_2, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", extra_suit_data = extr, projection_data = somevar, predictors = c(\"tmn\", \"cwd\"), geo_space = TRUE, prop_points = 0.05 ) p_extra( training_data = sp_pa_2, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", extra_suit_data = extr, projection_data = somevar, predictors = c(\"cwd\", \"tmx\", \"aet\"), geo_space = TRUE, geo_position = \"left\", prop_points = 0.05, color_p = \"white\", alpha_p = 0.5, alpha_gradient = 0.2, color_gradient = c(\"#404096\", \"#529DB7\", \"#7DB874\", \"#E39C37\", \"#D92120\"), theme = ggplot2::theme_dark() ) p_extra( training_data = sp_pa_2, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", extra_suit_data = extr, projection_data = somevar, geo_space = TRUE, prop_points = 0.05, color_p = \"white\", alpha_p = 0.5, alpha_gradient = 0.2, color_gradient = c(\"#404096\", \"#529DB7\", \"#7DB874\", \"#E39C37\", \"#D92120\"), theme = ggplot2::theme_dark() ) # Explore extrapolation only in the environmental space p_extra( training_data = sp_pa_2, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", extra_suit_data = extr, projection_data = somevar, geo_space = FALSE, prop_points = 0.05, color_p = \"black\", color_gradient = c(\"#085CF8\", \"#65AF1E\", \"#F3CC1D\", \"#FC6A9B\", \"#D70500\"), theme = ggplot2::theme_minimal() ) ##%######################################################%## #### Explore univariate #### #### and combinatorial extrapolation #### ##%######################################################%## extr <- extra_eval( training_data = sp_pa_2, pr_ab = \"pr_ab\", projection_data = somevar, metric = \"mahalanobis\", univar_comb = TRUE, n_cores = 1, aggreg_factor = 1 ) plot(extr) p_extra( training_data = sp_pa_2, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", extra_suit_data = extr$uni_comb, # use uni_comb layer projection_data = somevar, geo_space = TRUE, prop_points = 0.05, color_gradient = c(\"#B3DC2B\",\"#25818E\") ) ## %######################################################%## #### With p_extra also is possible #### #### to explore the patterns of suitability #### ## %######################################################%## sp_pa_2 <- part_random( data = sp_pa_2, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 5) ) rf_m1 <- fit_raf( data = sp_pa_2, response = \"pr_ab\", predictors = c(\"aet\", \"cwd\", \"tmx\", \"tmn\"), partition = \".part\", thr = c(\"max_sorensen\") ) suit <- sdm_predict(models = rf_m1, pred = somevar) plot(suit$raf) suit <- suit$raf # Pasterns of suitability in geographical and environmental space p_extra( training_data = sp_pa_2, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", extra_suit_data = suit, projection_data = somevar, geo_space = TRUE, prop_points = 0.05, ) # Pasterns of suitability plotting as points only presences p_extra( training_data = sp_pa_2 %>% dplyr::filter(pr_ab == 1), x = \"x\", y = \"y\", pr_ab = \"pr_ab\", extra_suit_data = suit, projection_data = somevar, geo_space = TRUE, prop_points = 0.05, ) # Pasterns of suitability in the environmental space only # and plotting as points only presences p_extra( training_data = sp_pa_2 %>% dplyr::filter(pr_ab == 1), x = \"x\", y = \"y\", pr_ab = \"pr_ab\", extra_suit_data = suit, projection_data = somevar, geo_space = FALSE, prop_points = 0.05, ) } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/p_pdp.html","id":null,"dir":"Reference","previous_headings":"","what":"Partial Dependent Plot — p_pdp","title":"Partial Dependent Plot — p_pdp","text":"Create partial dependence plot(s) explore marginal effect predictors suitability","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/p_pdp.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Partial Dependent Plot — p_pdp","text":"","code":"p_pdp( model, predictors = NULL, resolution = 100, resid = FALSE, training_data = NULL, projection_data = NULL, clamping = FALSE, rug = FALSE, colorl = c(\"#462777\", \"#6DCC57\"), colorp = \"black\", alpha = 0.2, theme = ggplot2::theme_classic() )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/p_pdp.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Partial Dependent Plot — p_pdp","text":"model model object class \"gam\", \"gbm\", \"glm\", \"graf\", \"ksvm\", \"ksvm\", \"maxnet”, “nnet\", \"randomForest\" model can found first element list returned function fit_, tune_, esm_ function families predictors character. Vector predictor name(s) calculate partial dependence plots. NULL predictors used. Default NULL resolution numeric. Number equally spaced points predict suitability values continuous predictors. Default 50 resid logical. Calculate residuals based training data. Default FALSE training_data data.frame. Database response (0,1) predictor values used fit model. Default NULL projection_data SpatRaster. Raster layer environmental variables used model projection. argument used, function calculate partial dependence curves distinguishing conditions used training projection conditions (.e., projection data present projection area training). Default NULL clamping logical. Perform clamping. maxent models. Default FALSE rug logical. Display training data rug plot x-axis. Note: time-consuming large databases. Default FALSE colorl character. vector one two colors used color lines. projection_data argument used necessary provide two colors. Default c(\"#462777\", \"#6DCC57\") colorp character. vector one color used color points residuals, Default \"black\" alpha numeric. value 0 1 control transparency residual points. Lower values corresponding transparent colors. Default 0.2 theme ggplot2 theme. Default ggplot2::theme_classic()","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/p_pdp.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Partial Dependent Plot — p_pdp","text":"function creates partial dependent plots explore marginal effect predictors suitability. projection_data used, function extract minimum maximum values found region time period model projected. range projection data greater training data plotted different color. Partial dependence curves used interpret model explore model may extrapolate outside environmental conditions used train model.","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/p_pdp.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Partial Dependent Plot — p_pdp","text":"","code":"if (FALSE) { # \\dontrun{ library(terra) library(dplyr) somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) # environmental data names(somevar) <- c(\"aet\", \"cwd\", \"tmx\", \"tmn\") data(abies) # set seed abies2 <- abies %>% dplyr::select(x, y, pr_ab) %>% dplyr::group_by(pr_ab) %>% dplyr::slice_sample(prop = 0.5) abies2 <- sdm_extract(abies2, x = \"x\", y = \"y\", env_layer = somevar ) abies2 <- part_random(abies2, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 5) ) svm_t1 <- fit_svm( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"cwd\", \"tmx\", \"tmn\"), partition = \".part\", thr = c(\"max_sens_spec\") ) # Partial depence plot p_pdp(model = svm_t1$model, training_data = abies2) p_pdp(model = svm_t1$model, training_data = abies2, predictors = c(\"aet\", \"cwd\")) p_pdp(model = svm_t1$model, training_data = abies2, resolution = 5) p_pdp(model = svm_t1$model, training_data = abies2, resolution = 50) p_pdp(model = svm_t1$model, training_data = abies2, resid = TRUE) p_pdp( model = svm_t1$model, training_data = abies2, resid = TRUE, colorl = \"black\", colorp = \"red\", alpha = 0.1 ) p_pdp( model = svm_t1$model, training_data = abies2, resid = TRUE, colorl = \"black\", colorp = \"red\", alpha = 0.1, rug = TRUE ) # Partial depence plot for training and projection condition found in a projection area plot(somevar[[1]], main = \"Projection area\") p_pdp(model = svm_t1$model, training_data = abies2, projection_data = somevar) p_pdp( model = svm_t1$model, training_data = abies2, projection_data = somevar, colorl = c(\"#CC00FF\", \"#CCFF00\") ) p_pdp( model = svm_t1$model, training_data = abies2, projection_data = somevar, colorl = c(\"#CC00FF\", \"#CCFF00\"), resid = TRUE, colorp = \"gray\" ) p_pdp( model = svm_t1$model, training_data = abies2, projection_data = somevar, colorl = c(\"#CC00FF\", \"#CCFF00\"), resid = TRUE, colorp = \"gray\", rug = TRUE, theme = ggplot2::theme_dark() ) } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/p_psp.html","id":null,"dir":"Reference","previous_headings":"","what":"Partial Dependent Suface Plot — p_psp","title":"Partial Dependent Suface Plot — p_psp","text":"Create partial dependence surface plot(s) explore bivariate marginal effect predictors suitability","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/p_psp.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Partial Dependent Suface Plot — p_psp","text":"","code":"p_psp( model, predictors = NULL, resolution = 50, training_data = NULL, pchull = FALSE, projection_data = NULL, clamping = FALSE, color_gradient = c(\"#000004\", \"#1B0A40\", \"#4A0C69\", \"#781B6C\", \"#A42C5F\", \"#CD4345\", \"#EC6824\", \"#FA990B\", \"#F7CF3D\", \"#FCFFA4\"), color_chull = \"white\", theme = ggplot2::theme_classic() )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/p_psp.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Partial Dependent Suface Plot — p_psp","text":"model model object class \"gam\", \"gbm\", \"glm\", \"graf\", \"ksvm\", \"ksvm\", \"maxnet”, “nnet\", \"randomForest\" model can found first element list returned function fit_, tune_, esm_ function families predictors character. Vector predictor names calculate partial dependence plots. NULL predictors used. Default NULL resolution numeric. Number equally spaced points predict suitability values continuous predictors. Default 50 training_data data.frame. Database response (0,1) predictor values used fit model. Default NULL pchull logical. Plot convex-hull limit training data. Default FALSE. TRUE necessary provide data training_data argument projection_data SpatRaster. Raster layer environmental variables used model projection. Default NULL clamping logical. Perform clamping. maxent models. Default FALSE color_gradient character. vector range colors plot. Default c(\"#FDE725\", \"#B3DC2B\", \"#6DCC57\", \"#36B677\", \"#1F9D87\", \"#25818E\", \"#30678D\", \"#3D4988\", \"#462777\", \"#440154\") color_chull character. vector one color used color points residuals, Default \"white\" theme ggplot2 theme. Default ggplot2::theme_classic()","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/p_psp.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Partial Dependent Suface Plot — p_psp","text":"function creates partial dependent surface plots explore bivariate marginal effect predictors suitability. projection_data used, function extract minimum maximum values found region time period model projected. Partial dependence surface plot used interpret model explore model extrapolate outside environmental conditions used train model (convex hull polygon).","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/p_psp.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Partial Dependent Suface Plot — p_psp","text":"","code":"if (FALSE) { library(terra) library(dplyr) somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) # environmental data names(somevar) <- c(\"aet\", \"cwd\", \"tmx\", \"tmn\") data(abies) # set seed abies2 <- abies %>% dplyr::select(x, y, pr_ab) %>% dplyr::group_by(pr_ab) %>% dplyr::slice_sample(prop = 0.5) abies2 <- sdm_extract(abies2, x = \"x\", y = \"y\", env_layer = somevar ) abies2 <- part_random(abies2, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 5) ) svm_t1 <- fit_svm( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"cwd\", \"tmx\", \"tmn\"), partition = \".part\", thr = c(\"max_sens_spec\") ) # Partial depence surface plot p_psp(model = svm_t1$model, training_data = abies2) p_psp(model = svm_t1$model, training_data = abies2, predictors = c(\"aet\", \"cwd\")) p_psp(model = svm_t1$model, training_data = abies2, resolution = 10) p_psp(model = svm_t1$model, training_data = abies2, resolution = 70) p_psp(model = svm_t1$model, training_data = abies2, pchull = TRUE) p_psp( model = svm_t1$model, training_data = abies2, pchull = TRUE, color_chull = \"orange\", color_gradient = c(\"#00007F\", \"#007FFF\", \"#7FFF7F\", \"#FF7F00\", \"#7F0000\") ) # Partial depence surface plot for training and projection condition plot(somevar[[1]], main = \"Projection area\") p_psp(model = svm_t1$model, training_data = abies2, projection_data = somevar, pchull = TRUE) # PSP with categorical variables somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) # environmental data names(somevar) <- c(\"aet\", \"cwd\", \"tmx\", \"tmn\") cat <- system.file(\"external/clusters.shp\", package = \"flexsdm\") cat <- terra::vect(cat) cat$clusters <- paste0(\"c\", cat$clusters) cat <- terra::rasterize(cat, somevar, field = \"clusters\") somevar <- c(somevar, cat) plot(somevar) # set seed abies2 <- abies %>% dplyr::select(x, y, pr_ab) %>% dplyr::group_by(pr_ab) %>% dplyr::slice_sample(prop = 0.5) abies2 <- sdm_extract( data = abies2, x = \"x\", y = \"y\", env_layer = somevar ) abies2 <- part_random(abies2, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 5) ) svm_t1 <- fit_svm( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"cwd\", \"tmx\", \"tmn\"), predictors_f = \"clusters\", partition = \".part\", thr = c(\"max_sens_spec\") ) p_psp(model = svm_t1$model, training_data = abies2) }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/sample_background.html","id":null,"dir":"Reference","previous_headings":"","what":"Sample background points — sample_background","title":"Sample background points — sample_background","text":"Sampling background points options using different geographical restrictions sampling methods.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/sample_background.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Sample background points — sample_background","text":"","code":"sample_background( data, x, y, n, method = \"random\", rlayer, maskval = NULL, calibarea = NULL, rbias = NULL, sp_name = NULL )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/sample_background.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Sample background points — sample_background","text":"data data.frame tibble. Database presences records, coordinates x character. Column name spatial x coordinates y character. Column name spatial y coordinates n integer. Number background point sampled method character. Background allocation method. methods implemented : random: Random allocation background points. Usage method = 'random' thickening: Thickening background points based Vollering et al. (2019) method. method, buffer width must defined used around presences points. buffer can defined using argument method = c(\"thickening\", width = 20000). Buffer width must m raster (used rlayer) longitude/latitude CRS, map units cases. buffer width provided function use width value equal mean pair-wise presence distances. width value provided, argument must used method = 'thickening'. biased: method, similar \"thickening\", sample background biased bias presences. However, background points sampled used presences probability throughout entire study area, restricting bias within buffers “thickening” approach. using method, necessary provide layer presences bias \"rbias\" argument (Phillips et al., 2009). Usage method='thickening' method = c(\"thickening\", width = 20000). Default 'random' rlayer SpatRaster used sampling background points. best use layer resolution extent environmental variables used modeling. using maskval argument, raster layer must contain values constrain sampling maskval integer, character, factor. Values raster layer used constraining sampling background points calibarea SpatVect delimits calibration area used given species (see calib_area function). rbias SpatRaster used choosing background points using bias method. raster bias data must provided. recommended rbias match resolution extent rlayer. sp_name character. Species name output used. argument used, first output column species name. Default NULL.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/sample_background.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Sample background points — sample_background","text":"tibble object x y coordinates sampled background points","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/sample_background.html","id":"references","dir":"Reference","previous_headings":"","what":"References","title":"Sample background points — sample_background","text":"Phillips, S. J., Dudík, M., Elith, J., Graham, C. H., Lehmann, ., Leathwick, J., & Ferrier, S. (2009). Sample selection bias presence-distribution models: Implications background pseudo-absence data. Ecological Applications, 19(1), 181-197. Vollering, J., Halvorsen, R., Auestad, ., & Rydgren, K. (2019). Bunching background betters bias species distribution models. Ecography, 42(10), 1717-1727. https://doi.org/10.1111/ecog.04503","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/sample_background.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Sample background points — sample_background","text":"","code":"if (FALSE) { # \\dontrun{ require(terra) require(dplyr) data(spp) somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) # Example for a single species spp_pa <- spp %>% dplyr::filter(species == \"sp3\") # Spatially structured partition part <- part_sblock( env_layer = somevar, data = spp_pa, x = \"x\", y = \"y\", pr_ab = \"pr_ab\", min_res_mult = 100, max_res_mult = 500, num_grids = 30, min_occ = 5, n_part = 2 ) grid_env <- get_block(env_layer = somevar, best_grid = part$grid) plot(grid_env) ## %######################################################%## # # #### Random background method #### # # ## %######################################################%## # Sample background points throughout study area with random sampling method spp_p <- spp_pa %>% dplyr::filter(pr_ab == 1) bg <- sample_background( data = spp_p, x = \"x\", y = \"y\", n = 1000, method = \"random\", rlayer = grid_env, sp_name = \"sp3\" ) bg plot(grid_env) points(bg[-1]) # Sample random background points constrained to a region with a give set of values plot(grid_env) sample_background( data = spp_p, x = \"x\", y = \"y\", n = 1000, method = \"random\", rlayer = grid_env, maskval = 1 ) %>% points() plot(grid_env) sample_background( data = spp_p, x = \"x\", y = \"y\", n = 1000, method = \"random\", rlayer = grid_env, maskval = 2 ) %>% points() plot(grid_env) sample_background( data = spp_p, x = \"x\", y = \"y\", n = 1000, method = \"random\", rlayer = grid_env, maskval = c(1, 2) ) %>% points() # Sample random background within a calibration area and constrained to a region ca_ps1 <- calib_area( data = spp_pa, x = \"x\", y = \"y\", method = c(\"buffer\", width = 50000), crs = crs(somevar) ) plot(grid_env) plot(ca_ps1, add = T) points(spp_pa[-1], col = \"blue\", cex = 0.7, pch = 19) sample_background( data = spp_p, x = \"x\", y = \"y\", n = 1000, method = \"random\", rlayer = grid_env, maskval = 1, calibarea = ca_ps1 ) %>% points(col = \"red\") ## %######################################################%## # # #### Thickening background method #### # # ## %######################################################%## # Thickening background without constraining them spp_p # presences database of a species grid_env # The raster layer used for sampling background bg <- sample_background( data = spp_p, x = \"x\", y = \"y\", n = 5000, method = \"thickening\", rlayer = grid_env, ) plot(grid_env) bg %>% points(col = \"red\") # Thickening background spp_p # presences database of a species grid_env # The raster layer used for sampling background bg <- sample_background( data = spp_p, x = \"x\", y = \"y\", n = 5000, method = c(\"thickening\", width = 150000), rlayer = grid_env ) plot(grid_env) bg %>% points(col = \"red\") # Sample thickening background within a calibration area and constrained to a region bg <- sample_background( data = spp_p, x = \"x\", y = \"y\", n = 3000, method = \"thickening\", rlayer = grid_env, maskval = 2, calibarea = ca_ps1 ) plot(grid_env) plot(ca_ps1, add = T) bg %>% points(col = \"red\", cex = 0.3) points(spp_p[c(\"x\", \"y\")], pch = 19) ## %######################################################%## # # #### Biased background method #### # # ## %######################################################%## require(dplyr) require(terra) data(spp) # Select the presences of a species spp_p <- spp %>% dplyr::filter(species == \"sp1\", pr_ab == 1) # Raster layer with density of points to obtain a biased sampling background occ_density <- system.file(\"external/occ_density.tif\", package = \"flexsdm\") occ_density <- terra::rast(occ_density) plot(occ_density) points(spp_p %>% dplyr::select(x, y), cex = 0.5) # A layer with region used to contrain background sampling area regions <- system.file(\"external/regions.tif\", package = \"flexsdm\") regions <- terra::rast(regions) plot(regions) points(spp_p %>% dplyr::select(x, y), cex = 0.5) # Biased background points spp_p # presences database of a species bg <- sample_background( data = spp_p, x = \"x\", y = \"y\", n = 3000, method = \"biased\", rlayer = regions, rbias = occ_density ) plot(occ_density) bg %>% points(col = \"red\", cex = 0.1) spp_p %>% dplyr::select(x, y) %>% points(., col = \"black\", pch = 19, cex = 0.5) # Biased background points constrained to a region # It will be selected region 6 plot(regions) plot(regions %in% c(1, 6)) bg <- sample_background( data = spp_p, x = \"x\", y = \"y\", n = 500, method = \"biased\", rlayer = regions, rbias = occ_density, maskval = c(1, 2) ) plot(occ_density) bg %>% points(col = \"red\", cex = 0.5) spp_p %>% dplyr::select(x, y) %>% points(., col = \"black\", pch = 19, cex = 0.5) } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/sample_pseudoabs.html","id":null,"dir":"Reference","previous_headings":"","what":"Sample pseudo-absences — sample_pseudoabs","title":"Sample pseudo-absences — sample_pseudoabs","text":"function provide several methods sampling pseudo-absences, instance totally random sampling method, options using different environmental geographical constraints.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/sample_pseudoabs.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Sample pseudo-absences — sample_pseudoabs","text":"","code":"sample_pseudoabs( data, x, y, n, method, rlayer, maskval = NULL, calibarea = NULL, sp_name = NULL )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/sample_pseudoabs.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Sample pseudo-absences — sample_pseudoabs","text":"data data.frame tibble. Database presences (presence-absence, presences-pseudo-absence) records, coordinates x character. Column name spatial x coordinates y character. Column name spatial y coordinates n integer. Number pseudo-absences sampled method character. Pseudo-absence allocation method. necessary provide vector argument. methods implemented : random: Random allocation pseudo-absences throughout area used model fitting. Usage method='random'. env_const: Pseudo-absences environmentally constrained regions lower suitability values predicted Bioclim model. method, necessary provide raster stack brick object environmental variables Usage method=c(method='env_const', env = somevar). geo_const: Pseudo-absences allocated far occurrences based geographical buffer. value buffer width m must provided raster (used rlayer) longitude/latitude CRS, map units cases. Usage method=c('geo_const', width='50000'). geo_env_const: Pseudo-absences constrained environmentally (based Bioclim model) distributed geographically far occurrences based geographical buffer. method, raster environmental variables stored SpatRaster object provided. value buffer width m must provided raster (used rlayer) longitude/latitude CRS, map units cases. Usage method=c('geo_env_const', width='50000', env = somevar). geo_env_km_const: Pseudo-absences constrained using three-level procedure; similar geo_env_const additional step distributes pseudo-absences environmental space using k-means cluster analysis. method, necessary provide raster stack brick object environmental variables value buffer width m raster (used rlayer) longitude/latitude CRS, map units cases. Usage method=c('geo_env_km_const', width='50000', env = somevar). rlayer SpatRaster. raster layer used sampling pseudo-absence layer resolution extent environmental variables used modeling recommended. case use maskval argument, raster layer must contain values used constrain sampling maskval integer, character, factor. Values raster layer used constraining pseudo-absence sampling calibarea SpatVector SpatVector delimit calibration area used given species (see calib_area function). sp_name character. Species name output used. argument used, first output column species name. Default NULL.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/sample_pseudoabs.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Sample pseudo-absences — sample_pseudoabs","text":"tibble object x y coordinates sampled pseudo-absence points","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/sample_pseudoabs.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Sample pseudo-absences — sample_pseudoabs","text":"","code":"if (FALSE) { # \\dontrun{ require(terra) require(dplyr) data(\"spp\") somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) regions <- system.file(\"external/regions.tif\", package = \"flexsdm\") regions <- terra::rast(regions) plot(regions) single_spp <- spp %>% dplyr::filter(species == \"sp3\") %>% dplyr::filter(pr_ab == 1) %>% dplyr::select(-pr_ab) # Pseudo-absences randomly sampled throughout study area ps1 <- sample_pseudoabs( data = single_spp, x = \"x\", y = \"y\", n = nrow(single_spp) * 10, method = \"random\", rlayer = regions, maskval = NULL, sp_name = \"sp3\" ) plot(regions, col = gray.colors(9)) points(single_spp[-1], col = \"blue\", cex = 0.7, pch = 19) # presences points(ps1[-1], col = \"red\", cex = 0.7, pch = 19) # absences # Pseudo-absences randomly sampled within a regions where a species occurs ## Regions where this species occurrs samp_here <- terra::extract(regions, single_spp[2:3])[, 2] %>% unique() %>% na.exclude() ps1 <- sample_pseudoabs( data = single_spp, x = \"x\", y = \"y\", n = nrow(single_spp) * 10, method = \"random\", rlayer = regions, maskval = samp_here ) plot(regions, col = gray.colors(9)) points(single_spp[-1], col = \"blue\", cex = 0.7, pch = 19) points(ps1, col = \"red\", cex = 0.7, pch = 19) # Pseudo-absences sampled with geographical constraint ps1 <- sample_pseudoabs( data = single_spp, x = \"x\", y = \"y\", n = nrow(single_spp) * 10, method = c(\"geo_const\", width = \"30000\"), rlayer = regions, maskval = samp_here ) plot(regions, col = gray.colors(9)) points(single_spp[-1], col = \"blue\", cex = 0.7, pch = 19) points(ps1, col = \"red\", cex = 0.7, pch = 19) # Pseudo-absences sampled with environmental constraint ps1 <- sample_pseudoabs( data = single_spp, x = \"x\", y = \"y\", n = nrow(single_spp) * 10, method = c(\"env_const\", env = somevar), rlayer = regions, maskval = samp_here ) plot(regions, col = gray.colors(9)) points(single_spp[-1], col = \"blue\", cex = 0.7, pch = 19) points(ps1, col = \"red\", cex = 0.7, pch = 19) # Pseudo-absences sampled with environmental and geographical constraint ps1 <- sample_pseudoabs( data = single_spp, x = \"x\", y = \"y\", n = nrow(single_spp) * 10, method = c(\"geo_env_const\", width = \"50000\", env = somevar), rlayer = regions, maskval = samp_here ) plot(regions, col = gray.colors(9)) points(single_spp[-1], col = \"blue\", cex = 0.7, pch = 19) points(ps1, col = \"red\", cex = 0.7, pch = 19) # Pseudo-absences sampled with environmental and geographical constraint and with k-mean clustering ps1 <- sample_pseudoabs( data = single_spp, x = \"x\", y = \"y\", n = nrow(single_spp) * 10, method = c(\"geo_env_km_const\", width = \"50000\", env = somevar), rlayer = regions, maskval = samp_here ) plot(regions, col = gray.colors(9)) points(single_spp[-1], col = \"blue\", cex = 0.7, pch = 19) points(ps1, col = \"red\", cex = 0.7, pch = 19) # Sampling pseudo-absence using a calibration area ca_ps1 <- calib_area( data = single_spp, x = \"x\", y = \"y\", method = c(\"buffer\", width = 50000), crs=crs(somevar) ) plot(regions, col = gray.colors(9)) plot(ca_ps1, add = T) points(single_spp[-1], col = \"blue\", cex = 0.7, pch = 19) ps1 <- sample_pseudoabs( data = single_spp, x = \"x\", y = \"y\", n = nrow(single_spp) * 50, method = \"random\", rlayer = regions, maskval = NULL, calibarea = ca_ps1 ) plot(regions, col = gray.colors(9)) plot(ca_ps1, add = T) points(ps1, col = \"red\", cex = 0.7, pch = 19) points(single_spp[-1], col = \"blue\", cex = 0.7, pch = 19) ps1 <- sample_pseudoabs( data = single_spp, x = \"x\", y = \"y\", n = nrow(single_spp) * 50, method = \"random\", rlayer = regions, maskval = samp_here, calibarea = ca_ps1 ) plot(regions, col = gray.colors(9)) plot(ca_ps1, add = T) points(ps1, col = \"red\", cex = 0.7, pch = 19) points(single_spp[-1], col = \"blue\", cex = 0.7, pch = 19) } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_directory.html","id":null,"dir":"Reference","previous_headings":"","what":"Create directories for saving the outputs of the flexsdm — sdm_directory","title":"Create directories for saving the outputs of the flexsdm — sdm_directory","text":"function assists creating directory system different sub-folders assist organisation modelling process outputs.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_directory.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Create directories for saving the outputs of the flexsdm — sdm_directory","text":"","code":"sdm_directory( main_dir = NULL, projections = NULL, calibration_area = TRUE, algorithm = NULL, ensemble = NULL, threshold = FALSE, return_vector = TRUE )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_directory.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Create directories for saving the outputs of the flexsdm — sdm_directory","text":"main_dir character. Directory path containing main folder saving model inputs outputs. NULL function assumes directory path current working R session creates sub-folder name 'flexsdm_results'. Default NULL projections vector. Vector folder names future scenarios/different regions/time periods save model projections output. calibration_area logical. TRUE, function creates folder 1_Inputs storing calibration area. Default TRUE algorithm vector. Vector model names used. Usage algorithm = c(gam, tune_max, tune_net, esm_glm). \"\" used function creates folders algorithms available flexsdm . .e. 'gam', 'gau', 'gbm', 'glm', 'max', 'net', 'raf', 'svm'. Default NULL ensemble vector. Vector methods used ensemble different models. Usage ensemble = c(\"mean\", \"meanthr\"). Default NULL threshold logical. TRUE sub-folders \"/1_con\", \"/2_bin\" created within algorithm /ensemble folder. Used storing continuous binarized models separately. Default FALSE return_vector logical. TRUE function returns vector path folders. Default TRUE","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_directory.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Create directories for saving the outputs of the flexsdm — sdm_directory","text":"character vector paths created folders","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_directory.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Create directories for saving the outputs of the flexsdm — sdm_directory","text":"sdm_directory function assists saving workflow outputs creating folders (directories) based user specifications, choice algorithms, ensemble methods, model projections new geographic regions periods. function first creates two folders within user-specified project folder, one model inputs (1_Inputs) one model outputs (2_Outputs). Within 1_Inputs, three sub-folders users store model inputs: 1_Occurrences, 2_Predictors, 3_Calibration_area. user chooses include projections modeling framework, 2_Projections subfolder created within 2_Predictors folder store environmental data projection scenarios provided \"projections\" argument. Additionally, sdm_directory offers users enhanced flexibility saving modeling outputs, giving offers users option save results modeling ensemble technique presented flexsdm","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_directory.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Create directories for saving the outputs of the flexsdm — sdm_directory","text":"","code":"if (FALSE) { # \\dontrun{ require(dplyr) # require(sf) # Implement sdm_directory without specific path and project name dirs_1 <- sdm_directory( main_dir = NULL, projections = NULL, calibration_area = TRUE, algorithm = c(\"gam\", \"tune_max\"), ensemble = c(\"mean\", \"meanthr\"), threshold = FALSE, return_vector = TRUE ) dirs_1 dirs_1[1] %>% fs::dir_tree(., recurse = TRUE) unlink(dirs_1[1], recursive = TRUE) # this directory and sub-folder will be removed # Implement sdm_directory with specific path and project name getwd() %>% dirname() dirs_2 <- sdm_directory( main_dir = getwd() %>% dirname() %>% file.path(., \"my_project_name\"), projections = c( \"cnrm_rpc8.5_2050\", \"cnrm_rpc4.5_2050\" ), calibration_area = TRUE, algorithm = \"all\", ensemble = c(\"mean\", \"meanthr\"), threshold = TRUE ) dirs_2[1] %>% fs::dir_tree(., recurse = TRUE) } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_eval.html","id":null,"dir":"Reference","previous_headings":"","what":"Calculate different model performance metrics — sdm_eval","title":"Calculate different model performance metrics — sdm_eval","text":"function calculates threshold dependent independent model performance metrics.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_eval.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Calculate different model performance metrics — sdm_eval","text":"","code":"sdm_eval(p, a, bg = NULL, thr = NULL)"},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_eval.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Calculate different model performance metrics — sdm_eval","text":"p numeric. Predicted suitability presences numeric. Predicted suitability absences bg numeric. Predicted suitability background points, used BOYCE metric. bg set NULL, BOYCE metric calculated presences absences suitabilities values thr character. Threshold criterion used get binary suitability values (.e. 0,1). Used threshold-dependent performance metrics. possible use one threshold type. vector must provided argument. following threshold criteria available: lpt: highest threshold omission. equal_sens_spec: Threshold Sensitivity Specificity equal. max_sens_spec: Threshold sum Sensitivity Specificity highest (aka threshold maximizes TSS). max_jaccard: threshold Jaccard index highest. max_sorensen: threshold Sorensen index highest. max_fpb: threshold FPB (F-measure presence-background data) highest. sensitivity: Threshold based specified Sensitivity value. Usage thr = c('sensitivity', sens='0.6') thr = c('sensitivity'). 'sens' refers Sensitivity value. sensitivity value specified, default value 0.9 one threshold type used, concatenate threshold types, e.g., thr=c('lpt', 'max_sens_spec', 'max_jaccard'), thr=c('lpt', 'max_sens_spec', 'sensitivity', sens='0.8'), thr=c('lpt', 'max_sens_spec', 'sensitivity'). Function use thresholds threshold type specified","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_eval.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Calculate different model performance metrics — sdm_eval","text":"tibble next columns threshold: threshold names thr_value: threshold values n_presences: number presences n_absences: number absences TPR IMAE: performance metrics","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_eval.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Calculate different model performance metrics — sdm_eval","text":"function used evaluating different models approaches base combination presence-absences presence-pseudo-absences background point data suitability predicted model flexsdm modeling function families (fit_, esm_, tune_.) calculates next performance metric: \\* BOYCE calculated based presences background points, case background points provided calculated using presences absences. codes calculating metric adaptation enmSdm package (https://github.com/adamlilith/enmSdm) \\** IMAE calculated 1-(Mean Absolute Error) order consistent metrics higher value given performance metric, greater model's accuracy","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_eval.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Calculate different model performance metrics — sdm_eval","text":"","code":"if (FALSE) { # \\dontrun{ require(dplyr) set.seed(0) p <- rnorm(50, mean = 0.7, sd = 0.3) %>% abs() p[p > 1] <- 1 p[p < 0] <- 0 set.seed(0) a <- rnorm(50, mean = 0.3, sd = 0.2) %>% abs() a[a > 1] <- 1 a[a < 0] <- 0 set.seed(0) backg <- rnorm(1000, mean = 0.4, sd = 0.4) %>% abs() backg[backg > 1] <- 1 backg[backg < 0] <- 0 # Function use without threshold specification e <- sdm_eval(p, a) e # Function use with threshold specification sdm_eval(p, a, thr = \"max_sorensen\") sdm_eval(p, a, thr = c(\"lpt\", \"max_sens_spec\", \"max_jaccard\")) sdm_eval(p, a, thr = c(\"lpt\", \"max_sens_spec\", \"sensitivity\")) sdm_eval(p, a, thr = c(\"lpt\", \"max_sens_spec\", \"sensitivity\", sens = \"0.95\")) # Use of bg argument (it will only be used for calculating BOYCE index) sdm_eval(p, a, thr = \"max_sens_spec\") sdm_eval(p, a, thr = c(\"max_sens_spec\"), bg = backg) # If background will be used to calculate all other metrics # background values can be used in \"a\" argument sdm_eval(p, backg, thr = \"max_sens_spec\") } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_extract.html","id":null,"dir":"Reference","previous_headings":"","what":"Extract environmental data values from a spatial raster based on x and y coordinates — sdm_extract","title":"Extract environmental data values from a spatial raster based on x and y coordinates — sdm_extract","text":"Extract environmental data values spatial raster based x y coordinates","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_extract.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Extract environmental data values from a spatial raster based on x and y coordinates — sdm_extract","text":"","code":"sdm_extract(data, x, y, env_layer, variables = NULL, filter_na = TRUE)"},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_extract.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Extract environmental data values from a spatial raster based on x and y coordinates — sdm_extract","text":"data data.frame. Database species presence, presence-absence, pseudo-absence records x y coordinates x character. Column name spatial x coordinates y character. Column name spatial y coordinates env_layer SpatRaster. Raster raster stack environmental variables. variables character. Vector variable names predictor (environmental) variables Usage variables. = c(\"aet\", \"cwd\", \"tmin\"). variable specified, function return data layers. Default NULL filter_na logical. filter_na = TRUE (default), rows NA values environmental variables removed returned tibble.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_extract.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Extract environmental data values from a spatial raster based on x and y coordinates — sdm_extract","text":"tibble returns original data base additional columns extracted environmental variables xy location SpatRaster object used 'env_layer'","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_extract.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Extract environmental data values from a spatial raster based on x and y coordinates — sdm_extract","text":"","code":"if (FALSE) { # \\dontrun{ require(terra) # Load datasets data(spp) f <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(f) # Extract environmental data from somevar for all locations in spp ex_spp <- sdm_extract( data = spp, x = \"x\", y = \"y\", env_layer = somevar, variables = NULL, filter_na = FALSE ) # Extract environmental for two variables and remove rows with NAs ex_spp2 <- sdm_extract( data = spp, x = \"x\", y = \"y\", env_layer = somevar, variables = c(\"CFP_3\", \"CFP_4\"), filter_na = TRUE ) ex_spp ex_spp2 } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_predict.html","id":null,"dir":"Reference","previous_headings":"","what":"Spatial predictions from individual and ensemble models — sdm_predict","title":"Spatial predictions from individual and ensemble models — sdm_predict","text":"function allows geographical prediction one models constructed fit_ tune_ function set, models fitted esm_ function set (.e., ensemble small models approach), models constructed fit_ensemble function. can return continuous continuous binary predictions one thresholds","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_predict.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Spatial predictions from individual and ensemble models — sdm_predict","text":"","code":"sdm_predict( models, pred, nchunk = 1, thr = NULL, con_thr = FALSE, predict_area = NULL, clamp = TRUE, pred_type = \"cloglog\" )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_predict.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Spatial predictions from individual and ensemble models — sdm_predict","text":"models list one models fitted fit_ tune_ functions. case use models fitted fit_ensemble esm_ family function one model used. Usage models = mglm models = list(mglm, mraf, mgbm) pred SpatRaster. Raster layer predictor variables. Names layers must exactly match used model fitting. nchunk integer. Number chunks split data used predict models (.e., SpatRaster used pred argument). Predicting models chunks helps reduce memory requirements cases models predicted large scales high resolution. Default = 1 thr character. Threshold used get binary suitability values (.e., 0,1). possible use one threshold type. mandatory use threshold/s used fit models. following threshold types available: lpt: highest threshold omission. equal_sens_spec: Threshold sensitivity specificity equal. max_sens_spec: Threshold sum sensitivity specificity highest (aka threshold maximizes TSS). max_jaccard: threshold Jaccard index highest. max_sorensen: threshold Sorensen index highest. max_fpb: threshold FPB highest. sensitivity: Threshold based specified sensitivity value used fit models. : threshold used model outputs used 'models' argument used. Usage thr = c('lpt', 'max_sens_spec', 'max_jaccard'), thr=c('lpt', 'max_sens_spec', 'sensitivity'), thr=''. threshold specified (.e., thr = NULL) function return continuous prediction . Default NULL con_thr logical. true predictions suitability values threshold/s returned. Default = FALSE predict_area SpatVector, SpatialPolygon, SpatialPolygonDataFrame. Spatial polygon used restring prediction given region. Default = NULL clamp logical. set TRUE, predictors features restricted range seen model training. valid Maxent model (see tune_mx fit_mx). Default TRUE. pred_type character. Type response required available \"link\", \"exponential\", \"cloglog\" \"logistic\". valid Maxent model (see tune_mx fit_mx). Default \"cloglog\".","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_predict.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Spatial predictions from individual and ensemble models — sdm_predict","text":"list SpatRaster continuous /binary predictions","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_predict.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Spatial predictions from individual and ensemble models — sdm_predict","text":"","code":"if (FALSE) { # \\dontrun{ require(dplyr) require(terra) data(\"spp\") somevar <- system.file(\"external/somevar.tif\", package = \"flexsdm\") somevar <- terra::rast(somevar) # Extract data some_sp <- spp %>% filter(species == \"sp3\") some_sp <- sdm_extract( data = some_sp, x = \"x\", y = \"y\", env_layer = somevar ) # Partition some_sp <- part_random( data = some_sp, pr_ab = \"pr_ab\", method = c(method = \"rep_kfold\", folds = 3, replicates = 5) ) ## %######################################################%## # # #### Create different type of models #### # # ## %######################################################%## # Fit some models mglm <- fit_glm( data = some_sp, response = \"pr_ab\", predictors = c(\"CFP_1\", \"CFP_2\", \"CFP_3\", \"CFP_4\"), partition = \".part\", poly = 2 ) mraf <- fit_raf( data = some_sp, response = \"pr_ab\", predictors = c(\"CFP_1\", \"CFP_2\", \"CFP_3\", \"CFP_4\"), partition = \".part\", ) mgbm <- fit_gbm( data = some_sp, response = \"pr_ab\", predictors = c(\"CFP_1\", \"CFP_2\", \"CFP_3\", \"CFP_4\"), partition = \".part\" ) # Fit an ensemble model mensemble <- fit_ensemble( models = list(mglm, mraf, mgbm), ens_method = \"meansup\", thr = NULL, thr_model = \"max_sens_spec\", metric = \"TSS\" ) # Fit a model with the Ensembles of Small Models approach # Without threshold specification and with kfold msmall <- esm_gam( data = some_sp, response = \"pr_ab\", predictors = c(\"CFP_1\", \"CFP_2\", \"CFP_3\", \"CFP_4\"), partition = \".part\", thr = NULL ) ## %######################################################%## # # #### Predict different kind of models #### # # ## %######################################################%## # sdm_predict can be used for predict one or more models fitted with fit_ or tune_ functions # a single model ind_p <- sdm_predict( models = mglm, pred = somevar, thr = \"max_fpb\", con_thr = FALSE, predict_area = NULL ) # a list of models list_p <- sdm_predict( models = list(mglm, mraf, mgbm), pred = somevar, thr = \"max_fpb\", con_thr = FALSE, predict_area = NULL ) # Predict an ensemble model # (only is possilbe use one fit_ensemble) ensemble_p <- sdm_predict( models = mensemble, pred = somevar, thr = \"max_fpb\", con_thr = FALSE, predict_area = NULL ) # Predict an ensemble of small models # (only is possible to use one ensemble of small models) small_p <- sdm_predict( models = msmall, pred = somevar, thr = \"max_fpb\", con_thr = FALSE, predict_area = NULL ) ##%######################################################%## # # #### Predict model using chunks #### # # ##%######################################################%## # Predicting models in chunks helps reduce memory requirements in # cases where models are predicted for large scales and high resolution ind_p <- sdm_predict( models = mglm, pred = somevar, thr = \"max_fpb\", con_thr = FALSE, predict_area = NULL, nchunk = 4 ) } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_summarize.html","id":null,"dir":"Reference","previous_headings":"","what":"Merge model performance tables — sdm_summarize","title":"Merge model performance tables — sdm_summarize","text":"Merge model performance tables","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_summarize.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Merge model performance tables — sdm_summarize","text":"","code":"sdm_summarize(models)"},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_summarize.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Merge model performance tables — sdm_summarize","text":"models list one models fitted fit_ tune_ functions, fit_ensemble output, esm_ family function output. list single several models fitted fit_ tune_ functions object returned fit_ensemble function. Usage models = list(mod1, mod2, mod3)","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_summarize.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Merge model performance tables — sdm_summarize","text":"Combined model performance table input models. Models fit tune include model performance best hyperparameters.","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/sdm_summarize.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Merge model performance tables — sdm_summarize","text":"","code":"if (FALSE) { # \\dontrun{ data(abies) abies # In this example we will partition the data using the k-fold method abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 5) ) # Build a generalized additive model using fit_gam gam_t1 <- fit_gam( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), predictors_f = c(\"landform\"), partition = \".part\", thr = c(\"max_sens_spec\", \"equal_sens_spec\", \"max_sorensen\") ) gam_t1$performance # Build a generalized linear model using fit_glm glm_t1 <- fit_glm( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"ppt_jja\", \"pH\", \"awc\", \"depth\"), predictors_f = c(\"landform\"), partition = \".part\", thr = c(\"max_sens_spec\", \"equal_sens_spec\", \"max_sorensen\"), poly = 0, inter_order = 0 ) glm_t1$performance # Build a tuned random forest model using tune_raf tune_grid <- expand.grid(mtry = seq(1, 7, 1)) rf_t1 <- tune_raf( data = abies2, response = \"pr_ab\", predictors = c( \"aet\", \"cwd\", \"tmin\", \"ppt_djf\", \"ppt_jja\", \"pH\", \"awc\", \"depth\" ), predictors_f = c(\"landform\"), partition = \".part\", grid = tune_grid, thr = c(\"max_sens_spec\", \"equal_sens_spec\", \"max_sorensen\"), metric = \"TSS\", ) rf_t1$performance # Merge sdm performance tables merge_df <- sdm_summarize(models = list(gam_t1, glm_t1, rf_t1)) merge_df } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/spp.html","id":null,"dir":"Reference","previous_headings":"","what":"A data set containing presences and absences of three virtual species — spp","title":"A data set containing presences and absences of three virtual species — spp","text":"data set containing presences absences three virtual species","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/spp.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"A data set containing presences and absences of three virtual species — spp","text":"","code":"spp"},{"path":"https://sjevelazco.github.io/flexsdm/reference/spp.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"A data set containing presences and absences of three virtual species — spp","text":"tibble 1150 rows 3 variables: species virtual species names x longitude species occurrences y latitude species occurrences pr_ab presences absences denoted 1 0 respectively","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/spp.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"A data set containing presences and absences of three virtual species — spp","text":"","code":"if (FALSE) { # \\dontrun{ require(dplyr) data(\"spp\") spp } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/tune_gbm.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit and validate Generalized Boosted Regression models with exploration of hyper-parameters that optimize performance — tune_gbm","title":"Fit and validate Generalized Boosted Regression models with exploration of hyper-parameters that optimize performance — tune_gbm","text":"Fit validate Generalized Boosted Regression models exploration hyper-parameters optimize performance","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/tune_gbm.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit and validate Generalized Boosted Regression models with exploration of hyper-parameters that optimize performance — tune_gbm","text":"","code":"tune_gbm( data, response, predictors, predictors_f = NULL, fit_formula = NULL, partition, grid = NULL, thr = NULL, metric = \"TSS\", n_cores = 1 )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/tune_gbm.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit and validate Generalized Boosted Regression models with exploration of hyper-parameters that optimize performance — tune_gbm","text":"data data.frame. Database response (0,1) predictors values. response character. Column name species absence-presence data (0,1). predictors character. Vector column names quantitative predictor variables (.e. continuous variables). Usage predictors = c(\"aet\", \"cwd\", \"tmin\") predictors_f character. Vector column names qualitative predictor variables (.e. ordinal nominal variables type). Usage predictors_f = c(\"landform\") fit_formula formula. formula object response predictor variables (e.g. formula(pr_ab ~ aet + ppt_jja + pH + awc + depth + landform)). Note variables used must consistent used response, predictors, predictors_f arguments. Default NULL. partition character. Column name training validation partition groups. grid data.frame. data frame object algorithm hyper-parameter values tested. recommended generate data.frame grid() function. Hyper-parameters needed tuning 'n.trees', 'shrinkage', 'n.minobsinnode'. thr character. Threshold used get binary suitability values (.e. 0,1) needed threshold-dependent performance metrics. possible use one threshold type. Provide vector argument. following threshold types available: lpt: highest threshold omission. equal_sens_spec: Threshold sensitivity specificity equal. max_sens_spec: Threshold sum sensitivity specificity highest (aka threshold maximizes TSS). max_jaccard: threshold Jaccard index highest. max_sorensen: threshold Sorensen index highest. max_fpb: threshold FPB (F-measure presence-background data) highest. sensitivity: Threshold based specified sensitivity value. Usage thr = c('sensitivity', sens='0.6') thr = c('sensitivity'). 'sens' refers sensitivity value. sensitivity value specified, default used 0.9 one threshold type used must concatenate, e.g., thr=c('lpt', 'max_sens_spec', 'max_jaccard'), thr=c('lpt', 'max_sens_spec', 'sensitivity', sens='0.8'), thr=c('lpt', 'max_sens_spec', 'sensitivity'). Function use threshold types threshold specified. metric character. Performance metric used selecting best combination hyper-parameter values. following metrics can used: SORENSEN, JACCARD, FPB, TSS, KAPPA, AUC, BOYCE. TSS used default. n_cores numeric. Number cores use parallelization. Default 1","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/tune_gbm.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit and validate Generalized Boosted Regression models with exploration of hyper-parameters that optimize performance — tune_gbm","text":"list object : model: \"gbm\" class object gbm package. object can used predicting. predictors: tibble quantitative (c column names) qualitative (f column names) variables use modeling. performance: Hyper-parameter values performance metric (see sdm_eval) best hyper-parameter combination. hyper_performance: Performance metric (see sdm_eval) combination hyper-parameters. data_ens: Predicted suitability test partition based best model. database used fit_ensemble","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/tune_gbm.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit and validate Generalized Boosted Regression models with exploration of hyper-parameters that optimize performance — tune_gbm","text":"","code":"if (FALSE) { # \\dontrun{ data(abies) abies # Partition the data with the k-fold method abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 5) ) # pr_ab is the name of the column with species presence and absences (i.e. the response variable) # from aet to landform are the predictors variables (landform is a qualitative variable) # Hyper-parameter values for tuning tune_grid <- expand.grid( n.trees = c(20, 50, 100), shrinkage = c(0.1, 0.5, 1), n.minobsinnode = c(1, 3, 5, 7, 9) ) gbm_t <- tune_gbm( data = abies2, response = \"pr_ab\", predictors = c( \"aet\", \"cwd\", \"tmin\", \"ppt_djf\", \"ppt_jja\", \"ppt_jja\", \"pH\", \"awc\", \"depth\" ), predictors_f = c(\"landform\"), partition = \".part\", grid = tune_grid, thr = \"max_sens_spec\", metric = \"TSS\", n_cores = 1 ) # Outputs gbm_t$model gbm_t$predictors gbm_t$performance gbm_t$data_ens gbm_t$hyper_performance # Graphical exploration of performance of each hyper-parameter setting require(ggplot2) pg <- position_dodge(width = 0.5) ggplot(gbm_t$hyper_performance, aes(factor(n.minobsinnode), TSS_mean, col = factor(shrinkage) )) + geom_errorbar(aes(ymin = TSS_mean - TSS_sd, ymax = TSS_mean + TSS_sd), width = 0.2, position = pg ) + geom_point(position = pg) + geom_line( data = gbm_t$tune_performance, aes(as.numeric(factor(n.minobsinnode)), TSS_mean, col = factor(shrinkage) ), position = pg ) + facet_wrap(. ~ n.trees) + theme(legend.position = \"bottom\") } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/tune_max.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit and validate Maximum Entropy models with exploration of hyper-parameters that optimize performance — tune_max","title":"Fit and validate Maximum Entropy models with exploration of hyper-parameters that optimize performance — tune_max","text":"Fit validate Maximum Entropy models exploration hyper-parameters optimize performance","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/tune_max.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit and validate Maximum Entropy models with exploration of hyper-parameters that optimize performance — tune_max","text":"","code":"tune_max( data, response, predictors, predictors_f = NULL, background = NULL, partition, grid = NULL, thr = NULL, metric = \"TSS\", clamp = TRUE, pred_type = \"cloglog\", n_cores = 1 )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/tune_max.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit and validate Maximum Entropy models with exploration of hyper-parameters that optimize performance — tune_max","text":"data data.frame. Database response (0,1) predictors values. response character. Column name species absence-presence data (0,1). predictors character. Vector column names quantitative predictor variables (.e. continuous variables). Usage predictors = c(\"aet\", \"cwd\", \"tmin\") predictors_f character. Vector column names qualitative predictor variables (.e. ordinal nominal variables type). Usage predictors_f = c(\"landform\") background data.frame. Database response variable column containing 0 values, predictors variables. column names must consistent data partition character. Column name training validation partition groups. grid data.frame. data frame object algorithm hyper-parameters values tested. recommended generate data.frame grid() function. Hyper-parameters needed tuning 'regmult' 'classes' (combination following letters l -linear-, q -quadratic-, h -hinge-, p -product-, t -threshold-). thr character. Threshold used get binary suitability values (.e. 0,1)., needed threshold-dependent performance metrics. one threshold type can used. necessary provide vector argument. following threshold types available: lpt: highest threshold omission. equal_sens_spec: Threshold sensitivity specificity equal. max_sens_spec: Threshold sum sensitivity specificity highest (aka threshold maximizes TSS). max_jaccard: threshold Jaccard index highest. max_sorensen: threshold Sorensen index highest. max_fpb: threshold # FPB (F-measure presence-background data) highest. sensitivity: Threshold based specified sensitivity value. Usage thr = c('sensitivity', sens='0.6') thr = c('sensitivity'). 'sens' refers sensitivity value. sensitivity value specified, default 0.9 used. one threshold type used, concatenate , e.g., thr=c('lpt', 'max_sens_spec', 'max_jaccard'), thr=c('lpt', 'max_sens_spec', 'sensitivity', sens='0.8'), thr=c('lpt', 'max_sens_spec', 'sensitivity'). Function use thresholds threshold specified. metric character. Performance metric used selecting best combination hyper -parameter values. One following metrics can used: SORENSEN, JACCARD, FPB, TSS, KAPPA, AUC, BOYCE. TSS used default. clamp logical. TRUE, predictors features restricted range seen model training. pred_type character. Type response required available \"link\", \"exponential\", \"cloglog\" \"logistic\". Default \"cloglog\" n_cores numeric. Number cores use parallelization. Default 1","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/tune_max.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit and validate Maximum Entropy models with exploration of hyper-parameters that optimize performance — tune_max","text":"list object : model: \"maxnet\" class object maxnet package. object can used predicting. predictors: tibble quantitative (c column names) qualitative (f column names) variables use modeling. performance: Hyper-parameters values performance metrics (see sdm_eval) best hyper-parameters combination. hyper_performance: Performance metrics (see sdm_eval) combination hyper-parameters. data_ens: Predicted suitability test partition based best model. database used fit_ensemble","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/tune_max.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Fit and validate Maximum Entropy models with exploration of hyper-parameters that optimize performance — tune_max","text":"presence-absence (presence-pseudo-absence) data used data argument addition background points, function fit models presences background points validate presences absences. procedure makes maxent comparable presences-absences models (e.g., random forest, support vector machine). presences background points data used, function fit validate model presences background data. presence-absences used data argument without background, function fit model specified data (recommended).","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/tune_max.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit and validate Maximum Entropy models with exploration of hyper-parameters that optimize performance — tune_max","text":"","code":"if (FALSE) { # \\dontrun{ data(\"abies\") data(\"backg\") abies # environmental conditions of presence-absence data backg # environmental conditions of background points # Using k-fold partition method # Remember that the partition method, number of folds or replications must # be the same for presence-absence and background points datasets abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 3) ) abies2 set.seed(1) backg <- dplyr::sample_n(backg, size = 2000, replace = FALSE) backg2 <- part_random( data = backg, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 3) ) backg gridtest <- expand.grid( regmult = seq(0.1, 3, 0.5), classes = c(\"l\", \"lq\", \"lqh\") ) max_t1 <- tune_max( data = abies2, response = \"pr_ab\", predictors = c(\"aet\", \"pH\", \"awc\", \"depth\"), predictors_f = c(\"landform\"), partition = \".part\", background = backg2, grid = gridtest, thr = \"max_sens_spec\", metric = \"TSS\", clamp = TRUE, pred_type = \"cloglog\", n_cores = 2 # activate two cores to speed up this process ) length(max_t1) max_t1$model max_t1$predictors max_t1$performance max_t1$data_ens } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/tune_net.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit and validate Neural Networks models with exploration of hyper-parameters — tune_net","title":"Fit and validate Neural Networks models with exploration of hyper-parameters — tune_net","text":"Fit validate Neural Networks models exploration hyper-parameters","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/tune_net.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit and validate Neural Networks models with exploration of hyper-parameters — tune_net","text":"","code":"tune_net( data, response, predictors, predictors_f = NULL, fit_formula = NULL, partition, grid = NULL, thr = NULL, metric = \"TSS\", n_cores = 1 )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/tune_net.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit and validate Neural Networks models with exploration of hyper-parameters — tune_net","text":"data data.frame. Database response (0,1) predictors values. response character. Column name species absence-presence data (0,1). predictors character. Vector column names quantitative predictor variables (.e. continuous variables). Usage predictors = c(\"aet\", \"cwd\", \"tmin\") predictors_f character. Vector column names qualitative predictor variables (.e. ordinal nominal variables type). Usage predictors_f = c(\"landform\") fit_formula formula. formula object response predictor variables (e.g. formula(pr_ab ~ aet + ppt_jja + pH + awc + depth + landform)). Note variable names used must consistent used response, predictors, predictors_f arguments. Defaul NULL. partition character. Column name training validation partition groups. grid data.frame. data frame object algorithm hyper-parameters values tested. recommended generate data.frame grid() function. thr character. Threshold used get binary suitability values (.e. 0,1), needed threshold-dependent performance metrics. possible use one threshold type. necessary provide vector argument. following threshold types available: lpt: highest threshold omission. equal_sens_spec: Threshold sensitivity specificity equal. max_sens_spec: Threshold sum sensitivity specificity highest (aka threshold maximizes TSS). max_jaccard: threshold Jaccard index highest. max_sorensen: threshold Sorensen index highest. max_fpb: threshold FPB (F-measure presence-background data) highest. sensitivity: Threshold based specified sensitivity value. Usage thr = c('sensitivity', sens='0.6') thr = c('sensitivity'). 'sens' refers sensitivity value. specified sensitivity values, function use default 0.9. using one threshold type concatenate , e.g., thr=c('lpt', 'max_sens_spec', 'max_jaccard'), thr=c('lpt', 'max_sens_spec', 'sensitivity', sens='0.8'), thr=c('lpt', 'max_sens_spec', 'sensitivity'). Function use thresholds threshold specified. metric character. Performance metric used selecting best combination hyper-parameter values. One following metrics can used: SORENSEN, JACCARD, FPB, TSS, KAPPA, AUC, BOYCE. TSS used default. n_cores numeric. Number cores use parallelization. Default 1","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/tune_net.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit and validate Neural Networks models with exploration of hyper-parameters — tune_net","text":"list object : model: \"nnet\" class object nnet package. object can used predicting. predictors: tibble quantitative (c column names) qualitative (f column names) variables use modeling. performance: Hyper-parameters values performance metric (see sdm_eval) best hyper-parameters combination. hyper_performance: Performance metric (see sdm_eval) combination hyper-parameters. data_ens: Predicted suitability test partition based best model. database used fit_ensemble","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/tune_net.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit and validate Neural Networks models with exploration of hyper-parameters — tune_net","text":"","code":"if (FALSE) { # \\dontrun{ data(abies) abies # Partitioning the data with the k-fold method abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 5) ) # pr_ab columns is species presence and absences (i.e. the response variable) # from aet to landform are the predictors variables (landform is a qualitative variable) # Hyper-parameter values for tuning tune_grid <- expand.grid( size = c(2, 4, 6, 8, 10), decay = c(0.001, 0.05, 0.1, 1, 3, 4, 5, 10) ) net_t <- tune_net( data = abies2, response = \"pr_ab\", predictors = c( \"aet\", \"cwd\", \"tmin\", \"ppt_djf\", \"ppt_jja\", \"pH\", \"awc\", \"depth\" ), predictors_f = c(\"landform\"), partition = \".part\", grid = tune_grid, thr = \"max_sens_spec\", metric = \"TSS\", n_cores = 1 ) # Outputs net_t$model net_t$predictors net_t$performance net_t$hyper_performance net_t$data_ens } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/tune_raf.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit and validate Random Forest models with exploration of hyper-parameters that optimize performance — tune_raf","title":"Fit and validate Random Forest models with exploration of hyper-parameters that optimize performance — tune_raf","text":"Fit validate Random Forest models exploration hyper-parameters optimize performance","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/tune_raf.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit and validate Random Forest models with exploration of hyper-parameters that optimize performance — tune_raf","text":"","code":"tune_raf( data, response, predictors, predictors_f = NULL, fit_formula = NULL, partition, grid = NULL, thr = NULL, metric = \"TSS\", n_cores = 1 )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/tune_raf.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit and validate Random Forest models with exploration of hyper-parameters that optimize performance — tune_raf","text":"data data.frame. Database response (0,1) predictors values. response character. Column name species absence-presence data (0,1). predictors character. Vector column names quantitative predictor variables (.e. continuous variables). Usage predictors = c(\"aet\", \"cwd\", \"tmin\") predictors_f character. Vector column names qualitative predictor variables (.e. ordinal nominal variables type). Usage predictors_f = c(\"landform\") fit_formula formula. formula object response predictor variables (e.g. formula(pr_ab ~ aet + ppt_jja + pH + awc + depth + landform)). Note variables used must consistent used response, predictors, predictors_f arguments. Default NULL partition character. Column name training validation partition groups. grid data.frame. data frame object algorithm hyper-parameters values tested. recommended generate data.frame grid() function. Hyper-parameter needed tuning 'mtry'. maximum mtry exceed total number predictors. thr character. Threshold used get binary suitability values (.e. 0,1), needed threshold-dependent performance metrics. possible use one threshold type. necessary provide vector argument. following threshold types available: lpt: highest threshold omission. equal_sens_spec: Threshold sensitivity specificity equal. max_sens_spec: Threshold sum sensitivity specificity highest (aka threshold maximizes TSS). max_jaccard: threshold Jaccard index highest. max_sorensen: threshold Sorensen index highest. max_fpb: threshold FPB highest. sensitivity: Threshold based specified sensitivity value. Usage thr = c('sensitivity', sens='0.6') thr = c('sensitivity'). 'sens' refers sensitivity value. specified sensitivity values, function use default 0.9 using one threshold type concatenate , e.g., thr=c('lpt', 'max_sens_spec', 'max_jaccard'), thr=c('lpt', 'max_sens_spec', 'sensitivity', sens='0.8'), thr=c('lpt', 'max_sens_spec', 'sensitivity'). Function use thresholds threshold specified. metric character. Performance metric used selecting best combination hyper -parameter values. One following metrics can used: SORENSEN, JACCARD, FPB, TSS, KAPPA, AUC, BOYCE. TSS used default. n_cores numeric. Number cores use parallelization. Default 1","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/tune_raf.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit and validate Random Forest models with exploration of hyper-parameters that optimize performance — tune_raf","text":"list object : model: \"randomForest\" class object randomForest package. object can used predicting. predictors: tibble quantitative (c column names) qualitative (f column names) variables use modeling. performance: Hyper-parameters values performance metric (see sdm_eval) best hyper-parameters combination. hyper_performance: Performance metric (see sdm_eval) combination hyper-parameters. data_ens: Predicted suitability test partition based best model. database used fit_ensemble","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/tune_raf.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit and validate Random Forest models with exploration of hyper-parameters that optimize performance — tune_raf","text":"","code":"if (FALSE) { # \\dontrun{ data(abies) abies # Partition the data with the k-fold method abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 5) ) tune_grid <- expand.grid(mtry = seq(1, 7, 1)) rf_t <- tune_raf( data = abies2, response = \"pr_ab\", predictors = c( \"aet\", \"cwd\", \"tmin\", \"ppt_djf\", \"ppt_jja\", \"pH\", \"awc\", \"depth\" ), predictors_f = c(\"landform\"), partition = \".part\", grid = tune_grid, thr = \"max_sens_spec\", metric = \"TSS\", n_cores = 1 ) # Outputs rf_t$model rf_t$predictors rf_t$performance rf_t$hyper_performance rf_t$data_ens } # }"},{"path":"https://sjevelazco.github.io/flexsdm/reference/tune_svm.html","id":null,"dir":"Reference","previous_headings":"","what":"Fit and validate Support Vector Machine models with exploration of hyper-parameters that optimize performance — tune_svm","title":"Fit and validate Support Vector Machine models with exploration of hyper-parameters that optimize performance — tune_svm","text":"Fit validate Support Vector Machine models exploration hyper-parameters optimize performance","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/tune_svm.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Fit and validate Support Vector Machine models with exploration of hyper-parameters that optimize performance — tune_svm","text":"","code":"tune_svm( data, response, predictors, predictors_f = NULL, fit_formula = NULL, partition, grid = NULL, thr = NULL, metric = \"TSS\", n_cores = 1 )"},{"path":"https://sjevelazco.github.io/flexsdm/reference/tune_svm.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Fit and validate Support Vector Machine models with exploration of hyper-parameters that optimize performance — tune_svm","text":"data data.frame. Database response (0,1) predictors values. response character. Column name species absence-presence data (0,1). predictors character. Vector column names quantitative predictor variables (.e. continuous variables). Usage predictors = c(\"aet\", \"cwd\", \"tmin\") predictors_f character. Vector column names qualitative predictor variables (.e. ordinal nominal variables type). Usage predictors_f = c(\"landform\") fit_formula formula. formula object response predictor variables (e.g. formula(pr_ab ~ aet + ppt_jja + pH + awc + depth + landform)). Note variable names used must consistent used response, predictors, predictors_f arguments. Default NULL partition character. Column name training validation partition groups. grid data.frame. Provide data frame object algorithm hyper-parameters values tested. recommended generate data.frame grid() function. Hyper-parameters needed tuning 'size' 'decay'. thr character. Threshold used get binary suitability values (.e. 0,1). useful threshold-dependent performance metrics. possible use one threshold type. necessary provide vector argument. next threshold area available: lpt: highest threshold omission. equal_sens_spec: Threshold sensitivity specificity equal. max_sens_spec: Threshold sum sensitivity specificity highest (aka threshold maximizes TSS). max_jaccard: threshold Jaccard index highest. max_sorensen: threshold Sorensen index highest. max_fpb: threshold # FPB (F-measure presence-background data) highest. sensitivity: Threshold based specified sensitivity value. Usage thr = c('sensitivity', sens='0.6') thr = c('sensitivity'). 'sens' refers sensitivity value. sensitivity value specified, default used 0.9. case use one threshold type necessary concatenate threshold types, e.g., thr=c('lpt', 'max_sens_spec', 'max_jaccard'), thr=c('lpt', 'max_sens_spec', 'sensitivity', sens='0.8'), thr=c('lpt', 'max_sens_spec', 'sensitivity'). Function use thresholds threshold specified metric character. Performance metric used selecting best combination hyper-parameter values. One following metrics can used: SORENSEN, JACCARD, FPB, TSS, KAPPA, AUC, BOYCE. TSS used default. n_cores numeric. Number cores use parallelization. Default 1","code":""},{"path":"https://sjevelazco.github.io/flexsdm/reference/tune_svm.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Fit and validate Support Vector Machine models with exploration of hyper-parameters that optimize performance — tune_svm","text":"list object : model: \"ksvm\" class object kernlab package. object can used predicting. predictors: tibble quantitative (c column names) qualitative (f column names) variables use modeling. performance: Hyper-parameters values performance metric (see sdm_eval) best hyper-parameters combination. hyper_performance: Performance metrics (see sdm_eval) combination hyper-parameters. data_ens: Predicted suitability test partition based best model. database used fit_ensemble","code":""},{"path":[]},{"path":"https://sjevelazco.github.io/flexsdm/reference/tune_svm.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Fit and validate Support Vector Machine models with exploration of hyper-parameters that optimize performance — tune_svm","text":"","code":"if (FALSE) { # \\dontrun{ data(abies) abies # Partition the data with the k-fold method abies2 <- part_random( data = abies, pr_ab = \"pr_ab\", method = c(method = \"kfold\", folds = 5) ) # pr_ab column is species presence and absences (i.e. the response variable) # from aet to landform are the predictors variables (landform is a qualitative variable) # Hyper-parameter values for tuning tune_grid <- expand.grid( C = c(2, 4, 8, 16, 20), sigma = c(0.01, 0.1, 0.2, 0.3, 0.4) ) svm_t <- tune_svm( data = abies2, response = \"pr_ab\", predictors = c( \"aet\", \"cwd\", \"tmin\", \"ppt_djf\", \"ppt_jja\", \"pH\", \"awc\", \"depth\" ), predictors_f = c(\"landform\"), partition = \".part\", grid = tune_grid, thr = \"max_sens_spec\", metric = \"TSS\", n_cores = 1 ) # Outputs svm_t$model svm_t$predictors svm_t$performance svm_t$hyper_performance svm_t$data_ens } # }"},{"path":"https://sjevelazco.github.io/flexsdm/news/index.html","id":"flexsdm-135-5","dir":"Changelog","previous_headings":"","what":"flexsdm 1.3.5-5","title":"flexsdm 1.3.5-5","text":"min change interp function @sjevelazco 362 min change occfilt_geo @sjevelazco 364 Rlof removed dependencies @sjevelazco 365 min change occfilt_geo @sjevelazco 370 new argument occfilt_geo @sjevelazco 371 esm_ functions improved improvements @sjevelazco 373 & 373 geographically constraint cell env_var argument correct_colinvar @sjevelazco 374 new argument correct_colinvar @sjevelazco 375 calib_area sped @sjevelazco 377 correct_colivar fixed improved, FA method @sjevelazco 383 occfilt_geo ‘defined’ method fixed @sjevelazco 384","code":""},{"path":"https://sjevelazco.github.io/flexsdm/news/index.html","id":"flexsdm-135","dir":"Changelog","previous_headings":"","what":"flexsdm 1.3.5","title":"flexsdm 1.3.5","text":"possible restrict cell used perform collinearity reduction analysis geographical area smaller full extent environmental variables correct_clinvar() esm_ family function improved debugged occfilt_geo new argument “rep” control number o repetition filter occurrences","code":""},{"path":"https://sjevelazco.github.io/flexsdm/news/index.html","id":"flexsdm-134","dir":"Changelog","previous_headings":"","what":"flexsdm 1.3.4","title":"flexsdm 1.3.4","text":"rgeos removed dependencies #356 New vignette use different tools explore model extrapolation truncate models added #352 Univariate combinatorial extrapolation metric added extra_eval. Minor bugs fixed project PCA time periods #351 Best grid raster names changed .part part_sblock part_sband Improvements correct_colinvar speed function using maxcell argument Improvements correct_colinvar project PCA time periods","code":""},{"path":"https://sjevelazco.github.io/flexsdm/news/index.html","id":"flexsdm-133","dir":"Changelog","previous_headings":"","what":"flexsdm 1.3.3","title":"flexsdm 1.3.3","text":"Improvements correct_colinvar now possible sample rasters reduce machine memory speed process Improvements sdm_predict possible predict model chunks reduce machine memory p_extra, p_pdp, p_bpdp fixed New function p_bpdp Bivariate Partial Dependent Plot New function data_bpdp Calculate data construct bivariate partial dependence plots Improvements p_dpd Calculate data construct partial dependence plots","code":""},{"path":"https://sjevelazco.github.io/flexsdm/news/index.html","id":"flexsdm-132","dir":"Changelog","previous_headings":"","what":"flexsdm 1.3.2","title":"flexsdm 1.3.2","text":"New function p_extra Graphical exploration extrapolation suitability pattern environmental geographical space New function p_pdp Partial Dependent Plot New function data_pdp Calculate data construct partial dependence plots","code":""},{"path":"https://sjevelazco.github.io/flexsdm/news/index.html","id":"flexsdm-131","dir":"Changelog","previous_headings":"","what":"flexsdm 1.3.1","title":"flexsdm 1.3.1","text":"New argument “crs” added function msdm_posteriori New argument “sp_name” sample_background sample_pseudoabs raster, flexclust, ape, sp removed dependencies Functions using CRS data improved codes possible use numeric value specify threshold msdm_posteriori extra_eval can use tibble SpatRaster object env_calib argument extra_truncate new argument define values used model truncation documentation improved. #","code":""}]