nemos.observation_models.BernoulliObservations#

class nemos.observation_models.BernoulliObservations[source]#

Bases: Observations

Model observations as Bernoulli random variables.

The BernoulliObservations is designed to model an observed binary variable based on a Bernoulli distribution with a given success probability. When using a logit link function (i.e. a logistic inverse link function), this is equivalent to Logistic Regression. It provides methods for computing the negative log-likelihood, generating samples, and computing the residual deviance for the given binary observations.

Attributes

default_inverse_link_function

scale

Getter for the scale parameter of the model.

__init__()[source]#

Methods

__init__()

deviance(observations, predicted_rate[, scale])

Compute the residual deviance for a Bernoulli model.

estimate_scale(y, predicted_rate, dof_resid)

Assign 1 to the scale parameter of the Bernoulli model.

get_params([deep])

From scikit-learn, get parameters by inspecting init.

likelihood(y, predicted_rate[, scale, ...])

Compute the Binomial model likelihood.

log_likelihood(y, predicted_rate[, scale, ...])

Compute the Bernoulli negative log-likelihood.

pseudo_r2(y, predicted_rate[, score_type, ...])

Pseudo-\(R^2\) calculation for a GLM.

sample_generator(key, predicted_rate[, scale])

Sample from the Bernoulli distribution.

set_params(**params)

Set the parameters of this estimator.

classmethod __init_subclass__(**kwargs)#

Set the set_{method}_request methods.

This uses PEP-487 [1] to set the set_{method}_request methods. It looks for the information available in the set default values which are set using __metadata_request__* class attributes, or inferred from method signatures.

The __metadata_request__* class attributes are used when a method does not explicitly accept a metadata through its arguments or if the developer would like to specify a request value for those metadata which are different from the default None.

References

deviance(observations, predicted_rate, scale=1.0)[source]#

Compute the residual deviance for a Bernoulli model.

Parameters:
  • observations (Array) – The binary observations. Shape (n_time_bins, ) or (n_time_bins, n_observations) for population models (i.e. multiple observations).

  • predicted_rate (Array) – The predicted rate (success probability). Shape (n_time_bins, ) or (n_time_bins, n_observations) for population models (i.e. multiple observations).

  • scale (Union[float, Array]) – Scale parameter of the model. For Bernoulli should be equal to 1.

Return type:

Array

Returns:

The residual deviance of the model.

Notes

The deviance is a measure of the goodness of fit of a statistical model. For a Bernoulli model, the residual deviance is computed as:

\[\begin{split}\begin{aligned} D(y_{tn}, \hat{y}_{tn}) &= 2 \left( \text{LL}\left(y_{tn} | y_{tn}\right) - \text{LL}\left(y_{tn} | \hat{y}_{tn}\right)\right) \\\ &= 2 \left[ y_{tn} \log\left(\frac{y_{tn}}{\hat{y}_{tn}}\right) + (1 - y_{tn}) \log\left(\frac{1 - y_{tn}}{1 - \hat{y}_{tn}}\right) \right] \end{aligned}\end{split}\]

where \(y\) is the observed data, \(\hat{y}\) is the predicted data, and \(\text{LL}\) is the model log-likelihood. Lower values of deviance indicate a better fit.

estimate_scale(y, predicted_rate, dof_resid)[source]#

Assign 1 to the scale parameter of the Bernoulli model.

For the Binomial exponential family distribution (to which the Bernoulli belongs), the scale parameter \(\phi\) is always 1.

Parameters:
  • y (Array) – Observed spike counts.

  • predicted_rate (Array) – The predicted rate values (success probabilities). This is not used in the Bernoulli model for estimating scale, but is retained for compatibility with the abstract method signature.

  • dof_resid (Union[float, Array]) – The DOF of the residuals.

Return type:

Union[float, Array]

get_metadata_routing()#

Get metadata routing of this object.

Please check User Guide on how the routing mechanism works.

Returns:

routing – A MetadataRequest encapsulating routing information.

Return type:

MetadataRequest

get_params(deep=True)#

From scikit-learn, get parameters by inspecting init.

Parameters:

deep – If True, will return the parameters for this estimator and contained subobjects that are estimators.

Return type:

dict

Returns:

A dictionary containing the parameters. Key is the parameter name, value is the parameter value.

likelihood(y, predicted_rate, scale=1.0, aggregate_sample_scores=<function BernoulliObservations.<lambda>>)[source]#

Compute the Binomial model likelihood.

This computes the likelihood of the predicted rates for the observed neural activity including the normalization constant.

Parameters:
  • y (Array) – The target activity to compare against. Shape (n_time_bins, ), or (n_time_bins, n_neurons).

  • predicted_rate (Array) – The predicted rate of the current model. Shape (n_time_bins, ), or (n_time_bins, n_neurons).

  • scale (Union[float, Array]) – The scale parameter of the model

  • aggregate_sample_scores (Callable) – Function that aggregates the likelihood of each sample.

Returns:

The likelihood. Shape (1,).

log_likelihood(y, predicted_rate, scale=1.0, aggregate_sample_scores=<function BernoulliObservations.<lambda>>)[source]#

Compute the Bernoulli negative log-likelihood.

This computes the Bernoulli negative log-likelihood of the predicted success probability (predicted rates) for the observations up to a constant.

Parameters:
  • y (Array) – The target observation to compare against. Shape (n_time_bins, ), or (n_time_bins, n_observations).

  • predicted_rate (Array) – The predicted rate (success probability) of the current model. Shape (n_time_bins, ), or (n_time_bins, n_observations).

  • scale (Union[float, Array]) – The scale parameter of the model.

  • aggregate_sample_scores (Callable) – Function that aggregates the log-likelihood of each sample.

Returns:

The Bernoulli negative log-likelihood. Shape (1,).

Notes

The formula for the Bernoulli mean log-likelihood is the following,

\[\text{LL}(p | y) = \frac{1}{T \cdot N} \sum_{n=1}^{N} \sum_{t=1}^{T} [y_{tn} \log(p_{tn}) + (1 - y_{tn}) \log(1 - p_{tn})]\]

where \(p\) is the predicted success probability, given by the inverse link function, and \(y\) is the observed binary variable.

pseudo_r2(y, predicted_rate, score_type='pseudo-r2-McFadden', scale=1.0, aggregate_sample_scores=<function Observations.<lambda>>)#

Pseudo-\(R^2\) calculation for a GLM.

Compute the pseudo-\(R^2\) metric for the GLM, as defined by McFadden et al. [2] or by Cohen et al. [3].

This metric evaluates the goodness-of-fit of the model relative to a null (baseline) model that assumes a constant mean for the observations. While the pseudo-\(R^2\) is bounded between 0 and 1 for the training set, it can yield negative values on out-of-sample data, indicating potential over-fitting.

Parameters:
  • y (Array) – The neural activity. Expected shape: (n_time_bins, )

  • predicted_rate (Array) – The mean neural activity. Expected shape: (n_time_bins, )

  • score_type (Literal['pseudo-r2-McFadden', 'pseudo-r2-Cohen']) – The pseudo-\(R^2\) type.

  • scale (Union[float, Array, ndarray[tuple[Any, ...], dtype[TypeVar(_ScalarT, bound= generic)]]]) – The scale parameter of the model.

  • aggregate_sample_scores (Callable)

Return type:

Array

Returns:

The pseudo-\(R^2\) of the model. A value closer to 1 indicates a better model fit, whereas a value closer to 0 suggests that the model doesn’t improve much over the null model.

Notes

  • The McFadden pseudo-\(R^2\) is given by:

    \[R^2_{\text{mcf}} = 1 - \frac{\log(L_{M})}{\log(L_0)}.\]

    Equivalent to statsmodels GLMResults.pseudo_rsquared(kind=’mcf’) .

  • The Cohen pseudo-\(R^2\) is given by:

    \[\begin{split}\begin{aligned} R^2_{\text{Cohen}} &= \frac{D_0 - D_M}{D_0} \\\ &= 1 - \frac{\log(L_s) - \log(L_M)}{\log(L_s)-\log(L_0)}, \end{aligned}\end{split}\]

    where \(L_M\), \(L_0\) and \(L_s\) are the likelihood of the fitted model, the null model (a model with only the intercept term), and the saturated model (a model with one parameter per sample, i.e. the maximum value that the likelihood could possibly achieve). \(D_M\) and \(D_0\) are the model and the null deviance, \(D_i = -2 \left[ \log(L_s) - \log(L_i) \right]\) for \(i=M,0\).

References

sample_generator(key, predicted_rate, scale=1.0)[source]#

Sample from the Bernoulli distribution.

This method generates random numbers from a Bernoulli distribution based on the given predicted_rate.

Parameters:
  • key (Array) – Random key used for the generation of random numbers in JAX.

  • predicted_rate (Array) – Expected rate (success probability) of the Bernoulli distribution. Shape (n_time_bins, ), or (n_time_bins, n_observations).

  • scale (Union[float, Array]) – Scale parameter. For Bernoulli should be equal to 1.

Returns:

Random numbers generated from the Bernoulli distribution based on the predicted_rate.

Return type:

Array

property scale#

Getter for the scale parameter of the model.

set_params(**params)#

Set the parameters of this estimator.

The method works on simple estimators as well as on nested objects (such as Pipeline). The latter have parameters of the form <component>__<parameter> so that it’s possible to update each component of a nested object.

Parameters:

**params (Any) – Estimator parameters.

Returns:

self – Estimator instance.

Return type:

estimator instance