loo_model_weights() rejects PSIS-LOO objects with equal observations but different posterior sample sizes
Nobody has claimed this yet.
Assessment
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Newbie friendliness
- 68/100
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
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from stan-dev/loo
-
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
-
Difficulty 5/5 Over a week Newbie friendliness 25/100
-
Difficulty 3/5 1-2 days Newbie friendliness 45/100
-
Clean up issues Open
Difficulty 4/5 3-5 days Newbie friendliness 25/100
-
Difficulty 3/5 1-2 days Newbie friendliness 68/100
Similar issues
-
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
robjhyndman/forecast#1220 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 65/100
JamesHWade/deputy#192 ·
-
bug triage_needed
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
-
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
pharmaverse/rtables#1123 · 1 comment · 1 reaction ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 72/100