Source code for sails.modelvalidation
#!/usr/bin/python
# vim: set expandtab ts=4 sw=4:
import numpy as np
from .stats import find_cov_multitrial
__all__ = []
[docs]
def approx_model_selection_criteria(A, EF, method='ss'):
"""Estimate Akaike's Information Criterion and Bayes Information Criterion
from a model fit using an approximation of the loglikelihood.
Two approximations are available:
'ss': The sum square of the residuals. This approximation is outlined
in [Burnham2002]_ and [Chatfield2003]_.
'det': The determinant of the residual covariance matrix.
The sum squares method is used as default.
Parameters
----------
A : ndarray
Array containing the parameters of a fitted model, of shape
[channels x channels x maxorder]
EF : ndarray
Array containing the residuals of the fitted model, of shape
[channels x samples x trials]
method : {'ss','det'}
string indicating which method should be used to approximate
the loglikelihood ('ss' or 'det') (Default value = 'ss')
Returns
-------
tuple
tuple of (aLL, AIC, BIC)
aLL: Approximation of the loglikelihood (determined by the method
defined above)
AIC: Estimate of Akaike's Information Criterion
BIC: Estimate of the Bayesian Information Criterion
"""
k = A.reshape(-1).shape[0] # number of parameters
N = EF.reshape(-1).shape[0] # number of observations
if method == 'ss':
# Chatfield 2004 - The analysis of time series p 256.
# Burnham and Anderson 2004 - multimodel inference, understanding AIC
# and BIC in model selection
SS = np.power(EF, 2).sum() # sum of squares
aLL = N*np.log(SS/N)
elif method == 'det':
# Method used in the GCCA toolbox
# TODO: make this work
# NOT CURRENTLY WORKING!!!!!
raise Exception("method == 'det' is not currently working")
cov = find_cov_multitrial(EF, EF)
aLL = np.log(np.linalg.det(cov))
else:
raise Exception("Unknown method")
aLL = np.float64(aLL.real)
# Compute AIC and BIC
aic = np.float64(aLL + 2*k)
# No-one else seems to approximate the BIC using the methods above, though
# we are following the same logic as for the AIC so it's probably fine.
bic = np.float64(aLL + k*np.log(N))
return aLL, aic, bic
__all__.append('approx_model_selection_criteria')