Source code for magli
"""magli (Modelo Aditivo Generalizado Lineal): Pythonic Generalized Additive Models (GAMs) with Wood and Eilers backends."""
from . import eilers, wood
from .eilers import GAMCore as EilersGAMCore, LinGAM as EilersLinGAM
from .wood import GAMCore as WoodGAMCore, LinGAM as WoodLinGAM
__version__ = "1.0.0"
_BACKENDS = {
"wood": (WoodLinGAM, WoodGAMCore),
"eilers": (EilersLinGAM, EilersGAMCore),
"pygam": (EilersLinGAM, EilersGAMCore),
}
def _dispatch(idx: int, backend: str, *args, **kwargs):
key = str(backend).lower()
if key not in _BACKENDS:
raise ValueError(f"Unknown backend '{backend}'. Choose 'wood' or 'eilers'.")
return _BACKENDS[key][idx](*args, **kwargs)
class GAM:
"""Single-term Generalized Additive Model dispatcher.
Parameters
----------
backend : {'wood', 'eilers'}, default='wood'
Engine backend: ``'wood'`` for Simon Wood's REML/GCV spline engine
(:class:`magli.wood.LinGAM`) or ``'eilers'`` for Eilers & Marx
B-splines with discrete GCV grid search (:class:`magli.eilers.LinGAM`).
*args, **kwargs
Forwarded to the selected backend's ``LinGAM`` constructor.
"""
def __new__(cls, *args, backend: str = "wood", **kwargs):
return _dispatch(0, backend, *args, **kwargs)
LinGAM = GAM
[docs]
class GAMCore:
"""Multi-term Generalized Additive Model formula dispatcher.
Parameters
----------
formula : str
Additive model formula with ``s()``, ``te()``, ``f()``, and ``l()`` terms.
backend : {'wood', 'eilers'}, default='wood'
Engine backend: ``'wood'`` (:class:`magli.wood.GAMCore`) or
``'eilers'`` (:class:`magli.eilers.GAMCore`).
*args, **kwargs
Forwarded to the selected backend's ``GAMCore`` constructor.
"""
def __new__(cls, *args, backend: str = "wood", **kwargs):
return _dispatch(1, backend, *args, **kwargs)
__all__ = [
"GAM",
"LinGAM",
"GAMCore",
"EilersLinGAM",
"EilersGAMCore",
"WoodLinGAM",
"WoodGAMCore",
"eilers",
"wood",
"__version__",
]