A formula-first Julia twin of drmTMB: the mean, the scale, and boundary probabilities of a response each take their own formula, with random effects and sparse phylogenetic structure.
bf() bundles one formula per distributional parameter your family admits, so the mean and the spread are modelled separately. The scale formula is on log σ, and the parameter is named sigma, never tau. Zero-inflation, hurdle, and zero/one-inflation parameters take formulas too.
Correlation between two responses
In the two-response bundle, rho12 takes its own formula, so residual correlation can itself depend on a covariate. It is a bivariate parameter and is not available in the univariate bundle.
Read each coefficient on its own scale
Every parameter is reported on the scale named by its link. The capability matrix says which families, structures, and sparse combinations are tested before you interpret a route.
A twin, not a port
MIT-licensed fresh code; drmTMB (GPL) stays the reference. The optional R bridge is experimental and lists its admitted engine = "julia" cells; the R-side glue lives in drmTMB, and the default R engine remains TMB.
The first question is not which optimiser to use. It is which feature of the response might change? A mean-only model asks whether the expected response changes. A distributional model can also ask whether its spread, its shape, or its boundary probabilities change. DRM.jl keeps those questions separate by giving each admitted parameter its own formula.
Given a table dat with numeric columns y and x, fit a location–scale model as below. Get started includes the complete data setup and a runnable example.
julia
using DRM# y varies in BOTH its mean and its spread with x:fit = drm(bf(@formula(y ~ x), @formula(sigma ~ x)), Gaussian(); data = dat)coef(fit, :mu) # mean coefficientscoef(fit, :sigma) # coefficients on log σ — how the spread changes with xsummary(fit) # readable coefficient table
The formula bundle bf(...) (alias drm_formula(...)) collects one formula per available distributional parameter. See Get started for a worked, runnable example, or What can I fit today? for the model-space guide and its route-specific boundaries.
The scale is modelled on the log scale
For a Gaussian fit, coef(fit, :sigma) are coefficients on log σ, the residual standard deviation. A slope of γ = 0.2 means the residual SD multiplies by exp(0.2) ≈ 1.22 per one-unit increase in x, and the residual variance by exp(0.4) ≈ 1.49. Other families keep the log link on sigma but interpret it on their own scale: for Gamma it is a coefficient of variation, for Beta it maps to a precision. The parameter is named sigma, matching drmTMB, never tau.
In the model above, DRM.jl estimates one coefficient vector for μ (the mean) and one for log σ (the residual standard deviation). A positive σ coefficient means a multiplicative increase in residual spread, not an additive change in the mean. Other families expose other admitted parameters, but the same rule holds: interpret a coefficient on the scale named by that parameter's link.
DRM.jl is a pre-release package. Use the capability matrix to choose a tested family–structure combination, and the diagnostics and validation guides to see how it was checked. The verified sparse phylogenetic engine, profile likelihood, and bootstrap routes are useful evidence — not blanket promises for every family, data set, or interval. In particular, an interval method being implemented does not claim universal calibrated coverage.
DRM.jl is the Julia twin of drmTMB: it adopts a closely related bf() grammar and vocabulary so R users do not have to relearn the model class. It is independent, MIT-licensed Julia code — not a port of drmTMB's GPL source. The optional R ↔ Julia bridge is experimental and lists the admitted engine = "julia" cells; engine = "tmb" remains the default R route and does not require Julia. The Rosetta page compares the two syntaxes directly.
MIT licensed. A sister package to drmTMB (GPL) and GLLVM.jl. DRM.jl is fresh code — never a port of drmTMB's GPL source.