From 4b695dcdc483698229dd8ab9130c1fcdaf2ab94d Mon Sep 17 00:00:00 2001 From: BehramUlukir Date: Wed, 9 Jul 2025 19:53:12 +0300 Subject: [PATCH 1/3] add x as argument to ppc_error_binned --- NEWS.md | 1 + R/ppc-errors.R | 36 ++++++++++++++++++++++++++---------- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/NEWS.md b/NEWS.md index 4f30cd1a..46a11788 100644 --- a/NEWS.md +++ b/NEWS.md @@ -2,6 +2,7 @@ * PPC "avg" functions (`ppc_scatter_avg()`, `ppc_error_scatter_avg()`, etc.) gain a `stat` argument to set the averaging function. (Suggestion of #348, @kruschke). * `ppc_error_scatter_avg_vs_x(x = some_expression)` labels the *x* axis with `some_expression`. +* Add `ppc_dots()` and `ppd_dots()` by @behramulukir (#357) # bayesplot 1.13.0 diff --git a/R/ppc-errors.R b/R/ppc-errors.R index d038aa70..c2be914f 100644 --- a/R/ppc-errors.R +++ b/R/ppc-errors.R @@ -312,6 +312,7 @@ ppc_error_scatter_avg_vs_x <- function( ppc_error_binned <- function(y, yrep, + x = NULL, ..., facet_args = list(), bins = NULL, @@ -319,7 +320,7 @@ ppc_error_binned <- alpha = 0.25) { check_ignored_arguments(...) - data <- ppc_error_binnned_data(y, yrep, bins = bins) + data <- ppc_error_binnned_data(y, yrep, x = x, bins = bins) facet_layer <- if (nrow(yrep) == 1) { geom_ignore() } else { @@ -356,7 +357,7 @@ ppc_error_binned <- color = point_color ) + labs( - x = "Predicted proportion", + x = if (is.null(x)) "Predicted proportion" else deparse(substitute(x)), y = "Average Errors \n (with 2SE bounds)" ) + bayesplot_theme_get() + @@ -454,10 +455,14 @@ error_avg_label <- function(stat = NULL) { # Data for binned errors plots -ppc_error_binnned_data <- function(y, yrep, bins = NULL) { +ppc_error_binnned_data <- function(y, yrep, x = NULL, bins = NULL) { y <- validate_y(y) yrep <- validate_predictions(yrep, length(y)) + if (!is.null(x)) { + x <- validate_x(x, y) + } + if (is.null(bins)) { bins <- n_bins(length(y)) } @@ -465,13 +470,24 @@ ppc_error_binnned_data <- function(y, yrep, bins = NULL) { errors <- compute_errors(y, yrep) binned_errs <- list() for (s in 1:nrow(errors)) { - binned_errs[[s]] <- - bin_errors( - ey = yrep[s, ], - r = errors[s, ], - bins = bins, - rep_id = s - ) + if (is.null(x)) { + binned_errs[[s]] <- + bin_errors( + ey = yrep[s, ], + r = errors[s, ], + bins = bins, + rep_id = s + ) + } else { + binned_errs[[s]] <- + bin_errors( + ey = x, + r = errors[s, ], + bins = bins, + rep_id = s + ) + } + } binned_errs <- dplyr::bind_rows(binned_errs) From 67b863ced00ad43579a9c10534ca6c17c0d05c91 Mon Sep 17 00:00:00 2001 From: BehramUlukir Date: Thu, 10 Jul 2025 17:29:58 +0300 Subject: [PATCH 2/3] updating documentation and adding new tests --- NEWS.md | 1 + R/ppc-errors.R | 8 +- man/PPC-errors.Rd | 8 +- .../ppc-errors/ppc-error-binned-with-x.svg | 218 ++++++++++++++++++ tests/testthat/data-for-binomial.rda | Bin 5238 -> 5343 bytes tests/testthat/test-ppc-errors.R | 6 + 6 files changed, 236 insertions(+), 5 deletions(-) create mode 100644 tests/testthat/_snaps/ppc-errors/ppc-error-binned-with-x.svg diff --git a/NEWS.md b/NEWS.md index 46a11788..941ef230 100644 --- a/NEWS.md +++ b/NEWS.md @@ -3,6 +3,7 @@ * PPC "avg" functions (`ppc_scatter_avg()`, `ppc_error_scatter_avg()`, etc.) gain a `stat` argument to set the averaging function. (Suggestion of #348, @kruschke). * `ppc_error_scatter_avg_vs_x(x = some_expression)` labels the *x* axis with `some_expression`. * Add `ppc_dots()` and `ppd_dots()` by @behramulukir (#357) +* Add `x` argument to `ppc_error_binned` by @behramulukir (#359) # bayesplot 1.13.0 diff --git a/R/ppc-errors.R b/R/ppc-errors.R index c2be914f..7981f199 100644 --- a/R/ppc-errors.R +++ b/R/ppc-errors.R @@ -9,6 +9,7 @@ #' @template args-y-yrep #' @template args-group #' @template args-facet_args +#' @param x A numeric vector the same length as `y` to use as the x-axis variable. #' @param ... Currently unused. #' @param stat A function or a string naming a function for computing the #' posterior average. In both cases, the function should take a vector input and @@ -109,6 +110,10 @@ #' yrep_prop <- sweep(yrep, 2, trials, "/") #' #' ppc_error_binned(y_prop, yrep_prop[1:6, ]) +#' +#' # plotting against a covariate on x-axis +#' herd <- as.numeric(example_model$data$herd) +#' ppc_error_binned(y_prop, yrep_prop[1:6, ], x = herd) #' } #' NULL @@ -270,9 +275,6 @@ ppc_error_scatter_avg_grouped <- #' @rdname PPC-errors #' @export -#' @param x A numeric vector the same length as `y` to use as the x-axis -#' variable. -#' ppc_error_scatter_avg_vs_x <- function( y, yrep, diff --git a/man/PPC-errors.Rd b/man/PPC-errors.Rd index 047590bf..a3aec9d8 100644 --- a/man/PPC-errors.Rd +++ b/man/PPC-errors.Rd @@ -63,6 +63,7 @@ ppc_error_scatter_avg_vs_x( ppc_error_binned( y, yrep, + x = NULL, ..., facet_args = list(), bins = NULL, @@ -120,8 +121,7 @@ posterior average. In both cases, the function should take a vector input and return a scalar statistic. The function name is displayed in the axis-label. Defaults to \code{"mean"}.} -\item{x}{A numeric vector the same length as \code{y} to use as the x-axis -variable.} +\item{x}{A numeric vector the same length as \code{y} to use as the x-axis variable.} } \value{ A ggplot object that can be further customized using the \strong{ggplot2} package. @@ -217,6 +217,10 @@ yrep <- posterior_predict(example_model) yrep_prop <- sweep(yrep, 2, trials, "/") ppc_error_binned(y_prop, yrep_prop[1:6, ]) + +# plotting against a covariate on x-axis +herd <- as.numeric(example_model$data$herd) +ppc_error_binned(y_prop, yrep_prop[1:6, ], x = herd) } } diff --git a/tests/testthat/_snaps/ppc-errors/ppc-error-binned-with-x.svg b/tests/testthat/_snaps/ppc-errors/ppc-error-binned-with-x.svg new file mode 100644 index 00000000..f2c45b8a --- /dev/null +++ b/tests/testthat/_snaps/ppc-errors/ppc-error-binned-with-x.svg @@ -0,0 +1,218 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +3 +4 +5 +6 + + + + + +3 +4 +5 +6 + +-0.3 +-0.2 +-0.1 +0.0 +0.1 +0.2 +0.3 + + + + + + + + +-0.3 +-0.2 +-0.1 +0.0 +0.1 +0.2 +0.3 + + + + + + + +x +Average Errors + (with 2SE bounds) +ppc_error_binned (with x) + + diff --git a/tests/testthat/data-for-binomial.rda b/tests/testthat/data-for-binomial.rda index 49f18e4decb58910d80f5ae6c149eb61f3dc5aba..128a1e830e71834ff6ac46f965f1953f1bbb4fd3 100644 GIT binary patch literal 5343 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 diff --git a/tests/testthat/test-ppc-errors.R b/tests/testthat/test-ppc-errors.R index 1b9d62e0..e7f0ad8f 100644 --- a/tests/testthat/test-ppc-errors.R +++ b/tests/testthat/test-ppc-errors.R @@ -52,6 +52,8 @@ test_that("ppc_error_binned returns ggplot object", { expect_gg(ppc_error_binned(y, Ey)) expect_gg(ppc_error_binned(y[1:5], Ey[, 1:5])) expect_gg(ppc_error_binned(rep(y, 2), cbind(Ey, Ey))) + expect_gg(ppc_error_binned(y, Ey, x = x)) + expect_gg(ppc_error_binned(rep(y, 2), cbind(Ey, Ey), x = rep(x, 2))) }) test_that("bin_errors works for edge cases", { @@ -150,4 +152,8 @@ test_that("ppc_error_binned renders correctly", { p_base <- ppc_error_binned(y, y_rep) vdiffr::expect_doppelganger("ppc_error_binned (default)", p_base) + + x <- rnorm(length(y), mean = 5) + p_base_x <- ppc_error_binned(y, y_rep, x = x) + vdiffr::expect_doppelganger("ppc_error_binned (with x)", p_base_x) }) From 125f2439df0d7eba45ad2c0c183413b796a5cd33 Mon Sep 17 00:00:00 2001 From: jgabry Date: Mon, 14 Jul 2025 10:36:45 -0600 Subject: [PATCH 3/3] use @tjmahr's way of labeling axes --- R/ppc-errors.R | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/R/ppc-errors.R b/R/ppc-errors.R index 7981f199..f53f869d 100644 --- a/R/ppc-errors.R +++ b/R/ppc-errors.R @@ -322,6 +322,7 @@ ppc_error_binned <- alpha = 0.25) { check_ignored_arguments(...) + qx <- enquo(x) data <- ppc_error_binnned_data(y, yrep, x = x, bins = bins) facet_layer <- if (nrow(yrep) == 1) { geom_ignore() @@ -359,7 +360,7 @@ ppc_error_binned <- color = point_color ) + labs( - x = if (is.null(x)) "Predicted proportion" else deparse(substitute(x)), + x = if (is.null(x)) "Predicted proportion" else as_label((qx)), y = "Average Errors \n (with 2SE bounds)" ) + bayesplot_theme_get() +