Removed the defunct delta_poisson_link_gamma() and
delta_poisson_link_lognormal(). Use delta_gamma(type = "poisson-link") or
delta_lognormal(type = "poisson-link").
Removed the defunct extract_mcmc() and add_barrier_mesh() functions; use the
versions in sdmTMBextra. Also removed the defunct previous_fit argument of
sdmTMB_simulate() (use simulate.sdmTMB()) and the error for the old
experimental = list(lwr, upr) censoring syntax.
sdmTMB_cv() now scores held-out data with a predictive density integrated
over the approximate posterior of the random effects
(predictive = "mle-mvn") instead of at their estimated values
("mle-eb"). predictive = "joint" also integrates over the fixed effects
and variance parameters. nsim sets the number of draws per fold, so
sum_loglik now depends on the random seed. The "mle-eb" values are always
returned in cv_loglik_mle_eb and sum_loglik_mle_eb. Random field
uncertainty on out-of-sample predictions generally increases with more
spatial knots, so it becomes increasingly important to account for random
field uncertainty at finer mesh resolutions and it's particularly important
for comparing across mesh resolutions.
get_index_split() now defaults to bias_correct = TRUE, matching
get_index().
predict(allow_new_levels = FALSE) now gives an error for new levels of a
random effect grouping factor, as in lme4 and glmmTMB. Previously it gave
the same warning as the default (NULL).
The arguments of sdmTMB() after family are reordered into groups:
random fields, observation model, other model terms, estimation, and
deprecated arguments. Code that passes arguments after family by position
must name them.
Censoring bounds for censored_poisson() and censored_betabinomial() are
now supplied with the censored_upper argument of sdmTMB(), which also
accepts a column name in data. The censored_upper argument of
sdmTMBcontrol() has been removed. Use Inf instead of NA for no upper
bound; NA is deprecated and is treated as Inf with a warning.
get_censored_upper() now caps the bounds at the number of hooks. This also
fixes sdmTMB_cv() misaligning the bounds with the data when folds were
assigned randomly with a time column.
predict.sdmTMB() now errors for type = "response" with se_fit = TRUE
(previously a warning, with link-scale output) and with a sims_var other
than "est". Use type = "link" for standard errors or nsim for
response-scale uncertainty. sims_var accepts only "est", "omega_s",
"zeta_s", "epsilon_st", "est_rf", and "est_non_rf"; use
return_tmb_report = TRUE with nsim for other reported variables.
diffusion(x) + time_lag(x) in nonlocal_formula now fits one stationary
joint space--time distributed-lag operator with one coefficient. Temporal
persistence is constrained to be non-negative. The temporal parameter is
estimated as log_kappaT_nl (equal to logit(rhoT)) rather than
kappaT_nl_raw, sdmTMB_simulate() requires 0 < lags_rhoT < 1, and the
derived summaries are named MSDK and RMSDK rather than MSD and RMSD.
time_lag() now starts from a stationary state by default (the covariate is
assumed to have held at its first time slice); use start = "zero" for the
previous behaviour, which matches Thorson et al. (2026).
spatial_varying now respects its own model matrix, and the (Intercept)
column is dropped only when spatial = "on". For
spatial = "off", spatial_varying = ~ 1 + factor, the model now fits a
genuine intercept field plus K - 1 deviation fields instead of omitting the
reference field, with a one-time warning. The svc-factor-models article
clarifies how spatial, spatial_varying, and the intercept of the
spatial_varying design matrix interact.
For truncated_nbinom1() and truncated_nbinom2(), phi now comes from
each fit's own parameters rather than the family object, so calling
family$linkinv() directly for these families requires phi.
The experimental epsilon_model and epsilon_predictor options are removed
and now error. File an issue if you're interested in using this functionality
and we can consider adding it back.
simulate_new() now works with areal SAR/CAR models: pass an areal domain
from make_areal_domain() as mesh, set spatial_model = "sar" or
"car", and supply rho_sar or alpha_car instead of range. #552
Added lognormal_prior() as an option for sdmTMBpriors(sigma_V = ...)
priors on time-varying coefficient SDs.
RTMB is now the default backend. The model code is written in R (via
RTMB) with about 50% fewer lines, and gives the same results as the TMB
backend in all our tests, although simulated values differ between backends
for the same seed. The TMB backend is retained for now but will eventually be
dropped. To keep using it, set control = sdmTMBcontrol(backend = "tmb") per
fit or options(sdmTMB.backend = "tmb") per session. The move uncovered
several bugs, which are fixed as listed below, and allowed for optimization
of the model. Speedups relative to sdmTMB 1.1.0 on an example model with the
built-in pcod dataset:
predict(): 13.5xget_index(bias_correct = FALSE): 10.4xget_index(bias_correct = TRUE): 1.5xsimulate(nsim = 400): 1.9xproject(nsim = 400) (30-year AR1 projection): 9.3xsimulate.sdmTMB() gains a simulate_re argument to choose which random
effects are simulated as new (any of "spatial", "spatiotemporal",
"spatial_varying", "group_re", "time_varying"). Random
effects not named are held at their empirical Bayes estimates
(type = "mle-eb") or at an approximate posterior draw
(type = "mle-mvn"). For example, simulate_re = "spatiotemporal" with
type = "mle-mvn" holds the spatial fields at one posterior draw while
simulating new spatiotemporal fields.
Add custom priors for the RTMB backend:
sdmTMBpriors(custom = function(par, theta) ...) adds arbitrary log
densities on raw (par) or natural-scale (theta) parameters, including
random effects, to the joint objective. With bayesian = TRUE,
custom_log_jacobian supplies the matching Jacobian adjustment. New
get_prior_parameters() lists the available parameters and
get_prior_densities() evaluates the terms at the estimates. See the new
vignette "Custom priors and penalties".
Add experimental multi-family models, where each row of the data can use a
different observation family (e.g., binomial, count, and delta-lognormal data
in one model with shared fields). Supply a named list to family and name
the column mapping rows to families with distribution_column. See the new
multi-family vignette.
Add ordbeta() for ordered beta regression (Kubinec 2023), an alternative to
zero-one-inflated beta for continuous data on [0, 1] with point masses at 0
and 1 (#515). Response-scale predictions and indices include the point
masses.
Add censored_betabinomial() for censored beta-binomial counts, e.g., to
account for hook competition in hook-and-line surveys with the number of
hooks as the number of trials. It uses sdmTMB(censored_upper = ...) like
censored_poisson(), with Inf meaning censoring between the observed
count and the number of trials. It needs the RTMB backend. The likelihood
sums the shorter of each interval and its complement, with a precision check
and fallback to the direct sum after fitting
(sdmTMBcontrol(censored_method = "direct") forces the direct sum). See the
new article "Accounting for hook competition with censored count models".
Add censored_binomial() for censored binomial counts. It works like
censored_betabinomial() (RTMB backend, number of trials via weights).
With link = "cloglog" and an observation-level random intercept, it is a
Poisson-lognormal model of the per-hook catch rate with at most one fish
per hook, so get_index(derived_link = "log") is proportional to the mean
catch rate.
Add censored_nbinom1() and censored_nbinom2() for censored negative
binomial counts (RTMB backend). They use sdmTMB(censored_upper = ...) like
censored_poisson(), with no upper limit on the count, e.g., for catch
without hook competition with an offset of log hooks.
Add the dispformula argument to sdmTMB() for modelling the observation
dispersion parameter with fixed-effect predictors. It is not supported for
multi-family models or truncated negative binomial families.
Add compare_deviance() for deviance explained (a pseudo-R^2) relative to a
simpler model.
Add a loo::elpd() method for sdmTMB_cv() output so models can be compared
with loo::loo_compare(), including a standard error of the difference. See
?sdmTMB_cv() for an example.
Add deviance residuals and deviance() for gengamma() and
censored_poisson().
Add make_zero_one_map() for categories (e.g., year factors) where the
response is all zeros or ones (#386).
Add sample_fe argument to predict.sdmTMB(). With nsim > 0 and
sample_fe = FALSE, fixed effects are held at their estimates and only
random effects are drawn.
get_index(), get_cog(), get_eao(), and get_weighted_average() can now
take a fitted model and prediction grid directly, e.g.,
get_index(fit, newdata = grid). These functions and get_index_split()
also gain an offset argument.
project() gains sample_fe, sample_historical_re, and
sample_future_re arguments to separate parameter uncertainty, historical
latent state uncertainty, and future process variation, and a future_re
argument for including (the default), zeroing, or fixing future
spatiotemporal and time-varying effects. Projections are faster when
newdata repeats spatial locations across time, and project() now keeps
only the simulated values it returns, which more than halves peak memory use
with many simulations.
sdmTMB_cv(lfo = TRUE) now supports delta/hurdle families.
Add opt-in collapse_spatiotemporal_ar1 and collapse_ar1_threshold controls
to simplify spatiotemporal AR1 fields to IID or random-walk fields when the
estimated correlation is near zero or one.
Covariate diffusion handles non-local covariates better: time-indexed formulas are distinguished, external grids are supported for prediction and cross-validation, and insufficient grid coverage gives clear errors.
Covariate diffusion's kappaS_nl now starts at a value scaled to the data's
spatial extent and log_kappaS_nl is bounded by default, which avoids
degenerate over-smoothed fits. Override the bounds with lower or upper in
sdmTMBcontrol().
Simulating new correlated random intercepts and slopes, e.g., (1 + x | g),
with simulate(re_form = ~0) on the TMB backend no longer gives an error.
Rows with missing values in the response or any variable the model uses
(including weights and offset) are now omitted before fitting, as with
na.omit in glm(), with a message unless silent = TRUE. Previously, such
rows were not removed from the spatial, temporal, random-effect, and
spatially varying inputs, so later rows were matched to the wrong locations
and times and fits were silently incorrect. predict(), residuals(), and
sdmTMB_cv() now work for these fits, and the fitted object's data holds
the rows used.
sdmTMB_simulate() now errors if sigma_E has more than one value, which
previously silently simulated a constant SD.
truncated_nbinom1() and truncated_nbinom2() now error on a response of
zero in non-delta models instead of reporting convergence with an infinite
objective.
Fix three bugs in priors. normal() priors on b used the standard
deviations as variances; a single b prior with multiple coefficients was
silently dropped and is now applied to every coefficient; and with
bayesian = TRUE the Jacobian for pc_matern() priors was incorrect.
Fix several other statistical bugs in both backends:
ordbeta() cutpoints are now constrained to be ordered.gengamma() returns a NaN likelihood where its mean does not exist.matern_st pc_matern() prior with a shared range no longer drops its
range term when there is no matern_s prior.bayesian = TRUE, the threshold_logistic_s95 prior includes its
Jacobian adjustment.simulate(observation_error = FALSE)) are now expectations for the
beta-binomial, truncated negative binomial, mixture, and ordered beta
families.get_eao() weights density by area.sigma_V priors are no longer applied twice in delta models.Fix censored_poisson() likelihoods and gradients, which since sdmTMB 0.4.0
evaluated the censored CDF terms at the starting values. Log likelihoods are
also now computed on the log scale, avoiding -Inf for observations far in
the tails.
Fix time_varying models with more than one column (e.g., ~ 1 + x), where
estimated b_rw_t and sigma_V for all but the last term were shrunk.
Likelihoods, fitted values, and predictions are unchanged.
Fix breakpt() likelihoods and gradients after the cutpoint moves from its
starting value in the TMB backend.
Fix ordbeta() simulation, which understated ones and the mean. The
likelihood was unaffected.
Fix TMB-backend simulation of AR1 and RW spatiotemporal fields with a barrier mesh, which had the wrong variance.
Fix deviance and deviance residuals: they now include observation weights,
binomial residuals work for responses with more than one trial, nbinom1()
uses the saturated model with phi fixed, and Poisson-link delta encounter
residuals are negative for zeros.
Fix sdmTMB_cv(lfo = TRUE) log likelihoods for lognormal models, which
omitted a logarithm.
Mixture-family predictions now respect non-log links and population-level
predictions (re_form = NA).
Fix delta models with spatial_varying where a component has
spatial = "off" (e.g., spatial = list("on", "off")). That component's
spatially varying coefficient fields entered the model without a random
field penalty and with an unidentified SD parameter. They now have a random
field density and their own estimated range.
tidy(effects = "ran_vals") for delta models with time_varying
coefficients now labels each row with the correct model component. It was
returning both components labelled with the requested model. As with IID
random effects, both components are returned regardless of model.
tidy(effects = "ran_pars") again reports sigma_V, the SD of
time-varying coefficients, for all time_varying_type values. It was being
silently dropped, and AR1 time-varying models were skipped entirely.
With more than one time-varying coefficient, the sigma_V and rho_time
terms are now labelled with their coefficient, e.g. sigma_V[depth_scaled]
and rho_time[depth_scaled].
sanity() no longer warns ("no non-missing arguments to min") for
non-spatial models fit without a mesh.
get_cog() now errors informatively for areal (SAR/CAR) models instead of
returning a centre of gravity of zero.
The type column returned by get_eao() is now "eao" instead of the
misspelled "eoa".
The silent argument of get_index(), get_cog(), get_eao(), and
get_weighted_average() was ignored and now controls TMB's output.
get_index(), get_cog(), and get_eao() now honour
predict_args = list(re_form = NA) for single-component models.
Previously the random fields were always included unless the model was a
delta model.
predict.sdmTMB() without newdata now returns the same values as
predict(fit, newdata = fit$data, offset = fit$offset). Previously,
est_non_rf left out smoothers and the offset, est_rf left out spatially
varying coefficient terms, and est for mixture families lacked the
mixture-mean adjustment. The fitted offset is now used for all prediction
types when offset = NULL (previously it was 0 for delta models and
internally rebuilt predictions) (#274). Set offset = 0 for predictions at
an offset of 0.
Fix predict.sdmTMB() with newdata for spatial_varying, time_varying,
and dispformula terms with data-dependent transformations such as poly().
The fitted encoding is now saved with the model and reused, and new factor
levels or missing values give an informative error. Refit models from earlier
versions for exact reproduction.
Fix predict.sdmTMB() with newdata = NULL ignoring return_tmb_report,
return_tmb_data, and nonlocal_newdata.
Draws from predict.sdmTMB() (nsim or mcmc_samples) now honour
re_form = NA. Population-level predictions also order columns as full
predictions do, and newdata coordinate columns are no longer dropped for
non-spatial models.
Fix response-scale est1 and est2 from predict.sdmTMB() for Poisson-link
delta models with a nonzero offset.
Fix type = "response" predictions for truncated_nbinom1() and
truncated_nbinom2(), which used the starting value of phi.
Fix residuals(type = "response") for truncated_nbinom1() and
truncated_nbinom2(), which subtracted the untruncated mean.
Fix randomized quantile residuals for zero observations with
betabinomial(), which were all set to the same value.
Fix calling the index functions directly on a do_index = TRUE fit:
get_index() now honours area, and get_eao(), get_weighted_average(),
and get_cog() no longer error (#549).
Fix sdmTMBcontrol(suppress_nlminb_warnings = TRUE), which previously had
no effect.
The "Maximum final gradient" convergence warning now considers the absolute value of the gradients; large negative gradients were previously ignored.
Make extra optimization more robust. run_extra_optimization() now updates
the parameters used by predict(), leaves the original fit unchanged,
updates pos_def_hessian, and counts iterations correctly. Newton updates
(newton_loops) in sdmTMB() and run_extra_optimization() halve steps
that cross limits or worsen the objective, and are skipped rather than
erroring when the gradient, objective, or Hessian is unusable. A failed first
multiphase phase falls back to the default starting values. The needless
Newton/parameter-limit message is removed.
Fix print() showing Time column: character instead of the time column
name (a regression in sdmTMB 0.8.1).
Fix reload_model() for models fit with normalize = TRUE.
Fix update.sdmTMB() for binomial cbind() responses with random effects
(#544).
Fix collapse_spatial_variance with delta models so fields already disabled
in one linear predictor are not treated as newly collapsed, and evaluate its
internal update() call in the parent environment so sdmTMB() arguments
can be objects within another function.
Simulate correlated IID random effects with the RTMB backend when
re_form = NA.
sdmTMB() checks more robustly for differing formula random effects in
delta model list formulas.
A mesh that does not match nrow(data) now errors when nonlocal_formula
is used, even with spatial and spatiotemporal fields off.
Beyond the RTMB speedups above, speed up simulate.sdmTMB() with
type = "mle-mvn", cAIC(), and sdmTMB_cv(). For example, cAIC() takes
0.68 s instead of 41 s on a model with about 5,800 random effects.
sdmTMB_cv() with save_models = TRUE also returns smaller objects.
collapse_threshold in sdmTMBcontrol() is deprecated in favour of
collapse_spatial_variance_threshold.
predict(..., return_tmb_object = TRUE) is soft-deprecated for index
calculations; pass newdata to the index functions instead.
sdmTMB(do_index = TRUE) (and its predict_args and index_args) is
soft-deprecated; fit the model and pass newdata to the index functions
instead.
Make sdmTMB compatible with visreg 3.0.0.
Revise the model description vignette and many articles.
sdmTMB() gains experimental support for CAR/SAR areal models as an
alternative to the SPDE. See the relevant vignette at
https://sdmtmb.github.io/sdmTMB/articles/index.html
sdmTMB() gains non-local covariate support, including spatial diffusion and
time lags, with new nonlocal_formula and nonlocal_data arguments.
plot_nonlocal_kernel() and plot_nonlocal_covariate() support visualizing
the resulting kernels and covariates (#507). See the relevant vignette at
https://sdmtmb.github.io/sdmTMB/articles/index.html
sdmTMB() now supports uncorrelated random slopes and intercepts with the
form (1 + slope_var || group), and reports the results correctly.
(@Joseph-Barss, #536).
predict.sdmTMB() gains allow_new_levels for prediction with new random
intercept or slope levels; new levels use the population value (#196, #480).
get_index() now reports index totals on a log-total scale after integrating
response-scale predictions. This preserves existing behaviour for log-link
abundance models and allows binomial and beta-binomial proportion models,
including logit and cloglog links, to use area as an explicit
standardization multiplier for expected-count indices.
get_index() gains derived_link to override the inverse link, which is
useful when fitting Bernoulli data with a cloglog link and predicting an
expected count from a thinned count process (#339).
sdmTMB() gains experimental Restricted Spatial Regression (RSR) fixed
effects adjusted for spatial confounding with the random fields (Hanks et al.
2015; Diaz and Thorson 2025). Use
control = sdmTMBcontrol(get_rsr = TRUE) and
tidy(fit, effects = "rsr").
Fix compatibility with next RcppEigen (#538).
print() and tidy() now display the correctly transformed correlation
between a random slope and intercept.
sdmTMB() now uses tryCatch() around Newton loops in optimization so those
steps abort cleanly instead of producing an error.
predict.sdmTMB() now allows missing factor levels when predicting with
time-varying factor predictors (#533).
sanity() now identifies the fixed effects, providing more useful
diagnostics (#506).
delta_poisson_link_gamma() and delta_poisson_link_lognormal() now raise
deprecation errors instead of warnings. Use
delta_gamma(type = "poisson-link") and
delta_lognormal(type = "poisson-link") instead.
spatial_varying now respects its own model matrix. The (Intercept) column
is only dropped when spatial = "on", in which case the ordinary spatial
field omega_s is used as the SVC intercept or reference-level field.
A single informational message is issued at fit time, suppressible via
silent = TRUE.
The only material change in fitted-model structure versus published releases
is for spatial = "off", spatial_varying = ~ 1 + factor: this previously
stripped the intercept and zeroed omega_s, leaving only K - 1 deviation
fields with no reference field. It now fits a genuine SVC intercept field
plus K - 1 deviation fields. A warning is
emitted for this specification for now.
The previous message suggesting spatial = "off" when using
spatial = "on", spatial_varying = ~ 0 + factor_var has been removed; this
is a valid model specification (global spatial field plus per-level SVC
deviations) although it can be more challenging to estimate.
get_index() now returns the correct se_natural column
(@CataRoman, @gavinfay, #523).
residuals() now uses the correct inverse link for encounter and
positive-component mechanisms, including offsets, in Poisson-link delta
models, avoiding spurious NaN and Inf values in the first linear
predictor residuals. For most scenarios, simulation-based residuals from
dharma_residuals() remain the most straightforward choice for combined
residuals in delta models (#512).
predict.sdmTMB() now works when newdata contains NA in the response
column for models with random effects and the response column is present but
unused for prediction (#508).
citation("sdmTMB").Fix crash with betabinomial and binomial when a response value was NA but the
corresponding weights argument (turned into 'size') was not NA.
Add simulate_new() as a synonym for sdmTMB_simulate(). simulate_new()
is recommended going forward because it is more expressive.
Refactor get_cog(), get_weighted_average(), and get_eao().
get_cog() should be more memory efficient and bias correction is now
enabled for get_eao() and get_weighted_average(). These all now work
with subsets of the full set of fitted time elements as get_index() has
for a while.
Optimize memory usage and speed of get_range_edge().
Remove extraDistr import to avoid CRAN warning.
Switch from lme4 to reformulas package for random effects parsing functions
(findbars(), nobars(), subbars(), mkReTrms()). The lme4 maintainers
moved these formula utilities to the separate reformulas package.
Fix predict() with se_fit = TRUE for delta models to correctly return
standard errors on combined predictions when model = NA. Previously,
standard errors were only calculated for the first component (est1) instead
of the combined estimate (est). #496
Fix typo in predict() for delta models that incorrectly calculated combined
predictions as p1 * p1 instead of p1 * p2 in the specific case of
re_form = NA and type = "link". #496
Dramatically improve print() performance for models with large embedded
objects in calls (e.g., cross-validation scenarios with replicated data).
The fix avoids expensive deparse() operations on large data frames and
mesh objects by extracting only the argument names needed for display. #492
Fix error when parsing model when including extra_time in delta-family models
with a list formula. #493
sdmTMB_cv() now supports the weights argument. User-supplied weights are
combined with the internal fold-assignment mechanism (held-out data are
assigned weight 0). Weights must be positive (> 0). #486
Add experimental collapse_spatial_variance option to sdmTMBcontrol() to
automatically detect and turn off spatial and/or spatiotemporal random fields
when their SD parameters are estimated to be very small (below a threshold).
When enabled, the model will automatically refit with the appropriate fields
turned off if SD parameters fall below collapse_threshold (default 0.01).
This can help avoid boundary issues and improve model stability when random
fields are not needed. Set to FALSE by default. #263
Add new experimental function get_range_edge() to calculate range edges as
density-weighted quantiles along a spatial axis (e.g., latitude, coastal distance).
Range edges are calculated as positions where cumulative density equals specified
quantiles. Uses linear interpolation for accurate
quantile estimation and simulation from the joint precision matrix for uncertainty
quantification. Implements a similar approach to VAST range edge calculations
following Fredston et al. (2021) https://doi.org/10.1111/gcb.15614.
See the new range edge vignette at https://sdmTMB.github.io/sdmTMB/articles/
The Student-t degrees of freedom parameter is now
estimated by default in student(). Previously it was fixed at 3. To fix it
at a specific value, set df to a numeric value (e.g., student(df = 3)).
To estimate it (new default), set df = NULL or omit the argument. The
parameter is constrained to be > 1. The function now prints an informative
message about the df parameter behavior.
Add deviance residuals for left-out data in the cross validation output.
This can be used to calculate deviance explained of left-out data.
See cv_deviance_resid column in the data element of the output of
sdmTMB_cv().
Add save_models argument to sdmTMB_cv() (defaults to TRUE). Setting
save_models = FALSE prevents storing fitted model objects for each fold,
which can substantially reduce memory usage for large datasets or many folds.
When FALSE, functions requiring model access (tidy(), cv_to_waywiser())
will error with informative messages. Essential CV metrics (predictions, log
likelihoods, deviance residuals, convergence info) remain available.
Extend sdmTMB_simulate() to support time-varying effects with vector sigma_V
inputs and AR1 correlation (rho_time). #447
Add new function cv_to_waywiser() to convert cross-validation results to sf
format for use with the waywiser package. This enables multi-scale spatial
assessment of model predictions. #193
Add vignette demonstrating how to fit zero-one-inflated beta (ZOIB) models by fitting three separate model components and combining predictions. #440 #441
Add argument to fix probability of extreme events for *_mix() families.
Note that the internal parameter name has also changed from p_mix to
p_extreme and from logit_p_mix to logit_p_extreme. #318 #474
Add beta-binomial family (betabinomial()) for modeling overdispersed binomial
data. Supports logit and cloglog links, and includes proper residuals support.
Add new function get_weighted_average() to calculate biomass-weighted averages
of user-supplied vectors (e.g., depth, temperature). This function follows the
same pattern as get_cog() but allows users to specify any variable for
weighted averaging. Supports bias correction and area weighting.
Add vignette on age (or length) composition standardization. To help with this
add a new experimental function make_category_svc().
Add emmeans support for delta/hurdle models. Use model = 1 for the binomial
component or model = 2 for the positive component when calling emmeans().
Example: emmeans(fit, ~ predictor, model = 2). #247 #249
Fix barrier model implementation. The SPDE input matrices for the barrier model from INLA and INLAspacetime had changed. sdmTMB now appropriately uses these new matrices and unit tests in sdmTMBextra should catch such a change in the future. #457
Fix Student-t deviance residuals, which were incorrectly returning NaNs.
Fix sign() utility function to avoid NaN when x = 0. Now returns
standard mathematical sign function behavior: sign(0) = 0.
Fix bug in sdmTMB_cv() automatic fold generation that could result in
unbalanced folds with duplicate and missing fold IDs. The bug was most severe
with large k_folds values (e.g., leave-one-out cross-validation with
k_folds = nrow(data)), which could cause errors when folds had no data.
User-supplied fold_ids were not affected.
Add check if newdata has been filtered after prediction and before passing
to a get_*() function.
Fix tidy() to only include the model column for delta models. For non-delta
models, the model column is no longer included in the output for
effects = "ran_pars" and effects = "ran_vals", making the output cleaner
and more consistent.
Update package logo.
Add residuals for truncated negative binomial families. #481 Thanks to @Joseph-Barss
Fix an issue with residuals for delta models by consistently using get_par(),
and another issue specifically for delta truncated negative binomial models by
replacing NaN with NA. #484
Fix tidy() with effects = "ran_pars" to report min/max anisotropic ranges
(e.g., range_min, range_max) for models fit with anisotropy = TRUE,
matching the values shown in print_anisotropy(). Standard errors and
confidence intervals are set to NA since uncertainty in both the range parameter
and H matrix cannot be easily propagated.
Fix issue with ggeffects with multiple smoothers + offsets. #450
Improve t2() printing and appearance in tidy.sdmTMB(). #415 #472
Fix emmeans support for models with smoothers (s() terms). Previously,
emmeans would fail with "Non-conformable elements in reference grid" when
smoothers were included in the model formula.
Let simulate.sdmTMB() work with binomial GLMs with size specified via
weights and newdata supplied. #465
Fix issue with fold logic in LFO (leave-future-out) cross validation
for lfo_forecast > 1. #454 Thanks to @Joseph-Barss.
Add update.sdmTMB() so that the mesh argument doesn't have to be
specified if model is loaded in a fresh session. #461
Change default in get_index() etc. to bias_correct = TRUE. This is the
recommended setting for final inference and speed improvements within TMB
have made it more viable to include the bias correction by default. #456
Only retain Newton update parameters if they improve the objective function. #455
Only run Newton updates if maximum absolute gradient is >= 1e-9 to save
time. #455
Suppress nlminb() warnings by default, which can usually be ignored by the
user and may be confusing. This can be controlled via
sdmTMB(..., control = sdmTMBcontrol(suppress_nlminb_warnings = FALSE)).
This option now mirrors tinyVAST.
Round time-varying AR(1) rho to 2 decimals in model printing/summary.
Add deviance residuals (residuals(fit, type = "deviance")) and
deviance.sdmTMB() method (deviance(fit)). Proportion deviance explained
can be calculated as 1 - deviance(fit) / deviance(fit_null) where
fit_null is a null model, e.g., fit with formula = ~ 1 and turning
off any random fields as desired
(e.g., spatial = "off", spatiotemporal = "off").
Add observation_error argument to simulate.sdmTMB() to allow
turning off observation error simulation. The intended use-case
is for simulating from random effects but not adding observation
error. #431
Change the default in dharma_residuals() to
test_uniformity = FALSE. Based on simulation testing, we
generally do not recommend using these p-values to reject models.
Fix a bug introduced in version 0.7.0 where printing of the 2nd
linear predictor smoother fixed effects (bs) was accidentally a copy
of the 1st linear predictor smoother fixed effects.
Fix bug in simulation with time-varying AR(1) when using the
project() function. Thanks to A. Allyn for pointing out the bug.
Fix reporting of converged models with sdmTMB_cv(). A recent change
resulted in reporting only 1 model converged if all models converged.
Remove warning about old default residuals type.
Fix project() and simulate.sdmTMB(..., newdata = ...) when
random intercepts/slopes are present. #431
Remove extra TMB data slots for project() and
simulate.sdmTMB(..., newdata = ...) to save memory. #431
Add option for random slopes, or random intercepts to be passed in in
lme4 style formulas, density ~ (1 | fyear) or density ~ (depth | fyear),
Matches output of lme4 and glmmTMB, and summarizes output with tidy().
Add project() experimental function.
Add get_eao() to calculate effective area occupied.
Allow predicting on new data with t2() smoothers. #413
Add priors for breakpt() and logistic() parameters. #403
Add priors on time-varying SD parameters (sigma_V).
Add cAIC() for calculating conditional AIC. Theory based on
https://arxiv.org/abs/2411.14185; also see
https://doi.org/10.1002/ecy.4327. J.T. Thorson wrote the function code.
EDF (effective degrees of freedom) will ultimately be further split
(e.g., split by smoothers) and added to summary.sdmTMB(). #383 #387
Add EDF (effective degrees of freedom) printing to smoothers with
print.sdmTMB() and summary.sdmTMB(). Set argument edf = TRUE.
E.g. print(fit, edf = TRUE). #383 #387
At experimental function get_index_split(), which takes care of
splitting a prediction grid by time, undoing the prediction and
area-integration index calculations for each chunk to save memory.
Add newdata argument to simulate.sdmTMB(). This enables simulating on
a new data frame similar to how one would predict on new data.
Add mle_mvn_samples argument to simulate.sdmTMB(). Defaults to "single".
If "multiple", then a sample from the random effects is taken for each
simulation iteration.
Allow for specifying only lower or upper limits. #394
sdmTMB_cv() gains a tidy() and print() method for output. #319
simulate.sdmTMB() method now has an return_tmb_report argument.
Add forecasting and presence-only article vignettes. See https://sdmTMB.github.io/sdmTMB/articles/
Add vignette on multispecies models with sdmTMB (or any case where one wants additional spatial and or spatiotemporal fields by some group). See https://sdmTMB.github.io/sdmTMB/articles/
Add a useful error if memory error occurs on index calculation.
Fix bug in a check in make_mesh() around if coordinates look
overly large. #427
Re-enable bias correction for get_cog() (get center of gravity).
Add check for Inf/-Inf values before fitting. #408
Add linear component of smoothers to tidy(). #90
Add time varying AR(1) correlation to tidy() and print(). #374
Warn if parameter limits are set with newton_loops > 0. #394
Fix bug in est column when predicting on new data with Poisson-link
delta models with type = "link" and re_form = NA. #389
Fix bug in s95 parameter reporting from the tidy() method. s95 is
present in the logistic threshold models. The model itself was fine but the
s95 parameter was supposed to be reported by tidy() as a combination of two
other parameters. This also affected the output in print()/summary().
Add progress bar to simulate.sdmTMB(). #346
Add AUC and TSS examples to cross validation vignette. #268
Add model (linear predictor number) argument to coef() method. Also,
write documentation for ?coef.sdmTMB. #351
Add helpful error message if some coordinates in make_mesh() are NA. #365
Add informative message if fitting with an offset but predicting with offset
argument left at NULL on newdata. #372
Fix passing of offset argument through in sdmTMB_cv(). Before it was being
omitted in the prediction (i.e., set to 0). #372
Fig bug in exponentiate argument for tidy(). Set conf.int = TRUE as
default. #353
Fix bug in prediction from delta_truncated_nbinom1() and
delta_truncated_nbinom2() families. The positive component
needs to be transformed to represent the mean of the untruncated
distribution first before multiplying by the probability of a non-zero.
Thanks to @tom-peatman #350
Add option for area to be passed in as the name of a column in the
data frame to be used for area weighting. Used in get_index(),
get_cog(), get_eao(), etc.
Pass several arguments to DHARMa::plotQQunif().
Add silent option in simulate.sdmTMB(). Setting it to FALSE allows
monitoring simulations from larger models.
Fix bug in est_non_rf1 and est_non_rf2 columns when all the following
conditions were true:
Fix delta-gamma binomial link printing for type = 'poisson-link' #340
Add suggestion to use an optimized BLAS library to README.
Add warning if it's detected that there were problems reloading (e.g., with
readRDS()) a fitted model. Simultaneously revert the approach to
how reloaded models are reattached.
Move log_ratio_mix parameter to 2nd phase with starting value of -1 instead
of 0 to improve convergence.
Fix bugs for nbinom1() and nbinom2_mix() simulation.
Allow profile argument in the control list to take a character vector of
parameters. This move these parameters from the outer optimization problem to
the inner problem (but omits from the from the Laplace approximation). See
documentation in TMB. This can considerably speed up fitting models with many
fixed effects.
Add theoretical quantile residuals for the generalized gamma distribution. Thanks to J.C. Dunic. #333
Add "poisson-link" option to delta-mixture lognormal.
Fix bug in simulation from Poisson-link delta models.
Simplify the internal treatment of extra time slices (extra_time). #329
This is much less bug prone and also fixes a recently introduced bug. #335
This can slightly affect model results compared to the previous approach if
extra time was used along with smoothers since the 'fake' extra data
previously used was included when mgcv determined knot locations for
smoothers.
Overhaul residuals vignette ('article') https://sdmTMB.github.io/sdmTMB/articles/residual-checking.html including brief intros to randomized quantile residuals, simulation-based residuals, 'one-sample' residuals, and uniform vs. Gaussian residuals.
Add check if prediction coordinates appear outside of fitted coordinates. #285
Fix memory issue with Tweedie family on large datasets. #302
Add experimental option to return standard normal residuals from
dharma_residuals().
Make simulate.sdmTMB() not include extra_time elements.
Improved re-initialization of saved fitted model objects in new sessions.
Fix important bug in simulate.sdmTMB() method for delta families where
the positive linear predictor was only getting simulated for observations
present in the fitted data.
Add new "mle-mvn" type to residuals.sdmTMB() and make it the default.
This is a fast option for evaluating goodness of fit that should be better
than the previous default. See the details section in ?residuals.sdmTMB
for details. The previous default is now called "mvn-eb" but is not
recommended.
Bring dharma_residuals() back over from sdmTMBextra to sdmTMB. Add a new
option in the type argument ("mle-mvn") that should make the
simulation residuals consistent with the expected distribution.
See the same new documentation in ?residuals.sdmTMB. The examples
in ?dharma_residuals illustrate suggested use.
Fix bug in sanity() where gradient checks were missing abs() such that
large negative gradients weren't getting caught. #324
Return offset vector in fitted object as an element. Ensure any extra time
rows of data in the data element of the fitted object do not include the
extra time slices.
Add experimental residuals option "mle-mvn" where a single approximate posterior sample of the random effects is drawn and these are combined with the MLE fixed effects to produce residuals. This may become the default option.
Add the generalized gamma distribution (thanks to J.T. Thorson with additional
work by J.C. Dunic.) See gengamma(). This distribution is still in a testing
phase and is not recommended for applied use yet. #286
Detect possible issue with factor(time) in formula if same column name is used
for time and extra_time is specified. #320
Improve sanity() check output when there are NA fixed effect standard
errors.
Set intern = FALSE within index bias correction, which seems to be
considerably faster when testing with most models.
Fix a bug likely introduced in July 2023 that caused issues when
extra_time was specified. This is an important bug and models fit with
extra_time between that date (if using the GitHub version) and v0.4.2.9004
(2024-02-24) should be checked against a current version of sdmTMB
(v0.4.2.9005 or greater). On CRAN, this affected v0.4.0 (2023-10-20) to
v0.4.2. Details:
extra_time works by padding the data
with a fake row of data for every extra time element (using the first row of
data as the template). This is supposed to then be omitted from the
likelihood so it has no impact on model fitting beyond spacing
time-series processes appropriately and setting up internal structures for
forecasting. Unfortunately, a bug was introduced that caused these fake data
(1 per extra time element) to be included in the likelihood.Fix bug in get_cog(..., format = "wide") where the time column was
hardcoded to "year" by accident.
Poisson-link delta models now use a type argument in delta_gamma() and
delta_lognormal(). delta_poisson_link_gamma() and
delta_poisson_link_lognormal() are deprecated. #290
Delta families can now pass links that are different from the default
"logit" and "log". #290
Force rebuild of CRAN binaries to fix issue with breaking Matrix ABI change
causing NaN gradient errors. #288 #287
Fix crash in if sdmTMB(..., do_index = TRUE) and extra_time supplied along
with predict_args = list(newdata = ...) that lacked extra_time elements.
Allow get_index() to work with missing time elements.
Add the ability to pass a custom randomized quantile function qres_func
to residuals.sdmTMB().
Add check for factor random intercept columns in newdata to avoid a crash.
#278 #280
Improve warnings/errors around use of do_index = TRUE and get_index()
if newdata = NULL. #276
Fix prediction with offset when newdata is NULL but offset is
specified. #274
Fix prediction failure when both offset and nsim are provided and
model includes extra_time. #273
Fix memory issues detected by CRAN 'Additional issues' clang-UBSAN, valgrind.
Fix a bug predicting on new data with a specified offset and extra_time.
#270
Add warning around non-factor handling of the spatial_varying formula. #269
Add experimental set_delta_model() for plotting delta models with
ggeffects::ggpredict() (GitHub version only until next CRAN version).
Move add_barrier_mesh() to sdmTMBextra to avoid final INLA dependency. https://github.com/sdmTMB/sdmTMBextra
Switch to using the new fmesher package for all mesh/SPDE calculations. INLA is no longer a dependency.
Switch to diagonal.penalty = FALSE in mgcv::smoothCon().
This changes the scale of the linear component of the smoother, but
should result in the same model.
https://github.com/glmmTMB/glmmTMB/issues/928#issuecomment-1642862066
Implement cross validation for delta models #239
Remove ELPD from cross validation output. Use sum_loglik instead. #235
Turn on Newton optimization by default. #182
print() now checks sanity() and issues a warning if there may be issues. #176
Poisson-link delta models and censored likelihood distributions have been made considerably more robust. #186
Standard errors are now available on SD parameters etc. in tidy() #240
Fix bug in print()/tidy() for delta-model positive model component sigma_E. A recently introduce bug was causing sigma_E for the 2nd model to be reported as the 1st model component sigma_E.
Add new anisotropy plotting function.
Create the sdmTMBextra package to remove rstan/tmbstan helpers, which were causing memory sanitizer errors on CRAN. https://github.com/sdmTMB/sdmTMBextra
The following functions are affected:
predict.sdmTMB() now takes mcmc_samples, which is output from
sdmTMBextra::extract_mcmc().simulate.sdmTMB() now takes mcmc_samples, which is output from
sdmTMBextra::extract_mcmc().residuals.sdmTMB() now takes mcmc_samples, which is output
sdmTMBextra::predict_mle_mcmc(). This only affects
residuals(..., type = "mle-mcmc").Move dharma_residuals() to
sdmTMBextra to reduce heavy
dependencies.
See examples in the Bayesian and residuals vignettes or in the help files for those functions within sdmTMBextra.
Various fixes to pass CRAN checks. #158
Fix memory issue highlighted by Additional issues CRAN checks. #158
'offset' argument can now be a character value indicating a column name. This is the preferred way of using an offset with parallel cross validation. #165
Fix parallel cross validation when using an offset vector. #165
Add leave-future-out cross validation functionality. #156
Example data qcs_grid is no longer replicated by year to save package
space. #158
Add message with tidy(fit, "ran_pars") about why SEs are NA.
Add anisotropy to print() #157
Fix predict(..., type = "response", se_fit = TRUE), which involves issuing
a warning and sticking to link space. #140
Relax range parameter sanity() check from 1x to 1.5x the greatest
distance in the data.
Add Pearson residuals for several families. residuals(fit, type = "pearson")
Useful for checking for overdispersion with N > 1 binomial or Poisson
families, among other uses. See the overdisp_fun() function at:
https://bbolker.github.io/mixedmodels-misc/glmmFAQ.html#testing-for-overdispersioncomputing-overdispersion-factor
Fix bug when using residuals() or simulate() with binomial families
specified via cbind() or weights = N. The binomial sample size wasn't
being passed through typically resulting in Inf/-Inf.
Add mixture families: gamma_mix(), lognormal_mix() and associated
delta/hurdle families: delta_gamma_mix(), delta_lognormal_mix(). These
families feature a mixture of two distributions with different means but
shared variance parameters.
Add delta_beta() family.
Tweak sanity() checking of standard error size.
Export previously experimental plot_anisotropy() function. The old function
is now plot_anisotropy2().
Allow passing offset data through predict.sdmTMB() via offset argument.
Switch effects = 'ran_vals' for random intercept values from tidy.sdmTMB()
to match the broom.mixed package.
Make tidy.sdmTMB() return a tibble if the tibble package is installed. Note
this could affect old code since drop = FALSE is the default for tibbles
but drop = TRUE is the default for data frames (i.e., tibbles always return
a data frame when subsetted).
Fix longstanding issue with predicting on newdata with mgcv's t2().
Previously this was disabled because of issues. It now works as expected.
Add knots argument in sdmTMB(), which is passed to mgcv. A common use
would be to specify end points in a cyclical spline
(e.g., s(x, bs = 'cc', k = 4), knots = list(x = c(1, 3, 5, 7))) when the
data don't extend fully to the boundaries that should match up.
Preparing for release on CRAN.
Add time-varying AR1 option (originally was always a random walk). See
time_varying_type argument in ?sdmTMB.
Allow prediction on newdata with missing time elements. #130
Add check for offset() (which does not work in sdmTMB, use the offset
argument instead). #131
Add check for random slopes (sdmTMB currently only does random intercepts, although slopes can vary spatially). #131
ADREPORT several parameters in natural space. https://github.com/sdmTMB/sdmTMB/discussions/113
Improve robustness of model print() to more esoteric mgcv smoothers.
Let sims_var work with multiple spatially varying slopes (zeta_s); return
output in named list by coefficients. #107
Add threshold_coefs to sdmTMB_simulate().
Don't make a fake mesh for non-spatial model (faster).
Add vignettes on visreg, ggeffects, and delta families (thanks J. Indivero!) #83 #87 #89 Forecasting and presence-only vignettes to be merged in soon.
Add support for emmeans package. See ?emmeans.sdmTMB for examples.
Add support for effects package. The ggeffects::ggeffect() function
can be used to make fast marginal effects plots. ggeffects::ggpredict()
works with a custom fork of ggeffects. A pull request will be made shortly.
#101
Add vcov(), fixef(), df.residual(), formula(), terms(), and
model.frame() methods.
Add support for "cloglog" link. Code adapted from glmmTMB for robust
likelihood implementation.
For delta models, by default share the anisotropy parameters as in VAST.
Separate anisotropy (old behavior) can be estimated with
control = sdmTMBcontrol(map = list(ln_H_input = factor(c(1, 2, 3, 4))))
Add experimental do_index, predict_args, and index_args in sdmTMB().
These can be used to perform prediction and index calculation at the same
time as fitting. For very large datasets or meshes this can save time
compared to fitting, predicting, and index calculation in 3 separate steps
since the TMB AD object doesn't have to be rebuilt. This will somewhat slow
down the initial fitting.
Remove max_gradient and bad_eig from get_index() output.
Use unique locations on prediction for huge speedups on large newdata
gridded data.
Fix bug where in rare cases get_index() would return gibberish small values.
Add bayesian argument, which when TRUE adds Jacobian adjustments for
non-linear transformed parameters. This should be TRUE if the model
will be passed to tmbstan, but FALSE otherwise. #95
Add experimental and not-yet-exported sdmTMB:::plot_anisotropy2().
Add many anisotropy, delta model, and index calculation unit tests.
Enable random walk random field TMB simulation in sdmTMB_simulate().
Add check for irregular time with AR1 or random walk processes.
Fix bugs introduced by delta model code (offsets with extra_time and
threshold model prediction).
Fix bug in sanity() message with small random field SDs.
Add support for 'delta' (or 'hurdle') models. See examples and documentation
in ?sdmTMB. This has resulted in a substantial restructuring of the
internal model code. By default both model components (e.g., binomial & Gamma)
share the same formula, spatial, and spatiotemporal structure, but these
can be separated by supplying argument values in lists where the first
element corresponds to the first model and the second element corresponds to
the second model (with some limitations as described in ?sdmTMB
documentation 'Details').
Add support for multiple spatially varying coefficients (used to be limited to a single variable).
Add compatibility with the 'visreg' package for visualizing conditional
effects of parameters. See ?visreg_delta for examples.
Add MCMC residual type to residuals.sdmTMB(). These are a 'better' residuals
but slower to calculate. See documentation 'Details' in ?residuals.sdmTMB.
Make offset an argument in sdmTMB(). Using the reserved word offset in
the formula is now deprecated.
Add sanity() function to perform some basic sanity checks on model fits.
Make an sdmTMB() model object compatible with update() method.
Remove several deprecated arguments.
Overhaul examples in ?sdmTMB.
Use faster "low-rank sparse hessian bias-correction" TMB bias correction.
Add parallel processing support. See parallel argument in sdmTMBcontrol.
By default, grabs value of sdmTMB.cores option. E.g.
options(sdmTMB.cores = 4). Only currently enabled on Mac/Linux.
Using too many cores can be much slower than 1 core.
Use 'cli' package cli_abort()/cli_warn()/cli_inform() over
stop()/warning()/message().
Add many unit tests.
poly(..., raw = FALSE) on newdata. #77Add experimental sdmTMB_stacking() for ensemble model stacking weights.
Add fake mesh if random fields are all off. #59
Make predict(..., newdata = NULL) also use last.par.best instead of
last.par to match newdata = df.
Fix bug in MVN fixed-effect prior indexing
sims and n_sims arguments have been deprecated and standardized
to nsim to match the simulate() S3 method.
Bias correction on get_index() and get_cog() is now selective and
is just applied to the necessary derived parameters.
INLA projection matrix 'A' is now shared across spatial and spatiotemporal fields.
Add add_utm_columns() to ease adding UTM columns.
Add dharma_residuals().
Fix bug in simulate.sdmTMB() and residuals.sdmTMB() for binomial family.
Smoothers now appear in print() output. The format should roughly match brms.
The main-effect component (e.g., sdepth for s(depth)) represents the
linear component and the random effect (e.g., sds(depth)) component in
the output corresponds to the standard deviation of the penalized weights.
Add censored_poisson(link = 'log') family; implemented by @joenomiddlename
fields in sdmTMB() is now deprecated and replaced by spatiotemporal.
include_spatial in sdmTMB() is now deprecated and replaced by spatial.
spatial_only in sdmTMB() is now deprecated and replaced by spatiotemporal.
E.g. spatial_only = TRUE is now spatiotemporal = 'off' or leaving
time = NULL.
spde in sdmTMB() is now deprecated and replaced by mesh.
sdmTMB_simulate() is new and will likely replace sdmTMB_sim() eventually.
sdmTMB_simulate() is set up to take a formula and a data frame and is easier
to use if you want different spatial observations (and covariates) for each
time slice. It can also take a fitted model and modify parts of it to simulate.
Finally, this function uses TMB for simulation and so is much faster and
more flexible in what it can simulate (e.g., anisotropy) than the previous version.
spatial_trend is now spatial_varying and accepts a one-sided formula
with a single predictor of any coefficient that should varying in space as a
random field. Note that you may want to include a fixed effect for the same
variable to improve interpretability. If the (scaled) time column is used, it will
represent a local-time-trend model as before.
The Tweedie power (p) parameter is now in print() and tidy() output.
thetaf is now tweedie_p in sdmTMB_sim().
se_fit = TRUE for breakpoint models.s() are now penalized smoothers: they determine the
degree of wiggliness (as in mgcv) and it is no longer necessary to
choose an appropriate k value a priori. Models fit with previous
versions of sdmTMB with s(x, k = ...) will not match models
specified the same way in version >= 0.0.19 since the basis functions
are now penalized. All the various mgcv::s() options should be supported
but t2() (and ti() and te()) are not supported.Add ELPD (expected log predictive density) to sdmTMB_cv()
https://arxiv.org/abs/1507.04544
Fix bug evaluating ... when sdmTMB_cv() was called within a function. #54
Add random walk option: fields = "RW".
Depreciate ar1_fields argument. See new fields argument in `sdmTMB().
Many packages moved from 'Imports' to 'Suggests'
Lower default nlminb() eval.max and iter.max to 1000 and 2000.
Added profile option in sdmTMBcontrol(). This can dramatically
improve model fitting speed with many fixed effects. Note the
result is likely to be slightly different with TRUE vs. FALSE.
Added simulation from the MVN precision matrix to predict.sdmTMB().
See the sims argument.
Added gather_sims() and spread_sims() to extract parameter
simulations from the joint precision matrix in a format that
matches the tidybayes package.
Added get_index_sims() for a population index calculated from
the MVN simulation draws.
Added extract_mcmc() to extract MCMC samples if the model is
passed to tmbstan.
Added the ability to predict from a model fitted with tmbstan.
See the tmbstan_model argument in predict.sdmTMB().
Allowed for separate random field Matern range parameters for
spatial and spatiotemporal fields. E.g. sdmTMB(shared_range = FALSE)
Bounded the AR1 rho parameter between -0.999 and 0.999 to improve convergence; was -1 to 1. Please post an issue if this creates problems for your model.
Added map, start, lower, and upper options to control
model fitting. See sdmTMBcontrol().
Added priors for all parameters. See ?sdmTMB::priors and the
priors argument in sdmTMB(). PC priors are available for
the random fields. See ?pc_matern and the details there.
Moved many less-common arguments from sdmTMB() to sdmTMBcontrol().
Fix bug in sdmTMB_cv() where fitting and testing data splits
were reversed. I.e., the small chunk was fit; the big chunk was tested.
Added experimental penalized complexity (PC) prior as used in INLA.
See arguments matern_prior_O and matern_prior_E.
Added back normalize argument to sdmTMB() and default to FALSE.
Setting to TRUE can dramatically speed up some model fits
(~4 times for some test models).
Add re_form_iid to predict.sdmTMB().
Add map_rf option to sdmTMB(). This lets you map (fix at
their starting values of zero) all random fields to produce a
classic GLM/GLMM.
... + (1 | g) #34epsilon_predictor argument in sdmTMB() to allow a model of the
spatiotemporal variance through time.penalties argument to allow for regularization.Fixed parameter initialization for inverse links #35
Switched Gamma 'phi' parameter to representing shape instead of CV to match glm(), glmmTMB(), etc.
get_generic() function can be used
to grab things like standardized average values of the response across a grid.
What used to be log_total in the raw TMB output is now link_total but most
users you shouldn't notice any difference.Overhauled the simulation function. The function is now called sdmTMB_sim()
and uses INLA functions instead of RandomFields functions for simulating
the random fields.
The simulation function can now accommodate all families and links and takes an INLA mesh as input.
Added a tidy() method (from broom and broom.mixed) to return a data frame
of parameter estimates. The function can extract the fixed effects or the
random effect parameters (variances, AR1 correlation, spatial range).
Added an argument extra_time to sdmTMB(). This introduces additional time
slices that you can then predict on if you want to interpolate or forecast.
Internally, it uses Eric Ward's 'weights hack'. This is also useful if you
have data unevenly spaced in time and you want the gaps evenly spaced for a
random walk or AR1 process (add any missing years to extra_time).
make_spde() is now replaced with make_mesh() and make_spde() has been
soft deprecated. make_mesh() carries through the x and y column names to
the predict function and is more in line with the tidyverse style of taking a
data frame first.
make_mesh() can accept cutoff as an argument (as in INLA), which is
likely a better default way to specify the mesh since it scales across
regions better and is line with the literature on INLA.
make_mesh() can use a binary search algorithm to find a cutoff that best
matches a desired number of knots (thanks to Kelli Johnson for the idea).
Barrier meshes are now possible. See add_barrier_mesh() for an example.
There is a pkgdown website now that gets auto generated with GitHub actions.
There is the start of a model description vignette. It is very much a work in progress.
Fixed bug with predictions on new data in models with break points
Overhauled cross validation function. The function now:
Added threshold parameters to the print method
Added forecasting example with the weights hack
Fixed bug in linear break point models
Fixed GAM predictions with all 0s in new data.
Add linear and logistic threshold models. #17
Added parsing of mgcv formulas for splines. #16
Added ability to predict with standard errors at the population level. This helps with making marginal-effect plots. #15
Added optimization options to aid convergence. Also added
run_extra_optimization() to run these on already fit models. Default is for
no extra optimization.
Added binomial likelihood to cross validation. Git hash ee3f3ba.
Started keeping track of news in NEWS.md.