Skip to content

Commit 4147555

Browse files
committed
Ensure rank overlay plot starts at 0 even if not all bins present
fixes #331
1 parent ce4f5d1 commit 4147555

File tree

4 files changed

+86
-3
lines changed

4 files changed

+86
-3
lines changed

R/mcmc-traces.R

+10-3
Original file line numberDiff line numberDiff line change
@@ -304,17 +304,24 @@ mcmc_rank_overlay <- function(x,
304304
mutate(cut = cut(.data$value_rank, n_bins)) %>%
305305
group_by(.data$cut) %>%
306306
mutate(bin_start = min(.data$value_rank)) %>%
307-
ungroup() %>%
308-
select(-c("cut"))
307+
ungroup()
309308

309+
# Count how many values fall into each bin per chain & parameter
310310
d_bin_counts <- data %>%
311311
left_join(histobins, by = "value_rank") %>%
312312
count(.data$parameter, .data$chain, .data$bin_start)
313313

314+
# Now ensure that all combinations of parameter, chain, and bin_start exist
315+
# even if no counts are present (https://github.com/stan-dev/bayesplot/issues/331)
316+
all_params_chains <- dplyr::distinct(data, .data$parameter, .data$chain)
317+
all_bins <- dplyr::distinct(histobins, .data$bin_start, .data$cut)
318+
combos <- dplyr::cross_join(all_params_chains, all_bins)
319+
d_bin_counts <- full_join(combos, d_bin_counts, by = c("parameter", "chain", "bin_start")) %>%
320+
mutate(n = dplyr::coalesce(n, 0L))
321+
314322
# Duplicate the final bin, setting the left edge to the greatest x value, so
315323
# that the entire x-axis is used,
316324
right_edge <- max(data$value_rank)
317-
318325
d_bin_counts <- d_bin_counts %>%
319326
dplyr::filter(.data$bin_start == max(.data$bin_start)) %>%
320327
mutate(bin_start = right_edge) %>%
Loading

tests/testthat/data-for-mcmc-tests.R

+7
Original file line numberDiff line numberDiff line change
@@ -73,4 +73,11 @@ vdiff_dframe_chains_lp <- vdiff_dframe_chains_divergences
7373
vdiff_dframe_chains_lp$Parameter <- NULL
7474
vdiff_dframe_chains_lp$Value <- runif(2000, -100, -50)
7575

76+
vdiff_dframe_rank_overlay_bins_test <- posterior::as_draws_df(
77+
list(
78+
list(theta = -2 + 0.003 * 1:1000 + stats::arima.sim(list(ar = 0.7), n = 1000, sd = 0.5)),
79+
list(theta = 1 + -0.01 * 1:1000 + stats::arima.sim(list(ar = 0.7), n = 1000, sd = 0.5))
80+
)
81+
)
82+
7683
set.seed(seed = NULL)

tests/testthat/test-mcmc-traces.R

+6
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,9 @@ test_that("mcmc_rank_overlay renders correctly", {
154154
n_bins = 4
155155
)
156156

157+
# https://github.com/stan-dev/bayesplot/issues/331
158+
p_not_all_bins_exist <- mcmc_rank_overlay(vdiff_dframe_rank_overlay_bins_test)
159+
157160
vdiffr::expect_doppelganger("mcmc_rank_overlay (default)", p_base)
158161
vdiffr::expect_doppelganger(
159162
"mcmc_rank_overlay (reference line)",
@@ -164,6 +167,9 @@ test_that("mcmc_rank_overlay renders correctly", {
164167
"mcmc_rank_overlay (wide bins)",
165168
p_one_param_wide_bins
166169
)
170+
171+
# https://github.com/stan-dev/bayesplot/issues/331
172+
vdiffr::expect_doppelganger("mcmc_rank_overlay (not all bins)", p_not_all_bins_exist)
167173
})
168174

169175
test_that("mcmc_rank_hist renders correctly", {

0 commit comments

Comments
 (0)