Source code for copul.family.elliptical.laplace

import numpy as np
import sympy
from scipy import stats

from copul.family.elliptical.elliptical_copula import EllipticalCopula
from copul.family.other import LowerFrechet, UpperFrechet


[docs] class multivariate_laplace: """ Simplified multivariate_laplace implementation for Laplace copula. This is a minimal version that only includes what's needed for the copula. """
[docs] @staticmethod def rvs(mean=None, cov=1, size=1, random_state=None, **kwargs): """Generate random samples from multivariate Laplace distribution""" # Simple implementation just for the copula's rvs method dim = len(mean) final_shape = [size, dim] if isinstance(size, int) else size + [dim] # Generate standard Laplace random variables if random_state is not None: np.random.seed(random_state) x = np.random.laplace(loc=0.0, scale=1.0, size=final_shape).reshape(-1, dim) # Apply covariance structure # We use a simplified approach: Cholesky decomposition L = np.linalg.cholesky(cov) x = np.dot(x, L.T) x += mean return x
[docs] class Laplace(EllipticalCopula): """ Laplace copula implementation. The Laplace copula is an elliptical copula based on the multivariate Laplace distribution. It is characterized by a correlation parameter rho in [-1, 1]. Special cases: - rho = -1: Lower Fréchet bound (countermonotonicity) - rho = 1: Upper Fréchet bound (comonotonicity) """ def __call__(self, *args, **kwargs): if args is not None and len(args) == 1: kwargs["rho"] = args[0] if "rho" in kwargs: if kwargs["rho"] == -1: del kwargs["rho"] return LowerFrechet()(**kwargs) elif kwargs["rho"] == 1: del kwargs["rho"] return UpperFrechet()(**kwargs) return super().__call__(**kwargs) @property def is_symmetric(self) -> bool: return True rho = sympy.symbols("rho") @property def is_absolutely_continuous(self) -> bool: return True
[docs] def rvs(self, n=1): """ Generate random samples from the Laplace copula. Args: n (int): Number of samples to generate Returns: numpy.ndarray: Array of shape (n, 2) containing the samples """ mu = [0, 0] cov = np.array(self.corr_matrix, dtype=float) samples = multivariate_laplace.rvs(mean=mu, cov=cov, size=n) u1 = stats.laplace.cdf(samples[:, 0]) u2 = stats.laplace.cdf(samples[:, 1]) return np.array([u1, u2]).T
@property def cdf(self): """ Compute the cumulative distribution function of the Laplace copula. Returns: SymPyFuncWrapper: Wrapped CDF function Note: This method is not yet implemented. """ # Not implemented yet raise NotImplementedError("CDF not implemented for Laplace copula") @property def pdf(self): """ Compute the probability density function of the Laplace copula. Returns: SymPyFuncWrapper: Wrapped PDF function Note: This method is not yet implemented. """ # Not implemented yet raise NotImplementedError("PDF not implemented for Laplace copula")