Source code for aurora.inference.intervals.confidence
# SPDX-License-Identifier: MIT
# Copyright (c) 2025 Lucy Eduardo Arias
"""Confidence interval utilities for GLM results."""
from __future__ import annotations
from dataclasses import dataclass
from statistics import NormalDist
import numpy as np
from ...models.base import GLMResult
@dataclass(frozen=True)
class ConfidenceIntervalResult:
"""Container for confidence interval bounds."""
lower: np.ndarray
upper: np.ndarray
intercept: tuple[float, float] | None = None
[docs]
def confidence_intervals(
result: GLMResult,
*,
level: float = 0.95,
method: str = "wald",
include_intercept: bool = True,
) -> ConfidenceIntervalResult:
"""Compute confidence intervals for the coefficients of a fitted GLM."""
if not 0.0 < level < 1.0:
raise ValueError("level must be in the open interval (0, 1).")
if method.lower() != "wald":
raise NotImplementedError(f"Unsupported confidence interval method: {method!r}")
quantile = NormalDist().inv_cdf(0.5 + level / 2.0)
coef = np.asarray(result.coef_, dtype=float)
std_errors = np.asarray(result.std_errors_, dtype=float)
lower = coef - quantile * std_errors
upper = coef + quantile * std_errors
intercept_interval: tuple[float, float] | None = None
if include_intercept and result.intercept_ is not None:
intercept_std = result.intercept_std_error_
if intercept_std is None:
raise RuntimeError("Intercept standard error is unavailable.")
intercept_lower = float(result.intercept_ - quantile * intercept_std)
intercept_upper = float(result.intercept_ + quantile * intercept_std)
intercept_interval = (intercept_lower, intercept_upper)
return ConfidenceIntervalResult(lower=lower, upper=upper, intercept=intercept_interval)