s-jSDM
A scalable and fast method for estimating joint Species Distribution Models (jSDMs) for big community data, including eDNA data.
https://github.com/theoreticalecology/s-jsdm
Category: Biosphere
Sub Category: Species Distribution Modeling
Keywords
deep-learning gpu-acceleration machine-learning species-distribution-modelling species-interactions
Last synced: about 23 hours ago
JSON representation
Repository metadata
Scalable joint species distribution modeling
- Host: GitHub
- URL: https://github.com/theoreticalecology/s-jsdm
- Owner: TheoreticalEcology
- License: gpl-3.0
- Created: 2019-11-12T16:38:43.000Z (over 6 years ago)
- Default Branch: master
- Last Pushed: 2026-04-21T11:42:24.000Z (22 days ago)
- Last Synced: 2026-05-07T10:03:33.843Z (6 days ago)
- Topics: deep-learning, gpu-acceleration, machine-learning, species-distribution-modelling, species-interactions
- Language: R
- Homepage: https://cran.r-project.org/web/packages/sjSDM/index.html
- Size: 51.1 MB
- Stars: 77
- Watchers: 5
- Forks: 15
- Open Issues: 54
- Releases: 6
-
Metadata Files:
- Readme: README.Rmd
- License: LICENSE.md
README.Rmd
---
output: github_document
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```
[](http://www.repostatus.org/#active) [](https://www.gnu.org/licenses/gpl-3.0) [](https://cran.r-project.org/package=sjSDM)  [](https://www.doi.org/10.1111/2041-210X.13687)
# s-jSDM - Fast and accurate Joint Species Distribution Modeling
## About sjSDM
The sjSDM package is an R package for estimating joint species distribution models. A jSDM is a GLMM that models a multivariate (i.e. a many-species) response to the environment, space and a covariance term that models conditional (on the other terms) correlations between the outputs (i.e. species).

A big challenge in jSDM implementation is computational speed. The goal of the sjSDM (which stands for "scalable joint species distribution models") is to make jSDM computations fast and scalable. Unlike many other packages, which use a latent-variable approximation to make estimating jSDMs faster, sjSDM fits a full covariance matrix in the likelihood, which is, however, numerically approximated via simulations. The method is described in Pichler & Hartig (2021) A new joint species distribution model for faster and more accurate inference of species associations from big community data, https://www.doi.org/10.1111/2041-210X.13687.
The core code of sjSDM is implemented in Python / PyTorch, which is then wrapped into an R package. In principle, you can also use it stand-alone under Python (see instructions below). Note: for both the R and the python package, python \>= 3.7 and pytorch must be installed (more details below). However, for most users, it will be more convenient to use sjSDM via the sjSDM R package, which also provides a large number of downstream functionalities.
To get citation info for sjSDM when you use it for your reseach, type
```{r,eval=FALSE}
citation("sjSDM")
```
## Installing the R package
sjSDM is distributed via [CRAN](https://cran.rstudio.com/web/packages/sjSDM/index.html). For most users, it will be best to install the package from CRAN
```{r,eval=FALSE}
install.packages("sjSDM")
```
Depencies for the package can be installed before or after installing the package. Detailed explanations of the dependencies are provided in vignette("Dependencies", package = "sjSDM"), source code [here](https://github.com/TheoreticalEcology/s-jSDM/blob/master/sjSDM/vignettes/Dependencies.Rmd). Very briefly, the dependencies can be automatically installed from within R:
```{r,eval=FALSE}
sjSDM::install_sjSDM(version = "gpu") # or
sjSDM::install_sjSDM(version = "cpu")
```
For advanced users: if you want to install the current (development) version from this repository, run
```{r,eval=FALSE}
devtools::install_github("https://github.com/TheoreticalEcology/s-jSDM", subdir = "sjSDM", ref = "master")
```
dependencies should be installed as above. If the installation fails, check out the help of ?install_sjSDM, ?installation_help, and vignette("Dependencies", package = "sjSDM").
1. Try install_sjSDM()
2. New session, if no 'PyTorch not found' appears it should work, otherwise see ?installation_help
3. If do not get the pkg to run, create an issue [issue tracker](https://github.com/TheoreticalEcology/s-jSDM/issues) or write an email to maximilian.pichler at ur.de
## Basic Workflow
Load the package
```{r, message = F}
library(sjSDM)
```
Simulate some community data
```{r}
set.seed(42)
community <- simulate_SDM(sites = 100, species = 10, env = 3, se = TRUE)
Env <- community$env_weights
Occ <- community$response
SP <- matrix(rnorm(200, 0, 0.3), 100, 2) # spatial coordinates (no effect on species occurences)
```
This fits the standard SDM with environmental, spatial and covariance terms
```{r, results='hide'}
model <- sjSDM(Y = Occ, env = linear(data = Env, formula = ~X1+X2+X3), spatial = linear(data = SP, formula = ~0+X1:X2), se = TRUE, family=binomial("probit"), sampling = 100L, verbose = FALSE)
```
```{r}
summary(model)
```
Plot the niche estimates, i.e the estimates in the environmental component:
```{r, results='hide'}
plot(model)
```
Visualize the species-species association matrix
```{r}
image(getCor(model))
```
## Anova / Variation partitioning
### Global ANOVA
As in other models, it can be interesting to analyze how much variation is explained by which parts of hte model.
{{width=70%}}
For the Env, Spatial, Covariance terms, this is implemented in
```{r, results='hide'}
an = anova(model, verbose = FALSE)
```
```{r,fig.height=7, fig.width=6.3}
summary(an)
plot(an)
```
The anova shows the relative changes in the R^2^ of the groups and their intersections.
### Internal metacommunity structure
Following [Leibold et al., 2022](https://doi.org/10.1111/oik.08618) we can calculate and visualize the internal metacommunity structure (=partitioning of the three components for species and sites). The internal structure is already calculated by the ANOVA and we can visualize it with the plot method:
```{r,fig.height=7, fig.width=8, warning=FALSE}
results = internalStructure(an) # or plot(an, internal = TRUE)
```
The plot function returns the results for the internal metacommunity structure:
```{r,fig.height=7, fig.width=12}
plot(results)
```
Which can be regressed against covariates to analyse assembly processes:
```{r}
plotAssemblyEffects(results)
```
## Python Package
If you want to use sjSDM from python (as said, not encouraged because all help and downstream functions are in R), install via
```{bash,eval=FALSE}
pip install sjSDM_py
```
Python example
```{python,eval=FALSE}
import sjSDM_py as fa
import numpy as np
import torch
Env = np.random.randn(100, 5)
Occ = np.random.binomial(1, 0.5, [100, 10])
model = fa.Model_sjSDM(device=torch.device("cpu"), dtype=torch.float32)
model.add_env(5, 10)
model.build(5, optimizer=fa.optimizer_adamax(0.001),scheduler=False)
model.fit(Env, Occ, batch_size = 20, epochs = 10)
# print(model.weights)
# print(model.covariance)
```
Calculate Importance:
```{python, eval=FALSE}
Beta = np.transpose(model.env_weights[0])
Sigma = ( model.sigma @ model.sigma.t() + torch.diag(torch.ones([1])) ).data.cpu().numpy()
covX = fa.covariance( torch.tensor(Env).t() ).data.cpu().numpy()
fa.importance(beta=Beta, covX=covX, sigma=Sigma)
```
Owner metadata
- Name: Theoretical Ecology
- Login: TheoreticalEcology
- Email:
- Kind: organization
- Description: Repositories of the Theoretical Ecology Group, University of Regensburg
- Website: http://www.uni-regensburg.de/biologie-vorklinische-medizin/theoretische-oekologie/forschung/index.html
- Location: Regensburg, Germany
- Twitter:
- Company:
- Icon url: https://avatars.githubusercontent.com/u/22679875?v=4
- Repositories: 10
- Last ynced at: 2023-03-05T01:08:20.721Z
- Profile URL: https://github.com/TheoreticalEcology
GitHub Events
Total
- Fork event: 1
- Issues event: 21
- Watch event: 4
- Issue comment event: 23
- Push event: 8
Last Year
- Issues event: 12
- Watch event: 2
- Issue comment event: 10
- Push event: 6
Committers metadata
Last synced: 4 days ago
Total Commits: 510
Total Committers: 6
Avg Commits per committer: 85.0
Development Distribution Score (DDS): 0.259
Commits in past year: 16
Committers in past year: 1
Avg Commits per committer in past year: 16.0
Development Distribution Score (DDS) in past year: 0.0
| Name | Commits | |
|---|---|---|
| MaximilianPi | m****r@b****e | 378 |
| Maximilian Pichler | M****r@s****e | 103 |
| Florian Hartig | f****g | 26 |
| CaiWang0503 | 4****3 | 1 |
| CaiWang0503 | 4****T | 1 |
| MaximilianPi | m****r@M****l | 1 |
Committer domains:
Issue and Pull Request metadata
Last synced: 20 days ago
Total issues: 124
Total pull requests: 30
Average time to close issues: 6 months
Average time to close pull requests: 9 days
Total issue authors: 45
Total pull request authors: 2
Average comments per issue: 2.81
Average comments per pull request: 0.13
Merged pull request: 28
Bot issues: 0
Bot pull requests: 0
Past year issues: 14
Past year pull requests: 1
Past year average time to close issues: 28 days
Past year average time to close pull requests: 3 minutes
Past year issue authors: 9
Past year pull request authors: 1
Past year average comments per issue: 1.5
Past year average comments per pull request: 0.0
Past year merged pull request: 1
Past year bot issues: 0
Past year bot pull requests: 0
Top Issue Authors
- MaximilianPi (22)
- florianhartig (20)
- dougwyu (6)
- frmunoz (5)
- wevertonbio (4)
- sogm (4)
- dansmi-hub (3)
- YJ781 (3)
- CaiWang0503 (3)
- AndrewCSlater (3)
- mtva0001 (3)
- agnes-duhamet (3)
- chnpenny (2)
- mdayii (2)
- kjmtaylor22 (2)
Top Pull Request Authors
- MaximilianPi (29)
- CaiWang0503 (1)
Top Issue Labels
- enhancement (18)
- bug (11)
- question (5)
- documentation (3)
- future (2)
- installation help (2)
- help wanted (2)
- CRAN (1)
Top Pull Request Labels
Package metadata
- Total packages: 2
-
Total downloads:
- pypi: 30 last-month
- cran: 276 last-month
- Total dependent packages: 0 (may contain duplicates)
- Total dependent repositories: 1 (may contain duplicates)
- Total versions: 13
- Total maintainers: 2
pypi.org: sjsdm-py
jSDM package
- Homepage: https://github.com/TheoreticalEcology/s-jSDM
- Documentation: https://sjsdm-py.readthedocs.io/
- Licenses: GNU General Public License v3 (GPLv3)
- Latest release: 0.1.1 (published almost 5 years ago)
- Last Synced: 2026-05-07T11:11:29.004Z (6 days ago)
- Versions: 5
- Dependent Packages: 0
- Dependent Repositories: 1
- Downloads: 30 Last month
-
Rankings:
- Dependent packages count: 7.313%
- Stargazers count: 8.867%
- Forks count: 9.89%
- Average: 19.372%
- Dependent repos count: 22.093%
- Downloads: 48.697%
- Maintainers (1)
cran.r-project.org: sjSDM
Scalable Joint Species Distribution Modeling
- Homepage: https://github.com/TheoreticalEcology/s-jSDM/
- Documentation: http://cran.r-project.org/web/packages/sjSDM/sjSDM.pdf
- Licenses: GPL-3
- Latest release: 1.0.7 (published 8 months ago)
- Last Synced: 2026-05-07T11:11:39.463Z (6 days ago)
- Versions: 8
- Dependent Packages: 0
- Dependent Repositories: 0
- Downloads: 276 Last month
-
Rankings:
- Forks count: 5.648%
- Stargazers count: 7.245%
- Average: 26.185%
- Dependent packages count: 29.797%
- Dependent repos count: 35.455%
- Downloads: 52.779%
- Maintainers (1)
Dependencies
- R >= 3.0 depends
- Metrics * imports
- Ternary * imports
- abind * imports
- checkmate * imports
- cli * imports
- crayon * imports
- ggplot2 * imports
- ggtern * imports
- grDevices * imports
- graphics * imports
- mathjaxr * imports
- mgcv * imports
- mvtnorm * imports
- parallel * imports
- reticulate * imports
- rstudioapi * imports
- stats * imports
- utils * imports
- knitr * suggests
- rmarkdown * suggests
- testthat * suggests
- numpy *
- actions/cache v2 composite
- actions/checkout v2 composite
- actions/upload-artifact main composite
- r-lib/actions/setup-pandoc v1 composite
- r-lib/actions/setup-r v1 composite
- r-lib/actions/setup-tinytex master composite
- actions/cache v2 composite
- actions/checkout v2 composite
- actions/upload-artifact main composite
- conda-incubator/setup-miniconda v2 composite
- r-lib/actions/setup-pandoc v1 composite
- r-lib/actions/setup-r v1 composite
- r-lib/actions/setup-tinytex master composite
Score: 12.400298069326952