Skip to content

loo_moment_match Support cmdstanr backend, instead of refitting with rstan? #1774

@emstruong

Description

@emstruong

Hello,

On my system, cmdstanr is much much faster than rstan. I was wondering if it'd be possible for loo_moment_match to run without recompiling the model with rstan? I'm not sure why it crashes in my reprex, but it ran fine in my code when doing it manually

library(metafor)
#> Loading required package: Matrix
#> Loading required package: metadat
#> Loading required package: numDeriv
#> 
#> Loading the 'metafor' package (version 4.8-0). For an
#> introduction to the package please type: help(metafor)
library(brms); options("brms.backend" = "cmdstanr")
#> Loading required package: Rcpp
#> Loading 'brms' package (version 2.22.8). Useful instructions
#> can be found by typing help('brms'). A more detailed introduction
#> to the package is available through vignette('brms_overview').
#> 
#> Attaching package: 'brms'
#> The following object is masked from 'package:stats':
#> 
#>     ar
library(priorsense)
library(rstan); rstan_options(auto_write = TRUE)
#> Loading required package: StanHeaders
#> 
#> rstan version 2.32.7 (Stan version 2.32.2)
#> For execution on a local, multicore CPU with excess RAM we recommend calling
#> options(mc.cores = parallel::detectCores()).
#> To avoid recompilation of unchanged Stan programs, we recommend calling
#> rstan_options(auto_write = TRUE)
#> For within-chain threading using `reduce_sum()` or `map_rect()` Stan functions,
#> change `threads_per_chain` option:
#> rstan_options(threads_per_chain = 1)
library(cmdstanr)
#> This is cmdstanr version 0.8.1.9000
#> - CmdStanR documentation and vignettes: mc-stan.org/cmdstanr
#> - CmdStan path: /home/mstruong/.cmdstan/cmdstan-2.36.0
#> - CmdStan version: 2.36.0

bcg <- metadat::dat.bcg

bcg <- metafor::escalc(
  measure = "RR",
  ai = tpos, # Got tubercolis and in treatment
  bi = tneg, # Did not get tubercolis and in treatment
  ci = cpos, # Got tubercolis and in control
  di = cneg, # Did not get tubercolis and in control
  data = bcg,
  append = TRUE
) |>
  dplyr::mutate(sei = sqrt(vi)) |>
  as.data.frame()

fit_bcg_fe <- brms::brm(yi | se(sei) ~ 1,
                        data = bcg,
                        back = "cmdstanr",
                        cores = 4,
                        prior = prior(normal(0,1), class = "Intercept"))
#> Start sampling
#> Running MCMC with 4 parallel chains...
#> 
#> Chain 1 Iteration:    1 / 2000 [  0%]  (Warmup) 
#> Chain 1 Iteration:  100 / 2000 [  5%]  (Warmup) 
#> Chain 1 Iteration:  200 / 2000 [ 10%]  (Warmup) 
#> Chain 1 Iteration:  300 / 2000 [ 15%]  (Warmup) 
#> Chain 1 Iteration:  400 / 2000 [ 20%]  (Warmup) 
#> Chain 1 Iteration:  500 / 2000 [ 25%]  (Warmup) 
#> Chain 1 Iteration:  600 / 2000 [ 30%]  (Warmup) 
#> Chain 1 Iteration:  700 / 2000 [ 35%]  (Warmup) 
#> Chain 1 Iteration:  800 / 2000 [ 40%]  (Warmup) 
#> Chain 1 Iteration:  900 / 2000 [ 45%]  (Warmup) 
#> Chain 1 Iteration: 1000 / 2000 [ 50%]  (Warmup) 
#> Chain 1 Iteration: 1001 / 2000 [ 50%]  (Sampling) 
#> Chain 1 Iteration: 1100 / 2000 [ 55%]  (Sampling) 
#> Chain 1 Iteration: 1200 / 2000 [ 60%]  (Sampling) 
#> Chain 1 Iteration: 1300 / 2000 [ 65%]  (Sampling) 
#> Chain 1 Iteration: 1400 / 2000 [ 70%]  (Sampling) 
#> Chain 1 Iteration: 1500 / 2000 [ 75%]  (Sampling) 
#> Chain 1 Iteration: 1600 / 2000 [ 80%]  (Sampling) 
#> Chain 1 Iteration: 1700 / 2000 [ 85%]  (Sampling) 
#> Chain 1 Iteration: 1800 / 2000 [ 90%]  (Sampling) 
#> Chain 1 Iteration: 1900 / 2000 [ 95%]  (Sampling) 
#> Chain 1 Iteration: 2000 / 2000 [100%]  (Sampling) 
#> Chain 2 Iteration:    1 / 2000 [  0%]  (Warmup) 
#> Chain 2 Iteration:  100 / 2000 [  5%]  (Warmup) 
#> Chain 2 Iteration:  200 / 2000 [ 10%]  (Warmup) 
#> Chain 2 Iteration:  300 / 2000 [ 15%]  (Warmup) 
#> Chain 2 Iteration:  400 / 2000 [ 20%]  (Warmup) 
#> Chain 2 Iteration:  500 / 2000 [ 25%]  (Warmup) 
#> Chain 2 Iteration:  600 / 2000 [ 30%]  (Warmup) 
#> Chain 2 Iteration:  700 / 2000 [ 35%]  (Warmup) 
#> Chain 2 Iteration:  800 / 2000 [ 40%]  (Warmup) 
#> Chain 2 Iteration:  900 / 2000 [ 45%]  (Warmup) 
#> Chain 2 Iteration: 1000 / 2000 [ 50%]  (Warmup) 
#> Chain 2 Iteration: 1001 / 2000 [ 50%]  (Sampling) 
#> Chain 2 Iteration: 1100 / 2000 [ 55%]  (Sampling) 
#> Chain 2 Iteration: 1200 / 2000 [ 60%]  (Sampling) 
#> Chain 2 Iteration: 1300 / 2000 [ 65%]  (Sampling) 
#> Chain 2 Iteration: 1400 / 2000 [ 70%]  (Sampling) 
#> Chain 2 Iteration: 1500 / 2000 [ 75%]  (Sampling) 
#> Chain 2 Iteration: 1600 / 2000 [ 80%]  (Sampling) 
#> Chain 2 Iteration: 1700 / 2000 [ 85%]  (Sampling) 
#> Chain 2 Iteration: 1800 / 2000 [ 90%]  (Sampling) 
#> Chain 2 Iteration: 1900 / 2000 [ 95%]  (Sampling) 
#> Chain 2 Iteration: 2000 / 2000 [100%]  (Sampling) 
#> Chain 3 Iteration:    1 / 2000 [  0%]  (Warmup) 
#> Chain 3 Iteration:  100 / 2000 [  5%]  (Warmup) 
#> Chain 3 Iteration:  200 / 2000 [ 10%]  (Warmup) 
#> Chain 3 Iteration:  300 / 2000 [ 15%]  (Warmup) 
#> Chain 3 Iteration:  400 / 2000 [ 20%]  (Warmup) 
#> Chain 3 Iteration:  500 / 2000 [ 25%]  (Warmup) 
#> Chain 3 Iteration:  600 / 2000 [ 30%]  (Warmup) 
#> Chain 3 Iteration:  700 / 2000 [ 35%]  (Warmup) 
#> Chain 3 Iteration:  800 / 2000 [ 40%]  (Warmup) 
#> Chain 3 Iteration:  900 / 2000 [ 45%]  (Warmup) 
#> Chain 3 Iteration: 1000 / 2000 [ 50%]  (Warmup) 
#> Chain 3 Iteration: 1001 / 2000 [ 50%]  (Sampling) 
#> Chain 3 Iteration: 1100 / 2000 [ 55%]  (Sampling) 
#> Chain 3 Iteration: 1200 / 2000 [ 60%]  (Sampling) 
#> Chain 3 Iteration: 1300 / 2000 [ 65%]  (Sampling) 
#> Chain 3 Iteration: 1400 / 2000 [ 70%]  (Sampling) 
#> Chain 3 Iteration: 1500 / 2000 [ 75%]  (Sampling) 
#> Chain 3 Iteration: 1600 / 2000 [ 80%]  (Sampling) 
#> Chain 3 Iteration: 1700 / 2000 [ 85%]  (Sampling) 
#> Chain 3 Iteration: 1800 / 2000 [ 90%]  (Sampling) 
#> Chain 3 Iteration: 1900 / 2000 [ 95%]  (Sampling) 
#> Chain 3 Iteration: 2000 / 2000 [100%]  (Sampling) 
#> Chain 4 Iteration:    1 / 2000 [  0%]  (Warmup) 
#> Chain 4 Iteration:  100 / 2000 [  5%]  (Warmup) 
#> Chain 4 Iteration:  200 / 2000 [ 10%]  (Warmup) 
#> Chain 4 Iteration:  300 / 2000 [ 15%]  (Warmup) 
#> Chain 4 Iteration:  400 / 2000 [ 20%]  (Warmup) 
#> Chain 4 Iteration:  500 / 2000 [ 25%]  (Warmup) 
#> Chain 4 Iteration:  600 / 2000 [ 30%]  (Warmup) 
#> Chain 4 Iteration:  700 / 2000 [ 35%]  (Warmup) 
#> Chain 4 Iteration:  800 / 2000 [ 40%]  (Warmup) 
#> Chain 4 Iteration:  900 / 2000 [ 45%]  (Warmup) 
#> Chain 4 Iteration: 1000 / 2000 [ 50%]  (Warmup) 
#> Chain 4 Iteration: 1001 / 2000 [ 50%]  (Sampling) 
#> Chain 4 Iteration: 1100 / 2000 [ 55%]  (Sampling) 
#> Chain 4 Iteration: 1200 / 2000 [ 60%]  (Sampling) 
#> Chain 4 Iteration: 1300 / 2000 [ 65%]  (Sampling) 
#> Chain 4 Iteration: 1400 / 2000 [ 70%]  (Sampling) 
#> Chain 4 Iteration: 1500 / 2000 [ 75%]  (Sampling) 
#> Chain 4 Iteration: 1600 / 2000 [ 80%]  (Sampling) 
#> Chain 4 Iteration: 1700 / 2000 [ 85%]  (Sampling) 
#> Chain 4 Iteration: 1800 / 2000 [ 90%]  (Sampling) 
#> Chain 4 Iteration: 1900 / 2000 [ 95%]  (Sampling) 
#> Chain 4 Iteration: 2000 / 2000 [100%]  (Sampling) 
#> Chain 1 finished in 0.0 seconds.
#> Chain 2 finished in 0.0 seconds.
#> Chain 3 finished in 0.0 seconds.
#> Chain 4 finished in 0.0 seconds.
#> 
#> All 4 chains finished successfully.
#> Mean chain execution time: 0.0 seconds.
#> Total execution time: 0.3 seconds.
loo_bcg_fe <- loo(fit_bcg_fe)
#> Warning: Found 3 observations with a pareto_k > 0.7 in model 'fit_bcg_fe'. We
#> recommend to set 'moment_match = TRUE' in order to perform moment matching for
#> problematic observations.
loo_bcg_fe <- loo_moment_match(fit_bcg_fe, loo_bcg_fe)
#> Recompiling the model with 'rstan'
#> Recompilation done

Created on 2025-05-10 with reprex v2.1.1

Session info
sessioninfo::session_info()
#> ─ Session info ───────────────────────────────────────────────────────────────
#>  setting  value
#>  version  R version 4.4.0 (2024-04-24)
#>  os       Ubuntu 22.04.5 LTS
#>  system   x86_64, linux-gnu
#>  ui       X11
#>  language en_CA:en
#>  collate  en_CA.UTF-8
#>  ctype    en_CA.UTF-8
#>  tz       America/Toronto
#>  date     2025-05-10
#>  pandoc   3.2 @ /usr/lib/rstudio/resources/app/bin/quarto/bin/tools/x86_64/ (via rmarkdown)
#> 
#> ─ Packages ───────────────────────────────────────────────────────────────────
#>  ! package        * version    date (UTC) lib source
#>    abind            1.4-8      2024-09-12 [1] RSPM
#>    backports        1.5.0      2024-05-23 [1] RSPM
#>    bayesplot        1.11.1     2024-02-15 [1] RSPM
#>    bridgesampling   1.1-2      2021-04-16 [1] RSPM
#>    brms           * 2.22.8     2025-02-03 [1] Github (paul-buerkner/brms@b1ec0be)
#>    Brobdingnag      1.2-9      2022-10-19 [1] RSPM
#>    callr            3.7.6      2024-03-25 [1] RSPM
#>    checkmate        2.3.2      2024-07-29 [1] RSPM
#>    cli              3.6.5      2025-04-23 [1] RSPM
#>    cmdstanr       * 0.8.1.9000 2025-02-03 [1] Github (stan-dev/cmdstanr@ce58981)
#>    coda             0.19-4.1   2024-01-31 [1] RSPM
#>  P codetools        0.2-20     2024-03-31 [3] CRAN (R 4.4.0)
#>    colorspace       2.1-1      2024-07-26 [1] RSPM
#>    data.table       1.16.4     2024-12-06 [1] RSPM
#>    digest           0.6.37     2024-08-19 [1] RSPM
#>    distributional   0.5.0      2024-09-17 [1] RSPM
#>    dplyr            1.1.4      2023-11-17 [1] RSPM
#>    evaluate         1.0.3      2025-01-10 [1] RSPM
#>    farver           2.1.2      2024-05-13 [1] RSPM
#>    fastmap          1.2.0      2024-05-15 [1] RSPM
#>    fs               1.6.5      2024-10-30 [1] RSPM
#>    generics         0.1.4      2025-05-09 [1] CRAN (R 4.4.0)
#>    ggplot2          3.5.2      2025-04-09 [1] RSPM
#>    glue             1.8.0      2024-09-30 [1] RSPM
#>    gridExtra        2.3        2017-09-09 [1] RSPM
#>    gtable           0.3.6      2024-10-25 [1] RSPM
#>    htmltools        0.5.8.1    2024-04-04 [1] RSPM
#>    inline           0.3.21     2025-01-09 [1] RSPM
#>    jsonlite         1.8.9      2024-09-20 [1] RSPM
#>    knitr            1.49       2024-11-08 [1] RSPM
#>    lattice          0.22-7     2025-04-02 [1] RSPM
#>    lifecycle        1.0.4      2023-11-07 [1] RSPM
#>    loo              2.8.0      2024-07-03 [1] RSPM
#>    magrittr         2.0.3      2022-03-30 [1] RSPM
#>    mathjaxr         1.6-0      2022-02-28 [1] RSPM
#>    Matrix         * 1.7-3      2025-03-11 [1] RSPM
#>    matrixStats      1.5.0      2025-01-07 [1] RSPM
#>    metadat        * 1.2-0      2022-04-06 [1] RSPM
#>    metafor        * 4.8-0      2025-01-28 [1] RSPM
#>    mvtnorm          1.3-3      2025-01-10 [1] RSPM
#>    nlme             3.1-168    2025-03-31 [1] RSPM
#>    numDeriv       * 2016.8-1.1 2019-06-06 [1] RSPM
#>    pillar           1.10.2     2025-04-05 [1] RSPM
#>    pkgbuild         1.4.6      2025-01-16 [1] RSPM
#>    pkgconfig        2.0.3      2019-09-22 [1] RSPM
#>    posterior        1.6.1      2025-02-27 [1] RSPM
#>    priorsense     * 1.1.0      2025-04-10 [1] RSPM
#>    processx         3.8.5      2025-01-08 [1] RSPM
#>    ps               1.8.1      2024-10-28 [1] RSPM
#>    QuickJSR         1.5.1      2025-01-08 [1] RSPM
#>    R6               2.6.1      2025-02-15 [1] RSPM
#>    RColorBrewer     1.1-3      2022-04-03 [1] RSPM
#>    Rcpp           * 1.0.14     2025-01-12 [1] RSPM
#>    RcppParallel     5.1.10     2025-01-24 [1] RSPM
#>    reprex           2.1.1      2024-07-06 [1] RSPM
#>    rlang            1.1.6      2025-04-11 [1] RSPM
#>    rmarkdown        2.29       2024-11-04 [1] RSPM
#>    rstan          * 2.32.7     2025-03-10 [1] RSPM
#>    rstantools       2.4.0      2024-01-31 [1] RSPM
#>    rstudioapi       0.17.1     2024-10-22 [1] RSPM
#>    scales           1.4.0      2025-04-24 [1] RSPM
#>    sessioninfo      1.2.2      2021-12-06 [1] RSPM
#>    StanHeaders    * 2.32.10    2024-07-15 [1] RSPM
#>    stringi          1.8.4      2024-05-06 [1] RSPM
#>    stringr          1.5.1      2023-11-14 [1] RSPM
#>    tensorA          0.36.2.1   2023-12-13 [1] RSPM
#>    tibble           3.2.1      2023-03-20 [1] RSPM
#>    tidyselect       1.2.1      2024-03-11 [1] RSPM
#>    vctrs            0.6.5      2023-12-01 [1] RSPM
#>    withr            3.0.2      2024-10-28 [1] RSPM
#>    xfun             0.50       2025-01-07 [1] RSPM
#>    yaml             2.3.10     2024-07-26 [1] RSPM
#> 
#>  [1] /home/mstruong/.cache/R/renv/library/xxx-d32e9da4/linux-ubuntu-jammy/R-4.4/x86_64-pc-linux-gnu
#>  [2] /home/mstruong/.cache/R/renv/sandbox/linux-ubuntu-jammy/R-4.4/x86_64-pc-linux-gnu/3df92652
#>  [3] /opt/R/4.4.0/lib/R/library
#> 
#>  P ── Loaded and on-disk path mismatch.
#> 
#> ──────────────────────────────────────────────────────────────────────────────

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions