New Features

  • Added further documentation about repeated observations models (#120)
  • Added vignette “Algorithmic scaling” (#121)
  • Models with Gaussian variables and no repeated observations now use a conditionally non-centred parameterisation for latent terminal drift, i.e. the terminal drift of non-Gaussian variables and of missing Gaussian values. Latent drift is written as a standard normal innovation conditional on the observed Gaussian residuals of the same taxon. This is a change of variables that leaves the model, the posterior, and the pointwise log-likelihood unchanged, but removes a funnel between the drift parameters and the latent terminal drift that caused poor mixing in mixed Gaussian and non-Gaussian models. Thanks to @yuhangxoox for the diagnosis (#124)

Bug Fixes

  • Fixed the continuous time intercept term in the expected change along a branch, A^-1 (exp(A t) - I) b. Since version 1.0.0 this matrix was symmetrised before being multiplied by b, which is only correct when the selection matrix A is symmetric (e.g., no cross-selection effects). Both the Stan and JAX backends now use the exact expression. In our comparisons the selection (A) and drift (Q) parameters were essentially unchanged, because b is weakly identified and absorbs most of the difference. Posterior estimates of b itself can shift; in one simulated example they moved by up to about 0.6 posterior standard deviations
  • Fixed coev_plot_predictive_check() when nuts_sampler = "nutpie". The JAX backend now returns yrep posterior predictions alongside the other model parameters, matching the Stan backend (#118)
  • log_lik = TRUE is now supported with nuts_sampler = "nutpie". The JAX backend previously ignored the argument and returned no log_lik, so loo and waic could not be computed from nutpie fits (#118)
  • Fixed prior_only = TRUE for models with Gaussian variables and no repeated observations. terminal_drift only received a prior inside the likelihood block, leaving it improper when the likelihood was skipped. Sampling failed to initialise with nuts_sampler = "nutpie" and was unreliable with nuts_sampler = "stan" (#118)
  • Fixed the pointwise log_lik and yrep for Gaussian variables with missing data. The generated quantities block used the -9999 missing value placeholder when constructing residuals, which corrupted the conditional densities of the other variables of the same observation

New Features

  • Added coev_ancestral_states() for extracting posterior estimates of ancestral trait values at internal phylogenetic nodes, on either the latent or response scale (#86)
  • Added vignette “Ancestral state reconstruction”

Bug Fixes

  • Fixed issue with plotting functions when nuts_sampler = "nutpie" (#114)

Other Changes

  • Updated documentation (#111)
  • Fixed cmdstanr location in documentation (#112)
  • Responded to rOpenSci package review (#113)
  • Added package citation (#116)

New Features

  • Allowed for single traits (#107)
  • Added pure JAX/NumPyro backend via nuts_sampler = "nutpie". Uses nutpie’s Rust NUTS sampler with JAX gradients for ~5x faster sampling than Stan on typical models. Requires pip install jax numpyro nutpie (#109)

New Features

  • Added nutpie as an alternative sampler for the Stan models (#92)
  • Cached matrix computations when branch lengths are identical (#93)
  • Implemented Hilbert-space approximate Gaussian processes for spatial control, adding the lon_lat argument and deprecating the dist_mat argument in coev_fit() (#103)

Bug Fixes

  • Fixed issue with summary() when estimate_residual = FALSE (#95)

Other Changes

  • Updated license
  • Submitted to rOpenSci for package review
  • Linted package using lintr
  • Implemented srr compliance checks
  • Added continuous integration checks using GitHub Actions
  • Reduced cyclomatic complexity for some functions
  • Re-factored Stan code generation to use whisker templates (#99)
  • Implemented automatic test fixture re-generation in GitHub Actions (#100)
  • Initial release version.