Hacktoberfest 2026: the issues maintainers tagged for October, open and beginner-friendly. Browse Hacktoberfest issues

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.

Assessment

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

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.

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   
Dominant language
R
Stars
157
Forks
38
Avg merge
4d 16h
Merged PRs (30d)
2

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.

More from stan-dev/loo

All issues in stan-dev/loo

Similar issues

More R issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.