stan-dev / stan-dev/loo

loo_model_weights() rejects PSIS-LOO objects with equal observations but different posterior sample sizes

Open
#389 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
R
Stars
157
Forks
38
Avg merge
4d 16h
Merged PRs (30d)
2

Description

Both objects contain pointwise LOO results for the same 32 observations in the same order. The only difference is the number of posterior draws: 1,000 versus 500 after merging chains.

loo_compare() accepts these objects, but loo_model_weights() rejects them because validate_psis_loo_list() requires both dimensions of the psis_loo objects to match.

My understanding is that stacking and pseudo-BMA operate on the pointwise elpd_loo vectors, so the posterior sample sizes need not be identical. Different sample sizes affect Monte Carlo precision but should not make the objects incompatible.

example

library(loo)

log_lik_full <- example_loglik_array()

# Keep the same chains and 32 observations, but use half the iterations.
log_lik_short <- log_lik_full[seq_len(dim(log_lik_full)[1] / 2),,, drop = FALSE]

loo_full <- loo(
  log_lik_full,
  r_eff = relative_eff(exp(log_lik_full))
)

loo_short <- loo(
  log_lik_short,
  r_eff = relative_eff(exp(log_lik_short))
)

dim(loo_full)
#> [1] 1000   32

dim(loo_short)
#> [1] 500  32

# Comparison works despite the different posterior sample sizes.
loo_compare(loo_full, loo_short)

# Model weights do not.
loo_model_weights(list(
  full  = loo_full,
  short = loo_short
))

sessionInfo()

output

> library(loo)
This is loo version 2.10.1
- Online documentation and vignettes at mc-stan.org/loo
- As of v2.0.0 loo defaults to 1 core but we recommend using as many as possible. Use the 'cores' argument or set options(mc.cores = NUM_CORES) for an entire session. 
- Windows 10 users: loo may be very slow if 'mc.cores' is set in your .Rprofile file (see https://github.com/stan-dev/loo/issues/94).
Warning message:
package ‘loo’ was built under R version 4.6.1 
> 
> log_lik_full <- example_loglik_array()
> 
> # Keep the same chains and 32 observations, but use half the iterations.
> log_lik_short <- log_lik_full[seq_len(dim(log_lik_full)[1] / 2),,, drop = FALSE]
> 
> loo_full <- loo(
+   log_lik_full,
+   r_eff = relative_eff(exp(log_lik_full))
+ )
> 
> loo_short <- loo(
+   log_lik_short,
+   r_eff = relative_eff(exp(log_lik_short))
+ )
> 
> dim(loo_full)
[1] 1000   32
> #> [1] 1000   32
> 
> dim(loo_short)
[1] 500  32
> #> [1] 500  32
> 
> # Comparison works despite the different posterior sample sizes.
> loo_compare(loo_full, loo_short)
  model elpd_diff se_diff p_worse diag_diff diag_elpd
 model2       0.0     0.0      NA                    
 model1       0.0     0.1    0.70   N < 100          

Diagnostic flags present.
See ?`loo-glossary` (sections `diag_diff` and `diag_elpd`)
or https://mc-stan.org/loo/reference/loo-glossary.html.
> 
> # Model weights do not.
> loo_model_weights(list(
+   full  = loo_full,
+   short = loo_short
+ ))
Error: Each object in the list must have the same dimensions.

> sessionInfo()
R version 4.6.0 (2026-04-24 ucrt)
Platform: x86_64-w64-mingw32/x64
Running under: Windows 11 x64 (build 26200)

Matrix products: default
  LAPACK version 3.12.1

locale:
[1] LC_COLLATE=English_United States.utf8  LC_CTYPE=English_United States.utf8   
[3] LC_MONETARY=English_United States.utf8 LC_NUMERIC=C                          
[5] LC_TIME=English_United States.utf8    

time zone: Europe/Amsterdam
tzcode source: internal

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] loo_2.10.1

loaded via a namespace (and not attached):
 [1] vctrs_0.7.3          cli_3.6.6            knitr_1.51           rlang_1.2.0         
 [5] xfun_0.57            otel_0.2.0           generics_0.1.4       tensorA_0.36.2.1    
 [9] glue_1.8.1           backports_1.5.1      htmltools_0.5.9      distributional_0.7.0
[13] rmarkdown_2.31       evaluate_1.0.5       tibble_3.3.1         abind_1.4-8         
[17] fastmap_1.2.0        yaml_2.3.12          lifecycle_1.0.5      compiler_4.6.0      
[21] posterior_1.7.0      pkgconfig_2.0.3      rstudioapi_0.18.0    digest_0.6.39       
[25] pillar_1.11.1        parallel_4.6.0       magrittr_2.0.5       checkmate_2.3.4     
[29] tools_4.6.0          matrixStats_1.5.0   

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start at loo_model_weights() and validate_psis_loo_list(), then compare their dimension checks with loo_compare(). Reproduce the example using loo_full and loo_short, and add coverage for equal observation counts with different posterior sample sizes. Done means loo_model_weights() accepts these objects while preserving validation for incompatible observation dimensions.

Written by the indexing model from the issue text.

Assessment

Tech stack
r
Domain
data
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
68/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.