environmentaltools.temporal.negative_log_likelihood

environmentaltools.temporal.negative_log_likelihood(par, df, imod, param, t_expans)[source]

Compute negative log-likelihood for time-varying distribution parameters.

Objective function for maximum likelihood estimation of non-stationary distribution models. Handles single, mixed, and piecewise distributions with time-varying parameters expanded using Fourier series.

Parameters:
  • par (array-like) – Vector of parameters to optimize, containing Fourier coefficients for each distribution parameter

  • df (pd.DataFrame) – Time series data with columns for the variable and normalized time ‘n’

  • imod (tuple) – Fourier mode orders for each parameter component

  • param (dict) –

    Configuration dictionary with keys:

    • ’var’str

      Variable name to fit

    • ’fun’dict

      scipy.stats distribution objects

    • ’no_fun’int

      Number of distribution functions

    • ’reduction’bool

      Whether using reduced parameter space for mixed models

    • ’no_param’list

      Number of parameters for each distribution

    • ’constraints’bool

      Whether to apply matching constraints

  • t_expans (np.ndarray) – Time expansion matrix for Fourier basis functions

Returns:

Negative log-likelihood value (lower is better). Returns 1e10 for invalid parameter combinations.

Return type:

float

Notes

The function computes NLLF as: -sum(log(pdf(x|theta(t))))

For reduced mixed models: - Body distribution for u1 <= x <= u2 - Lower tail (GPD) for x < u1 - Upper tail (GPD) for x > u2

Returns 1e10 (failure) if: - Parameters contain NaN - GPD shape parameter creates invalid support - Threshold ordering violated (u1 >= u2) - Negative values where positive required

The function is designed for use with scipy.optimize minimizers.

See also

get_params

Expands Fourier coefficients to time-varying parameters

fit

Main optimization wrapper

params_t_expansion

Constructs Fourier basis matrix

Examples

>>> # Used internally by optimization routines
>>> from scipy.optimize import minimize
>>> result = minimize(
...     negative_log_likelihood,
...     initial_params,
...     args=(df, mode, param, t_expans),
...     method='L-BFGS-B'
... )