Type: | Package |
Title: | Joint Species Distribution Models |
Version: | 0.2.6 |
Date: | 2023-07-12 |
Imports: | Rcpp (≥ 1.0.0), graphics, stats, coda, corrplot, stringi, MASS, parallel, doParallel, foreach, methods |
LinkingTo: | Rcpp, RcppArmadillo, RcppGSL |
NeedsCompilation: | yes |
SystemRequirements: | GNU GSL |
Suggests: | knitr, kableExtra, terra, dplyr, rmarkdown, bookdown, testthat (≥ 3.0.0), boral, Hmsc, BayesComm, snow, snowfall, ggplot2, covr, ape, gstat |
Maintainer: | Jeanne Clément <jeanne.clement16@laposte.net> |
Description: | Fits joint species distribution models ('jSDM') in a hierarchical Bayesian framework (Warton and al. 2015 <doi:10.1016/j.tree.2015.09.007>). The Gibbs sampler is written in 'C++'. It uses 'Rcpp', 'Armadillo' and 'GSL' to maximize computation efficiency. |
Depends: | R (≥ 3.5.0) |
License: | GPL-3 |
URL: | https://ecology.ghislainv.fr/jSDM/, https://github.com/ghislainv/jSDM |
BugReports: | https://github.com/ghislainv/jSDM/issues |
LazyLoad: | yes |
Encoding: | UTF-8 |
RoxygenNote: | 7.2.3 |
VignetteBuilder: | knitr |
Config/testthat/edition: | 3 |
Packaged: | 2023-07-17 15:21:44 UTC; clement |
Author: | Jeanne Clément |
Repository: | CRAN |
Date/Publication: | 2023-07-22 10:30:09 UTC |
joint species distribution models
Description
jSDM
is an R package for fitting joint species distribution models (JSDM) in a hierarchical Bayesian framework.
The Gibbs sampler is written in 'C++'. It uses 'Rcpp', 'Armadillo' and 'GSL' to maximize computation efficiency.
Package: | jSDM |
Type: | Package |
Version: | 0.2.1 |
Date: | 2019-01-11 |
License: | GPL-3 |
LazyLoad: | yes |
Details
The package includes the following functions to fit various species distribution models :
function | data-type |
jSDM_binomial_logit | presence-absence |
jSDM_binomial_probit | presence-absence |
jSDM_binomial_probit_sp_constrained | presence-absence |
jSDM_binomial_probit_long_format | presence-absence |
jSDM_poisson_log | abundance |
-
jSDM_binomial_probit
:
Ecological process:y_{ij} \sim \mathcal{B}ernoulli(\theta_{ij})
where
if n_latent=0
andsite_effect="none"
probit (\theta_{ij}) = X_i \beta_j
if n_latent>0
andsite_effect="none"
probit (\theta_{ij}) = X_i \beta_j + W_i \lambda_j
if n_latent=0
andsite_effect="fixed"
probit (\theta_{ij}) = X_i \beta_j + \alpha_i
and\alpha_i \sim \mathcal{N}(0,V_\alpha)
if n_latent>0
andsite_effect="fixed"
probit (\theta_{ij}) = X_i \beta_j + W_i \lambda_j + \alpha_i
if n_latent=0
andsite_effect="random"
probit (\theta_{ij}) = X_i \beta_j + \alpha_i
if n_latent>0
andsite_effect="random"
probit (\theta_{ij}) = X_i \beta_j + W_i \lambda_j + \alpha_i
and\alpha_i \sim \mathcal{N}(0,V_\alpha)
-
jSDM_binomial_probit_sp_constrained
:
This function allows to fit the same models than the functionjSDM_binomial_probit
except for models not including latent variables, indeedn_latent
must be greater than zero in this function. At first, the function fit a JSDM with the constrained species arbitrarily chosen as the first ones in the presence-absence data-set. Then, the function evaluates the convergence of MCMC\lambda
chains using the Gelman-Rubin convergence diagnostic (\hat{R}
). It identifies the species (\hat{j}_l
) having the higher\hat{R}
for\lambda_{\hat{j}_l}
. These species drive the structure of the latent axisl
. The\lambda
corresponding to this species are constrained to be positive and placed on the diagonal of the\Lambda
matrix for fitting a second model. This usually improves the convergence of the latent variables and factor loadings. The function returns the parameter posterior distributions for this second model. -
jSDM_binomial_logit
:
Ecological process :y_{ij} \sim \mathcal{B}inomial(\theta_{ij},t_i)
where
if n_latent=0
andsite_effect="none"
logit (\theta_{ij}) = X_i \beta_j
if n_latent>0
andsite_effect="none"
logit (\theta_{ij}) = X_i \beta_j + W_i \lambda_j
if n_latent=0
andsite_effect="fixed"
logit (\theta_{ij}) = X_i \beta_j + \alpha_i
if n_latent>0
andsite_effect="fixed"
logit (\theta_{ij}) = X_i \beta_j + W_i \lambda_j + \alpha_i
if n_latent=0
andsite_effect="random"
logit (\theta_{ij}) = X_i \beta_j + \alpha_i
and\alpha_i \sim \mathcal{N}(0,V_\alpha)
if n_latent>0
andsite_effect="random"
logit (\theta_{ij}) = X_i \beta_j + W_i \lambda_j + \alpha_i
and\alpha_i \sim \mathcal{N}(0,V_\alpha)
-
jSDM_poisson_log
:
Ecological process :y_{ij} \sim \mathcal{P}oisson(\theta_{ij})
where
if n_latent=0
andsite_effect="none"
log (\theta_{ij}) = X_i \beta_j
if n_latent>0
andsite_effect="none"
log (\theta_{ij}) = X_i \beta_j + W_i \lambda_j
if n_latent=0
andsite_effect="fixed"
log (\theta_{ij}) = X_i \beta_j + \alpha_i
if n_latent>0
andsite_effect="fixed"
log (\theta_{ij}) = X_i \beta_j + W_i \lambda_j + \alpha_i
if n_latent=0
andsite_effect="random"
log (\theta_{ij}) = X_i \beta_j + \alpha_i
and\alpha_i \sim \mathcal{N}(0,V_\alpha)
if n_latent>0
andsite_effect="random"
log (\theta_{ij}) = X_i \beta_j + W_i \lambda_j + \alpha_i
and\alpha_i \sim \mathcal{N}(0,V_\alpha)
-
jSDM_binomial_probit_long_format
:
Ecological process:y_n \sim \mathcal{B}ernoulli(\theta_n)
such as
species_n=j
andsite_n=i
, whereif n_latent=0
andsite_effect="none"
probit (\theta_n) = D_n \gamma + X_n \beta_j
if n_latent>0
andsite_effect="none"
probit (\theta_n) = D_n \gamma + X_n \beta_j + W_i \lambda_j
if n_latent=0
andsite_effect="fixed"
probit (\theta_n) = D_n \gamma + X_n \beta_j + \alpha_i
and\alpha_i \sim \mathcal{N}(0,V_\alpha)
if n_latent>0
andsite_effect="fixed"
probit (\theta_n) = D_n \gamma + X_n \beta_j + W_i \lambda_j + \alpha_i
if n_latent=0
andsite_effect="random"
probit (\theta_n) = D_n \gamma + X_n \beta_j + \alpha_i
if n_latent>0
andsite_effect="random"
probit (\theta_n) = D_n \gamma + X_n \beta_j + W_i \lambda_j + \alpha_i
and\alpha_i \sim \mathcal{N}(0,V_\alpha)
Author(s)
Ghislain Vieilledent <ghislain.vieilledent@cirad.fr>
Jeanne Clément <jeanne.clement16@laposte.net>
Frédéric Gosselin <frederic.gosselin@inrae.fr>
References
Chib, S. and Greenberg, E. (1998) Analysis of multivariate probit models. Biometrika, 85, 347-361.
Warton, D. I.; Blanchet, F. G.; O'Hara, R. B.; O'Hara, R. B.; Ovaskainen, O.; Taskinen, S.; Walker, S. C. and Hui, F. K. C. (2015) So Many Variables: Joint Modeling in Community Ecology. Trends in Ecology & Evolution, 30, 766-779.
Ovaskainen, O., Tikhonov, G., Norberg, A., Blanchet, F. G., Duan, L., Dunson, D., Roslin, T. and Abrego, N. (2017) How to make more out of community data? A conceptual framework and its implementation as models and software. Ecology Letters, 20, 561-576.
Distribution of Alpine plants in Aravo (Valloire, France)
Description
This dataset describe the distribution of 82 species of Alpine plants in 75 sites. Species traits and environmental variables are also measured.
Usage
data("aravo")
Format
aravo is a list containing the following objects :
spe
is a data.frame with the abundance values of 82 species (columns) in 75 sites (rows).
env
is a data.frame with the measurements of 6 environmental variables for the sites.
traits
is data.frame with the measurements of 8 traits for the species.
spe.names
is a vector with full species names.
Details
The environmental variables are :
Aspect | Relative south aspect (opposite of the sine of aspect with flat coded 0) |
Slope | Slope inclination (degrees) |
Form | Microtopographic landform index: 1 (convexity); 2 (convex slope); 3 (right slope); |
4 (concave slope); 5 (concavity) | |
Snow | Mean snowmelt date (Julian day) averaged over 1997-1999 |
PhysD | Physical disturbance, i.e., percentage of unvegetated soil due to physical processes |
ZoogD | Zoogenic disturbance, i.e., quantity of unvegetated soil due to marmot activity: no; some; high |
The species traits for the plants are:
Height | Vegetative height (cm) |
Spread | Maximum lateral spread of clonal plants (cm) |
Angle | Leaf elevation angle estimated at the middle of the lamina |
Area | Area of a single leaf |
Thick | Maximum thickness of a leaf cross section (avoiding the midrib) |
SLA | Specific leaf area |
Nmass | Mass-based leaf nitrogen content |
Seed | Seed mass |
Source
Choler, P. (2005) Consistent shifts in Alpine plant traits along a mesotopographical gradient. Arctic, Antarctic, and Alpine Research 37,444-453.
Dray S, Dufour A (2007). The ade4 Package: Implementing the Duality Diagram for Ecologists. Journal of Statistical Software, 22(4), 1-20. doi:10.18637/jss.v022.i04.
Examples
data(aravo, package="jSDM")
summary(aravo)
birds dataset
Description
The Swiss breeding bird survey ("Monitoring Häufige Brutvögel" MHB) has monitored the populations of 158 common species since 1999.
The MHB sample from data(MHB2014, package="AHMbook")
consists of 267 1-km squares that are laid out as a grid across Switzerland. Fieldwork is conducted by about 200 skilled birdwatchers, most of them volunteers. Avian populations are monitored using a simplified territory mapping protocol, where each square is surveyed up to three times during the breeding season (only twice above the tree line).
Surveys are conducted along a transect that does not change over the years. The birds
dataset has the data for 2014, except one quadrat not surveyed in 2014.
Usage
data("birds")
Format
A data frame with 266 observations on the following 166 variables.
158 bird species named in latin and whose occurrences are indicated as the number of visits to each site during which the species was observed, including 13 species not recorded in the year 2014 and 5 covariates collected on the 266 1x1 km quadrat as well as their identifiers and coordinates :
siteID | an alphanumeric site identifier |
coordx | a numeric vector indicating the x coordinate of the centre of the quadrat. |
The coordinate reference system is not specified intentionally. | |
coordy | a numeric vector indicating the y coordinate of the centre of the quadrat. |
elev | a numeric vector indicating the mean elevation of the quadrat (m). |
rlength | the length of the route walked in the quadrat (km). |
nsurvey | a numeric vector indicating the number of replicate surveys planned in the quadrat; |
above the tree-line 2, otherwise 3. | |
forest | a numeric vector indicating the percentage of forest cover in the quadrat. |
obs14 | a categorical vector indicating the identifying number of the observer. |
Details
Only the Latin names of bird species are given in this dataset but you can find the corresponding English names in the original dataset : data(MHB2014, package="AHMbook")
.
Source
Swiss Ornithological Institute
References
Kéry and Royle (2016) Applied Hierarachical Modeling in Ecology Section 11.3
Examples
data(birds, package="jSDM")
head(birds)
# find species not recorded in 2014
which(colSums(birds[,1:158])==0)
eucalypts dataset
Description
The Eucalyptus data set includes 12 taxa recorded in 458 plots spanning elevation gradients in the Grampians National Park, Victoria, which is known for high species diversity and endemism. The park has three mountain ranges interspersed with alluvial valleys and sand sheet and has a semi-Mediterranean climate with warm, dry summers and cool, wet winters.
This dataset records presence or absence at 458 sites of 12 eucalypts species, 7 covariates collected at these sites as well as their longitude and latitude.
Usage
data("eucalypts")
Format
A data frame with 458 observations on the following 21 variables.
12 eucalypts species which presence on sites is indicated by a 1 and absence by a 0 :
ALA
a binary vector indicating the occurrence of the species E. alaticaulis
ARE
a binary vector indicating the occurrence of the species E. arenacea
BAX
a binary vector indicating the occurrence of the species E. baxteri
CAM
a binary vector indicating the occurrence of the species E. camaldulensis
GON
a binary vector indicating the occurrence of the species E. goniocalyx
MEL
a binary vector indicating the occurrence of the species E. melliodora
OBL
a binary vector indicating the occurrence of the species E. oblique
OVA
a binary vector indicating the occurrence of the species E. ovata
WIL
a binary vector indicating the occurrence of the species E. willisii subsp. Falciformis
ALP
a binary vector indicating the occurrence of the species E. serraensis, E. verrucata and E. victoriana
VIM
a binary vector indicating the occurrence of the species E. viminalis subsp. Viminalis and Cygnetensis
ARO.SAB
a binary vector indicating the occurrence of the species E. aromaphloia and E. sabulosa
7 covariates collected on the 458 sites and their coordinates :
Rockiness
a numeric vector taking values from 0 to 95 corresponding to the rock cover of the site in percent estimated in 5 % increments in field plots
Sandiness
a binary vector indicating if soil texture categorie is sandiness based on soil texture classes from field plots and according to relative amounts of sand, silt, and clay particles
VallyBotFlat
a numeric vector taking values from 0 to 6 corresponding to the valley bottom flatness GIS-derived variable defining flat areas relative to surroundings likely to accumulate sediment (units correspond to the percentage of slope e.g. 0.5 = 16 %slope, 4.5 = 1 %slope, 5.5 = 0.5 %slope)
PPTann
a numeric vector taking values from 555 to 1348 corresponding to annual precipitation in millimeters measured as the sum of monthly precipitation estimated using BIOCLIM based on 20m grid cell Digital Elevation Model
Loaminess
a binary vector indicating if soil texture categorie is loaminess based on soil texture classes from field plots and according to relative amounts of sand, silt, and clay particles
cvTemp
a numeric vector taking values from 136 to 158 corresponding to coefficient of variation of temperature seasonality in percent measured as the standard deviation of weekly mean temperatures as a percentage of the annual mean temperature from BIOCLIM
T0
a numeric vector corresponding to solar radiation in
WH/m^2
measured as the amount of incident solar energy based on the visible sky and the sun's position. Derived from Digital Elevation Model in ArcGIS 9.2 Spatial Analyst for the summer solstice (December 22)latitude
a numeric vector indicating the latitude of the studied site
longitude
a numeric vector indicating the longitude of the studied site
Source
Wilkinson, D. P.; Golding, N.; Guillera-Arroita, G.; Tingley, R. and McCarthy, M. A. (2018) A comparison of joint species distribution models for presence-absence data. Methods in Ecology and Evolution.
Examples
data(eucalypts, package="jSDM")
head(eucalypts)
frogs dataset
Description
Presence or absence of 9 species of frogs at 104 sites, 3 covariates collected at these sites and their coordinates.
Format
frogs
is a data frame with 104 observations on the following 14 variables.
Species_
1 to 9 indicate by a 0 the absence of the species on one site and by a 1 its presence
Covariates_
1 and 3 continuous variables
Covariates_
2 discrete variables
x
a numeric vector of first coordinates corresponding to each site
y
a numeric vector of second coordinates corresponding to each site
Source
Wilkinson, D. P.; Golding, N.; Guillera-Arroita, G.; Tingley, R. and McCarthy, M. A. (2018) A comparison of joint species distribution models for presence-absence data. Methods in Ecology and Evolution.
Examples
data(frogs, package="jSDM")
head(frogs)
fungi dataset
Description
Presence or absence of 11 species of fungi on dead-wood objects at 800 sites and 12 covariates collected at these sites.
Usage
data("fungi")
Format
A data frame with 800 observations on the following 23 variables :
11 fungi species which presence on sites is indicated by a 1 and absence by a 0 :
antser
a binary vector
antsin
a binary vector
astfer
a binary vector
fompin
a binary vector
hetpar
a binary vector
junlut
a binary vector
phefer
a binary vector
phenig
a binary vector
phevit
a binary vector
poscae
a binary vector
triabi
a binary vector
12 covariates collected on the 800 sites :
diam
a numeric vector indicating the diameter of dead-wood object
dc1
a binary vector indicating if the decay class is 1 measured in the scale 1, 2, 3, 4, 5 (from freshly decayed to almost completely decayed)
dc2
a binary vector indicating if the decay class is 2
dc3
a binary vector indicating if the decay class is 3
dc4
a binary vector indicating if the decay class is 4
dc5
a binary vector indicating if the decay class is 5
quality3
a binary vector indicating if the quality is level 3
quality4
a binary vector indicating if the quality is level 4
ground3
a binary vector indicating if the ground contact is level 3 as 2 = no ground contact, 3 = less than half of the log in ground contact and 4 = more than half of the log in ground contact
ground4
a binary vector a binary vector indicating if the ground contact is level 4
epi
a numeric vector indicating the epiphyte cover
bark
a numeric vector indicating the bark cover
Source
Wilkinson, D. P.; Golding, N.; Guillera-Arroita, G.; Tingley, R. and McCarthy, M. A. (2018) A comparison of joint species distribution models for presence-absence data. Methods in Ecology and Evolution.
Examples
data(fungi, package="jSDM")
head(fungi)
Extract covariances and correlations due to shared environmental responses
Description
Calculates the correlation between columns of the response matrix, due to similarities in the response to explanatory variables i.e., shared environmental response.
Usage
get_enviro_cor(mod, type = "mean", prob = 0.95)
Arguments
mod |
An object of class |
type |
A choice of either the posterior median ( |
prob |
A numeric scalar in the interval |
Details
In both independent response and correlated response models, where each of the columns of the response matrix Y
are fitted to a set of explanatory variables given by X
,
the covariance between two columns j
and j'
, due to similarities in their response to the model matrix, is thus calculated based on the linear predictors X \beta_j
and X \beta_j'
, where \beta_j
are species effects relating to the explanatory variables.
Such correlation matrices are discussed and found in Ovaskainen et al., (2010), Pollock et al., (2014).
Value
results, a list including :
cor , cor.lower , cor.upper |
A set of |
cor.sig |
A |
cov |
Average over the MCMC samples of the |
Author(s)
Ghislain Vieilledent <ghislain.vieilledent@cirad.fr>
Jeanne Clément <jeanne.clement16@laposte.net>
References
Hui FKC (2016). “boral: Bayesian Ordination and Regression Analysis of Multivariate Abundance Data in R.” Methods in Ecology and Evolution, 7, 744–750.
Ovaskainen et al. (2010). Modeling species co-occurrence by multivariate logistic regression generates new hypotheses on fungal interactions. Ecology, 91, 2514-2521.
Pollock et al. (2014). Understanding co-occurrence by modelling species simultaneously with a Joint Species Distribution Model (JSDM). Methods in Ecology and Evolution, 5, 397-406.
See Also
cov2cor
get_residual_cor
jSDM-package
jSDM_binomial_probit
jSDM_binomial_logit
jSDM_poisson_log
Examples
library(jSDM)
# frogs data
data(frogs, package="jSDM")
# Arranging data
PA_frogs <- frogs[,4:12]
# Normalized continuous variables
Env_frogs <- cbind(scale(frogs[,1]),frogs[,2],
scale(frogs[,3]))
colnames(Env_frogs) <- colnames(frogs[,1:3])
Env_frogs <- as.data.frame(Env_frogs)
# Parameter inference
# Increase the number of iterations to reach MCMC convergence
mod <- jSDM_binomial_probit(# Response variable
presence_data=PA_frogs,
# Explanatory variables
site_formula = ~.,
site_data = Env_frogs,
n_latent=0,
site_effect="random",
# Chains
burnin=100,
mcmc=100,
thin=1,
# Starting values
alpha_start=0,
beta_start=0,
V_alpha=1,
# Priors
shape=0.5, rate=0.0005,
mu_beta=0, V_beta=10,
# Various
seed=1234, verbose=1)
# Calcul of residual correlation between species
enviro.cors <- get_enviro_cor(mod)
Calculate the residual correlation matrix from a latent variable model (LVM)
Description
This function use coefficients (\lambda_{jl}
with j=1,\dots,n_{species}
and l=1,\dots,n_{latent})
, corresponding to latent variables fitted using jSDM
package, to calculate the variance-covariance matrix which controls correlation between species.
Usage
get_residual_cor(mod, prob = 0.95, type = "mean")
Arguments
mod |
An object of class |
prob |
A numeric scalar in the interval |
type |
A choice of either the posterior median ( |
Details
After fitting the jSDM with latent variables, the fullspecies residual correlation matrix : R=(R_{ij})
with i=1,\ldots, n_{species}
and j=1,\ldots, n_{species}
can be derived from the covariance in the latent variables such as :
\Sigma_{ij}=\lambda_i' .\lambda_j
, in the case of a regression with probit, logit or poisson link function and
\Sigma_{ij} | = \lambda_i' .\lambda_j + V | if i=j |
= \lambda_i' .\lambda_j | else, |
, in the case of a linear regression with a response variable such as
y_{ij} \sim \mathcal{N}(\theta_{ij}, V)
. Then we compute correlations from covariances :
R_{ij} = \frac{\Sigma_{ij}}{\sqrt{\Sigma_ii\Sigma _jj}}
.
Value
results A list including :
cov.mean |
Average over the MCMC samples of the variance-covariance matrix, if |
cov.median |
Median over the MCMC samples of the variance-covariance matrix, if |
cov.lower |
A |
cov.upper |
A |
cov.sig |
A |
cor.mean |
Average over the MCMC samples of the residual correlation matrix, if |
cor.median |
Median over the MCMC samples of the residual correlation matrix, if |
cor.lower |
A |
cor.upper |
A |
cor.sig |
A |
Author(s)
Ghislain Vieilledent <ghislain.vieilledent@cirad.fr>
Jeanne Clément <jeanne.clement16@laposte.net>
References
Hui FKC (2016). boral: Bayesian Ordination and Regression Analysis of Multivariate Abundance Data in R. Methods in Ecology and Evolution, 7, 744–750.
Ovaskainen and al. (2016). Using latent variable models to identify large networks of species-to-species associations at different spatial scales. Methods in Ecology and Evolution, 7, 549-555.
Pollock and al. (2014). Understanding co-occurrence by modelling species simultaneously with a Joint Species Distribution Model (JSDM). Methods in Ecology and Evolution, 5, 397-406.
See Also
get_enviro_cor
cov2cor
jSDM-package
jSDM_binomial_probit
jSDM_binomial_logit
jSDM_poisson_log
Examples
library(jSDM)
# frogs data
data(frogs, package="jSDM")
# Arranging data
PA_frogs <- frogs[,4:12]
# Normalized continuous variables
Env_frogs <- cbind(scale(frogs[,1]),frogs[,2],scale(frogs[,3]))
colnames(Env_frogs) <- colnames(frogs[,1:3])
Env_frogs <- as.data.frame(Env_frogs)
# Parameter inference
# Increase the number of iterations to reach MCMC convergence
mod <- jSDM_binomial_probit(# Response variable
presence_data=PA_frogs,
# Explanatory variables
site_formula = ~.,
site_data = Env_frogs,
n_latent=2,
site_effect="random",
# Chains
burnin=100,
mcmc=100,
thin=1,
# Starting values
alpha_start=0,
beta_start=0,
lambda_start=0,
W_start=0,
V_alpha=1,
# Priors
shape=0.5, rate=0.0005,
mu_beta=0, V_beta=10,
mu_lambda=0, V_lambda=10,
# Various
seed=1234, verbose=1)
# Calcul of residual correlation between species
result <- get_residual_cor(mod, prob=0.95, type="mean")
# Residual variance-covariance matrix
result$cov.mean
## All non-significant co-variances are set to zero.
result$cov.mean * result$cov.sig
# Residual correlation matrix
result$cor.mean
## All non-significant correlations are set to zero.
result$cor.mean * result$cor.sig
Generalized inverse logit function
Description
Compute generalized inverse logit function.
Usage
inv_logit(x, min = 0, max = 1)
Arguments
x |
value(s) to be transformed |
min |
Lower end of logit interval |
max |
Upper end of logit interval |
Details
The generalized inverse logit function takes values on [-Inf,Inf] and transforms them to span [min, max] :
y = p' (max-min) + min
where
p =\frac{exp(x)}{(1+exp(x))}
Value
y Transformed value(s).
Author(s)
Gregory R. Warnes <greg@warnes.net>
Examples
x <- seq(0,10, by=0.25)
xt <- jSDM::logit(x, min=0, max=10)
cbind(x,xt)
y <- jSDM::inv_logit(xt, min=0, max=10)
cbind(x,xt,y)
Binomial logistic regression
Description
The jSDM_binomial_logit
function performs a Binomial logistic regression in a Bayesian framework. The function calls a Gibbs sampler written in 'C++' code which uses an adaptive Metropolis algorithm to estimate the conditional posterior distribution of model's parameters.
Usage
jSDM_binomial_logit(
burnin = 5000,
mcmc = 10000,
thin = 10,
presence_data,
site_formula,
trait_data = NULL,
trait_formula = NULL,
site_data,
trials = NULL,
n_latent = 0,
site_effect = "none",
beta_start = 0,
gamma_start = 0,
lambda_start = 0,
W_start = 0,
alpha_start = 0,
V_alpha = 1,
shape_Valpha = 0.5,
rate_Valpha = 5e-04,
mu_beta = 0,
V_beta = 10,
mu_gamma = 0,
V_gamma = 10,
mu_lambda = 0,
V_lambda = 10,
ropt = 0.44,
seed = 1234,
verbose = 1
)
Arguments
burnin |
The number of burnin iterations for the sampler. |
mcmc |
The number of Gibbs iterations for the sampler. Total number of Gibbs iterations is equal to |
thin |
The thinning interval used in the simulation. The number of mcmc iterations must be divisible by this value. |
presence_data |
A matrix |
site_formula |
A one-sided formula of the form '~x1+...+xp' specifying the explanatory variables for the suitability process of the model,
used to form the design matrix |
trait_data |
A data frame containing the species traits which can be included as part of the model. Default to |
trait_formula |
A one-sided formula of the form '~ t1 + ... + tk + x1:t1 + ... + xp:tk' specifying the interactions between the environmental variables and the species traits to be considered in the model,
used to form the trait design matrix |
site_data |
A data frame containing the model's explanatory variables by site. |
trials |
A vector indicating the number of trials for each site. |
n_latent |
An integer which specifies the number of latent variables to generate. Defaults to |
site_effect |
A string indicating whether row effects are included as fixed effects ( |
beta_start |
Starting values for |
gamma_start |
Starting values for |
lambda_start |
Starting values for |
W_start |
Starting values for latent variables must be either a scalar or a |
alpha_start |
Starting values for random site effect parameters must be either a scalar or a |
V_alpha |
Starting value for variance of random site effect if |
shape_Valpha |
Shape parameter of the Inverse-Gamma prior for the random site effect variance |
rate_Valpha |
Rate parameter of the Inverse-Gamma prior for the random site effect variance |
mu_beta |
Means of the Normal priors for the |
V_beta |
Variances of the Normal priors for the |
mu_gamma |
Means of the Normal priors for the |
V_gamma |
Variances of the Normal priors for the |
mu_lambda |
Means of the Normal priors for the |
V_lambda |
Variances of the Normal priors for the |
ropt |
Target acceptance rate for the adaptive Metropolis algorithm. Default to 0.44. |
seed |
The seed for the random number generator. Default to 1234. |
verbose |
A switch (0,1) which determines whether or not the progress of the sampler is printed to the screen. Default is 1: a progress bar is printed, indicating the step (in %) reached by the Gibbs sampler. |
Details
We model an ecological process where the presence or absence of species j
on site i
is explained by habitat suitability.
Ecological process :
y_{ij} \sim \mathcal{B}inomial(\theta_{ij},n_i)
where
if n_latent=0 and site_effect="none" | logit(\theta_{ij}) = X_i \beta_j |
if n_latent>0 and site_effect="none" | logit(\theta_{ij}) = X_i \beta_j + W_i \lambda_j |
if n_latent=0 and site_effect="fixed" | logit(\theta_{ij}) = X_i \beta_j + \alpha_i |
if n_latent>0 and site_effect="fixed" | logit(\theta_{ij}) = X_i \beta_j + W_i \lambda_j + \alpha_i |
if n_latent=0 and site_effect="random" | logit(\theta_{ij}) = X_i \beta_j + \alpha_i and \alpha_i \sim \mathcal{N}(0,V_\alpha) |
if n_latent>0 and site_effect="random" | logit(\theta_{ij}) = X_i \beta_j + W_i \lambda_j + \alpha_i and \alpha_i \sim \mathcal{N}(0,V_\alpha) |
In the absence of data on species traits (trait_data=NULL
), the effect of species j
: \beta_j
;
follows the same a priori Gaussian distribution such that \beta_j \sim \mathcal{N}_{np}(\mu_{\beta},V_{\beta})
,
for each species.
If species traits data are provided, the effect of species j
: \beta_j
;
follows an a priori Gaussian distribution such that \beta_j \sim \mathcal{N}_{np}(\mu_{\beta_j},V_{\beta})
,
where \mu_{\beta_jp} = \sum_{k=1}^{nt} t_{jk}.\gamma_{kp}
, takes different values for each species.
We assume that \gamma_{kp} \sim \mathcal{N}(\mu_{\gamma_{kp}},V_{\gamma_{kp}})
as prior distribution.
We define the matrix \gamma=(\gamma_{kp})_{k=1,...,nt}^{p=1,...,np}
such as :
x_0 | x_1 | ... | x_p | ... | x_{np} | ||
__________ | ________ | ________ | ________ | ________ | ________ | ||
t_0 | | \gamma_{0,0} | \gamma_{0,1} | ... | \gamma_{0,p} | ... | \gamma_{0,np} | { effect of |
| | intercept | environmental | |||||
| | variables | ||||||
t_1 | | \gamma_{1,0} | \gamma_{1,1} | ... | \gamma_{1,p} | ... | \gamma_{1,np} | |
... | | ... | ... | ... | ... | ... | ... | |
t_k | | \gamma_{k,0} | \gamma_{k,1} | ... | \gamma_{k,p} | ... | \gamma_{k,np} | |
... | | ... | ... | ... | ... | ... | ... | |
t_{nt} | | \gamma_{nt,0} | \gamma_{nt,1} | ... | \gamma_{nt,p} | ... | \gamma_{nt,np} | |
average | |||||||
trait effect | interaction | traits | environment | ||||
Value
An object of class "jSDM"
acting like a list including :
mcmc.alpha |
An mcmc object that contains the posterior samples for site effects |
mcmc.V_alpha |
An mcmc object that contains the posterior samples for variance of random site effect, not returned if |
mcmc.latent |
A list by latent variable of mcmc objects that contains the posterior samples for latent variables |
mcmc.sp |
A list by species of mcmc objects that contains the posterior samples for species effects |
mcmc.gamma |
A list by covariates of mcmc objects that contains the posterior samples for |
mcmc.Deviance |
The posterior sample of the deviance ( |
logit_theta_latent |
Predictive posterior mean of the probability to each species to be present on each site, transformed by logit link function. |
theta_latent |
Predictive posterior mean of the probability associated to the suitability process for each observation. |
model_spec |
Various attributes of the model fitted, including the response and model matrix used, distributional assumptions as link function, family and number of latent variables, hyperparameters used in the Bayesian estimation and mcmc, burnin and thin. |
The mcmc.
objects can be summarized by functions provided by the coda
package.
Author(s)
Ghislain Vieilledent <ghislain.vieilledent@cirad.fr>
Jeanne Clément <jeanne.clement16@laposte.net>
References
Gelfand, A. E.; Schmidt, A. M.; Wu, S.; Silander, J. A.; Latimer, A. and Rebelo, A. G. (2005) Modelling species diversity through species level hierarchical modelling. Applied Statistics, 54, 1-20.
Latimer, A. M.; Wu, S. S.; Gelfand, A. E. and Silander, J. A. (2006) Building statistical models to analyze species distributions. Ecological Applications, 16, 33-50.
Ovaskainen, O., Tikhonov, G., Norberg, A., Blanchet, F. G., Duan, L., Dunson, D., Roslin, T. and Abrego, N. (2017) How to make more out of community data? A conceptual framework and its implementation as models and software. Ecology Letters, 20, 561-576.
See Also
plot.mcmc
, summary.mcmc
jSDM_binomial_probit
jSDM_poisson_log
Examples
#==============================================
# jSDM_binomial_logit()
# Example with simulated data
#==============================================
#=================
#== Load libraries
library(jSDM)
#==================
#== Data simulation
#= Number of sites
nsite <- 50
#= Number of species
nsp <- 10
#= Set seed for repeatability
seed <- 1234
#= Number of visits associated to each site
set.seed(seed)
visits <- rpois(nsite,3)
visits[visits==0] <- 1
#= Ecological process (suitability)
x1 <- rnorm(nsite,0,1)
set.seed(2*seed)
x2 <- rnorm(nsite,0,1)
X <- cbind(rep(1,nsite),x1,x2)
np <- ncol(X)
set.seed(3*seed)
W <- cbind(rnorm(nsite,0,1),rnorm(nsite,0,1))
n_latent <- ncol(W)
l.zero <- 0
l.diag <- runif(2,0,2)
l.other <- runif(nsp*2-3,-2,2)
lambda.target <- matrix(c(l.diag[1],l.zero,l.other[1],
l.diag[2],l.other[-1]),
byrow=TRUE, nrow=nsp)
beta.target <- matrix(runif(nsp*np,-2,2), byrow=TRUE, nrow=nsp)
V_alpha.target <- 0.5
alpha.target <- rnorm(nsite,0,sqrt(V_alpha.target))
logit.theta <- X %*% t(beta.target) + W %*% t(lambda.target) + alpha.target
theta <- inv_logit(logit.theta)
set.seed(seed)
Y <- apply(theta, 2, rbinom, n=nsite, size=visits)
#= Site-occupancy model
# Increase number of iterations (burnin and mcmc) to get convergence
mod <- jSDM_binomial_logit(# Chains
burnin=150,
mcmc=150,
thin=1,
# Response variable
presence_data=Y,
trials=visits,
# Explanatory variables
site_formula=~x1+x2,
site_data=X,
n_latent=n_latent,
site_effect="random",
# Starting values
beta_start=0,
lambda_start=0,
W_start=0,
alpha_start=0,
V_alpha=1,
# Priors
shape_Valpha=0.5,
rate_Valpha=0.0005,
mu_beta=0,
V_beta=10,
mu_lambda=0,
V_lambda=10,
# Various
seed=1234,
ropt=0.44,
verbose=1)
#==========
#== Outputs
#= Parameter estimates
oldpar <- par(no.readonly = TRUE)
## beta_j
# summary(mod$mcmc.sp$sp_1[,1:ncol(X)])
mean_beta <- matrix(0,nsp,np)
pdf(file=file.path(tempdir(), "Posteriors_beta_jSDM_logit.pdf"))
par(mfrow=c(ncol(X),2))
for (j in 1:nsp) {
mean_beta[j,] <- apply(mod$mcmc.sp[[j]][,1:ncol(X)],
2, mean)
for (p in 1:ncol(X)) {
coda::traceplot(mod$mcmc.sp[[j]][,p])
coda::densplot(mod$mcmc.sp[[j]][,p],
main = paste(colnames(
mod$mcmc.sp[[j]])[p],
", species : ",j))
abline(v=beta.target[j,p],col='red')
}
}
dev.off()
## lambda_j
mean_lambda <- matrix(0,nsp,n_latent)
pdf(file=file.path(tempdir(), "Posteriors_lambda_jSDM_logit.pdf"))
par(mfrow=c(n_latent*2,2))
for (j in 1:nsp) {
mean_lambda[j,] <- apply(mod$mcmc.sp[[j]]
[,(ncol(X)+1):(ncol(X)+n_latent)], 2, mean)
for (l in 1:n_latent) {
coda::traceplot(mod$mcmc.sp[[j]][,ncol(X)+l])
coda::densplot(mod$mcmc.sp[[j]][,ncol(X)+l],
main=paste(colnames(mod$mcmc.sp[[j]])
[ncol(X)+l],", species : ",j))
abline(v=lambda.target[j,l],col='red')
}
}
dev.off()
# Species effects beta and factor loadings lambda
par(mfrow=c(1,2))
plot(beta.target, mean_beta,
main="species effect beta",
xlab ="obs", ylab ="fitted")
abline(a=0,b=1,col='red')
plot(lambda.target, mean_lambda,
main="factor loadings lambda",
xlab ="obs", ylab ="fitted")
abline(a=0,b=1,col='red')
## W latent variables
par(mfrow=c(1,2))
for (l in 1:n_latent) {
plot(W[,l],
summary(mod$mcmc.latent[[paste0("lv_",l)]])[[1]][,"Mean"],
main = paste0("Latent variable W_", l),
xlab ="obs", ylab ="fitted")
abline(a=0,b=1,col='red')
}
## alpha
par(mfrow=c(1,3))
plot(alpha.target, summary(mod$mcmc.alpha)[[1]][,"Mean"],
xlab ="obs", ylab ="fitted", main="site effect alpha")
abline(a=0,b=1,col='red')
## Valpha
coda::traceplot(mod$mcmc.V_alpha)
coda::densplot(mod$mcmc.V_alpha)
abline(v=V_alpha.target,col='red')
## Deviance
summary(mod$mcmc.Deviance)
plot(mod$mcmc.Deviance)
#= Predictions
par(mfrow=c(1,2))
plot(logit.theta, mod$logit_theta_latent,
main="logit(theta)",
xlab="obs", ylab="fitted")
abline(a=0 ,b=1, col="red")
plot(theta, mod$theta_latent,
main="Probabilities of occurence theta",
xlab="obs", ylab="fitted")
abline(a=0 ,b=1, col="red")
par(oldpar)
Binomial probit regression
Description
The jSDM_binomial_probit
function performs a Binomial probit regression in a Bayesian framework.
The function calls a Gibbs sampler written in 'C++' code which uses conjugate priors to estimate the conditional posterior distribution of model's parameters.
Usage
jSDM_binomial_probit(
burnin = 5000,
mcmc = 10000,
thin = 10,
presence_data,
site_formula,
trait_data = NULL,
trait_formula = NULL,
site_data,
n_latent = 0,
site_effect = "none",
lambda_start = 0,
W_start = 0,
beta_start = 0,
alpha_start = 0,
gamma_start = 0,
V_alpha = 1,
mu_beta = 0,
V_beta = 10,
mu_lambda = 0,
V_lambda = 10,
mu_gamma = 0,
V_gamma = 10,
shape_Valpha = 0.5,
rate_Valpha = 5e-04,
seed = 1234,
verbose = 1
)
Arguments
burnin |
The number of burnin iterations for the sampler. |
mcmc |
The number of Gibbs iterations for the sampler. Total number of Gibbs iterations is equal to |
thin |
The thinning interval used in the simulation. The number of mcmc iterations must be divisible by this value. |
presence_data |
A matrix |
site_formula |
A one-sided formula of the form '~x1+...+xp' specifying the explanatory variables for the suitability process of the model,
used to form the design matrix |
trait_data |
A data frame containing the species traits which can be included as part of the model. Default to |
trait_formula |
A one-sided formula of the form '~ t1 + ... + tk + x1:t1 + ... + xp:tk' specifying the interactions between the environmental variables and the species traits to be considered in the model,
used to form the trait design matrix |
site_data |
A data frame containing the model's explanatory variables by site. |
n_latent |
An integer which specifies the number of latent variables to generate. Defaults to |
site_effect |
A string indicating whether row effects are included as fixed effects ( |
lambda_start |
Starting values for |
W_start |
Starting values for latent variables must be either a scalar or a |
beta_start |
Starting values for |
alpha_start |
Starting values for random site effect parameters must be either a scalar or a |
gamma_start |
Starting values for |
V_alpha |
Starting value for variance of random site effect if |
mu_beta |
Means of the Normal priors for the |
V_beta |
Variances of the Normal priors for the |
mu_lambda |
Means of the Normal priors for the |
V_lambda |
Variances of the Normal priors for the |
mu_gamma |
Means of the Normal priors for the |
V_gamma |
Variances of the Normal priors for the |
shape_Valpha |
Shape parameter of the Inverse-Gamma prior for the random site effect variance |
rate_Valpha |
Rate parameter of the Inverse-Gamma prior for the random site effect variance |
seed |
The seed for the random number generator. Default to 1234. |
verbose |
A switch (0,1) which determines whether or not the progress of the sampler is printed to the screen. Default is 1: a progress bar is printed, indicating the step (in %) reached by the Gibbs sampler. |
Details
We model an ecological process where the presence or absence of species j
on site i
is explained by habitat suitability.
Ecological process:
y_{ij} \sim \mathcal{B}ernoulli(\theta_{ij})
where
if n_latent=0 and site_effect="none" | probit(\theta_{ij}) = X_i \beta_j |
if n_latent>0 and site_effect="none" | probit(\theta_{ij}) = X_i \beta_j + W_i \lambda_j |
if n_latent=0 and site_effect="random" | probit(\theta_{ij}) = X_i \beta_j + \alpha_i and \alpha_i \sim \mathcal{N}(0,V_\alpha) |
if n_latent>0 and site_effect="fixed" | probit(\theta_{ij}) = X_i \beta_j + W_i \lambda_j + \alpha_i |
if n_latent=0 and site_effect="fixed" | probit(\theta_{ij}) = X_i \beta_j + \alpha_i |
if n_latent>0 and site_effect="random" | probit(\theta_{ij}) = X_i \beta_j + W_i \lambda_j + \alpha_i and \alpha_i \sim \mathcal{N}(0,V_\alpha) |
In the absence of data on species traits (trait_data=NULL
), the effect of species j
: \beta_j
;
follows the same a priori Gaussian distribution such that \beta_j \sim \mathcal{N}_{np}(\mu_{\beta},V_{\beta})
,
for each species.
If species traits data are provided, the effect of species j
: \beta_j
;
follows an a priori Gaussian distribution such that \beta_j \sim \mathcal{N}_{np}(\mu_{\beta_j},V_{\beta})
,
where \mu_{\beta_jp} = \sum_{k=1}^{nt} t_{jk}.\gamma_{kp}
, takes different values for each species.
We assume that \gamma_{kp} \sim \mathcal{N}(\mu_{\gamma_{kp}},V_{\gamma_{kp}})
as prior distribution.
We define the matrix \gamma=(\gamma_{kp})_{k=1,...,nt}^{p=1,...,np}
such as :
x_0 | x_1 | ... | x_p | ... | x_{np} | ||
__________ | ________ | ________ | ________ | ________ | ________ | ||
t_0 | | \gamma_{0,0} | \gamma_{0,1} | ... | \gamma_{0,p} | ... | \gamma_{0,np} | { effect of |
| | intercept | environmental | |||||
| | variables | ||||||
t_1 | | \gamma_{1,0} | \gamma_{1,1} | ... | \gamma_{1,p} | ... | \gamma_{1,np} | |
... | | ... | ... | ... | ... | ... | ... | |
t_k | | \gamma_{k,0} | \gamma_{k,1} | ... | \gamma_{k,p} | ... | \gamma_{k,np} | |
... | | ... | ... | ... | ... | ... | ... | |
t_{nt} | | \gamma_{nt,0} | \gamma_{nt,1} | ... | \gamma_{nt,p} | ... | \gamma_{nt,np} | |
average | |||||||
trait effect | interaction | traits | environment | ||||
Value
An object of class "jSDM"
acting like a list including :
mcmc.alpha |
An mcmc object that contains the posterior samples for site effects |
mcmc.V_alpha |
An mcmc object that contains the posterior samples for variance of random site effect, not returned if |
mcmc.latent |
A list by latent variable of mcmc objects that contains the posterior samples for latent variables |
mcmc.sp |
A list by species of mcmc objects that contains the posterior samples for species effects |
mcmc.gamma |
A list by covariates of mcmc objects that contains the posterior samples for |
mcmc.Deviance |
The posterior sample of the deviance ( |
Z_latent |
Predictive posterior mean of the latent variable Z. |
probit_theta_latent |
Predictive posterior mean of the probability to each species to be present on each site, transformed by probit link function. |
theta_latent |
Predictive posterior mean of the probability to each species to be present on each site. |
model_spec |
Various attributes of the model fitted, including the response and model matrix used, distributional assumptions as link function, family and number of latent variables, hyperparameters used in the Bayesian estimation and mcmc, burnin and thin. |
The mcmc.
objects can be summarized by functions provided by the coda
package.
Author(s)
Ghislain Vieilledent <ghislain.vieilledent@cirad.fr>
Jeanne Clément <jeanne.clement16@laposte.net>
References
Chib, S. and Greenberg, E. (1998) Analysis of multivariate probit models. Biometrika, 85, 347-361.
Warton, D. I.; Blanchet, F. G.; O'Hara, R. B.; O'Hara, R. B.; Ovaskainen, O.; Taskinen, S.; Walker, S. C. and Hui, F. K. C. (2015) So Many Variables: Joint Modeling in Community Ecology. Trends in Ecology & Evolution, 30, 766-779.
Ovaskainen, O., Tikhonov, G., Norberg, A., Blanchet, F. G., Duan, L., Dunson, D., Roslin, T. and Abrego, N. (2017) How to make more out of community data? A conceptual framework and its implementation as models and software. Ecology Letters, 20, 561-576.
See Also
plot.mcmc
, summary.mcmc
jSDM_binomial_logit
jSDM_poisson_log
jSDM_binomial_probit_sp_constrained
Examples
#======================================
# jSDM_binomial_probit()
# Example with simulated data
#====================================
#=================
#== Load libraries
library(jSDM)
#==================
#' #== Data simulation
#= Number of sites
nsite <- 150
#= Set seed for repeatability
seed <- 1234
set.seed(seed)
#= Number of species
nsp<- 20
#= Number of latent variables
n_latent <- 2
#= Ecological process (suitability)
x1 <- rnorm(nsite,0,1)
x2 <- rnorm(nsite,0,1)
X <- cbind(rep(1,nsite),x1,x2)
np <- ncol(X)
#= Latent variables W
W <- matrix(rnorm(nsite*n_latent,0,1), nsite, n_latent)
#= Fixed species effect beta
beta.target <- t(matrix(runif(nsp*np,-2,2),
byrow=TRUE, nrow=nsp))
#= Factor loading lambda
lambda.target <- matrix(0, n_latent, nsp)
mat <- t(matrix(runif(nsp*n_latent, -2, 2), byrow=TRUE, nrow=nsp))
lambda.target[upper.tri(mat, diag=TRUE)] <- mat[upper.tri(mat, diag=TRUE)]
diag(lambda.target) <- runif(n_latent, 0, 2)
#= Variance of random site effect
V_alpha.target <- 0.5
#= Random site effect alpha
alpha.target <- rnorm(nsite,0 , sqrt(V_alpha.target))
# Simulation of response data with probit link
probit_theta <- X%*%beta.target + W%*%lambda.target + alpha.target
theta <- pnorm(probit_theta)
e <- matrix(rnorm(nsp*nsite,0,1),nsite,nsp)
# Latent variable Z
Z_true <- probit_theta + e
# Presence-absence matrix Y
Y <- matrix (NA, nsite,nsp)
for (i in 1:nsite){
for (j in 1:nsp){
if ( Z_true[i,j] > 0) {Y[i,j] <- 1}
else {Y[i,j] <- 0}
}
}
#==================================
#== Site-occupancy model
# Increase number of iterations (burnin and mcmc) to get convergence
mod<-jSDM_binomial_probit(# Iteration
burnin=200,
mcmc=200,
thin=1,
# Response variable
presence_data=Y,
# Explanatory variables
site_formula=~x1+x2,
site_data = X,
n_latent=2,
site_effect="random",
# Starting values
alpha_start=0,
beta_start=0,
lambda_start=0,
W_start=0,
V_alpha=1,
# Priors
shape_Valpha=0.5,
rate_Valpha=0.0005,
mu_beta=0, V_beta=1,
mu_lambda=0, V_lambda=1,
seed=1234, verbose=1)
# ===================================================
# Result analysis
# ===================================================
#==========
#== Outputs
oldpar <- par(no.readonly = TRUE)
#= Parameter estimates
## beta_j
mean_beta <- matrix(0,nsp,ncol(X))
pdf(file=file.path(tempdir(), "Posteriors_beta_jSDM_probit.pdf"))
par(mfrow=c(ncol(X),2))
for (j in 1:nsp) {
mean_beta[j,] <- apply(mod$mcmc.sp[[j]]
[,1:ncol(X)], 2, mean)
for (p in 1:ncol(X)){
coda::traceplot(mod$mcmc.sp[[j]][,p])
coda::densplot(mod$mcmc.sp[[j]][,p],
main = paste(colnames(mod$mcmc.sp[[j]])[p],", species : ",j))
abline(v=beta.target[p,j],col='red')
}
}
dev.off()
## lambda_j
mean_lambda <- matrix(0,nsp,n_latent)
pdf(file=file.path(tempdir(), "Posteriors_lambda_jSDM_probit.pdf"))
par(mfrow=c(n_latent*2,2))
for (j in 1:nsp) {
mean_lambda[j,] <- apply(mod$mcmc.sp[[j]]
[,(ncol(X)+1):(ncol(X)+n_latent)], 2, mean)
for (l in 1:n_latent) {
coda::traceplot(mod$mcmc.sp[[j]][,ncol(X)+l])
coda::densplot(mod$mcmc.sp[[j]][,ncol(X)+l],
main=paste(colnames(mod$mcmc.sp[[j]])
[ncol(X)+l],", species : ",j))
abline(v=lambda.target[l,j],col='red')
}
}
dev.off()
# Species effects beta and factor loadings lambda
par(mfrow=c(1,2))
plot(t(beta.target), mean_beta,
main="species effect beta",
xlab ="obs", ylab ="fitted")
abline(a=0,b=1,col='red')
plot(t(lambda.target), mean_lambda,
main="factor loadings lambda",
xlab ="obs", ylab ="fitted")
abline(a=0,b=1,col='red')
## W latent variables
par(mfrow=c(1,2))
for (l in 1:n_latent) {
plot(W[,l],
summary(mod$mcmc.latent[[paste0("lv_",l)]])[[1]][,"Mean"],
main = paste0("Latent variable W_", l),
xlab ="obs", ylab ="fitted")
abline(a=0,b=1,col='red')
}
## alpha
par(mfrow=c(1,3))
plot(alpha.target, summary(mod$mcmc.alpha)[[1]][,"Mean"],
xlab ="obs", ylab ="fitted", main="site effect alpha")
abline(a=0,b=1,col='red')
## Valpha
coda::traceplot(mod$mcmc.V_alpha)
coda::densplot(mod$mcmc.V_alpha)
abline(v=V_alpha.target,col='red')
## Deviance
summary(mod$mcmc.Deviance)
plot(mod$mcmc.Deviance)
#= Predictions
## Z
par(mfrow=c(1,2))
plot(Z_true,mod$Z_latent,
main="Z_latent", xlab="obs", ylab="fitted")
abline(a=0,b=1,col='red')
## probit_theta
plot(probit_theta,mod$probit_theta_latent,
main="probit(theta)",xlab="obs",ylab="fitted")
abline(a=0,b=1,col='red')
## probabilities theta
par(mfrow=c(1,1))
plot(theta,mod$theta_latent,
main="theta",xlab="obs",ylab="fitted")
abline(a=0,b=1,col='red')
par(oldpar)
Binomial probit regression on long format data
Description
The jSDM_binomial_probit_long_format
function performs a Binomial probit regression in a Bayesian framework.
The function calls a Gibbs sampler written in 'C++' code which uses conjugate priors to estimate the conditional posterior distribution of model's parameters.
Usage
jSDM_binomial_probit_long_format(
burnin = 5000,
mcmc = 10000,
thin = 10,
data,
site_formula,
n_latent = 0,
site_effect = "none",
alpha_start = 0,
gamma_start = 0,
beta_start = 0,
lambda_start = 0,
W_start = 0,
V_alpha = 1,
shape_Valpha = 0.5,
rate_Valpha = 5e-04,
mu_gamma = 0,
V_gamma = 10,
mu_beta = 0,
V_beta = 10,
mu_lambda = 0,
V_lambda = 10,
seed = 1234,
verbose = 1
)
Arguments
burnin |
The number of burnin iterations for the sampler. | ||||||||||||||
mcmc |
The number of Gibbs iterations for the sampler. Total number of Gibbs iterations is equal to | ||||||||||||||
thin |
The thinning interval used in the simulation. The number of mcmc iterations must be divisible by this value. | ||||||||||||||
data |
A
| ||||||||||||||
site_formula |
A one-sided formula, as the formulas used by the | ||||||||||||||
n_latent |
An integer which specifies the number of latent variables to generate. Defaults to | ||||||||||||||
site_effect |
A string indicating whether row effects are included as fixed effects ( | ||||||||||||||
alpha_start |
Starting values for random site effect parameters must be either a scalar or a | ||||||||||||||
gamma_start |
Starting values for gamma parameters of the suitability process must be either a scalar or a | ||||||||||||||
beta_start |
Starting values for beta parameters of the suitability process for each species must be either a scalar or a | ||||||||||||||
lambda_start |
Starting values for lambda parameters corresponding to the latent variables for each species must be either a scalar or a | ||||||||||||||
W_start |
Starting values for latent variables must be either a scalar or a | ||||||||||||||
V_alpha |
Starting value for variance of random site effect if | ||||||||||||||
shape_Valpha |
Shape parameter of the Inverse-Gamma prior for the random site effect variance | ||||||||||||||
rate_Valpha |
Rate parameter of the Inverse-Gamma prior for the random site effect variance | ||||||||||||||
mu_gamma |
Means of the Normal priors for the | ||||||||||||||
V_gamma |
Variances of the Normal priors for the | ||||||||||||||
mu_beta |
Means of the Normal priors for the | ||||||||||||||
V_beta |
Variances of the Normal priors for the | ||||||||||||||
mu_lambda |
Means of the Normal priors for the | ||||||||||||||
V_lambda |
Variances of the Normal priors for the | ||||||||||||||
seed |
The seed for the random number generator. Default to 1234. | ||||||||||||||
verbose |
A switch (0,1) which determines whether or not the progress of the sampler is printed to the screen. Default is 1: a progress bar is printed, indicating the step (in %) reached by the Gibbs sampler. |
Details
We model an ecological process where the presence or absence of species j
on site i
is explained by habitat suitability.
Ecological process:
y_n \sim \mathcal{B}ernoulli(\theta_n)
such as species_n=j
and site_n=i
,
where :
if n_latent=0 and site_effect="none" | probit(\theta_n) = D_n \gamma + X_n \beta_j |
if n_latent>0 and site_effect="none" | probit(\theta_n) = D_n \gamma+ X_n \beta_j + W_i \lambda_j |
if n_latent=0 and site_effect="fixed" | probit(\theta_n) = D_n \gamma + X_n \beta_j + \alpha_i and \alpha_i \sim \mathcal{N}(0,V_\alpha) |
if n_latent>0 and site_effect="fixed" | probit(\theta_n) = D_n \gamma + X_n \beta_j + W_i \lambda_j + \alpha_i |
if n_latent=0 and site_effect="random" | probit(\theta_n) = D_n \gamma + X_n \beta_j + \alpha_i |
if n_latent>0 and site_effect="random" | probit(\theta_n) = D_n \gamma + X_n \beta_j + W_i \lambda_j + \alpha_i and \alpha_i \sim \mathcal{N}(0,V_\alpha)
|
Value
An object of class "jSDM"
acting like a list including :
mcmc.alpha |
An mcmc object that contains the posterior samples for site effects |
mcmc.V_alpha |
An mcmc object that contains the posterior samples for variance of random site effect, not returned if |
mcmc.latent |
A list by latent variable of mcmc objects that contains the posterior samples for latent variables |
mcmc.sp |
A list by species of mcmc objects that contains the posterior samples for species effects |
mcmc.gamma |
An mcmc objects that contains the posterior samples for parameters |
mcmc.Deviance |
The posterior sample of the deviance |
Z_latent |
Predictive posterior mean of the latent variable Z. |
probit_theta_latent |
Predictive posterior mean of the probability to each species to be present on each site, transformed by probit link function. |
theta_latent |
Predictive posterior mean of the probability to each species to be present on each site. |
model_spec |
Various attributes of the model fitted, including the response and model matrix used, distributional assumptions as link function, family and number of latent variables, hyperparameters used in the Bayesian estimation and mcmc, burnin and thin. |
The mcmc.
objects can be summarized by functions provided by the coda
package.
Author(s)
Ghislain Vieilledent <ghislain.vieilledent@cirad.fr>
Jeanne Clément <jeanne.clement16@laposte.net>
References
Chib, S. and Greenberg, E. (1998) Analysis of multivariate probit models. Biometrika, 85, 347-361.
Warton, D. I.; Blanchet, F. G.; O'Hara, R. B.; O'Hara, R. B.; Ovaskainen, O.; Taskinen, S.; Walker, S. C. and Hui, F. K. C. (2015) So Many Variables: Joint Modeling in Community Ecology. Trends in Ecology & Evolution, 30, 766-779.
See Also
plot.mcmc
, summary.mcmc
jSDM_binomial_probit
jSDM_binomial_logit
jSDM_poisson_log
Examples
#==============================================
# jSDM_binomial_probit_long_format()
# Example with simulated data
#==============================================
#=================
#== Load libraries
library(jSDM)
#==================
#== Data simulation
#= Number of sites
nsite <- 50
#= Set seed for repeatability
seed <- 1234
set.seed(seed)
#' #= Number of species
nsp <- 25
#= Number of latent variables
n_latent <- 2
#'
# Ecological process (suitability)
## X
x1 <- rnorm(nsite,0,1)
x1.2 <- scale(x1^2)
X <- cbind(rep(1,nsite),x1,x1.2)
colnames(X) <- c("Int","x1","x1.2")
np <- ncol(X)
## W
W <- matrix(rnorm(nsite*n_latent,0,1),nrow=nsite,byrow=TRUE)
## D
SLA <- runif(nsp,-1,1)
D <- data.frame(x1.SLA= scale(c(x1 %*% t(SLA))))
nd <- ncol(D)
## parameters
beta.target <- t(matrix(runif(nsp*np,-2,2), byrow=TRUE, nrow=nsp))
mat <- t(matrix(runif(nsp*n_latent,-2,2), byrow=TRUE, nrow=nsp))
diag(mat) <- runif(n_latent,0,2)
lambda.target <- matrix(0,n_latent,nsp)
gamma.target <-runif(nd,-1,1)
lambda.target[upper.tri(mat,diag=TRUE)] <- mat[upper.tri(mat,
diag=TRUE)]
#= Variance of random site effect
V_alpha.target <- 0.5
#= Random site effect
alpha.target <- rnorm(nsite,0,sqrt(V_alpha.target))
## probit_theta
probit_theta <- c(X %*% beta.target) + c(W %*% lambda.target) +
as.matrix(D) %*% gamma.target + rep(alpha.target, nsp)
# Supplementary observation (each site have been visited twice)
# Environmental variables at the time of the second visit
x1_supObs <- rnorm(nsite,0,1)
x1.2_supObs <- scale(x1^2)
X_supObs <- cbind(rep(1,nsite),x1_supObs,x1.2_supObs)
D_supObs <- data.frame(x1.SLA=scale(c(x1_supObs %*% t(SLA))))
probit_theta_supObs <- c(X_supObs%*%beta.target) + c(W%*%lambda.target) +
as.matrix(D_supObs) %*% gamma.target + alpha.target
probit_theta <- c(probit_theta, probit_theta_supObs)
nobs <- length(probit_theta)
e <- rnorm(nobs,0,1)
Z_true <- probit_theta + e
Y<-rep(0,nobs)
for (n in 1:nobs){
if ( Z_true[n] > 0) {Y[n] <- 1}
}
Id_site <- rep(1:nsite,nsp)
Id_sp <- rep(1:nsp,each=nsite)
data <- data.frame(site=rep(Id_site,2), species=rep(Id_sp,2), Y=Y,
x1=c(rep(x1,nsp),rep(x1_supObs,nsp)),
x1.2=c(rep(x1.2,nsp),rep(x1.2_supObs,nsp)),
x1.SLA=c(D$x1.SLA,D_supObs$x1.SLA))
# missing observation
data <- data[-1,]
#==================================
#== Site-occupancy model
# Increase number of iterations (burnin and mcmc) to get convergence
mod<-jSDM_binomial_probit_long_format( # Iteration
burnin=500,
mcmc=500,
thin=1,
# Response variable
data=data,
# Explanatory variables
site_formula=~ (x1 + x1.2):species + x1.SLA,
n_latent=2,
site_effect="random",
# Starting values
alpha_start=0,
gamma_start=0,
beta_start=0,
lambda_start=0,
W_start=0,
V_alpha=1,
# Priors
shape_Valpha=0.5, rate_Valpha=0.0005,
mu_gamma=0, V_gamma=10,
mu_beta=0, V_beta=10,
mu_lambda=0, V_lambda=10,
seed=1234, verbose=1)
#= Parameter estimates
oldpar <- par(no.readonly = TRUE)
# gamma
par(mfrow=c(2,2))
for(d in 1:nd){
coda::traceplot(mod$mcmc.gamma[,d])
coda::densplot(mod$mcmc.gamma[,d],
main = colnames(mod$mcmc.gamma)[d])
abline(v=gamma.target[d],col='red')
}
## beta_j
mean_beta <- matrix(0,nsp,ncol(X))
pdf(file=file.path(tempdir(), "Posteriors_beta_jSDM_probit.pdf"))
par(mfrow=c(ncol(X),2))
for (j in 1:nsp) {
mean_beta[j,] <- apply(mod$mcmc.sp[[j]]
[,1:ncol(X)], 2, mean)
for (p in 1:ncol(X)){
coda::traceplot(mod$mcmc.sp[[j]][,p])
coda::densplot(mod$mcmc.sp[[j]][,p],
main = paste0(colnames(mod$mcmc.sp[[j]])[p],"_sp",j))
abline(v=beta.target[p,j],col='red')
}
}
dev.off()
## lambda_j
mean_lambda <- matrix(0,nsp,n_latent)
pdf(file=file.path(tempdir(), "Posteriors_lambda_jSDM_probit.pdf"))
par(mfrow=c(n_latent*2,2))
for (j in 1:nsp) {
mean_lambda[j,] <- apply(mod$mcmc.sp[[j]]
[,(ncol(X)+1):(ncol(X)+n_latent)], 2, mean)
for (l in 1:n_latent) {
coda::traceplot(mod$mcmc.sp[[j]][,ncol(X)+l])
coda::densplot(mod$mcmc.sp[[j]][,ncol(X)+l],
main=paste0(colnames(mod$mcmc.sp[[j]])[ncol(X)+l], "_sp",j))
abline(v=lambda.target[l,j],col='red')
}
}
dev.off()
# Species effects beta and factor loadings lambda
par(mfrow=c(1,2))
plot(t(beta.target), mean_beta,
main="species effect beta",
xlab ="obs", ylab ="fitted")
abline(a=0,b=1,col='red')
plot(t(lambda.target), mean_lambda,
main="factor loadings lambda",
xlab ="obs", ylab ="fitted")
abline(a=0,b=1,col='red')
## W latent variables
par(mfrow=c(1,2))
for (l in 1:n_latent) {
plot(W[,l],
summary(mod$mcmc.latent[[paste0("lv_",l)]])[[1]][,"Mean"],
main = paste0("Latent variable W_", l),
xlab ="obs", ylab ="fitted")
abline(a=0,b=1,col='red')
}
## alpha
par(mfrow=c(1,3))
plot(alpha.target, summary(mod$mcmc.alpha)[[1]][,"Mean"],
xlab ="obs", ylab ="fitted", main="site effect alpha")
abline(a=0,b=1,col='red')
## Valpha
coda::traceplot(mod$mcmc.V_alpha, main="Trace V_alpha")
coda::densplot(mod$mcmc.V_alpha,main="Density V_alpha")
abline(v=V_alpha.target,col='red')
## Deviance
summary(mod$mcmc.Deviance)
plot(mod$mcmc.Deviance)
#= Predictions
## probit_theta
par(mfrow=c(1,2))
plot(probit_theta[-1],mod$probit_theta_latent,
main="probit(theta)",xlab="obs",ylab="fitted")
abline(a=0,b=1,col='red')
## Z
plot(Z_true[-1],mod$Z_latent,
main="Z_latent", xlab="obs", ylab="fitted")
abline(a=0,b=1,col='red')
## theta
par(mfrow=c(1,1))
plot(pnorm(probit_theta[-1]),mod$theta_latent,
main="theta",xlab="obs",ylab="fitted")
abline(a=0,b=1,col='red')
par(oldpar)
Binomial probit regression with selected constrained species
Description
The jSDM_binomial_probit_sp_constrained
function performs in parallel Binomial probit regressions in a Bayesian framework. The function calls a Gibbs sampler written in 'C++' code which uses conjugate priors to estimate the conditional posterior distribution of model's parameters. Then the function evaluates the convergence of MCMC \lambda
chains using the Gelman-Rubin convergence diagnostic (\hat{R}
). \hat{R}
is computed using the gelman.diag
function. We identify the species (\hat{j}_l
) having the higher \hat{R}
for \lambda_{\hat{j}_l}
. These species drive the structure of the latent axis l
. The \lambda
corresponding to this species are constrained to be positive and placed on the diagonal of the \Lambda
matrix for fitting a second model. This usually improves the convergence of the latent variables and factor loadings. The function returns the parameter posterior distributions for this second model.
Arguments
burnin |
The number of burn-in iterations for the sampler. |
mcmc |
The number of Gibbs iterations for the sampler. Total number of Gibbs iterations is equal to |
thin |
The thinning interval used in the simulation. The number of MCMC iterations must be divisible by this value. |
nchains |
The number of Monte Carlo Markov Chains (MCMCs) simulated in parallel. If not specified, the number of chains is set to 2. |
ncores |
The number of cores to use for parallel execution. If not specified, the number of cores is set to 2. |
presence_data |
A matrix |
site_formula |
A one-sided formula of the form '~x1+...+xp' specifying the explanatory variables for the suitability process of the model,
used to form the design matrix |
site_data |
A data frame containing the model's explanatory variables by site. |
trait_data |
A data frame containing the species traits which can be included as part of the model. Default to |
trait_formula |
A one-sided formula of the form '~ t1 + ... + tk + x1:t1 + ... + xp:tk' specifying the interactions between the environmental variables and the species traits to be considered in the model,
used to form the trait design matrix |
n_latent |
An integer which specifies the number of latent variables to generate. Defaults to |
site_effect |
A string indicating whether row effects are included as fixed effects ( |
beta_start |
Starting values for |
gamma_start |
Starting values for |
lambda_start |
Starting values for |
W_start |
Starting values for latent variables must be either a scalar or a |
alpha_start |
Starting values for random site effect parameters must be either a scalar or a |
V_alpha |
Starting value for variance of random site effect if |
shape_Valpha |
Shape parameter of the Inverse-Gamma prior for the random site effect variance |
rate_Valpha |
Rate parameter of the Inverse-Gamma prior for the random site effect variance |
mu_beta |
Means of the Normal priors for the |
V_beta |
Variances of the Normal priors for the |
mu_gamma |
Means of the Normal priors for the |
V_gamma |
Variances of the Normal priors for the |
mu_lambda |
Means of the Normal priors for the |
V_lambda |
Variances of the Normal priors for the |
seed |
The seed for the random number generator. Default to |
verbose |
A switch (0,1) which determines whether or not the progress of the sampler is printed to the screen. Default is 1: a progress bar is printed, indicating the step (in %) reached by the Gibbs sampler. |
Details
We model an ecological process where the presence or absence of species j
on site i
is explained by habitat suitability.
Ecological process:
y_{ij} \sim \mathcal{B}ernoulli(\theta_{ij})
where
if n_latent=0 and site_effect="none" | probit(\theta_{ij}) = X_i \beta_j |
if n_latent>0 and site_effect="none" | probit(\theta_{ij}) = X_i \beta_j + W_i \lambda_j |
if n_latent=0 and site_effect="random" | probit(\theta_{ij}) = X_i \beta_j + \alpha_i and \alpha_i \sim \mathcal{N}(0,V_\alpha) |
if n_latent>0 and site_effect="fixed" | probit(\theta_{ij}) = X_i \beta_j + W_i \lambda_j + \alpha_i |
if n_latent=0 and site_effect="fixed" | probit(\theta_{ij}) = X_i \beta_j + \alpha_i |
if n_latent>0 and site_effect="random" | probit(\theta_{ij}) = X_i \beta_j + W_i \lambda_j + \alpha_i and \alpha_i \sim \mathcal{N}(0,V_\alpha) |
In the absence of data on species traits (trait_data=NULL
), the effect of species j
: \beta_j
;
follows the same a priori Gaussian distribution such that \beta_j \sim \mathcal{N}_{np}(\mu_{\beta},V_{\beta})
,
for each species.
If species traits data are provided, the effect of species j
: \beta_j
;
follows an a priori Gaussian distribution such that \beta_j \sim \mathcal{N}_{np}(\mu_{\beta_j},V_{\beta})
,
where \mu_{\beta_jp} = \sum_{k=1}^{nt} t_{jk}.\gamma_{kp}
, takes different values for each species.
We assume that \gamma_{kp} \sim \mathcal{N}(\mu_{\gamma_{kp}},V_{\gamma_{kp}})
as prior distribution.
We define the matrix \gamma=(\gamma_{kp})_{k=1,...,nt}^{p=1,...,np}
such as :
x_0 | x_1 | ... | x_p | ... | x_{np} | ||
__________ | ________ | ________ | ________ | ________ | ________ | ||
t_0 | | \gamma_{0,0} | \gamma_{0,1} | ... | \gamma_{0,p} | ... | \gamma_{0,np} | { effect of |
| | intercept | environmental | |||||
| | variables | ||||||
t_1 | | \gamma_{1,0} | \gamma_{1,1} | ... | \gamma_{1,p} | ... | \gamma_{1,np} | |
... | | ... | ... | ... | ... | ... | ... | |
t_k | | \gamma_{k,0} | \gamma_{k,1} | ... | \gamma_{k,p} | ... | \gamma_{k,np} | |
... | | ... | ... | ... | ... | ... | ... | |
t_{nt} | | \gamma_{nt,0} | \gamma_{nt,1} | ... | \gamma_{nt,p} | ... | \gamma_{nt,np} | |
average | |||||||
trait effect | interaction | traits | environment | ||||
Value
A list of length nchains
where each element is an object of class "jSDM"
acting like a list including :
mcmc.alpha |
An mcmc object that contains the posterior samples for site effects |
mcmc.V_alpha |
An mcmc object that contains the posterior samples for variance of random site effect, not returned if |
mcmc.latent |
A list by latent variable of mcmc objects that contains the posterior samples for latent variables |
mcmc.sp |
A list by species of mcmc objects that contains the posterior samples for species effects |
mcmc.gamma |
A list by covariates of mcmc objects that contains the posterior samples for |
mcmc.Deviance |
The posterior sample of the deviance ( |
Z_latent |
Predictive posterior mean of the latent variable Z. |
probit_theta_latent |
Predictive posterior mean of the probability to each species to be present on each site, transformed by probit link function. |
theta_latent |
Predictive posterior mean of the probability to each species to be present on each site. |
model_spec |
Various attributes of the model fitted, including the response and model matrix used, distributional assumptions as link function, family and number of latent variables, hyperparameters used in the Bayesian estimation and mcmc, burnin and thin. |
sp_constrained |
Indicates the reference species ( |
The mcmc.
objects can be summarized by functions provided by the coda
package.
Author(s)
Ghislain Vieilledent <ghislain.vieilledent@cirad.fr>
Jeanne Clément <jeanne.clement16@laposte.net>
References
Chib, S. and Greenberg, E. (1998) Analysis of multivariate probit models. Biometrika, 85, 347-361.
Warton, D. I.; Blanchet, F. G.; O'Hara, R. B.; O'Hara, R. B.; Ovaskainen, O.; Taskinen, S.; Walker, S. C. and Hui, F. K. C. (2015) So Many Variables: Joint Modeling in Community Ecology. Trends in Ecology & Evolution, 30, 766-779.
Ovaskainen, O., Tikhonov, G., Norberg, A., Blanchet, F. G., Duan, L., Dunson, D., Roslin, T. and Abrego, N. (2017) How to make more out of community data? A conceptual framework and its implementation as models and software. Ecology Letters, 20, 561-576.
See Also
plot.mcmc
, summary.mcmc
mcmc.list
mcmc
gelman.diag
jSDM_binomial_probit
Examples
#======================================
# jSDM_binomial_probit_sp_constrained()
# Example with simulated data
#====================================
#=================
#== Load libraries
library(jSDM)
#==================
#== Data simulation
#= Number of sites
nsite <- 30
#= Set seed for repeatability
seed <- 1234
set.seed(seed)
#= Number of species
nsp <- 10
#= Number of latent variables
n_latent <- 2
#= Ecological process (suitability)
x1 <- rnorm(nsite,0,1)
x2 <- rnorm(nsite,0,1)
X <- cbind(rep(1,nsite),x1,x2)
np <- ncol(X)
#= Latent variables W
W <- matrix(rnorm(nsite*n_latent,0,1), nsite, n_latent)
#= Fixed species effect beta
beta.target <- t(matrix(runif(nsp*np,-2,2),
byrow=TRUE, nrow=nsp))
#= Factor loading lambda
lambda.target <- matrix(0, n_latent, nsp)
mat <- t(matrix(runif(nsp*n_latent, -2, 2), byrow=TRUE, nrow=nsp))
lambda.target[upper.tri(mat, diag=TRUE)] <- mat[upper.tri(mat, diag=TRUE)]
diag(lambda.target) <- runif(n_latent, 0, 2)
#= Variance of random site effect
V_alpha.target <- 0.5
#= Random site effect alpha
alpha.target <- rnorm(nsite,0 , sqrt(V_alpha.target))
# Simulation of response data with probit link
probit_theta <- X%*%beta.target + W%*%lambda.target + alpha.target
theta <- pnorm(probit_theta)
e <- matrix(rnorm(nsp*nsite,0,1),nsite,nsp)
# Latent variable Z
Z_true <- probit_theta + e
# Presence-absence matrix Y
Y <- matrix (NA, nsite,nsp)
for (i in 1:nsite){
for (j in 1:nsp){
if ( Z_true[i,j] > 0) {Y[i,j] <- 1}
else {Y[i,j] <- 0}
}
}
#==================================
#== Site-occupancy model
# Increase number of iterations (burnin and mcmc) to get convergence
mod <- jSDM_binomial_probit_sp_constrained(# Iteration
burnin=100,
mcmc=100,
thin=1,
# parallel MCMCs
nchains=2, ncores=2,
# Response variable
presence_data=Y,
# Explanatory variables
site_formula=~x1+x2,
site_data = X,
n_latent=2,
site_effect="random",
# Starting values
alpha_start=0,
beta_start=0,
lambda_start=0,
W_start=0,
V_alpha=1,
# Priors
shape_Valpha=0.5,
rate_Valpha=0.0005,
mu_beta=0, V_beta=1,
mu_lambda=0, V_lambda=1,
seed=c(123,1234), verbose=1)
# ===================================================
# Result analysis
# ===================================================
#==========
#== Outputs
oldpar <- par(no.readonly = TRUE)
burnin <- mod[[1]]$model_spec$burnin
ngibbs <- burnin + mod[[1]]$model_spec$mcmc
thin <- mod[[1]]$model_spec$thin
require(coda)
arr2mcmc <- function(x) {
return(mcmc(as.data.frame(x),
start=burnin+1 , end=ngibbs, thin=thin))
}
mcmc_list_Deviance <- mcmc.list(lapply(lapply(mod,"[[","mcmc.Deviance"), arr2mcmc))
mcmc_list_alpha <- mcmc.list(lapply(lapply(mod,"[[","mcmc.alpha"), arr2mcmc))
mcmc_list_V_alpha <- mcmc.list(lapply(lapply(mod,"[[","mcmc.V_alpha"), arr2mcmc))
mcmc_list_param <- mcmc.list(lapply(lapply(mod,"[[","mcmc.sp"), arr2mcmc))
mcmc_list_lv <- mcmc.list(lapply(lapply(mod,"[[","mcmc.latent"), arr2mcmc))
mcmc_list_beta <- mcmc_list_param[,grep("beta",colnames(mcmc_list_param[[1]]))]
mcmc_list_beta0 <- mcmc_list_beta[,grep("Intercept", colnames(mcmc_list_beta[[1]]))]
mcmc_list_lambda <- mcmc.list(
lapply(mcmc_list_param[, grep("lambda", colnames(mcmc_list_param[[1]]))],
arr2mcmc))
# Compute Rhat
psrf_alpha <- mean(gelman.diag(mcmc_list_alpha, multivariate=FALSE)$psrf[,2])
psrf_V_alpha <- gelman.diag(mcmc_list_V_alpha)$psrf[,2]
psrf_beta0 <- mean(gelman.diag(mcmc_list_beta0)$psrf[,2])
psrf_beta <- mean(gelman.diag(mcmc_list_beta[,grep("Intercept",
colnames(mcmc_list_beta[[1]]),
invert=TRUE)])$psrf[,2])
psrf_lambda <- mean(gelman.diag(mcmc_list_lambda,
multivariate=FALSE)$psrf[,2],
na.rm=TRUE)
psrf_lv <- mean(gelman.diag(mcmc_list_lv, multivariate=FALSE)$psrf[,2])
Rhat <- data.frame(Rhat=c(psrf_alpha, psrf_V_alpha, psrf_beta0, psrf_beta,
psrf_lambda, psrf_lv),
Variable=c("alpha", "Valpha", "beta0", "beta",
"lambda", "W"))
# Barplot
library(ggplot2)
ggplot2::ggplot(Rhat, aes(x=Variable, y=Rhat)) +
ggtitle("Averages of Rhat obtained with jSDM for each type of parameter") +
theme(plot.title = element_text(hjust = 0.5, size=15)) +
geom_bar(fill="skyblue", stat = "identity") +
geom_text(aes(label=round(Rhat,2)), vjust=0, hjust=-0.1) +
geom_hline(yintercept=1, color='red') +
coord_flip()
#= Parameter estimates
nchains <- length(mod)
## beta_j
pdf(file=file.path(tempdir(), "Posteriors_species_effect_jSDM_probit.pdf"))
plot(mcmc_list_param)
dev.off()
## Latent variables
pdf(file=file.path(tempdir(), "Posteriors_latent_variables_jSDM_probit.pdf"))
plot(mcmc_list_lv)
dev.off()
## Random site effect and its variance
pdf(file=file.path(tempdir(), "Posteriors_site_effect_jSDM_probit.pdf"))
plot(mcmc_list_V_alpha)
plot(mcmc_list_alpha)
dev.off()
## Predictive posterior mean for each observation
# Species effects beta and factor loadings lambda
param <- list()
for (i in 1:nchains){
param[[i]] <- matrix(unlist(lapply(mod[[i]]$mcmc.sp,colMeans)),
nrow=nsp, byrow=TRUE)
}
par(mfrow=c(1,1))
for (i in 1:nchains){
if(i==1){
plot(t(beta.target), param[[i]][,1:np],
main="species effect beta",
xlab ="obs", ylab ="fitted")
abline(a=0,b=1, col='red')
}
else{
points(t(beta.target), param[[i]][,1:np], col=i)
}
}
par(mfrow=c(1,2))
for(l in 1:n_latent){
for (i in 1:nchains){
if (i==1){
plot(t(lambda.target)[,l],
param[[i]][,np+l],
main=paste0("factor loadings lambda_", l),
xlab ="obs", ylab ="fitted")
abline(a=0,b=1, col='red')
} else {
points(t(lambda.target)[,l],
param[[i]][,np+l],
col=i)
}
}
}
## W latent variables
mean_W <- list()
for (i in 1:nchains){
mean_W[[i]] <- sapply(mod[[i]]$mcmc.latent,colMeans)
}
par(mfrow=c(1,2))
for (l in 1:n_latent) {
for (i in 1:nchains){
if (i==1){
plot(W[,l], mean_W[[i]][,l],
main = paste0("Latent variable W_", l),
xlab ="obs", ylab ="fitted")
abline(a=0,b=1, col='red')
}
else{
points(W[,l], mean_W[[i]][,l], col=i)
}
}
}
#= W.lambda
par(mfrow=c(1,2))
for (i in 1:nchains){
if (i==1){
plot(W%*%lambda.target,
mean_W[[i]]%*%t(param[[i]][,(np+1):(np+n_latent)]),
main = "W.lambda",
xlab ="obs", ylab ="fitted")
abline(a=0,b=1, col='red')
}
else{
points(W%*%lambda.target,
mean_W[[i]]%*%t(param[[i]][,(np+1):(np+n_latent)]),
col=i)
}
}
# Site effect alpha et V_alpha
plot(alpha.target,colMeans(mod[[1]]$mcmc.alpha),
xlab="obs", ylab="fitted",
main="Random site effect alpha")
abline(a=0,b=1, col='red')
points(V_alpha.target, mean(mod[[1]]$mcmc.V_alpha),
pch=18, cex=2)
legend("bottomright", legend=c("V_alpha"), pch =18, pt.cex=1.5)
for (i in 2:nchains){
points(alpha.target, colMeans(mod[[i]]$mcmc.alpha), col=i)
points(V_alpha.target, mean(mod[[i]]$mcmc.V_alpha),
pch=18, col=i, cex=2)
}
#= Predictions
## Occurence probabilities
plot(pnorm(probit_theta), mod[[1]]$theta_latent,
main="theta",xlab="obs",ylab="fitted")
for (i in 2:nchains){
points(pnorm(probit_theta), mod[[i]]$theta_latent, col=i)
}
abline(a=0,b=1, col='red')
## probit(theta)
plot(probit_theta, mod[[1]]$probit_theta_latent,
main="probit(theta)",xlab="obs",ylab="fitted")
for (i in 2:nchains){
points(probit_theta, mod[[i]]$probit_theta_latent, col=i)
}
abline(a=0,b=1, col='red')
## Deviance
plot(mcmc_list_Deviance)
par(oldpar)
Binomial probit regression
Description
The jSDM_gaussian
function performs a linear regression in a Bayesian framework.
The function calls a Gibbs sampler written in 'C++' code which uses conjugate priors to estimate the conditional posterior distribution of model's parameters.
Usage
jSDM_gaussian(
burnin = 5000,
mcmc = 10000,
thin = 10,
response_data,
site_formula,
trait_data = NULL,
trait_formula = NULL,
site_data,
n_latent = 0,
site_effect = "none",
lambda_start = 0,
W_start = 0,
beta_start = 0,
alpha_start = 0,
gamma_start = 0,
V_alpha = 1,
V_start = 1,
mu_beta = 0,
V_beta = 10,
mu_lambda = 0,
V_lambda = 10,
mu_gamma = 0,
V_gamma = 10,
shape_Valpha = 0.5,
rate_Valpha = 5e-04,
shape_V = 0.5,
rate_V = 5e-04,
seed = 1234,
verbose = 1
)
Arguments
burnin |
The number of burnin iterations for the sampler. |
mcmc |
The number of Gibbs iterations for the sampler. Total number of Gibbs iterations is equal to |
thin |
The thinning interval used in the simulation. The number of mcmc iterations must be divisible by this value. |
response_data |
A matrix |
site_formula |
A one-sided formula of the form '~x1+...+xp' specifying the explanatory variables for the suitability process of the model,
used to form the design matrix |
trait_data |
A data frame containing the species traits which can be included as part of the model. Default to |
trait_formula |
A one-sided formula of the form '~ t1 + ... + tk + x1:t1 + ... + xp:tk' specifying the interactions between the environmental variables and the species traits to be considered in the model,
used to form the trait design matrix |
site_data |
A data frame containing the model's explanatory variables by site. |
n_latent |
An integer which specifies the number of latent variables to generate. Defaults to |
site_effect |
A string indicating whether row effects are included as fixed effects ( |
lambda_start |
Starting values for |
W_start |
Starting values for latent variables must be either a scalar or a |
beta_start |
Starting values for |
alpha_start |
Starting values for random site effect parameters must be either a scalar or a |
gamma_start |
Starting values for |
V_alpha |
Starting value for variance of random site effect if |
V_start |
Starting value for the variance of residuals or over dispersion term. Must be a strictly positive scalar. |
mu_beta |
Means of the Normal priors for the |
V_beta |
Variances of the Normal priors for the |
mu_lambda |
Means of the Normal priors for the |
V_lambda |
Variances of the Normal priors for the |
mu_gamma |
Means of the Normal priors for the |
V_gamma |
Variances of the Normal priors for the |
shape_Valpha |
Shape parameter of the Inverse-Gamma prior for the random site effect variance |
rate_Valpha |
Rate parameter of the Inverse-Gamma prior for the random site effect variance |
shape_V |
Shape parameter of the Inverse-Gamma prior for the variance of residuals |
rate_V |
Rate parameter of the Inverse-Gamma prior for the variance of residuals |
seed |
The seed for the random number generator. Default to 1234. |
verbose |
A switch (0,1) which determines whether or not the progress of the sampler is printed to the screen. Default is 1: a progress bar is printed, indicating the step (in %) reached by the Gibbs sampler. |
Details
We model an ecological process where the continuous data y_ij
about the species j
and the site i
is explained by habitat suitability.
Ecological process:
y_{ij} \sim \mathcal{N}(\theta_{ij}, V)
where
if n_latent=0 and site_effect="none" | \theta_{ij} = X_i \beta_j |
if n_latent>0 and site_effect="none" | \theta_{ij} = X_i \beta_j + W_i \lambda_j |
if n_latent=0 and site_effect="random" | \theta_{ij} = X_i \beta_j + \alpha_i and \alpha_i \sim \mathcal{N}(0,V_\alpha) |
if n_latent>0 and site_effect="fixed" | \theta_{ij} = X_i \beta_j + W_i \lambda_j + \alpha_i |
if n_latent=0 and site_effect="fixed" | \theta_{ij} = X_i \beta_j + \alpha_i |
if n_latent>0 and site_effect="random" | \theta_{ij} = X_i \beta_j + W_i \lambda_j + \alpha_i and \alpha_i \sim \mathcal{N}(0,V_\alpha) |
In the absence of data on species traits (trait_data=NULL
), the effect of species j
: \beta_j
;
follows the same a priori Gaussian distribution such that \beta_j \sim \mathcal{N}_{np}(\mu_{\beta},V_{\beta})
,
for each species.
If species traits data are provided, the effect of species j
: \beta_j
;
follows an a priori Gaussian distribution such that \beta_j \sim \mathcal{N}_{np}(\mu_{\beta_j},V_{\beta})
,
where \mu_{\beta_jp} = \sum_{k=1}^{nt} t_{jk}.\gamma_{kp}
, takes different values for each species.
We assume that \gamma_{kp} \sim \mathcal{N}(\mu_{\gamma_{kp}},V_{\gamma_{kp}})
as prior distribution.
We define the matrix \gamma=(\gamma_{kp})_{k=1,...,nt}^{p=1,...,np}
such as :
x_0 | x_1 | ... | x_p | ... | x_{np} | ||
__________ | ________ | ________ | ________ | ________ | ________ | ||
t_0 | | \gamma_{0,0} | \gamma_{0,1} | ... | \gamma_{0,p} | ... | \gamma_{0,np} | { effect of |
intercept | environmental | ||||||
variables | |||||||
t_1 | | \gamma_{1,0} | \gamma_{1,1} | ... | \gamma_{1,p} | ... | \gamma_{1,np} | |
... | | ... | ... | ... | ... | ... | ... | |
t_k | | \gamma_{k,0} | \gamma_{k,1} | ... | \gamma_{k,p} | ... | \gamma_{k,np} | |
... | | ... | ... | ... | ... | ... | ... | |
t_{nt} | | \gamma_{nt,0} | \gamma_{nt,1} | ... | \gamma_{nt,p} | ... | \gamma_{nt,np} | |
average | |||||||
trait effect | interaction | traits | environment | ||||
Value
An object of class "jSDM"
acting like a list including :
mcmc.alpha |
An mcmc object that contains the posterior samples for site effects |
mcmc.V_alpha |
An mcmc object that contains the posterior samples for variance of random site effect, not returned if |
mcmc.V |
An mcmc object that contains the posterior samples for variance of residuals. |
mcmc.latent |
A list by latent variable of mcmc objects that contains the posterior samples for latent variables |
mcmc.sp |
A list by species of mcmc objects that contains the posterior samples for species effects |
mcmc.gamma |
A list by covariates of mcmc objects that contains the posterior samples for |
mcmc.Deviance |
The posterior sample of the deviance ( |
Z_latent |
Predictive posterior mean of the latent variable Z. |
probit_theta_latent |
Predictive posterior mean of the probability to each species to be present on each site, transformed by probit link function. |
theta_latent |
Predictive posterior mean of the probability to each species to be present on each site. |
model_spec |
Various attributes of the model fitted, including the response and model matrix used, distributional assumptions as link function, family and number of latent variables, hyperparameters used in the Bayesian estimation and mcmc, burnin and thin. |
The mcmc.
objects can be summarized by functions provided by the coda
package.
Author(s)
Ghislain Vieilledent <ghislain.vieilledent@cirad.fr>
Jeanne Clément <jeanne.clement16@laposte.net>
References
Chib, S. and Greenberg, E. (1998) Analysis of multivariate probit models. Biometrika, 85, 347-361.
Warton, D. I.; Blanchet, F. G.; O'Hara, R. B.; O'Hara, R. B.; Ovaskainen, O.; Taskinen, S.; Walker, S. C. and Hui, F. K. C. (2015) So Many Variables: Joint Modeling in Community Ecology. Trends in Ecology & Evolution, 30, 766-779.
Ovaskainen, O., Tikhonov, G., Norberg, A., Blanchet, F. G., Duan, L., Dunson, D., Roslin, T. and Abrego, N. (2017) How to make more out of community data? A conceptual framework and its implementation as models and software. Ecology Letters, 20, 561-576.
See Also
plot.mcmc
, summary.mcmc
jSDM_binomial_logit
jSDM_poisson_log
jSDM_binomial_probit_sp_constrained
jSDM_binomial_probit
Examples
#======================================
# jSDM_gaussian()
# Example with simulated data
#====================================
#=================
#== Load libraries
library(jSDM)
#==================
#== Data simulation
#= Number of sites
nsite <- 100
#= Set seed for repeatability
seed <- 1234
set.seed(seed)
#= Number of species
nsp <- 20
#= Number of latent variables
n_latent <- 2
#= Ecological process (suitability)
x1 <- rnorm(nsite,0,1)
x2 <- rnorm(nsite,0,1)
X <- cbind(rep(1,nsite),x1,x2)
np <- ncol(X)
#= Latent variables W
W <- matrix(rnorm(nsite*n_latent,0,1), nsite, n_latent)
#= Fixed species effect beta
beta.target <- t(matrix(runif(nsp*np,-1,1),
byrow=TRUE, nrow=nsp))
#= Factor loading lambda
lambda.target <- matrix(0, n_latent, nsp)
mat <- t(matrix(runif(nsp*n_latent, -1, 1), byrow=TRUE, nrow=nsp))
lambda.target[upper.tri(mat, diag=TRUE)] <- mat[upper.tri(mat, diag=TRUE)]
diag(lambda.target) <- runif(n_latent, 0, 2)
#= Variance of random site effect
V_alpha.target <- 0.2
#= Random site effect alpha
alpha.target <- rnorm(nsite,0 , sqrt(V_alpha.target))
# Simulation of response data
theta.target <- X%*%beta.target + W%*%lambda.target + alpha.target
V.target <- 0.2
Y <- matrix(rnorm(nsite*nsp, theta.target, sqrt(V.target)), nrow=nsite)
#==================================
#== Site-occupancy model
# Increase number of iterations (burnin and mcmc) to get convergence
mod <- jSDM_gaussian(# Iteration
burnin=200,
mcmc=200,
thin=1,
# Response variable
response_data=Y,
# Explanatory variables
site_formula=~x1+x2,
site_data = X,
n_latent=2,
site_effect="random",
# Starting values
alpha_start=0,
beta_start=0,
lambda_start=0,
W_start=0,
V_alpha=1,
V_start=1 ,
# Priors
shape_Valpha=0.5, rate_Valpha=0.0005,
shape_V=0.5, rate_V=0.0005,
mu_beta=0, V_beta=1,
mu_lambda=0, V_lambda=1,
seed=1234, verbose=1)
# ===================================================
# Result analysis
# ===================================================
#==========
#== Outputs
#= Parameter estimates
oldpar <- par(no.readonly = TRUE)
## beta_j
mean_beta <- matrix(0,nsp,ncol(X))
pdf(file=file.path(tempdir(), "Posteriors_beta_jSDM_probit.pdf"))
par(mfrow=c(ncol(X),2))
for (j in 1:nsp) {
mean_beta[j,] <- apply(mod$mcmc.sp[[j]]
[,1:ncol(X)], 2, mean)
for (p in 1:ncol(X)){
coda::traceplot(mod$mcmc.sp[[j]][,p])
coda::densplot(mod$mcmc.sp[[j]][,p],
main = paste(colnames(mod$mcmc.sp[[j]])[p],", species : ",j))
abline(v=beta.target[p,j],col='red')
}
}
dev.off()
## lambda_j
mean_lambda <- matrix(0,nsp,n_latent)
pdf(file=file.path(tempdir(), "Posteriors_lambda_jSDM_probit.pdf"))
par(mfrow=c(n_latent*2,2))
for (j in 1:nsp) {
mean_lambda[j,] <- apply(mod$mcmc.sp[[j]]
[,(ncol(X)+1):(ncol(X)+n_latent)], 2, mean)
for (l in 1:n_latent) {
coda::traceplot(mod$mcmc.sp[[j]][,ncol(X)+l])
coda::densplot(mod$mcmc.sp[[j]][,ncol(X)+l],
main=paste(colnames(mod$mcmc.sp[[j]])
[ncol(X)+l],", species : ",j))
abline(v=lambda.target[l,j],col='red')
}
}
dev.off()
# Species effects beta and factor loadings lambda
par(mfrow=c(1,2))
plot(t(beta.target), mean_beta,
main="species effect beta",
xlab ="obs", ylab ="fitted")
abline(a=0,b=1,col='red')
plot(t(lambda.target), mean_lambda,
main="factor loadings lambda",
xlab ="obs", ylab ="fitted")
abline(a=0,b=1,col='red')
## W latent variables
par(mfrow=c(1,2))
for (l in 1:n_latent) {
plot(W[,l],
summary(mod$mcmc.latent[[paste0("lv_",l)]])[[1]][,"Mean"],
main = paste0("Latent variable W_", l),
xlab ="obs", ylab ="fitted")
abline(a=0,b=1,col='red')
}
## alpha
par(mfrow=c(1,3))
plot(alpha.target, summary(mod$mcmc.alpha)[[1]][,"Mean"],
xlab ="obs", ylab ="fitted", main="site effect alpha")
abline(a=0,b=1,col='red')
## Valpha
coda::traceplot(mod$mcmc.V_alpha)
coda::densplot(mod$mcmc.V_alpha)
abline(v=V_alpha.target,col='red')
## Variance of residuals
par(mfrow=c(1,2))
coda::traceplot(mod$mcmc.V)
coda::densplot(mod$mcmc.V,
main="Variance of residuals")
abline(v=V.target, col='red')
## Deviance
summary(mod$mcmc.Deviance)
plot(mod$mcmc.Deviance)
#= Predictions
par(mfrow=c(1,1))
plot(Y, mod$Y_pred,
main="Response variable",xlab="obs",ylab="fitted")
abline(a=0,b=1,col='red')
par(oldpar)
Poisson regression with log link function
Description
The jSDM_poisson_log
function performs a Poisson regression with log link function in a Bayesian framework.
The function calls a Gibbs sampler written in 'C++' code which uses an adaptive Metropolis algorithm to estimate the conditional posterior distribution of model's parameters.
Usage
jSDM_poisson_log(
burnin = 5000,
mcmc = 10000,
thin = 10,
count_data,
site_data,
site_formula,
trait_data = NULL,
trait_formula = NULL,
n_latent = 0,
site_effect = "none",
beta_start = 0,
gamma_start = 0,
lambda_start = 0,
W_start = 0,
alpha_start = 0,
V_alpha = 1,
shape_Valpha = 0.5,
rate_Valpha = 5e-04,
mu_beta = 0,
V_beta = 10,
mu_gamma = 0,
V_gamma = 10,
mu_lambda = 0,
V_lambda = 10,
ropt = 0.44,
seed = 1234,
verbose = 1
)
Arguments
burnin |
The number of burnin iterations for the sampler. |
mcmc |
The number of Gibbs iterations for the sampler. Total number of Gibbs iterations is equal to |
thin |
The thinning interval used in the simulation. The number of mcmc iterations must be divisible by this value. |
count_data |
A matrix |
site_data |
A data frame containing the model's explanatory variables by site. |
site_formula |
A one-sided formula of the form '~x1+...+xp' specifying the explanatory variables for the suitability process of the model, |
trait_data |
A data frame containing the species traits which can be included as part of the model. |
trait_formula |
A one-sided formula of the form '~ t1 + ... + tk + x1:t1 + ... + xp:tk' specifying the interactions between the environmental variables and the species traits to be considered in the model, |
n_latent |
An integer which specifies the number of latent variables to generate. Defaults to |
site_effect |
A string indicating whether row effects are included as fixed effects ( |
beta_start |
Starting values for |
gamma_start |
Starting values for |
lambda_start |
Starting values for |
W_start |
Starting values for latent variables must be either a scalar or a |
alpha_start |
Starting values for random site effect parameters must be either a scalar or a |
V_alpha |
Starting value for variance of random site effect if |
shape_Valpha |
Shape parameter of the Inverse-Gamma prior for the random site effect variance |
rate_Valpha |
Rate parameter of the Inverse-Gamma prior for the random site effect variance |
mu_beta |
Means of the Normal priors for the |
V_beta |
Variances of the Normal priors for the |
mu_gamma |
Means of the Normal priors for the |
V_gamma |
Variances of the Normal priors for the |
mu_lambda |
Means of the Normal priors for the |
V_lambda |
Variances of the Normal priors for the |
ropt |
Target acceptance rate for the adaptive Metropolis algorithm. Default to 0.44. |
seed |
The seed for the random number generator. Default to 1234. |
verbose |
A switch (0,1) which determines whether or not the progress of the sampler is printed to the screen. Default is 1: a progress bar is printed, indicating the step (in %) reached by the Gibbs sampler. |
Details
We model an ecological process where the presence or absence of species j
on site i
is explained by habitat suitability.
Ecological process :
y_{ij} \sim \mathcal{P}oisson(\theta_{ij})
where
if n_latent=0 and site_effect="none" | log(\theta_{ij}) = X_i \beta_j |
if n_latent>0 and site_effect="none" | log(\theta_{ij}) = X_i \beta_j + W_i \lambda_j |
if n_latent=0 and site_effect="fixed" | log(\theta_{ij}) = X_i \beta_j + \alpha_i |
if n_latent>0 and site_effect="fixed" | log(\theta_{ij}) = X_i \beta_j + W_i \lambda_j + \alpha_i |
if n_latent=0 and site_effect="random" | log(\theta_{ij}) = X_i \beta_j + \alpha_i and \alpha_i \sim \mathcal{N}(0,V_\alpha) |
if n_latent>0 and site_effect="random" | log(\theta_{ij}) = X_i \beta_j + W_i \lambda_j + \alpha_i and \alpha_i \sim \mathcal{N}(0,V_\alpha) |
In the absence of data on species traits (trait_data=NULL
), the effect of species j
: \beta_j
;
follows the same a priori Gaussian distribution such that \beta_j \sim \mathcal{N}_{np}(\mu_{\beta},V_{\beta})
,
for each species.
If species traits data are provided, the effect of species j
: \beta_j
;
follows an a priori Gaussian distribution such that \beta_j \sim \mathcal{N}_{np}(\mu_{\beta_j},V_{\beta})
,
where \mu_{\beta_jp} = \sum_{k=1}^{nt} t_{jk}.\gamma_{kp}
, takes different values for each species.
We assume that \gamma_{kp} \sim \mathcal{N}(\mu_{\gamma_{kp}},V_{\gamma_{kp}})
as prior distribution.
We define the matrix \gamma=(\gamma_{kp})_{k=1,...,nt}^{p=1,...,np}
such as :
x_0 | x_1 | ... | x_p | ... | x_{np} | ||
__________ | ________ | ________ | ________ | ________ | ________ | ||
t_0 | | \gamma_{0,0} | \gamma_{0,1} | ... | \gamma_{0,p} | ... | \gamma_{0,np} | { effect of |
| | intercept | environmental | |||||
| | variables | ||||||
t_1 | | \gamma_{1,0} | \gamma_{1,1} | ... | \gamma_{1,p} | ... | \gamma_{1,np} | |
... | | ... | ... | ... | ... | ... | ... | |
t_k | | \gamma_{k,0} | \gamma_{k,1} | ... | \gamma_{k,p} | ... | \gamma_{k,np} | |
... | | ... | ... | ... | ... | ... | ... | |
t_{nt} | | \gamma_{nt,0} | \gamma_{nt,1} | ... | \gamma_{nt,p} | ... | \gamma_{nt,np} | |
average | |||||||
trait effect | interaction | traits | environment | ||||
Value
An object of class "jSDM"
acting like a list including :
mcmc.alpha |
An mcmc object that contains the posterior samples for site effects |
mcmc.V_alpha |
An mcmc object that contains the posterior samples for variance of random site effect, not returned if |
mcmc.latent |
A list by latent variable of mcmc objects that contains the posterior samples for latent variables |
mcmc.sp |
A list by species of mcmc objects that contains the posterior samples for species effects |
mcmc.gamma |
A list by covariates of mcmc objects that contains the posterior samples for |
mcmc.Deviance |
The posterior sample of the deviance ( |
log_theta_latent |
Predictive posterior mean of the probability to each species to be present on each site, transformed by log link function. |
theta_latent |
Predictive posterior mean of the probability to each species to be present on each site. |
model_spec |
Various attributes of the model fitted, including the response and model matrix used, distributional assumptions as link function, family and number of latent variables, hyperparameters used in the Bayesian estimation and mcmc, burnin and thin. |
The mcmc.
objects can be summarized by functions provided by the coda
package.
Author(s)
Ghislain Vieilledent <ghislain.vieilledent@cirad.fr>
Jeanne Clément <jeanne.clement16@laposte.net>
References
Gelfand, A. E.; Schmidt, A. M.; Wu, S.; Silander, J. A.; Latimer, A. and Rebelo, A. G. (2005) Modelling species diversity through species level hierarchical modelling. Applied Statistics, 54, 1-20.
Latimer, A. M.; Wu, S. S.; Gelfand, A. E. and Silander, J. A. (2006) Building statistical models to analyze species distributions. Ecological Applications, 16, 33-50.
Ovaskainen, O., Tikhonov, G., Norberg, A., Blanchet, F. G., Duan, L., Dunson, D., Roslin, T. and Abrego, N. (2017) How to make more out of community data? A conceptual framework and its implementation as models and software. Ecology Letters, 20, 561-576.
See Also
plot.mcmc
, summary.mcmc
jSDM_binomial_probit
jSDM_binomial_logit
Examples
#==============================================
# jSDM_poisson_log()
# Example with simulated data
#==============================================
#=================
#== Load libraries
library(jSDM)
#==================
#== Data simulation
#= Number of sites
nsite <- 50
#= Number of species
nsp <- 10
#= Set seed for repeatability
seed <- 1234
#= Ecological process (suitability)
set.seed(seed)
x1 <- rnorm(nsite,0,1)
set.seed(2*seed)
x2 <- rnorm(nsite,0,1)
X <- cbind(rep(1,nsite),x1,x2)
np <- ncol(X)
set.seed(3*seed)
W <- cbind(rnorm(nsite,0,1),rnorm(nsite,0,1))
n_latent <- ncol(W)
l.zero <- 0
l.diag <- runif(2,0,1)
l.other <- runif(nsp*2-3,-1,1)
lambda.target <- matrix(c(l.diag[1],l.zero,l.other[1],
l.diag[2],l.other[-1]),
byrow=TRUE, nrow=nsp)
beta.target <- matrix(runif(nsp*np,-1,1), byrow=TRUE, nrow=nsp)
V_alpha.target <- 0.5
alpha.target <- rnorm(nsite,0,sqrt(V_alpha.target))
log.theta <- X %*% t(beta.target) + W %*% t(lambda.target) + alpha.target
theta <- exp(log.theta)
Y <- apply(theta, 2, rpois, n=nsite)
#= Site-occupancy model
# Increase number of iterations (burnin and mcmc) to get convergence
mod <- jSDM_poisson_log(# Chains
burnin=200,
mcmc=200,
thin=1,
# Response variable
count_data=Y,
# Explanatory variables
site_formula=~x1+x2,
site_data=X,
n_latent=n_latent,
site_effect="random",
# Starting values
beta_start=0,
lambda_start=0,
W_start=0,
alpha_start=0,
V_alpha=1,
# Priors
shape_Valpha=0.5,
rate_Valpha=0.0005,
mu_beta=0,
V_beta=10,
mu_lambda=0,
V_lambda=10,
# Various
seed=1234,
ropt=0.44,
verbose=1)
#==========
#== Outputs
oldpar <- par(no.readonly = TRUE)
#= Parameter estimates
## beta_j
mean_beta <- matrix(0,nsp,np)
pdf(file=file.path(tempdir(), "Posteriors_beta_jSDM_log.pdf"))
par(mfrow=c(ncol(X),2))
for (j in 1:nsp) {
mean_beta[j,] <- apply(mod$mcmc.sp[[j]][,1:ncol(X)],
2, mean)
for (p in 1:ncol(X)) {
coda::traceplot(mod$mcmc.sp[[j]][,p])
coda::densplot(mod$mcmc.sp[[j]][,p],
main = paste(colnames(
mod$mcmc.sp[[j]])[p],
", species : ",j))
abline(v=beta.target[j,p],col='red')
}
}
dev.off()
## lambda_j
mean_lambda <- matrix(0,nsp,n_latent)
pdf(file=file.path(tempdir(), "Posteriors_lambda_jSDM_log.pdf"))
par(mfrow=c(n_latent*2,2))
for (j in 1:nsp) {
mean_lambda[j,] <- apply(mod$mcmc.sp[[j]]
[,(ncol(X)+1):(ncol(X)+n_latent)], 2, mean)
for (l in 1:n_latent) {
coda::traceplot(mod$mcmc.sp[[j]][,ncol(X)+l])
coda::densplot(mod$mcmc.sp[[j]][,ncol(X)+l],
main=paste(colnames(mod$mcmc.sp[[j]])
[ncol(X)+l],", species : ",j))
abline(v=lambda.target[j,l],col='red')
}
}
dev.off()
# Species effects beta and factor loadings lambda
par(mfrow=c(1,2))
plot(beta.target, mean_beta,
main="species effect beta",
xlab ="obs", ylab ="fitted")
abline(a=0,b=1,col='red')
plot(lambda.target, mean_lambda,
main="factor loadings lambda",
xlab ="obs", ylab ="fitted")
abline(a=0,b=1,col='red')
## W latent variables
par(mfrow=c(1,2))
for (l in 1:n_latent) {
plot(W[,l],
summary(mod$mcmc.latent[[paste0("lv_",l)]])[[1]][,"Mean"],
main = paste0("Latent variable W_", l),
xlab ="obs", ylab ="fitted")
abline(a=0,b=1,col='red')
}
## alpha
par(mfrow=c(1,3))
plot(alpha.target, summary(mod$mcmc.alpha)[[1]][,"Mean"],
xlab ="obs", ylab ="fitted", main="site effect alpha")
abline(a=0,b=1,col='red')
## Valpha
coda::traceplot(mod$mcmc.V_alpha)
coda::densplot(mod$mcmc.V_alpha)
abline(v=V_alpha.target,col='red')
## Deviance
summary(mod$mcmc.Deviance)
plot(mod$mcmc.Deviance)
#= Predictions
par(mfrow=c(1,2))
plot(log.theta, mod$log_theta_latent,
main="log(theta)",
xlab="obs", ylab="fitted")
abline(a=0 ,b=1, col="red")
plot(theta, mod$theta_latent,
main="Expected abundance theta",
xlab="obs", ylab="fitted")
abline(a=0 ,b=1, col="red")
par(oldpar)
Generalized logit function
Description
Compute generalized logit function.
Usage
logit(x, min = 0, max = 1)
Arguments
x |
value(s) to be transformed |
min |
Lower end of logit interval |
max |
Upper end of logit interval |
Details
The generalized logit function takes values on [min, max]
and transforms them to span [ -\infty, +\infty ]
it is defined as:
y = log(\frac{p}{(1-p)})
where
p=\frac{(x-min)}{(max-min)}
Value
y Transformed value(s).
Author(s)
Gregory R. Warnes <greg@warnes.net>
Examples
x <- seq(0,10, by=0.25)
xt <- jSDM::logit(x, min=0, max=10)
cbind(x,xt)
y <- jSDM::inv_logit(xt, min=0, max=10)
cbind(x,xt,y)
Madagascar's forest inventory
Description
Dataset compiled from the national forest inventories carried out on 753 sites on the island of Madagascar, listing the presence or absence of 555 plant species on each of these sites between 1994 and 1996. We use these forest inventories to calculate a matrix indicating the presence by a 1 and the absence by a 0 of the species at each site by removing observations for which the species is not identified. This presence-absence matrix therefore records the occurrences of 483 species at 751 sites.
Format
madagascar
is a data frame with 751 rows corresponding to the inventory sites and 483 columns corresponding to the species whose presence or absence has been recorded on the sites.
sp_
1 to 483 indicate by a 0 the absence of the species on one site and by a 1 its presence
site
"1" to "753" inventory sites identifiers.
Examples
data(madagascar, package="jSDM")
head(madagascar)
mites dataset
Description
This example data set is composed of 70 cores of mostly Sphagnum mosses collected on the territory of the Station de biologie des Laurentides of University of Montreal, Quebec, Canada in June 1989.
The whole sampling area was 2.5 m x 10 m in size and thirty-five taxa were recognized as species, though many were not given a species name, owing to the incomplete stage of systematic knowledge of the North American Oribatid fauna.
The data set comprises the abundances of 35 morphospecies, 5 substrate and micritopographic variables, and the x-y Cartesian coordinates of the 70 sampling sites.
See Borcard et al. (1992, 1994) for details.
Usage
data("mites")
Format
A data frame with 70 observations on the following 42 variables.
Abundance of 35 Oribatid mites morphospecies named :
Brachy
a vector of integers
PHTH
a vector of integers
HPAV
a vector of integers
RARD
a vector of integers
SSTR
a vector of integers
Protopl
a vector of integers
MEGR
a vector of integers
MPRO
a vector of integers
TVIE
a vector of integers
HMIN
a vector of integers
HMIN2
a vector of integers
NPRA
a vector of integers
TVEL
a vector of integers
ONOV
a vector of integers
SUCT
a vector of integers
LCIL
a vector of integers
Oribatul1
a vector of integers
Ceratoz1
a vector of integers
PWIL
a vector of integers
Galumna1
a vector of integers
Steganacarus2
a vector of integers
HRUF
a vector of integers
Trhypochth1
a vector of integers
PPEL
a vector of integers
NCOR
a vector of integers
SLAT
a vector of integers
FSET
a vector of integers
Lepidozetes
a vector of integers
Eupelops
a vector of integers
Minigalumna
a vector of integers
LRUG
a vector of integers
PLAG2
a vector of integers
Ceratoz3
a vector of integers
Oppia.minus
a vector of integers
Trimalaco2
a vector of integers
5 covariates collected on the 70 sites and their coordinates :
substrate
a categorical vector indicating substrate type using a 7-level unordered factor :
sph1
,sph2
,sph3
,sph4
,litter
,peat
andinter
for interface.shrubs
a categorical vector indicating shrub density using a 3-level ordered factor :
None
,Few
andMany
topo
a categorical vector indicating microtopography using a 2-level factor:
blanket
orhummock
density
a numeric vector indicating the substrate density (g/L)
water
a numeric vector indicating the water content of the substrate (g/L)
x
a numeric vector indicating first coordinates of sampling sites
y
a numeric vector indicating second coordinates of sampling sites
Details
Oribatid mites (Acari: Oribatida) are a very diversified group of small (0.2-1.2 mm) soil-dwelling, mostly microphytophagous and detritivorous arthropods. A well aerated soil or a complex substrate like Sphagnum mosses present in bogs and wet forests can harbour up to several hundred thousand individuals per square metre.
Local assemblages are sometimes composed of over a hundred species, including many rare ones. This diversity makes oribatid mites an interesting target group to study community-environment relationships at very local scales.
Source
Pierre Legendre
References
Borcard, D.; Legendre, P. and Drapeau, P. (1992) Partialling out the spatial component of ecological variation. Ecology 73: 1045-1055.
Borcard, D. and Legendre, P. (1994) Environmental control and spatial structure in ecological communities: an example using Oribatid mites (Acari, Oribatei). Environmental and Ecological Statistics 1: 37-61.
Borcard, D. and Legendre, P. (2002) All-scale spatial analysis of ecological data by means of principal coordinates of neighbour matrices. Ecological Modelling 153: 51-68.
Examples
data(mites, package="jSDM")
head(mites)
mosquitos dataset
Description
Presence or absence at 167 sites of 16 species that constitute the aquatic faunal community studied, 13 covariates collected at these sites and their coordinates.
Usage
data("mosquitos")
Format
A data frame with 167 observations on the following 31 variables :
16 aquatic species including larvae of four mosquito species (all potential vectors of human disease), which presence on sites is indicated by a 1 and absence by a 0 :
Culex_pipiens_sl
a binary vector (mosquito species)
Culex_modestus
a binary vector (mosquito species)
Culiseta_annulata
a binary vector (mosquito species)
Anopheles_maculipennis_sl
a binary vector (mosquito species)
waterboatmen__Corixidae
a binary vector
diving_beetles__Dysticidae
a binary vector
damselflies__Zygoptera
a binary vector
swimming_beetles__Haliplidae
a binary vector
opossum_shrimps__Mysidae
a binary vector
ditch_shrimp__Gammarus
a binary vector
beetle_larvae__Coleoptera
a binary vector
dragonflies__Anisoptera
a binary vector
mayflies__Ephemeroptera
a binary vector
newts__Pleurodelinae
a binary vector
fish
a binary vector
saucer_bugs__Ilyocoris
a binary vector
13 covariates collected on the 167 sites and their coordinates :
depth__cm
a numeric vector corresponding to the water depth in cm recorded as the mean of the depth at the edge and the centre of each dip site
temperature__C
a numeric vector corresponding to the temperature in °C
oxidation_reduction_potential__Mv
a numeric vector corresponding to the redox potential of the water in millivolts (mV)
salinity__ppt
a numeric vector corresponding to the salinity of the water in parts per thousand (ppt)
High-resolution digital photographs were taken of vegetation at the edge and centre dip points and the presence or absence of different vegetation types at each dipsite was determined from these photographs using field guides :
water_crowfoot__Ranunculus
a binary vector indicating presence on sites by a 1 and absence by a 0 of the plant species Ranunculus aquatilis which common name is water-crowfoot
rushes__Juncus_or_Scirpus
a binary vector indicating presence on sites by a 1 and absence by a 0 of rushes from the Juncus or Scirpus genus
filamentous_algae
a binary vector indicating presence on sites by a 1 and absence by a 0 of filamentous algae
emergent_grass
a binary vector indicating presence on sites by a 1 and absence by a 0 of emergent grass
ivy_leafed_duckweed__Lemna_trisulca
a binary vector indicating presence on sites by a 1 and absence by a 0 of ivy leafed duckweed of species Lemna trisulca
bulrushes__Typha
a binary vector indicating presence on sites by a 1 and absence by a 0 of bulrushes from the Typha genus
reeds_Phragmites
a binary vector indicating presence on sites by a 1 and absence by a 0 of reeds from the Phragmites genus
marestail__Hippuris
a binary vector indicating presence on sites by a 1 and absence by a 0 of plants from the Hippuris genus known as mare's-tail
common_duckweed__Lemna_minor
a binary vector indicating presence on sites by a 1 and absence by a 0 of common duckweed of species Lemna minor
x
a numeric vector of first coordinates corresponding to each site
y
a numeric vector of second coordinates corresponding to each site
Source
Wilkinson, D. P.; Golding, N.; Guillera-Arroita, G.; Tingley, R. and McCarthy, M. A. (2018) A comparison of joint species distribution models for presence-absence data. Methods in Ecology and Evolution.
Examples
data(mosquitos, package="jSDM")
head(mosquitos)
plot_associations plot species-species associations
Description
plot_associations plot species-species associations
Usage
plot_associations(
R,
radius = 5,
main = NULL,
cex.main = NULL,
circleBreak = FALSE,
top = 10L,
occ = NULL,
env_effect = NULL,
cols_association = c("#FF0000", "#BF003F", "#7F007F", "#3F00BF", "#0000FF"),
cols_occurrence = c("#BEBEBE", "#8E8E8E", "#5F5F5F", "#2F2F2F", "#000000"),
cols_env_effect = c("#1B9E77", "#D95F02", "#7570B3", "#E7298A", "#66A61E", "#E6AB02",
"#A6761D", "#666666"),
lwd_occurrence = 1,
species_order = "abundance",
species_indices = NULL
)
Arguments
R |
matrix of correlation | ||||||
radius |
circle's radius | ||||||
main |
title | ||||||
cex.main |
title's character size. NULL and NA are equivalent to 1.0. | ||||||
circleBreak |
circle break or not | ||||||
top |
number of top negative and positive associations to consider | ||||||
occ |
species occurence data | ||||||
env_effect |
environmental species effects | ||||||
cols_association |
color gradient for association lines | ||||||
cols_occurrence |
color gradient for species | ||||||
cols_env_effect |
color gradient for environmental effect | ||||||
lwd_occurrence |
lwd for occurrence lines | ||||||
species_order |
order species according to :
| ||||||
species_indices |
indices for sorting species |
Details
After fitting the jSDM with latent variables, the fullspecies residual correlation matrix : R=(R_{ij})
with i=1,\ldots, n_{species}
and j=1,\ldots, n_{species}
can be derived from the covariance in the latent variables such as :
can be derived from the covariance in the latent variables such as :
\Sigma_{ij}=\lambda_i' .\lambda_j
, in the case of a regression with probit, logit or poisson link function and
\Sigma_{ij} | = \lambda_i' .\lambda_j + V | if i=j |
= \lambda_i' .\lambda_j | else, |
this function represents the correlations computed from covariances :
R_{ij} = \frac{\Sigma_{ij}}{\sqrt{\Sigma_ii\Sigma _jj}}
.
Value
No return value. Displays species-species associations.
Author(s)
Ghislain Vieilledent <ghislain.vieilledent@cirad.fr>
Jeanne Clément <jeanne.clement16@laposte.net>
References
Pichler M. and Hartig F. (2021) A new method for faster and more accurate inference of species associations from big community data.
Methods in Ecology and Evolution, 12, 2159-2173 doi:10.1111/2041-210X.13687.
See Also
jSDM-package
get_residual_cor
jSDM_binomial_probit
jSDM_binomial_probit_long_format
jSDM_binomial_probit_sp_constrained
jSDM_binomial_logit
jSDM_poisson_log
Examples
library(jSDM)
# frogs data
data(mites, package="jSDM")
# Arranging data
PA_mites <- mites[,1:35]
# Normalized continuous variables
Env_mites <- cbind(mites[,36:38], scale(mites[,39:40]))
colnames(Env_mites) <- colnames(mites[,36:40])
Env_mites <- as.data.frame(Env_mites)
# Parameter inference
# Increase the number of iterations to reach MCMC convergence
mod <- jSDM_poisson_log(# Response variable
count_data=PA_mites,
# Explanatory variables
site_formula = ~ water + topo + density,
site_data = Env_mites,
n_latent=2,
site_effect="random",
# Chains
burnin=100,
mcmc=100,
thin=1,
# Starting values
alpha_start=0,
beta_start=0,
lambda_start=0,
W_start=0,
V_alpha=1,
# Priors
shape=0.5, rate=0.0005,
mu_beta=0, V_beta=10,
mu_lambda=0, V_lambda=10,
# Various
seed=1234, verbose=1)
# Calcul of residual correlation between species
R <- get_residual_cor(mod)$cor.mean
plot_associations(R, circleBreak = TRUE, occ = PA_mites, species_order="abundance")
# Average of MCMC samples of species enrironmental effect beta except the intercept
env_effect <- t(sapply(mod$mcmc.sp,
colMeans)[grep("beta_", colnames(mod$mcmc.sp[[1]]))[-1],])
colnames(env_effect) <- gsub("beta_", "", colnames(env_effect))
plot_associations(R, env_effect = env_effect, species_order="main env_effect")
Plot the residual correlation matrix from a latent variable model (LVM).
Description
Plot the posterior mean estimator of residual correlation matrix reordered by first principal component using corrplot
function from the package of the same name.
Usage
plot_residual_cor(
mod,
prob = NULL,
main = "Residual Correlation Matrix from LVM",
cex.main = 1.5,
diag = FALSE,
type = "lower",
method = "color",
mar = c(1, 1, 3, 1),
tl.srt = 45,
tl.cex = 0.5,
...
)
Arguments
mod |
An object of class |
prob |
A numeric scalar in the interval |
main |
Character, title of the graph. |
cex.main |
Numeric, title's size. |
diag |
Logical, whether display the correlation coefficients on the principal diagonal. |
type |
Character, "full" (default), "upper" or "lower", display full matrix, lower triangular or upper triangular matrix. |
method |
Character, the visualization method of correlation matrix to be used. Currently, it supports seven methods, named "circle" (default), "square", "ellipse", "number", "pie", "shade" and "color". |
mar |
See |
tl.srt |
Numeric, for text label string rotation in degrees, see |
tl.cex |
Numeric, for the size of text label (variable names). |
... |
Further arguments passed to |
Value
No return value. Displays a reordered correlation matrix.
Author(s)
Ghislain Vieilledent <ghislain.vieilledent@cirad.fr>
Jeanne Clément <jeanne.clement16@laposte.net>
References
Taiyun Wei and Viliam Simko (2017). R package "corrplot": Visualization of a Correlation Matrix (Version 0.84)
Warton, D. I.; Blanchet, F. G.; O'Hara, R. B.; O'Hara, R. B.; Ovaskainen, O.; Taskinen, S.; Walker, S. C. and Hui, F. K. C. (2015) So Many Variables: Joint Modeling in Community Ecology. Trends in Ecology & Evolution, 30, 766-779.
See Also
corrplot
jSDM-package
jSDM_binomial_probit
jSDM_binomial_logit
jSDM_poisson_log
Examples
library(jSDM)
# frogs data
data(frogs, package="jSDM")
# Arranging data
PA_frogs <- frogs[,4:12]
# Normalized continuous variables
Env_frogs <- cbind(scale(frogs[,1]),frogs[,2],scale(frogs[,3]))
colnames(Env_frogs) <- colnames(frogs[,1:3])
# Parameter inference
# Increase the number of iterations to reach MCMC convergence
mod<-jSDM_binomial_probit(# Response variable
presence_data = PA_frogs,
# Explanatory variables
site_formula = ~.,
site_data = Env_frogs,
n_latent=2,
site_effect="random",
# Chains
burnin=100,
mcmc=100,
thin=1,
# Starting values
alpha_start=0,
beta_start=0,
lambda_start=0,
W_start=0,
V_alpha=1,
# Priors
shape=0.1, rate=0.1,
mu_beta=0, V_beta=1,
mu_lambda=0, V_lambda=1,
# Various
seed=1234, verbose=1)
# Representation of residual correlation between species
plot_residual_cor(mod)
plot_residual_cor(mod, prob=0.95)
Predict method for models fitted with jSDM
Description
Prediction of species probabilities of occurrence from models fitted using the jSDM package
Usage
## S3 method for class 'jSDM'
predict(
object,
newdata = NULL,
Id_species,
Id_sites,
type = "mean",
probs = c(0.025, 0.975),
...
)
Arguments
object |
An object of class | |||||||||
newdata |
An optional data frame in which explanatory variables can be searched for prediction. If omitted, the adjusted values are used. | |||||||||
Id_species |
An vector of character or integer indicating for which species the probabilities of presence on chosen sites will be predicted. | |||||||||
Id_sites |
An vector of integer indicating for which sites the probabilities of presence of specified species will be predicted. | |||||||||
type |
Type of prediction. Can be :
Using | |||||||||
probs |
Numeric vector of probabilities with values in [0,1], | |||||||||
... |
Further arguments passed to or from other methods. |
Value
Return a vector for the predictive posterior mean when type="mean"
, a data-frame with the mean and quantiles when type="quantile"
or an mcmc
object (see coda
package) with posterior distribution for each prediction when type="posterior"
.
Author(s)
Ghislain Vieilledent <ghislain.vieilledent@cirad.fr>
Jeanne Clément <jeanne.clement16@laposte.net>
See Also
jSDM-package
jSDM_gaussian
jSDM_binomial_logit
jSDM_binomial_probit
jSDM_poisson_log
Examples
library(jSDM)
# frogs data
data(frogs, package="jSDM")
# Arranging data
PA_frogs <- frogs[,4:12]
# Normalized continuous variables
Env_frogs <- cbind(scale(frogs[,1]),frogs[,2],scale(frogs[,3]))
colnames(Env_frogs) <- colnames(frogs[,1:3])
# Parameter inference
# Increase the number of iterations to reach MCMC convergence
mod<-jSDM_binomial_probit(# Response variable
presence_data=PA_frogs,
# Explanatory variables
site_formula = ~.,
site_data = Env_frogs,
n_latent=2,
site_effect="random",
# Chains
burnin=100,
mcmc=100,
thin=1,
# Starting values
alpha_start=0,
beta_start=0,
lambda_start=0,
W_start=0,
V_alpha=1,
# Priors
shape=0.5, rate=0.0005,
mu_beta=0, V_beta=10,
mu_lambda=0, V_lambda=10,
# Various
seed=1234, verbose=1)
# Select site and species for predictions
## 30 sites
Id_sites <- sample.int(nrow(PA_frogs), 30)
## 5 species
Id_species <- sample(colnames(PA_frogs), 5)
# Predictions
theta_pred <- predict(mod,
Id_species=Id_species,
Id_sites=Id_sites,
type="mean")
hist(theta_pred, main="Predicted theta with simulated covariates")