Skip to contents

drmTMB 0.1.2 (2026-05-16)

  • drm_control() now has optimizer_preset = "careful" and "robust" for explicit nlminb() optimizer-budget presets. These expand to recorded iter.max and eval.max controls, keep the default fit fast, and can still be overridden with optimizer = list(...).
  • drm_control() now reserves fallback-optimizer control names such as fallback_optimizer, fallback_optimizers, and optimizer_fallback while documenting the future selected-optimizer provenance contract. Fallback BFGS or L-BFGS-B refits remain planned, not automatic.
  • drm_control() now reserves warm-start control names such as start_from, warm_start, and warm_start_from so simpler-fit starts cannot be silently passed to nlminb() before the source-fit contract is implemented.
  • check_drm() now reports the largest fixed-gradient component label in the fixed_gradient diagnostic row, making non-converged or flat-surface fits easier to triage before Hessian or Wald inference is trusted.
  • Interval documentation now separates fitted-model Wald and profile intervals from Phase 18 Fisher-z simulation helpers, and tests confirm Student-t nu fixed-effect interval targets plus Fisher-z-scale correlation-helper output.
  • meta_V(V = V) now has explicit full-matrix alias coverage with Wald fixed-effect interval checks, documentation points to it as the preferred known-covariance spelling, and meta_V(V = V, scale = "exact") now errors with guidance that the exact additive route is already selected by meta_V(V = V).
  • Bergmann-report follow-up now hardens invalid Wald standard-error rows, clarifies that univariate sigma ~ phylo(...) is not yet fitted, documents long-iteration triage, and tests the labelled q4-to-two-q2 block-diagonal fallback.
  • Structural-dependence docs now give a clearer user surface for planned animal() and relmat() models, including what fitted sensitivity model to use now and when a known matrix belongs to meta_V(V = V) instead of a future latent relatedness path.
  • Structural-dependence design notes now separate dense covariance inputs (A, K) from sparse precision inputs (Ainv, Q) for future animal() and relmat() models, keeping large-pedigree or large-matrix speed claims blocked until sparse-precision recovery and scaling evidence exists.
  • The family registry now has a Slice 283 family-and-parameter evidence map, listing each public family route, distributional-parameter link, shape or coscale slot, fitted random-effect allowance, and test evidence state before later count, proportion, shape, ordinal, or mixed-response hardening work expands those rows.
  • Count-family tests now assert Wald fixed-effect interval rows for Poisson, NB2, zero-truncated NB2, zero-inflated Poisson, zero-inflated NB2, and hurdle NB2 dpars, and the count tutorial now names ordinary non-zero-inflated Poisson/NB2 mu random intercepts and independent slopes as the current fitted mixed-count route.
  • Proportion-family tests now assert Wald fixed-effect interval rows for beta and beta-binomial mu and sigma coefficients, and the proportion tutorial now states that fixed-effect beta() and beta_binomial() are fitted while zoi/coi, zero-one-inflation, random effects, and meta_V(V = V) bounded-response routes remain planned or blocked.
  • Continuous-shape design notes now separate fitted fixed-effect Student-t nu, planned fixed-effect skew-normal nu, planned skew-t nu/tau, and future latent-effect skew(id) ~ ..., keeping shape and skewness random effects out of Phase 18 simulation until likelihood, recovery, diagnostic, and interval evidence exists.
  • Ordinal readiness docs now record the fixed-effect cumulative_logit() evidence ledger: likelihood, category probabilities, prediction, expected-score summaries, simulation, fixed-effect Wald intervals, internal cutpoint profile targets, malformed inputs, and unsupported random-effect boundaries are covered, while ordinal mixed models and scale/discrimination formulas remain planned.
  • Mixed-response bivariate family docs now keep Gaussian-count, Gaussian-proportion, count-proportion, ordinal mixed, and other two-response combinations planned until a joint likelihood or copula/latent-variable contract, prediction, simulation, extractors, intervals, examples, and comparator checks exist; tests cover mixed-family errors for c() and list() spellings.
  • corpairs() now returns conf.status and interval_source columns by default, matching the prediction-table provenance contract. plot_corpairs() now draws finite bounds only when those columns mark a real interval source, so compatible pair tables cannot imply confidence intervals from bare numeric limits alone.
  • User-facing docs now share a status vocabulary for stable, first slice, opt-in, planned or reserved, and unsupported or blocked surfaces across README, the model-map article, the package reference topic, getting-started article, source-map guidance, and pkgdown reference groups.
  • The pre-simulation readiness matrix now includes a Slice 291 evidence-ledger gate: every public stable-core row is mapped to implementation evidence, tests or diagnostics, user-facing boundaries, and Phase 18 admission status before comprehensive simulation design can treat it as admitted.
  • The Phase 18 simulation programme now has a Slice 292 comprehensive design map covering continuous, proportion, count, ordinal, meta-analysis, bivariate, random-slope, shape, phylogenetic, spatial, animal(), and relmat() lanes, while keeping planned or blocked lanes in the failure ledger instead of fitted grids.
  • Phase 18 now has its first one-page ADEMP sheet for the admitted Gaussian location-scale lane, tying the existing phase18_dgp_gaussian_ls() helper to aims, DGP conditions, estimands, methods, performance measures, and Williams-style reporting checks before larger grids run.
  • Phase 18 now has a one-page ADEMP sheet for the admitted Gaussian meta_V(V = V) lane, keeping known sampling covariance as input data and public residual sigma as the fitted heterogeneity estimand before vector or dense known-V grids expand.
  • Phase 18 now has a one-page ADEMP sheet for the paired Poisson/NB2 mu random-effect lane, keeping the first count grid to ordinary non-zero-inflated mu random intercepts and independent numeric slopes while zero-inflated, hurdle, zero-truncated, structured, correlated-slope, and labelled covariance count models remain failure-ledger rows.
  • Phase 18 now has a one-page ADEMP sheet for the fixed-effect proportion lane, separating strict continuous beta() responses from denominator-aware beta_binomial() success counts while keeping exact 0/1 boundary mass, zoi/coi, random effects, structured effects, known sampling covariance, and mixed-response bounded models in the failure ledger.
  • Phase 18 now has a one-page ADEMP sheet for the fixed-effect ordinal lane, defining cumulative-logit category probabilities, cutpoint recovery, expected-score summaries, and malformed-input boundaries while keeping ordinal random effects, scale/discrimination formulas, cutpoint-specific predictors, bivariate ordinal models, and mixed-response ordinal models in the failure ledger.
  • Phase 18 now has a one-page ADEMP sheet for the bivariate Gaussian residual rho12 lane, defining the response-specific mean and scale DGP, residual covariance matrix, response-scale rho12 grids, and boundary diagnostics while keeping group-level corpairs(), structured correlations, known sampling covariance, random effects in rho12, mixed-response families, and bivariate random slopes in separate design or failure-ledger lanes.
  • Bivariate random-slope combination boundaries now have focused error coverage for matching slope-only mu1/mu2 blocks, intercept-plus-slope location q=4 requests, residual-scale slope pairs, same-response location-scale slope combinations, and all-four q=8-style slope requests.
  • Structured random-slope boundaries now have parser and fit-time audit coverage: one-slope animal() and relmat() markers are readable as planned grammar, and multiple structured slopes are rejected. Only coordinate spatial Gaussian mu one-slope models are fitted for Phase 18 admission.
  • Shape and inflation random-effect boundaries now have random-slope-specific test coverage: Student-t nu, zero-inflation zi, hurdle hu, and planned bounded-response zoi/coi random slopes still error before fitting, so Phase 18 will not treat those paths as implemented.
  • Gaussian sigma random-effect documentation now states the independent residual-scale slope boundary more explicitly: separate terms such as sigma ~ z + (0 + w_id | id) + (0 + w_site | site) are fitted with direct log_sd_sigma profile targets, while correlated residual-scale slope blocks remain planned.
  • Ordinary Gaussian mu random-slope documentation now states the q > 2 boundary more explicitly: multi-slope blocks such as (1 + x1 + x2 + x3 | id) are fitted, their SDs are direct profile targets, and their block correlations are derived-unavailable for direct profile intervals until a dedicated interval method exists.
  • Phase 18 now has a pre-simulation capability audit table that records implemented, tested, planned, and unsupported status for Gaussian, non-Gaussian, shape, inflation, bivariate, random-slope, meta-analysis, phylogenetic, spatial, animal, and relmat() model classes before broad simulation grids admit them.
  • Phase 18 now has an optional resumable replicate runner under inst/sim/ that captures warnings, errors, elapsed time, session metadata, and optional RDS output for pilot simulation cells.
  • Phase 18 now has a Simulation & Comparison plot-grammar article for bias, RMSE, coverage, power, convergence, runtime, and warning/error ledgers across continuous, proportion, count, and meta-analysis examples.
  • plot_corpairs() now has a label argument so publication figures can use short row labels while keeping full correlation metadata in the source table.
  • Phase 18 replicate results can now be reduced to a warning/error failure ledger so failed fits and warning-bearing replicates remain visible beside aggregate summaries.
  • Phase 18 saved replicate directories can now be reloaded into result lists, allowing manifests and failure ledgers to be rebuilt from RDS output after a resumable simulation run.
  • Phase 18 simulation results can now be reduced to a compact manifest table with cell id, replicate, seed, status, skipped/resumed flag, warning count, error message, and elapsed time.
  • Phase 18 summary-smoke helpers now return run manifests and warning/error ledgers beside aggregate bias, RMSE, and MCSE tables.
  • Developer design notes now include ASReml efficiency lessons for future animal() and relmat() work, emphasizing sparse precision matrices, explicit row-name matching, matrix-orientation metadata, and honest speed claims.
  • nbinom2() now supports ordinary non-zero-inflated mu random intercepts and independent numeric random slopes such as bf(count ~ x + (1 | id) + (0 + x | id), sigma ~ z). The fitted SDs appear in sdpars$mu, random_effects$mu, and direct profile_targets() rows, while correlated or labelled NB2 slope blocks, NB2 sigma random effects, and zero-inflated NB2 random effects remain planned.
  • Phase 18 now includes a smoke simulation report template under inst/sim/reports/, giving pilot surfaces a reader-facing structure for purpose, aggregate summaries, reader checks, and interpretation boundaries.
  • Phase 18 now has a Gaussian mu q=3 random-slope smoke surface under inst/sim/, covering seeded data generation, drmTMB() fitting for (1 + x1 + x2 | id), parameter summaries, aggregate output, manifests, and failure ledgers.
  • Phase 18 now has a Gaussian sigma independent random-slope smoke surface under inst/sim/, covering seeded data generation, drmTMB() fitting for sigma ~ z + (0 + w | id), parameter summaries, aggregate output, manifests, and failure ledgers.
  • Phase 18 now has a structured-slope parity gate: coordinate spatial one-slope Gaussian mu models are fitted enough for focused smoke grids, while phylogenetic, animal, and relmat() one-slope models remain planned until their implementation, diagnostics, profile targets, recovery tests, and biological examples exist.
  • Phase 18 now has a cross-distributional-parameter correlation gate: residual rho12, constant fitted random-effect block correlations, predictor-dependent q=2 corpair() routes, and known sampling covariance V remain separate layers, while non-Gaussian, slope-level, shape, inflation, hurdle, one-inflation, and rho12 random-effect covariance surfaces stay outside Wave A until focused gates close.
  • Phase 18 now has a coordinate spatial Gaussian mu one-slope smoke surface under inst/sim/, covering seeded data generation, drmTMB() fitting for spatial(1 + x | site, coords = coords), parameter summaries, aggregate output, manifests, and failure ledgers.
  • Phase 18 now has a non-zero-inflated Poisson mu random-effect smoke surface under inst/sim/, covering seeded data generation, drmTMB() fitting for (1 | id) + (0 + x | id), parameter summaries, aggregate output, manifests, and failure ledgers.
  • Phase 18 non-zero-inflated Poisson mu random-effect smoke output now includes Wald interval rows and coverage summaries for fixed log-mean coefficients, while random-effect SD rows remain visible as missing-SE interval rows until profile producers are attached.
  • Phase 18 non-zero-inflated Poisson mu random-effect smoke output now includes direct profile-likelihood interval rows and coverage summaries for the fitted random-intercept and independent random-slope SD targets.
  • Phase 18 now has a non-zero-inflated NB2 mu random-effect smoke surface under inst/sim/, covering seeded data generation, drmTMB() fitting for (1 | id) + (0 + x | id) with fixed-effect sigma ~ z overdispersion, parameter summaries, aggregate output, manifests, and failure ledgers.
  • Phase 18 non-zero-inflated NB2 mu random-effect smoke output now includes Wald interval rows and coverage summaries for fixed log-mean and log-overdispersion coefficients, while random-effect SD rows remain visible as missing-SE interval rows until profile producers are attached.
  • Phase 18 non-zero-inflated NB2 mu random-effect smoke output now includes direct profile-likelihood interval rows and coverage summaries for the fitted random-intercept and independent random-slope SD targets.
  • NB2 mu random effects now have a focused weak-SD boundary diagnostic test, exercising check_drm() lower-boundary reporting for a near-zero fitted random-intercept SD before larger Phase 18 grids vary the true SD.
  • Phase 18 Poisson and NB2 mu random-effect condition helpers now build true crossed condition grids, including random-effect SDs and, for NB2, overdispersion settings.
  • Phase 18 now has a paired count-family mu random-effect pilot helper that combines ready Poisson and NB2 surfaces into one optional aggregate, manifest, failure-ledger, Wald-coverage, and profile-coverage output.
  • Phase 18 now has a plot-data helper for paired Poisson/NB2 mu random-effect pilot outputs, preparing aggregate, coverage, manifest, and failure tables for later figure-gallery work.
  • Phase 18 now has a count-pilot figure-gallery report template for bias, RMSE, interval coverage, manifests, and warning/error ledgers from paired Poisson/NB2 mu random-effect pilots.
  • Phase 18 now has count-pilot gallery helper plumbing that writes plot-ready CSV inputs and renders a checked local HTML gallery artifact from a paired Poisson/NB2 mu random-effect pilot object.
  • Phase 18 now has an end-to-end count-gallery smoke runner that executes a tiny paired Poisson/NB2 mu random-effect pilot and renders the Florence-facing HTML gallery from the resulting tables.
  • The Phase 18 count-pilot gallery now has a first Florence visual-polish pass, with horizontal estimand labels, shared palette/theme helpers, captions, and MCSE-aware coverage ranges when available.
  • The figure gallery now has a Florence visual-repair pass: confidence distributions render as compact confidence clouds for mu and sigma temperature effects, tutorial plots share explicit palettes, discrete comparison and empirical marginal displays no longer fall back to default black styling, status-strip labels have better contrast, and the simulation bias panel uses raincloud-style replicate clouds plus mean/MCSE intervals instead of misleading lines across unrelated estimands.
  • The Simulation & Comparison plot-grammar article now carries the raincloud lesson into the Phase 18 simulation lane: bias displays show replicate-level errors plus mean/MCSE intervals in fixed surface facets, while RMSE keeps a separate aggregate point/MCSE panel instead of being visually collapsed with signed bias or mistaken for a mean absolute-error cloud.
  • The Phase 18 count-pilot gallery now follows the same accuracy-display contract: bias and RMSE use fixed family facets, show MCSE intervals when available, and explain that replicate-error clouds require replicate-level output rather than aggregate CSVs alone.
  • The figure gallery now keeps correlation layers visually separate, with faceted residual rho12, ordinary group, and phylogenetic corpairs()-style rows plus planned boundaries for spatial, animal, and relmat() layers.
  • The figure gallery now includes a source-map table that maps each display to its fitted object or fixture, extractor or plotter, interval source, and current support boundary.
  • The figure gallery now shows the supported fixed-effect univariate mu emmeans route, including factor-conditioned and interaction grids, an empirical marginal_parameters() summary, and unsupported boundaries for non-mu or blocked emmeans targets.
  • The figure gallery now separates residual sigma, ordinary group-level SDs, conditional random-slope deviations, and fitted sd(site) surfaces, with unavailable random-effect SD intervals shown as an explicit plotting boundary.
  • The visualization grammar now records the Florence closeout: plot_parameter_surface() and plot_corpairs() remain the exported helpers, most gallery-specific displays stay as ggplot2 recipes, and simulation or failure-ledger helpers wait for stable Phase 18 result schemas.
  • The figure gallery now includes distributional-parameter panels for mu, sigma, Student-t nu, zero-inflation probability zi, and residual rho12, with explicit response-scale labels and interval provenance.
  • The pkgdown site now includes a user-facing figure gallery for model interpretation plots, confidence bands, correlation displays, random-effect scale surfaces, and simulation operating-characteristic figures.
  • The pkgdown site now includes an improving-convergence guide explaining when the default optimizer budget is enough, how to use drm_control(optimizer = ...), how to interpret check_drm() rows, and when to separate optimization from Wald uncertainty with se = FALSE.
  • Phase 18 now has a pre-simulation readiness matrix that separates fitted, smoke-tested, interval-ready, weak-boundary-tested, planned, and blocked surfaces before broad simulation reports are written.
  • Phase 18 now has a meta_V(V = V) summary-smoke runner that executes vector and dense known-covariance pilot replicates and returns grouped bias, RMSE, and Monte Carlo error summaries.
  • Phase 18 now has a Gaussian location-scale summary-smoke runner that executes two or more pilot replicates and returns grouped bias, RMSE, and Monte Carlo error summaries from the smoke output.
  • Phase 18 now has Monte Carlo uncertainty helpers for simulation summaries, including MCSEs for mean error, RMSE, proportions, and explicit interval-coverage summaries when lower and upper interval columns are present.
  • Phase 18 now has a synthetic interval-coverage smoke helper for testing coverage-table plumbing before Wald, profile, or bootstrap interval methods are attached.
  • Phase 18 smoke reports can now display optional aggregate, manifest, and warning/error ledger CSVs while still rendering when those files are not supplied.
  • Phase 18 smoke report rendering is now covered by a skip-aware test with tiny aggregate, manifest, and warning/error ledger CSV fixtures.
  • Phase 18 interval work now has a producer contract for Wald, profile, and bootstrap interval tables, including reported scale, method, status, and correlation-scale rules.
  • Phase 18 now has a Fisher-z back-transformed Wald interval helper for correlation summaries, complementing raw-correlation Wald intervals from the generic helper.
  • Phase 18 now has a generic Wald interval-table helper for parameter summaries that already contain estimates and standard errors, recording interval method, reported scale, status, and failure messages.
  • Phase 18 now has a small aggregation helper for simulation parameter summaries, reporting replicate counts, bias, RMSE, absolute error, empirical standard error, convergence rate, Hessian rate, warning rate, and elapsed time by explicit grouping columns.
  • Phase 18 now has a first end-to-end meta_V(V = V) smoke runner under inst/sim/run/, covering vector and dense known sampling covariance cells through DGP, drmTMB() fit, saved RDS output, and combined parameter summaries.
  • Phase 18 meta_V(V = V) pilot summaries now carry standard errors for estimated mu coefficients and response-scale fitted residual sigma, while keeping known sampling covariance V out of interval targets.
  • Phase 18 meta_V(V = V) summary-smoke output now includes Wald interval rows and coverage summaries for estimated mu coefficients and fitted residual sigma.
  • Phase 18 now has a first end-to-end Gaussian location-scale smoke runner under inst/sim/run/, wiring the cell registry, seeded DGP, drmTMB() fit, pilot summariser, saved RDS output, and combined parameter table for one small surface.
  • Phase 18 Gaussian location-scale pilot summaries now carry fixed-effect standard errors when the fitted model exposes them, preparing that surface for real Wald interval coverage checks.
  • Phase 18 Gaussian location-scale summary-smoke output now includes formula-coefficient Wald interval rows and coverage summaries.
  • Phase 18 now has a Gaussian meta-analysis meta_V(V = V) simulation pilot covering vector and dense known sampling covariance, including smoke tests that keep known V out of interval targets.
  • Phase 18 now has a Gaussian location-scale simulation pilot: optional inst/sim/ helpers generate mu ~ x, sigma ~ z data and summarise one fitted model into a truth/estimate/error table.
  • Phase 18 now has an optional inst/sim/ skeleton with reproducible seed-table and cell-registry helpers plus a CRAN-safe smoke test for simulation-run bookkeeping.
  • Phase 18 now has an ADEMP-style simulation-programme blueprint in docs/design/41-phase-18-simulation-programme.md, including first-wave surfaces, estimands, methods, performance measures with Monte Carlo uncertainty, and the next three implementation slices.
  • The meta-analysis tutorial and design examples now use meta_V(V = V) as the preferred known sampling covariance spelling, with meta_known_V(V = V) described only as a compatibility alias.
  • meta_V() interval safety is now tested for Gaussian meta-analysis fits: profile_targets() keeps estimated sigma, random-effect SD, and bivariate rho12 targets visible while never treating known sampling covariance V as an estimated confidence-interval target.
  • meta_V() now gives a clearer reserved-boundary error for proportional sampling-variance arguments such as meta_V(w = w, scale = "proportional"), meta_V(w = w), or meta_V(V = V, scale = "exact"). Diagonal/vector meta_V(V = V) can still use ordinary likelihood weights, while full matrix-V fits reject non-unit weights until joint-block weighting has a separate design.
  • meta_V(V = V) is now accepted as the preferred additive known sampling covariance marker for Gaussian meta-analysis, routing to the same likelihood path as meta_known_V(V = V). The proportional branch meta_V(w = w, scale = "proportional") remains deliberately unimplemented and errors before fitting.
  • Slice 204 now records the meta_V() API decision: the preferred additive known-covariance spelling is meta_V(V = V), without a positional response/value argument, and meta_known_V(V = V) is retained as a compatibility alias rather than a separate likelihood path.
  • Slice 203 now records the post-202 Phase 17 return block for meta-analysis hardening. The next targets are the preferred meta_V(V = V) spelling and compatibility story, additive vector/matrix known V, proportional-variance design boundaries, interval safety, and reader examples.
  • The Slice 202 pre-simulation gate now keeps broad Phase 18 comprehensive simulation closed until the post-202 Phase 17 hardening block is complete. A narrow Poisson mu random-effect pilot simulation is allowed, but meta-analysis hardening around meta_V()/known V, interval safety, and reader-facing examples should come before broad simulation claims.
  • Focused Poisson random-effect recovery now includes a factor-predictor random-intercept case and a weak-SD boundary case. These tests keep ordinary non-zero-inflated Poisson mu random effects inside the Phase 17/18 gate while leaving NB2, zero-inflation, scale, shape, ordinal, and structured non-Gaussian random effects as planned work.
  • The validation-debt register now contains a Slice 201 non-Gaussian failure ledger. It names the convergence, boundary, identifiability, interval, and runtime risks that Phase 18 should measure or exclude before broad simulation claims are made.
  • animal() and relmat() are now exported and documented as planned structured-effect markers, giving the reference index the intended animal -> phylo -> spatial -> lower-level known-dependence path while keeping gr() as a reserved legacy marker. These markers are parsed for roadmap examples and rejected by drmTMB() until fitted likelihood, diagnostics, profile-target, and recovery-test evidence exists (#147).
  • summary(conf.int = TRUE) now handles fitted non-Gaussian models whose summary has no parameter rows to receive intervals, including cumulative-logit ordinal models. Wald fixed-effect intervals are still reported where fixed effects exist, and empty coefficient or parameter tables keep explicit interval-status columns instead of erroring.
  • The model map, family chooser, and structural-dependence article now teach the structural-dependence ladder in biological order: animal(), phylo(), spatial(), combined phylogenetic-plus-spatial models, and lower-level relmat() known-dependence matrices. The same pages keep the non-Gaussian random-effect boundary visible before the comprehensive simulation phase.
  • Shape random effects now have a dedicated unsupported-boundary message and Student-t test gate. Current Student-t nu formulas remain fixed-effect tail-shape models; future skew-normal and skew-t asymmetry parameters must pass fixed-effect likelihood recovery before nu/tau random effects or ID-level skew(id) ~ x style models are added.
  • Poisson mu now supports ordinary unlabelled random intercepts and independent numeric random slopes for non-zero-inflated Poisson models, such as (1 | group) and (0 + x | group) on the log-mean predictor. The fitted SDs appear in sdpars$mu, ranef()/random_effects$mu, and profile_targets() as direct log_sd_mu targets; correlated Poisson random-slope blocks, labelled covariance blocks, zero-inflated Poisson random effects, and cross-parameter non-Gaussian covariance remain planned.
  • Non-Gaussian sigma random effects now have a dedicated unsupported-boundary message and test gate. Student-t, lognormal, Gamma, beta, beta-binomial, NB2, truncated NB2, and hurdle NB2 sigma formulas remain fixed-effect only until each family has likelihood, recovery, extractor, interval, and documentation evidence for scale random effects.
  • Bivariate random-slope boundary errors now distinguish the first planned slope-only mu1/mu2 target, later intercept-plus-slope q=4 location blocks, and deliberately closed all-four q=8 location-scale slope blocks before simulation evidence exists.
  • Gaussian location random-slope blocks now support ordinary unstructured numeric multi-slope mu terms such as (1 + x1 + x2 | id) and labelled variants. The first public path has q=3 recovery, sdpars$mu, corpars$re_cov, corpairs(), summary(), and profile_targets() coverage; larger q blocks are advanced fits whose sample-size cost remains a simulation target.
  • Gaussian location-scale models now fit more than one independent matched labelled mu/sigma random-intercept covariance block, for example matching (1 | p | id) and (1 | q | site) terms in both formulas. Each block reports its own corpars$mu_sigma, corpairs(class = "mean-scale"), summary(), and profile_targets() row.
  • check_drm() and profile-interval tests now cover two independent univariate mu/sigma random-intercept covariance blocks, reporting one diagnostic row per mean-scale block and confirming the second eta_cor_mu_sigma profile target.
  • Gaussian residual-scale random slopes now have an explicit multiple-independent-term boundary: sigma ~ z + (1 | id) + (0 + w1 | id) + (0 + w2 | id) fits separate log-sigma random-effect SDs with correlations fixed at zero, while correlated or labelled residual-scale slope covariance blocks remain planned.
  • Phylogenetic random-slope errors now explicitly state the structured-slope parity gap: phylo(1 + x | species, tree = tree) remains planned, while the coordinate-spatial sibling already fits one univariate Gaussian mu slope via spatial(1 + x | site, coords = coords).
  • Random-effect planning now includes a one-slope-per-layer gate before the non-Gaussian revisit, separating fitted ordinary Gaussian mu, Gaussian sigma, univariate mean-scale, bivariate intercept, phylogenetic intercept, and coordinate-spatial one-slope surfaces from the remaining Gaussian double-hierarchical limits.
  • Spatial one-slope coverage now confirms a profile-likelihood interval for the coordinate-spatial slope-field SD and keeps the fitted path limited to univariate Gaussian mu; multiple spatial slopes, spatial scale terms, and bivariate spatial syntax remain planned.
  • The double-hierarchical endpoint map now reflects the current Gaussian boundary after the random-slope gate: q > 2 ordinary mu, independent sigma slopes, multiple univariate mean-scale intercept blocks, and coordinate-spatial one-slope support are fitted, while bivariate slope, q=6/q=8 endpoint, and spatial q=4 covariance surfaces remain planned.
  • Non-Gaussian random-effect planning now has a first mu random-intercept gate: Poisson and NB2-style count likelihoods are the first candidates, while continuous, bounded, ordinal, zero-inflation, hurdle, shape, and structured non-Gaussian random-effect paths keep explicit unsupported messages until their recovery tests exist.
  • emmeans::emmeans() now supports the first narrow drmTMB path: fixed-effect univariate mu estimated marginal means with retained model frames and fixed-effect covariance available. Generic emmeans pairwise contrasts on that returned mu grid are covered by a small parity test.
  • The public emmeans::emmeans() boundary tests now confirm that transformed-response formulas such as log(y) ~ x error before an emmGrid is returned, keeping the first bridge limited to untransformed response formulas and explicit transformed-scale prediction tables through prediction_grid().
  • The public emmeans::emmeans() boundary tests now confirm that bivariate Gaussian fits error with the unsupported "biv_gaussian" model type before an emmGrid is returned, instead of falling through to a generic missing-mu message.
  • The public emmeans::emmeans() boundary tests now confirm that cumulative-logit ordinal fits still error before an emmGrid is returned, with guidance toward prediction_grid() and predict_parameters() for explicit prediction tables.
  • The public emmeans::emmeans() boundary tests now confirm that hurdle NB2 fits still error before an emmGrid is returned, with guidance toward prediction_grid() and predict_parameters() for explicit prediction tables.
  • The public emmeans::emmeans() boundary tests now confirm that zero-inflated NB2 fits error with the unsupported "zi_nbinom2" model type before an emmGrid is returned, matching the existing zero-inflated Poisson boundary.
  • The public emmeans::emmeans() boundary tests now confirm that zero-inflated Poisson fits still error before an emmGrid is returned, with guidance toward prediction_grid() and predict_parameters() for explicit prediction tables.
  • The fixed-effect univariate mu emmeans::emmeans() path now explicitly checks the type = "response" argument path, so response-scale EMMs requested directly from emmeans() must match predict(dpar = "mu", type = "response").
  • Fixed-effect prediction matrices and the first univariate mu emmeans::emmeans() bridge now preserve fitted ordered-factor coding when newdata or an emmeans reference grid supplies the same levels as an ordinary factor, so ordered polynomial columns still align with fitted coefficients.
  • Fixed-effect prediction matrices now accept character newdata values for fitted factor levels, ignore unused factor columns, and reject unknown or missing factor levels with a clear predictor-specific error before model-matrix construction.
  • Fixed-effect prediction matrices now validate that newdata supplies every predictor required by the requested distributional parameter and that required predictor values are complete before model-matrix construction.
  • Fixed-effect prediction matrices now reject non-finite numeric values such as Inf in required predictors before model-matrix construction.
  • Fixed-effect prediction matrices now reject newdata values that produce non-finite transformed-predictor columns, such as log(size) when size = 0, before returning a non-finite prediction.
  • marginal_parameters() and predict_parameters() now have explicit coverage for fitted random-effect scale model names such as sd(id), returning the random-effect-sd-model component, preserving row labels in long prediction tables, and averaging supplied direct-SD rows in marginal summaries.
  • prediction_grid() now has explicit integration coverage for fitted direct-SD predictors: grids over predictors such as w in sd(id) ~ w can feed predict_parameters(..., dpar = "sd(id)") and marginal_parameters(..., by = "w").
  • Random-effect scale predictions now accept character newdata values for fitted sd(group) factor levels and reject unknown levels with a predictor-specific error before random-effect scale model-matrix construction.
  • Random-effect scale predictions now have explicit boundary coverage for newdata containers: non-data-frame inputs error, while zero-row data frames return named length-zero numeric vectors on both link and response scales.
  • Random-effect scale predictions now have explicit coverage that multi-row newdata returns one value per supplied row, preserves rownames(newdata), uses response scale by default, and matches exp(link) when compared with type = "link".
  • Random-effect scale predictions now have explicit multiple-target coverage: when a fit includes formulas such as sd(id) ~ w_id and sd(site) ~ w_site, each requested dpar validates its own required predictors, ignores sibling-target extras, and names the missing target-specific predictor.
  • Random-effect scale predictions now validate the raw predictors required by sd(group) formulas in supplied newdata, so missing columns, missing values, and non-finite numeric values error before random-effect scale model-matrix construction.
  • Random-effect scale predictions such as predict(fit, dpar = "sd(id)", newdata = ...) now reject newdata values that produce non-finite transformed-predictor columns, such as log(w_pos) when w_pos = 0, before returning an infinite link- or response-scale SD prediction.
  • The fixed-effect univariate mu emmeans::emmeans() path now explicitly checks factor-conditioned reference grids such as emmeans(fit, ~ habitat | season, at = list(x = 0.25)), so conditional EMM rows must match predict(dpar = "mu") with the same factor levels.
  • The fixed-effect univariate mu emmeans::emmeans() path now explicitly checks interaction formulas such as habitat * x on an explicit reference grid, so conditional EMMs must match predict(dpar = "mu") at the same interaction design point.
  • The fixed-effect univariate mu emmeans::emmeans() path now explicitly checks multiple numeric at values, so conditional grids such as emmeans(fit, ~ habitat | x, at = list(x = c(-0.25, 0.75))) must match row-wise predict(dpar = "mu") on the same grid.
  • The fixed-effect univariate mu emmeans::emmeans() path now explicitly checks cov.reduce = FALSE, so EMMs that average over unreduced numeric covariate levels must match predict(dpar = "mu") averaged over the same reference grid.
  • The fixed-effect univariate mu emmeans::emmeans() path now explicitly checks custom numeric covariate reduction, so cov.reduce = stats::median must move the reference grid to median(x) rather than the default mean.
  • The fixed-effect univariate mu emmeans::emmeans() path now explicitly checks the default numeric covariate-reduction rule, so emmeans(fit, ~ habitat) must match predict(dpar = "mu") at the mean of the numeric covariate used by the reference grid.
  • The fixed-effect univariate mu emmeans::emmeans() path now has explicit parity coverage for formulas with offset(log(exposure)), so exposure-adjusted count-rate grids must match predict(dpar = "mu") on both link and response scales.
  • The fixed-effect univariate mu emmeans::emmeans() path now has explicit recover-data coverage for transformed predictors such as log(size), so reference grids supplied through at are checked against predict(dpar = "mu").
  • Bivariate, zero-inflated, hurdle, ordinal expected-score, random-effect, structured-effect, non-mu, slope, and interval-specialized emmeans targets still error before an emmGrid is returned.
  • The model-workflow article now shows the first optional emmeans::emmeans() example for fixed-effect univariate mu, keeping adjusted means separate from predict_parameters() tables and from unsupported sigma, random-effect, bivariate, zero-inflated, hurdle, ordinal, and slope workflows. Broader drmTMB-specific contrast helpers remain a separate future contract.
  • The model-workflow article now shows how to build an explicit prediction_grid() for a fitted random-effect scale model such as sd(site) ~ reef_cover, then pass that grid through predict_parameters(..., dpar = "sd(site)") and marginal_parameters(..., by = "reef_cover") without treating random-effect SDs as residual sigma or raw responses.
  • The model-map article now routes fitted random-effect SD surfaces through prediction_grid(), predict_parameters(..., dpar = "sd(group)"), and marginal_parameters(), with the random-effect-sd-model component kept separate from residual sigma.
  • predict_parameters(conf.int = TRUE) now adds Wald fixed-effect confidence intervals for supplied newdata grids when the requested distributional parameter has an ordinary fixed-effect basis. The table fills std.error, conf.low, conf.high, conf.level, conf.status = "wald", and interval_source = "wald" for supported rows, while fitted-row requests and direct random-effect scale models keep explicit unavailable interval status.
  • Installation docs now point tagged-preview users to pak::pak("itchyshin/drmTMB@v0.1.2").
  • docs/design/39-visualization-grammar.md now records the Phase 17 visualization and marginal-effects research contract. The note uses ggplot2, tidybayes, ggdist, emmeans, ggeffects, marginaleffects, diagnostic plotting packages, and figure-composition tools as design sources while keeping drmTMB data-first and dependency-light. The model-workflow article now states that predict_parameters() and marginal_parameters() are data tables that plotting helpers can consume, not plotters themselves.
  • plot_corpairs() now provides the first optional ggplot2 display for explicit corpairs() tables. It draws one point per fitted correlation row, adds interval segments only when finite conf.low and conf.high bounds have supported interval provenance, can facet by a supplied table column such as level, and keeps correlation level, class, display interval status, and interval source attached to the plotted data.
  • plot_parameter_surface() now provides the first optional ggplot2 plotting helper for long tables returned by predict_parameters(). It plots existing point estimates, keeps interval provenance columns attached to the data, and leaves EMMs, contrasts, and slope plots for later tested helpers.
  • plot_parameter_surface() now draws confidence bands for continuous x-values and interval bars for discrete x-values when the supplied table already contains finite conf.low and conf.high bounds with real conf.status and interval_source provenance. It still does not compute confidence intervals, and rows with interval_source = "not_available" remain visibly interval-free.
  • The model-workflow and model-map articles now show prediction-surface confidence bands as a table-first workflow: prediction_grid() -> predict_parameters(conf.int = TRUE) -> plot_parameter_surface(), with conf.status, conf.level, and interval_source left visible.
  • plot_parameter_surface() now labels single-parameter panels with the fitted distributional parameter and prediction scale, such as sigma estimate (response scale), while keeping the generic Estimate label when multiple parameters are plotted together.
  • prediction_grid() now builds explicit newdata grids for predict_parameters() and marginal_parameters(). The first contract supports focal predictors, supplied values, conditioned nuisance predictors, mean-reference grids, and empirical counterfactual grids while recording the grid rule as metadata.
  • The bivariate-coscale tutorial now shows a fitted corpairs() table flowing into plot_corpairs(..., facet = "level"), separating residual rho12 from group-level correlation rows in the displayed workflow.
  • docs/design/39-visualization-grammar.md now records the pre-export contract that plot_corpairs() follows: consume explicit corpairs() tables, keep correlation levels/classes visible, draw intervals only from finite confidence bounds with supported provenance, and test residual, ordinary group-level, phylogenetic, derived-unavailable, empty-table, and missing-ggplot2 cases before export.
  • The model-map article now includes a Phase 17 visualization decision table that routes raw responses, fitted parameter surfaces, empirical marginal summaries, correlations, interval tables, and diagnostics to the current data helpers before readers choose a plotting style.
  • The Reference index now makes the post-fit path explicit: fitting, checking, summaries, predictions, uncertainty, and extractors are grouped under “Model fitting and post-fit tools”, while exported plotting helpers appear under “Visualization”. The current exported plotting helpers are plot_parameter_surface() and plot_corpairs().
  • predict_parameters() and marginal_parameters() now include interval provenance columns. The first contract reports conf.status = "not_requested" and interval_source = "not_available" so downstream tables and future plots cannot imply confidence intervals that were not computed.
  • confint(), summary(), and corpairs() now reject method = "bootstrap" and method = "parametric_bootstrap" with an explicit not-yet-implemented message, keeping public interval methods limited to Wald and profile routes until a tested simulate-refit bootstrap contract exists.
  • summary() now reports delta-method standard errors for direct response-scale parameter rows, including constant sigma, residual rho12, random-effect SDs, and random-effect correlations, when TMB::sdreport() succeeds. Descriptive fitted ranges and derived variance ratios keep missing standard errors, and profile-likelihood confidence intervals remain the recommended interval route for fitted SD and correlation targets.
  • summary() profile summaries now keep fixed-effect Wald 95% confidence intervals while adding profile-likelihood 95% confidence intervals for selected direct targets such as sigma. Printed parameter tables no longer show duplicated minimum and maximum columns for constant direct parameters where those values equal the estimate.
  • The model-workflow article now includes a compact guide to reading ordinary summary() output. The guide maps coefficients, parameters, covariance, derived, and confint components to the interpretation task and then points readers to fixef(), sigma(), rho12(), ranef(), corpairs(), and profile_targets() when they need more detail.
  • The model-workflow article now shows empirical marginalization with prediction_grid(..., margin = "empirical") and marginal_parameters(..., by = "temperature"), separating conditioned prediction rows from averages over the fitted-row covariate distribution.
  • The model-workflow article now adds raw-data-plus-model display rules for Phase 17: show observed responses on the observed-response scale, draw fitted mu and sigma surfaces from an explicit predict_parameters() table, keep interval provenance visible, and do not place raw response points on sigma, sigma^2, rho12, random-effect SD, or correlation axes.
  • The Gaussian location-scale tutorial now includes a response-scale interpretation ladder for fixed mean slopes, residual-SD and residual-variance ratios, random-slope SDs, residual-scale random-slope SDs, and sd(group) slopes. It also adds a trait-named parrot beak-length equation block defining mu, sigma, body mass, forest habitat, and scale coefficients before the worked growth example. The worked growth example shows profile_targets(fit_growth) and a compact fitted translation table so readers can report mean growth, predictability, and among-group variation on the correct scale.
  • The phylogenetic-spatial tutorial is now framed as a structural-dependence route: first phylogeny, then coordinate spatial dependence, then the planned phylogeny-plus-spatial endpoint. The article defines the conceptual combined equation, names the phylogenetic and spatial SDs, and keeps simultaneous phylo() plus spatial() syntax marked as planned until multiple structural mu layers have implementation and identifiability checks.

drmTMB 0.1.1 (2026-05-10)

  • docs/design/34-validation-debt-register.md now backs the stable-core matrix with an evidence and debt ledger. Each advertised surface is marked as covered, partial, opt-in, or blocked, with tests, diagnostics, interval status, docs, and explicit debt recorded before the project expands the surface.
  • README and the “What can I fit today?” model-map article now include a stable-core feature matrix. The matrix separates stable fitted surfaces, first-slice implementations, opt-in large-data controls, and planned or rejected neighbouring syntax, with interval and diagnostic status attached to each row.
  • check_drm() now reports full-matrix meta_known_V(V = V) fits as dense known-covariance notes with retained dimension, storage, density, size, rank, and conditioning, making clear that dense known covariance is a small-to-moderate path until sparse or block-sparse V storage has implementation and benchmark evidence.
  • confint() profile rows now include lightweight profile diagnostics through profile.boundary and profile.message. Successful intervals currently report "ok" unless transformed SD intervals are close to zero or transformed correlation intervals are close to the correlation boundary; profile failure messages now explicitly point to boundary, one-sided, non-monotone, or failed-inner-optimization profiles as possible causes.
  • confint() and summary() now use an explicit conf.status column for interval output. Successful confint() rows report conf.status = "wald" or "profile", while summary(conf.int = TRUE) marks parameter rows that need newdata, are derived-only, are ready but not selected in the current call, or are unavailable for Wald intervals.
  • summary() and profile_targets() now expose the first derived variance-ratio summaries without claiming derived confidence intervals. Simple Gaussian random-intercept repeatability and univariate phylogenetic signal appear as point-estimate rows with target_type = "derived", transformation = "variance_ratio", and profile_note = "derived_target". When intervals are requested, these rows report derived_interval_unavailable; confint(..., method = "profile") fails before launching an unsupported derived profile.
  • Direct profile-likelihood intervals for random-effect SDs and correlations now have focused Slice 55 coverage across the currently fitted ordinary, phylogenetic, and coordinate-spatial surfaces. The tests verify the first spatial sd:mu:spatial(1 | site) interval, ordinary and phylogenetic constant corpairs(conf.int = TRUE) rows, bivariate phylogenetic SD and mean-mean correlation targets in summary(conf.int = TRUE, method = "profile"), and the continued separation of derived covariance intervals from direct SD/correlation intervals.
  • Row-specific profile-likelihood intervals now have focused coverage for response-scale sigma, sigma1, sigma2, residual rho12, and fitted q=2 ordinary or phylogenetic corpair() values supplied through newdata. The tests verify multi-row bivariate scale intervals, fitted latent-correlation intervals for both ordinary and phylogenetic q=2 corpair() routes, and early errors for ambiguous newdata requests such as multiple parm values, non-data-frame inputs, or empty grids.
  • profile_targets() now treats its returned table as a tested namespace contract. Target rows use controlled target_type, profile_ready, profile_note, and transformation values, and memory-light fits created with drm_control(keep_tmb_object = FALSE) now keep listing direct target names while marking them with profile_note = "tmb_object_required" instead of implying that direct profile intervals can be run.
  • confint() now wraps direct TMB::tmbprofile() calls with clearer target-specific errors. Users can still tune profile controls such as ystep, ytol, and parm.range, but drmTMB now blocks attempts to override the internal obj, name, lincomb, or trace arguments through ... and reports the profile_targets() name when profiling or profile-interval extraction fails.
  • drm_control(se = FALSE) now skips TMB::sdreport() while keeping optimized fits usable for coefficients, fitted values, residuals, prediction, simulation, log-likelihood, and profile-likelihood routes that retain fit$obj. Fits also survive sdreport() failure with fit$uncertainty$status = "failed", while summary(), vcov(), and check_drm() report the skipped or failed uncertainty state explicitly.
  • drm_control() now reserves future start, fixed-parameter map, fallback-optimizer, and multi-start control names so they cannot be silently passed to nlminb() through a plain optimizer list. Profile-likelihood calls also re-pin the TMB object to the selected opt$par before profiling, keeping mutable TMB state aligned with the chosen optimum.
  • drm_control(aggregate_gaussian = TRUE) now fits the first sufficient-statistic aggregation path for univariate Gaussian fixed-effect models. Repeated rows are grouped by processed mu and sigma design state, TMB evaluates the Gaussian likelihood with n, sum(y), and sum(y^2) cells, and fitted-row predictions and residuals remain one value per original model row. Random effects, direct-SD formulas, structured effects, known sampling covariance, bivariate models, non-Gaussian families, non-unit likelihood weights, and combined sparse fixed-effect matrices remain planned.
  • drm_control(keep_model_frame = FALSE) now also drops nested model-frame caches for direct random-effect SD models and fitted q=2 corpair() regression models after their model matrices and group metadata have been retained. This keeps the memory-light fitted-object path aligned with sd_phylo() and latent-correlation features.
  • drm_control(sparse_fixed = TRUE) now fits the first sparse fixed-effect path for univariate Gaussian mu fixed effects with intercept-only sigma. The fitted object keeps the mu design as a sparse Matrix, prediction follows the fitted sparse flag, and check_drm() reports sparse fixed-effect design matrices; random effects, known covariance, phylogenetic or spatial terms, bivariate models, non-Gaussian models, and sparse sigma remain planned.
  • bench/large-phylo-location.R now records aggregate_gaussian, requested and fitted aggregation-cell counts, aggregation compression ratio, and largest aggregation cell size, and can run a non-phylogenetic aggregation smoke benchmark with --structured none --aggregate-gaussian true --aggregation-cells 100.
  • bench/large-phylo-location.R now records structured and sparse_fixed settings and can run a non-phylogenetic sparse fixed-effect smoke benchmark with --structured none --factor-heavy true --sparse-fixed true.
  • check_drm() now includes the density of the largest retained fixed-effect design block in the fixed_effect_design_size row, making high-cardinality mostly-zero designs easier to distinguish from genuinely dense designs and confirming when a fitted object retains sparse fixed-effect matrices.
  • The optional bench/large-phylo-location.R benchmark now records the largest retained fixed-effect design block, its column count, nonzero count, and density, and bench/summarize-results.R includes those fields when present.
  • Univariate Gaussian phylogenetic location models now support the Family B direct-SD formula sd_phylo(species) ~ x_species. The implementation uses a non-centred unit phylogenetic base effect scaled at observed tips by species-level SD predictors, giving marginal tip covariance D_tip A_tip D_tip without assigning predictors to internal tree nodes. coef(), predict(), sdpars, and profile_targets() expose the fitted SD surface.
  • Bivariate Gaussian phylogenetic location models now support Family B direct-SD formulas sd_phylo1(species) ~ x_species and sd_phylo2(species) ~ x_species for matching mu1 and mu2 phylogenetic location effects. The implementation keeps the latent phylogenetic mean-mean correlation constant, exposes response-specific species SD surfaces through coef(), predict(), and sdpars, and rejects mixtures with all-four q=4 phylogenetic location-scale blocks.
  • biv_gaussian() now supports Family B direct location random-effect SD formulas for labelled bivariate location random intercepts: sd1(id) ~ x_group targets the mu1 random-effect SD and sd2(id) ~ x_group targets the mu2 random-effect SD. Predictors must be constant within the named group, and unsupported scale-random-effect SD names such as sd_sigma1() / sd_sigma2() plus same-group q=4 Family A mixtures are rejected to avoid mixing direct SD models with scale-formula random effects.
  • biv_gaussian() now supports the first predictor-dependent latent random-effect correlation models for q=2 location blocks. Ordinary grouped blocks use corpair(id, level = "group", block = "p", from = "mu1", to = "mu2") ~ x_group; phylogenetic blocks use corpair(species, level = "phylogenetic", block = "p", from = "mu1", to = "mu2") ~ ecology beside matching phylo(1 | p | species, tree = tree) terms. The fitted link-scale coefficients appear in coef(), summary(), vcov(), and profile_targets(), while corpairs() reports the response-scale mean, range, and number of group/species correlation values. Predictors must be constant within group/species; location-scale, scale-scale, q=4, and spatial corpair() regressions remain planned.
  • The fitted q=2 phylogenetic corpair() route uses two independent unit phylogenetic fields with species-specific loadings. This gives a positive-definite nonstationary covariance model, preserves the same-species local correlation interpretation, and reduces to the existing constant bivariate phylogenetic covariance when the correlation predictor is constant. A CRAN-safe broad-trend recovery test now checks that a positive species-level correlation predictor recovers the ordering of fitted phylogenetic correlations without hitting the correlation guard. The first implementation target is mu1-mu2; phylogenetic location-scale and scale-scale correlation regressions remain q=4 extensions.
  • A new large-data workflow article documents current memory-light fit controls, practical post-fit output cautions, and the optional bench/large-phylo-location.R benchmark harness for Gaussian phylogenetic location models.
  • check_drm() now reports optimizer evaluation counts, dense fixed-effect design size, finite fixed-effect standard errors, near-boundary random-effect standard deviations, univariate mu/sigma mean-scale covariance diagnostics, bivariate same-response mu/sigma diagnostics, bivariate mu1/mu2 and sigma1/sigma2 random-intercept covariance diagnostics, ordinary q=4 bivariate location-scale covariance diagnostics, bivariate phylogenetic mu1/mu2 covariance diagnostics, phylogenetic q=4 location-scale covariance diagnostics, coordinate-spatial mu diagnostics, and univariate or bivariate sd_phylo*() direct-SD surface diagnostics, helping users diagnose large, difficult, or weakly identified fits before interpreting estimates.
  • biv_gaussian() now fits matching intercept-only phylo(1 | species, tree = tree) or labelled phylo(1 | p | species, tree = tree) terms in mu1 and mu2 as correlated phylogenetic location effects. It also fits the first matching labelled all-four phylogenetic q=4 block across mu1, mu2, sigma1, and sigma2, reporting four endpoint SDs and all six latent phylogenetic correlations while keeping residual rho12 separate. Partial, unlabelled, mismatched, and slope phylogenetic q=4 forms remain rejected.
  • profile_targets() lists the fitted-model target names that can be passed to confint(), including whether each target is ready for direct profile-likelihood intervals. It distinguishes group-level covariance targets such as cor:mu_sigma:cor(mu:(Intercept),sigma:(Intercept) | p | id), cor:mu_sigma:cor(mu1:(Intercept),sigma1:(Intercept) | p | id), cor:mu:cor(mu1:(Intercept),mu2:(Intercept) | p | id), cor:sigma:cor(sigma1:(Intercept),sigma2:(Intercept) | p | id), and cor:phylo:cor(mu1:(Intercept),mu2:(Intercept) | phylo | species) from residual rho12. Ordinary q=4 theta_re_cov correlations and phylogenetic q=4 theta_phylo correlations are listed as derived unstructured-correlation targets rather than direct profile-ready atanh correlations.
  • confint() now returns Wald fixed-effect confidence intervals by default and can compute profile-likelihood intervals for explicit direct targets such as fixef:mu:x, constant sigma, sd:mu:(1 + x | id):(Intercept), sd:mu:phylo(1 | species), cor:mu:cor((Intercept),x | id), the first univariate mu/sigma, bivariate mu1/mu2, bivariate sigma1/sigma2, and bivariate phylogenetic mu1/mu2 random-effect correlations, and constant residual rho12. It also profiles row-specific response-scale sigma, sigma1, sigma2, rho12, and fitted q=2 ordinary or phylogenetic corpair() values when newdata is supplied. Phylogenetic q=4 correlations are currently reported as derived targets and are not claimed as direct profile-ready intervals.
  • corpairs() now accepts conf.int = TRUE for profile-likelihood correlation-pair intervals where the fitted target is profile-ready. Rows that are not interval-ready, such as predictor-dependent residual rho12 summaries that need newdata or derived q=4 unstructured-correlation rows, now carry an explicit conf.status instead of silently omitting bounds.
  • biv_gaussian() now fits the first bivariate group-level covariance blocks: matching labelled random intercepts in mu1/mu2 and in sigma1/sigma2. The fitted group-level SDs appear in sdpars$mu or sdpars$sigma, the same-parameter random-intercept correlations appear in corpars$mu or corpars$sigma and corpairs(), and residual rho12 remains a separate within-observation correlation.
  • biv_gaussian() now fits one same-response cross-parameter random-intercept covariance block, such as matching (1 | p | id) terms in mu1 and sigma1, or in mu2 and sigma2. The fitted mean-scale correlation appears in corpars$mu_sigma, corpairs(), and profile_targets().
  • biv_gaussian() now fits an intercept-only ordinary q=4 location-scale covariance block when the same labelled (1 | p | id) term appears in mu1, mu2, sigma1, and sigma2. The block estimates four group-level SDs and all six latent random-effect correlations while keeping residual rho12 separate.
  • corpairs() now accepts group and block filters so users can directly subset fitted group-level covariance rows while keeping residual rho12 rows separate. It also accepts location-class aliases such as class = "location-location" and class = "location-scale" for the existing mean-mean and mean-scale rows, matching the reserved corpair() formula terminology without renaming current output.
  • drm_control() is now exported and provides the first large-data storage controls for drmTMB(): users can pass optimizer settings through optimizer = list(...), drop stored complete-case data with keep_data = FALSE, drop stored model frames after fitting with keep_model_frame = FALSE, and drop the retained TMB automatic-differentiation object with keep_tmb_object = FALSE.
  • drm_formula() now reserves explicit coefficient-specific random-effect SD syntax such as sd(id, dpar = "mu", coef = "x1") ~ x_group for future random-slope scale models. drmTMB() rejects these formulas until the likelihood, covariance diagnostics, and simulation tests exist.
  • drm_formula() now uses singular endpoint-specific corpair(group, level = "...", block = "...", from = "mu1", to = "mu2") ~ x syntax for predictor-dependent latent random-effect correlations. The first fitted paths are ordinary and phylogenetic q=2 mu1/mu2; spatial, location-scale, scale-scale, and q=4 variants remain parsed or documented as later targets. Use rho12 = ~ x for residual correlation and corpairs() to extract fitted latent correlations.
  • drmTMB() now fits the first labelled cross-formula covariance block for univariate Gaussian location-scale models: matching y ~ x + (1 | p | id) and sigma ~ z + (1 | p | id) random intercepts. The fitted mean-scale correlation appears in corpars$mu_sigma and corpairs().
  • Gaussian residual-scale random slopes are now implemented for univariate Gaussian sigma formulas as independent terms such as sigma ~ z + (0 + w | id). Correlated residual-scale slope blocks and labelled mu/sigma slope covariance remain planned.
  • Installation docs now point tagged-preview users to pak::pak("itchyshin/drmTMB@v0.1.1").
  • marginal_parameters() averages long-format distributional-parameter predictions over fitted rows or supplied newdata groups, providing the first simple marginalisation surface for mean, scale, shape, and residual-correlation summaries.
  • nbinom2() and the zero-inflated, zero-truncated, and hurdle NB2 routes now share an internal count-kernel helper that avoids observed-count loops for large counts while preserving the small-overdispersion Poisson limit. Deterministic high-count tests compare the optimized objective against independent stats::dnbinom() calculations.
  • Developer documentation now includes a C++ modularization source map that identifies safe header-only helper extraction, hidden model_type probe branches, required test gates, and the template pieces that should not move during the first refactor pass.
  • Phase 6d stable-core validation is locally closed with a stable-core feature matrix, validation-debt register, failure-safe sdreport() controls, optimizer/start/map contract, dense covariance guardrails, count-kernel hardening, and a C++ modularization source map. GitHub Actions remains the PR-side gate.
  • predict_parameters() returns long-format predictions for fitted distributional parameters such as mu, sigma, nu, and rho12, giving interpretation tables and future plotting or marginalisation helpers one shared data surface.
  • summary() now reports a response-scale parameter table for fitted scale, shape, random-effect SD, and correlation quantities, with opt-in Wald or profile-likelihood confidence intervals through conf.int = TRUE, including direct profile intervals for the first fitted group-level covariance rows. It also includes a covariance component with fitted random-effect variance and covariance point summaries for currently fitted registry-backed covariance blocks and the first bivariate phylogenetic mu1/mu2 mean-mean row; derived covariance intervals remain unavailable until a nonlinear interval method is implemented, and the covariance table marks that interval status explicitly.

drmTMB 0.1.0 (2026-05-10)

  • bf() now stores parsed formula entries for distributional parameters, including bivariate rho12, meta-analysis meta_known_V(V = V), and random-effect scale syntax.
  • beta() now fits fixed-effect beta mean-scale models for strict continuous proportions in (0, 1), using logit(mu), log(sigma), and internal precision phi = 1 / sigma^2; fitted() returns mu and sigma(fit) returns the public scale parameter.
  • beta_binomial() now fits fixed-effect beta-binomial mean-overdispersion models for cbind(successes, failures) responses, using logit(mu), log(sigma), and internal beta precision phi = 1 / sigma^2. fitted() returns the success probability mu, and sigma(fit) returns the public extra-binomial variation scale.
  • biv_gaussian() now fits fixed-effect bivariate Gaussian location-scale-coscale models with separate mu1, mu2, sigma1, sigma2, and predictor-dependent rho12 formulas.
  • check_drm() now provides a first-pass diagnostic table for optimizer convergence, fixed gradients, Hessian status, dropped rows, scale positivity, rho12 boundaries, Student-t nu boundary behaviour, known sampling covariance summaries, random-effect replication, and weak random-slope design checks.
  • corpairs() now returns a long table of fitted correlation pairs that already exist in a drmTMB fit, currently residual bivariate rho12 summaries and ordinary group-level mu random-effect correlations.
  • drm_formula() is now the primary formula constructor; bf() remains a short alias.
  • drm_formula(mvbind(y1, y2) ~ x) is now implemented as shorthand for identical bivariate Gaussian location formulas, expanding internally to mu1 = y1 ~ x and mu2 = y2 ~ x.
  • drmTMB() now fits Gaussian location-scale models with fixed effects, random intercepts, labelled random intercepts such as (1 | p | id), independent numeric random slopes, and ordinary labelled or unlabelled correlated random intercept-slope blocks in the mu formula, such as bf(y ~ x1 + (1 | id) + (0 + x1 | id), sigma ~ x1), bf(y ~ x1 + (1 + x1 | id), sigma ~ x1), and bf(y ~ x1 + (1 + x1 | p | id), sigma ~ x1).
  • cumulative_logit() now fits fixed-effect univariate ordinal location models for ordered responses, using ordered cutpoints, Pr(y_i <= k) = logit^-1(theta_k - mu_i), and a fixed latent logistic scale. fitted() returns the expected ordered-category score, and ordinal scale/discrimination formulas remain planned.
  • drmTMB() now fits fixed-effect Gamma mean-CV models for positive responses with family = Gamma(link = "log"), where mu is the response mean and sigma is the coefficient of variation.
  • drmTMB() now fits fixed-effect Poisson mean models for count responses with family = poisson(link = "log"), including standard R exposure offsets in the mu formula such as count ~ habitat + offset(log(trap_nights)). The same family route supports fixed-effect zero-inflated Poisson models via zi ~ predictors, where mu is the conditional Poisson mean, zi is the structural-zero probability, and fitted() returns (1 - zi) * mu. Overdispersion, random effects, known sampling covariance, and bivariate count models remain planned for this route.
  • drmTMB() now supports a top-level weights = argument for non-negative row log-likelihood multipliers, with weights(fit) returning the processed weights after model-row filtering. Known sampling variance or covariance remains separate and should use meta_V(V = V), with meta_known_V(V = V) as a compatibility alias.
  • nbinom2() now fits fixed-effect negative-binomial 2 mean-dispersion models for overdispersed counts, with log(mu), log(sigma), and Var(y) = mu + sigma^2 * mu^2. The mu formula supports standard R exposure offsets such as count ~ habitat + offset(log(trap_nights)). Here sigma is an overdispersion scale, not a residual standard deviation or size parameter. The same family route supports fixed-effect zero-inflated NB2 models via zi ~ predictors.
  • drmTMB() now accepts family = c(gaussian(), gaussian()) and family = list(gaussian(), gaussian()), routing both to the implemented bivariate Gaussian location-coscale likelihood. Mixed composed families such as c(gaussian(), poisson()) remain planned and currently error clearly.
  • Gaussian residual-scale random intercepts are implemented in the sigma formula, for example bf(y ~ x1 + (1 | id), sigma ~ x1 + (1 | id)). These model residual-scale heterogeneity and are distinct from random-effect scale formulae such as sd(id) ~ x_group.
  • Gaussian random-effect scale formulae are implemented for one or more distinct unlabelled mu random intercepts, for example bf(y ~ x1 + (1 | id) + (1 | site), sigma ~ x2, sd(id) ~ x_group, sd(site) ~ site_type). Each sd(group) predictor must be constant within the named group after missing-row filtering.
  • Gaussian known-covariance meta-analysis with meta_known_V(V = V) is now covered by targeted validation when combined with random-effect scale formulae such as sd(id) ~ x_group, using an independent dense marginal-likelihood comparator.
  • Gaussian mu random-effect correlations from correlated blocks are exposed as corpars$mu, keeping group-level labels such as p separate from residual bivariate rho12.
  • Profile-likelihood confidence intervals are documented as a planned inference phase with an explicit target namespace, such as sd:mu:(1 | id), cor:mu:cor((Intercept),x | id), and fixef:rho12:(Intercept), plus boundary flags and nonlinear derived-quantity guidance.
  • deviance(), df.residual(), and nobs() now work for drmTMB fits, making base-R model summaries and comparison helpers more complete.
  • fitted() now returns family-specific response summaries: mu for implemented Gaussian-like, Gamma, beta, beta-binomial, Poisson, and NB2 mean models, the expected ordered-category score for cumulative-logit ordinal models, the arithmetic response mean for lognormal models, (1 - zi) * mu for zero-inflated Poisson and zero-inflated NB2 models, (1 - hu) * mu / (1 - Pr_NB2(0)) for hurdle NB2 models, and a two-column mu1/mu2 matrix for bivariate Gaussian models.
  • fixef() now returns distributional fixed-effect coefficients and acts as a mixed-model-friendly alias for coef().
  • lognormal() now fits fixed-effect univariate lognormal location-scale models for positive responses, with mu and sigma defined on the log-response scale, fitted() returning the arithmetic response mean, and simulation plus likelihood tests checked against stats::dlnorm().
  • meta_known_V(V = V) now fits Gaussian meta-analysis with diagonal or dense full known sampling covariance using family = gaussian().
  • meta_vcov_bivariate() now builds row-paired dense sampling covariance matrices for bivariate Gaussian meta-analysis with known within-study covariance, and meta_known_V(V = V) now fits complete-row bivariate Gaussian known-V models by adding that sampling covariance to the fitted residual covariance from sigma1, sigma2, and rho12.
  • ranef() now returns fitted conditional random-effect blocks, including ordinary mu, residual-scale sigma, phylo_mu, and the first spatial_mu blocks when present.
  • rho12() now returns response-scale residual correlations from bivariate Gaussian location-coscale fits, with type = "link" available for Fisher-z-like linear predictors using the guarded transform rho12 = 0.99999999 * tanh(eta_rho12).
  • student() now fits fixed-effect univariate Student-t location-scale-shape models with mu, sigma, and nu formulas. The nu parameter is modelled as nu = 2 + exp(eta_nu) for a stable finite-variance robust continuous family.
  • truncated_nbinom2() now fits fixed-effect zero-truncated negative-binomial 2 models for positive counts, with mu and sigma describing the untruncated NB2 component, fitted() returning the conditional positive-count mean mu / (1 - Pr_NB2(0)), and sigma(fit) returning the NB2 overdispersion scale. Adding hu ~ predictors fits the corresponding fixed-effect hurdle NB2 model, where hu is the hurdle-zero probability and nonzero counts come from the zero-truncated NB2 component.
  • drmTMB() now fits intercept-only phylogenetic random effects in the univariate Gaussian location formula with phylo(1 | species, tree = tree), using an ultrametric branch-length tree and the sparse augmented A-inverse path. It also fits coordinate-based spatial random intercepts and one numeric spatial mu slope in the univariate Gaussian location formula with spatial(1 | site, coords = coords) and spatial(1 + x | site, coords = coords). The slope path estimates independent intercept and slope spatial fields with the same fixed coordinate precision and separate SDs, labelled spatial(1 | site) and spatial(0 + x | site).
  • Planned structured-effect markers outside the first fitted phylogenetic and spatial paths, such as phylo(1 + x | species, tree = tree), phylogenetic or spatial terms in sigma, spatial(1 | site, mesh = mesh), multiple spatial slopes, spatial slope correlations, and bivariate spatial blocks, are parsed by drm_formula() and rejected by drmTMB() with planned-feature errors until their TMB likelihoods and recovery tests are implemented.
  • The “Which scale are you modelling?” tutorial now includes a copy-run scale audit with fitted output and interpretations for sigma ~, weights =, meta_known_V(V = V), sd(group) ~, and bivariate rho12 ~ syntax.
  • Tutorial prose now clarifies that ordinary likelihood weights and known sampling covariance are separate concepts, and that dense full meta_known_V(V = V) paths currently reject non-unit weights.
  • The Gaussian location-scale tutorial now includes a worked growth example with equations, fitted summary() output, response-scale sigma interpretation, and a table mapping mean growth and residual SD back to the biological question.
  • The bivariate location-coscale tutorial now includes worked activity-boldness equations, output-reading guidance for rho12, and a response-scale residual-correlation curve along a disturbance gradient.
  • The bivariate Gaussian coscale phase now has a closure audit in the roadmap: rho12(), corpairs(), bivariate known sampling covariance, row likelihood weights, mvbind() shorthand, residual diagnostics, and unsupported bivariate random-effect syntax are all documented as implemented or planned in one place.
  • The response-family tutorial now starts with an at-a-glance table that maps common measurement processes to implemented families, distributional parameters, the meaning of sigma, and the main current limitation.
  • The meta-analysis tutorial now includes a worked restoration example with equations, fitted summary() output, response-scale residual heterogeneity interpretation, and a clearer distinction between meta_known_V(V = V) and ordinary likelihood weights =.
  • The phylogenetic-spatial tutorial now includes a worked thermal-tolerance example for the implemented phylo(1 | species, tree = tree) path, with equations, fitted output, tree/species validation guidance, bivariate phylogenetic reading guidance for corpairs(), summary(fit)$covariance, direct profile targets, the first labelled q=4 phylogenetic location-scale syntax, and clearer marking of implemented coordinate-spatial intercept and one-slope terms versus planned mesh/SPDE and bivariate spatial paths.
  • The getting-started article and pkgdown tutorial menu now provide a clearer learning path from biological or statistical questions to the matching tutorial and distributional parameter.
  • Public documentation now pairs symbolic model equations with matching R syntax for the first Gaussian location-scale, random-effect scale, bivariate rho12, meta-analysis, and phylogenetic examples, and clarifies planned spatial coords versus mesh inputs.
  • The likelihood design now includes a central TMB model_type routing table, aligned with the implemented source map, including the hidden phylogenetic prior parity branch used only by tests.
  • residuals() now returns whitened Pearson residuals for bivariate Gaussian fits, and vcov() now uses coefficient-level row and column names.
  • Initial project scaffold.