Skip to contents

Compute the Curvewise interval (CWI) (also called the "simultaneous interval" or "joint interval") of posterior distributions using ggdist::curve_interval(). Whereas the more typical "pointwise intervals" contain xx% of the posterior for a single parameter, joint/curvewise intervals contain xx% of the posterior distribution for all parameters.


cwi(x, ...)

# S3 method for class 'data.frame'
cwi(x, ci = 0.95, ...)



Vector representing a posterior distribution, or a data frame of such vectors. Can also be a Bayesian model. bayestestR supports a wide range of models (see, for example, methods("hdi")) and not all of those are documented in the 'Usage' section, because methods for other classes mostly resemble the arguments of the .numeric or .data.framemethods.


Currently not used.


Value or vector of probability of the (credible) interval - CI (between 0 and 1) to be estimated. Default to .95 (95%).


A data frame with following columns:

  • Parameter The model parameter(s), if x is a model-object. If x is a vector, this column is missing.

  • CI The probability of the credible interval.

  • CI_low, CI_high The lower and upper credible interval limits for the parameters.


Applied model predictions, pointwise intervals contain xx% of the predicted response values conditional on specific predictor values. In contrast, curvewise intervals contain xx% of the predicted response values across all predictor values. Put another way, curvewise intervals contain xx% of the full prediction lines from the model.

For more details, see the ggdist documentation on curvewise intervals.

See also

Other ci: bci(), ci(), eti(), hdi(), si(), spi()


# \donttest{

if (require("ggplot2") && require("rstanarm") && require("ggdist")) {
  # Generate data =============================================
  k <- 11 # number of curves (iterations)
  n <- 201 # number of rows
  data <- data.frame(x = seq(-15, 15, length.out = n))

  # Simulate iterations as new columns
  for (i in 1:k) {
    data[paste0("iter_", i)] <- dnorm(data$x, seq(-5, 5, length.out = k)[i], 3)

  # Note: first, we need to transpose the data to have iters as rows
  iters <- datawizard::data_transpose(data[paste0("iter_", 1:k)])

  # Compute Median
  data$Median <- point_estimate(iters)[["Median"]]

  # Compute Credible Intervals ================================

  # Compute ETI (default type of CI)
  data[c("ETI_low", "ETI_high")] <- eti(iters, ci = 0.5)[c("CI_low", "CI_high")]

  # Compute CWI
  # ggdist::curve_interval(reshape_iterations(data), iter_value .width = 0.5)

  # Visualization =============================================
  ggplot(data, aes(x = x, y = Median)) +
    geom_ribbon(aes(ymin = ETI_low, ymax = ETI_high), fill = "red", alpha = 0.3) +
    geom_line(linewidth = 1) +
      data = reshape_iterations(data),
      aes(y = iter_value, group = iter_group),
      alpha = 0.3
#> Loading required package: ggplot2
#> Loading required package: ggdist
#> Attaching package: ‘ggdist’
#> The following objects are masked from ‘package:brms’:
#>     dstudent_t, pstudent_t, qstudent_t, rstudent_t
#> The following object is masked from ‘package:bayestestR’:
#>     hdi

# }