Source code for pastas.objective_functions
"""This module contains the objective functions that can be used with the pastas
`EmceeSolve` solver.
"""
from numpy import log, pi
from pandas import DataFrame
[docs]class GaussianLikelihood:
"""Gaussian likelihood function.
Notes
-----
The Gaussian log-likelihood function is defined as:
.. math::
\\log(L) = -\\frac{N}{2}\\log(2\\pi\\sigma^2) +
\\frac{\\sum_{i=1}^N - \\epsilon_i^2}{2\\sigma^2}
where :math:`N` is the number of observations, :math:`\\sigma^2` is the variance of
the residuals, and :math:`\\epsilon_i` is the residual at time :math:`i`. The
parameter :math:`\\sigma^2` need to be estimated.
"""
_name = "GaussianLikelihood"
[docs] def __init__(self):
self.nparam = 1
[docs] def get_init_parameters(self, name: str) -> DataFrame:
"""Get the initial parameters for the log-likelihood function.
Parameters
----------
name: str
Name of the log-likelihood function.
Returns
-------
parameters: DataFrame
Initial parameters for the log-likelihood function.
"""
parameters = DataFrame(
columns=["initial", "pmin", "pmax", "vary", "stderr", "name", "dist"]
)
parameters.loc[name + "_sigma"] = (0.05, 1e-10, 1, True, 0.01, name, "uniform")
return parameters
[docs] def compute(self, rv, p):
"""Compute the log-likelihood.
Parameters
----------
rv: array
Residuals of the model.
p: array or list
Parameters of the log-likelihood function.
Returns
-------
ln: float
Log-likelihood
"""
sigma = p[-1]
N = rv.size
ln = -0.5 * N * log(2 * pi * sigma) + sum(-(rv**2) / (2 * sigma))
return ln
[docs]class GaussianLikelihoodAr1:
"""Gaussian likelihood function with AR1 autocorrelated residuals.
Notes
-----
The Gaussian log-likelihood function with AR1 autocorrelated residual is defined as:
.. math::
\\log(L) = -\\frac{N-1}{2}\\log(2\\pi\\sigma^2) +
\\frac{\\sum_{i=1}^N - (\\epsilon_i - \\phi \\epsilon_{i-\\Delta t})^2}
{2\\sigma^2}
where :math:`N` is the number of observations, :math:`\\sigma^2` is the
variance of the residuals, :math:`\\epsilon_i` is the residual at time
:math:`i` and :math:`\\mu` is the mean of the residuals. :math:`\\Delta t` is
the time step between the observations. :math:`\\phi` is the autoregressive
parameter. The parameters :math:`\\phi` and :math:`\\sigma^2` need to be estimated.
"""
_name = "GaussianLikelihoodAr1"
[docs] def __init__(self):
self.nparam = 2
[docs] def get_init_parameters(self, name: str) -> DataFrame:
"""Get the initial parameters for the log-likelihood function.
Parameters
----------
name: str
Name of the log-likelihood function.
Returns
-------
parameters: DataFrame
Initial parameters for the log-likelihood function.
"""
parameters = DataFrame(
columns=["initial", "pmin", "pmax", "vary", "stderr", "name", "dist"]
)
parameters.loc[name + "_sigma"] = (0.05, 1e-10, 1, True, 0.01, name, "uniform")
parameters.loc[name + "_theta"] = (
0.5,
1e-10,
0.99999,
True,
0.2,
name,
"uniform",
)
return parameters
[docs] def compute(self, rv, p):
"""Compute the log-likelihood.
Parameters
----------
rv: array
Residuals of the model.
p: array or list
Parameters of the log-likelihood function.
Returns
-------
ln: float
Log-likelihood.
"""
sigma = p[-2]
theta = p[-1]
N = rv.size
ln = -(N - 1) / 2 * log(2 * pi * sigma) + sum(
-((rv[1:] - theta * rv[0:-1]) ** 2) / (2 * sigma)
)
return ln