
The RTMB
package enables powerful and flexible statistical modelling with rich
random effect structures using automatic differentiation (AD). However,
its built-in support for probability distributions is limited to
standard cases. RTMBdist fills this gap by providing a
collection of non-standard, AD-compatible distributions, extending the
range of models that can be implemented and estimated with
RTMB. Most of the distributions implemented in
RTMBdist allow for automatic simulation and residual
calculation by RTMB.
The full list of distributions currently available is given in the List
of distributions vignette. There are also a couple of Worked
examples demonstrating how to use RTMBdist in
practice.
Feel free to contribute!
You can install the development version of RTMBdist from
GitHub with:
remotes::install_github("janoleko/RTMBdist")library(RTMBdist)Let’s do numerical maximum likelihood estimation with a
gumbel distribution:
# simulate data
x <- rgumbel(100, location = 5, scale = 2)
# negative log-likelihood function
nll <- function(par) {
x <- OBS(x) # mark x as the response
loc <- par[1]; ADREPORT(loc)
scale <- exp(par[2]); ADREPORT(scale)
-sum(dgumbel(x, loc, scale, log = TRUE))
}
# RTMB AD object
obj <- MakeADFun(nll, c(5, log(2)), silent = TRUE)
# model fitting using AD gradient
opt <- nlminb(obj$par, obj$fn, obj$gr)
# model summary
summary(sdreport(obj))[3:4,]
#> Estimate Std. Error
#> loc 5.001543 0.2065935
#> scale 1.960676 0.1502500Through the magic of RTMB, we can also immediately
simulate new data from the fitted model and calculate residuals:
# simulate new data
x_new <- obj$simulate()$x
# calculate residuals
osa <- oneStepPredict(obj, method = "cdf", trace = FALSE)
qqnorm(osa$res); abline(0, 1)