# Likelihood

By default the likelihood is determined by the type of transient/data being used. However, users can choose a different likelihood. We note that there is typically only one correct choice of likelihood but there may be edge cases such as errors in time, or non-detections, or uncertain y errors which requires users to use a different likelihood. Many different simple to more complicated likelihoods are included in `redback`, these should cover most of the cases seen in transient data but if not, users can write their own likelihoods. We encourage users to add such likelihoods to `redback`.

## Regular likelihoods

• Gaussian likelihood - general Gaussian likelihood

• GRB Gaussian likelihood - a GRB specific Gaussian likelihood

• Poisson likelihood - For a poisson process

• Gaussian likelihood with additional noise - When you want to estimate some additional uncertainty on your model

• Gaussian likelihood with uniform x errors - When you have x errors that are bin widths

• Gaussian likelihood with non detections - A general Gaussian likelihood with a upper limits on some data points

If you don’t like the likelihoods implemented in redback, you can write your own, subclassing the redback likelihood for example,

```class GaussianLikelihoodKnownNoise(redback.Likelihood):
def __init__(self, x, y, sigma, function):
"""
A general Gaussian likelihood - the parameters are inferred from the
arguments of function

Parameters
----------
x, y: array_like
The data to analyse
sigma: float
The standard deviation of the noise
function:
The python function to fit to the data. Note, this must take the
dependent variable as its first argument. The other arguments are
will require a prior and will be sampled over (unless a fixed
value is given).
"""
self.x = x
self.y = y
self.sigma = sigma
self.N = len(x)
self.function = function

# These lines of code infer the parameters from the provided function
parameters = inspect.getargspec(function).args
parameters.pop(0)
super().__init__(parameters=dict.fromkeys(parameters))

def log_likelihood(self):
res = self.y - self.function(self.x, **self.parameters)
return -0.5 * (np.sum((res / self.sigma)**2)
+ self.N*np.log(2*np.pi*self.sigma**2))
```