SAMPLE_EQTAIL_CI

This function computes an equal-tailed Bayesian credible interval directly from posterior samples without assuming a closed-form distribution.

For confidence level c and posterior samples \{x_i\}_{i=1}^{n}, the interval uses empirical quantiles at probabilities \frac{1-c}{2} and 1-\frac{1-c}{2}.

[x_L, x_U] = [\hat{Q}((1-c)/2),\; \hat{Q}(1-(1-c)/2)]

where \hat{Q} is the sample quantile function computed from the posterior draws.

Excel Usage

=SAMPLE_EQTAIL_CI(samples, confidence)
  • samples (list[list], required): 2D array of posterior sample draws (unitless).
  • confidence (float, optional, default: 0.95): Credible interval probability level (0 to 1).

Returns (list[list]): 2D table with sample median and lower/upper equal-tailed credible bounds.

Example 1: Equal-tailed interval from symmetric posterior samples

Inputs:

samples confidence
-2 -1 0 1 2 0.8

Excel formula:

=SAMPLE_EQTAIL_CI({-2,-1,0,1,2}, 0.8)

Expected output:

Median Lower Upper
0 -1.6 1.6
Example 2: Equal-tailed interval from positive posterior samples

Inputs:

samples confidence
0.5 0.9 1.2 0.95
1.6 2 2.4

Excel formula:

=SAMPLE_EQTAIL_CI({0.5,0.9,1.2;1.6,2,2.4}, 0.95)

Expected output:

Median Lower Upper
1.4 0.55 2.35
Example 3: Equal-tailed interval from right-skewed posterior draws

Inputs:

samples confidence
0.2 0.3 0.4 0.8 1.5 3 0.9

Excel formula:

=SAMPLE_EQTAIL_CI({0.2,0.3,0.4,0.8,1.5,3}, 0.9)

Expected output:

Median Lower Upper
0.6 0.225 2.625
Example 4: Multi-row sample layout is flattened

Inputs:

samples confidence
1 2 0.85
3 4
5 6

Excel formula:

=SAMPLE_EQTAIL_CI({1,2;3,4;5,6}, 0.85)

Expected output:

Median Lower Upper
3.5 1.375 5.625

Python Code

import numpy as np

def sample_eqtail_ci(samples, confidence=0.95):
    """
    Compute an equal-tailed credible interval from posterior samples using empirical quantiles.

    See: https://numpy.org/doc/stable/reference/generated/numpy.quantile.html

    This example function is provided as-is without any representation of accuracy.

    Args:
        samples (list[list]): 2D array of posterior sample draws (unitless).
        confidence (float, optional): Credible interval probability level (0 to 1). Default is 0.95.

    Returns:
        list[list]: 2D table with sample median and lower/upper equal-tailed credible bounds.
    """
    try:
        def to2d(x):
            return [[x]] if not isinstance(x, list) else x

        samples = to2d(samples)

        if not isinstance(samples, list) or not all(isinstance(row, list) for row in samples):
            return "Error: Invalid input - samples must be a 2D list"

        if not (0 < confidence < 1):
            return "Error: confidence must be between 0 and 1"

        flat = []
        for row in samples:
            for value in row:
                try:
                    flat.append(float(value))
                except (TypeError, ValueError):
                    continue

        if len(flat) < 2:
            return "Error: samples must contain at least two numeric values"

        sorted_samples = np.sort(np.array(flat, dtype=float))
        tail_probability = (1 - confidence) / 2

        lower = float(np.quantile(sorted_samples, tail_probability))
        upper = float(np.quantile(sorted_samples, 1 - tail_probability))
        median = float(np.quantile(sorted_samples, 0.5))

        return [
            ["Median", "Lower", "Upper"],
            [median, lower, upper]
        ]
    except Exception as e:
        return f"Error: {str(e)}"

Online Calculator

2D array of posterior sample draws (unitless).
Credible interval probability level (0 to 1).