Commit dbe4a717 authored by Le Roux Erwan's avatar Le Roux Erwan
Browse files

[projection snowfall] refactor nb_params. so that is it associated to the...

[projection snowfall] refactor nb_params. so that is it associated to the margin_function rather than to the margin_model.
parent 7ef2da5d
No related merge requests found
Showing with 32 additions and 21 deletions
+32 -21
......@@ -7,6 +7,8 @@ from cached_property import cached_property
from extreme_fit.estimator.abstract_estimator import AbstractEstimator
from extreme_fit.estimator.utils import load_margin_function
from extreme_fit.model.margin_model.linear_margin_model.abstract_temporal_linear_margin_model import \
AbstractTemporalLinearMarginModel
from extreme_fit.model.margin_model.linear_margin_model.linear_margin_model import LinearMarginModel
from extreme_fit.function.margin_function.linear_margin_function import LinearMarginFunction
from extreme_fit.model.margin_model.utils import MarginFitMethod
......@@ -103,15 +105,22 @@ class LinearMarginEstimator(AbstractMarginEstimator):
return 2 * self.nllh(split=split)
def aic(self, split=Split.all):
aic = 2 * self.margin_model.nb_params + 2 * self.nllh(split=split)
aic = 2 * self.nb_params + 2 * self.nllh(split=split)
npt.assert_almost_equal(self.result_from_model_fit.aic, aic, decimal=0)
return aic
def n(self, split=Split.all):
return len(self.dataset.maxima_gev(split=split))
@property
def nb_params(self):
nb_params = self.function_from_fit.nb_params
if isinstance(self.margin_model, AbstractTemporalLinearMarginModel) and self.margin_model.is_gumbel_model:
nb_params -= 1
return nb_params
def bic(self, split=Split.all):
return np.log(self.n(split=split)) * self.margin_model.nb_params + 2 * self.nllh(split=split)
return np.log(self.n(split=split)) * self.nb_params + 2 * self.nllh(split=split)
def compute_nllh(coordinate_values, maxima_values, function_from_fit, maximum_from_obs=True, assertion_for_inf=True):
......
......@@ -57,6 +57,10 @@ class AbstractMarginFunction(AbstractFunction):
"""Main method that maps each coordinate to its distribution parameters"""
raise NotImplementedError
@property
def nb_params(self):
raise NotImplementedError
@property
def gev_value_name_to_serie(self) -> Dict[str, pd.Series]:
# Load the gev_params
......
......@@ -49,6 +49,10 @@ class LinearMarginFunction(ParametricMarginFunction):
def coefficient_name_to_dim(cls, coordinates: AbstractCoordinates) -> Dict[int, str]:
return {v: k for k, v in cls.idx_to_coefficient_name(coordinates).items()}
@property
def nb_params(self):
return len(self.coef_dict)
@property
def coef_dict(self) -> Dict[str, float]:
coef_dict = {}
......
......@@ -31,6 +31,10 @@ class PolynomialMarginFunction(LinearMarginFunction):
def get_params(self, coordinate: np.ndarray, is_transformed: bool = True) -> GevParams:
return super().get_params(coordinate, is_transformed)
@property
def nb_params(self):
return sum([c.nb_params for c in self.param_name_to_coef.values()])
@classmethod
def from_coef_dict(cls, coordinates: AbstractCoordinates, param_name_to_dims: Dict[str, List[Tuple[int, int]]],
coef_dict: Dict[str, float], starting_point: Union[None, int] = None, log_scale=None):
......
......@@ -39,6 +39,10 @@ class SplineMarginFunction(LinearMarginFunction):
def get_params(self, coordinate: np.ndarray, is_transformed: bool = True) -> GevParams:
return super().get_params(coordinate, is_transformed)
@property
def nb_params(self):
return sum([c.nb_params for c in self.param_name_to_coef.values()])
@classmethod
def from_coef_dict(cls, coordinates: AbstractCoordinates, param_name_to_dims: Dict[str, List[Tuple[int, int]]],
coef_dict: Dict[str, float], starting_point: Union[None, int] = None, log_scale=None):
......
......@@ -169,3 +169,7 @@ class AbstractTemporalLinearMarginModel(LinearMarginModel):
@property
def siglink(self):
return r('identity')
@property
def is_gumbel_model(self):
return self.type_for_mle == "Gumbel"
\ No newline at end of file
......@@ -37,7 +37,7 @@ class LinearMarginModel(ParametricMarginModel):
@property
def nb_params(self):
return len(self.margin_function.coef_dict)
return self.margin_function.nb_params
def param_name_to_linear_coef(self, param_name_and_dim_to_coef):
param_name_to_linear_coef = {}
......
......@@ -126,11 +126,6 @@ class GumbelTemporalModel(StationaryTemporalModel):
super().__init__(coordinates, params_user, starting_point, fit_method,
nb_iterations_for_bayesian_fit, params_initial_fit_bayesian, type_for_MLE="Gumbel")
@property
def nb_params(self):
return super().nb_params - 1
class NonStationaryLocationGumbelModel(GumbelTemporalModel, NonStationaryLocationTemporalModel):
pass
......
......@@ -24,11 +24,6 @@ class AbstractGumbelAltitudinalModel(AbstractAltitudinalModel):
super().__init__(coordinates, params_user, starting_point, fit_method, nb_iterations_for_bayesian_fit,
params_initial_fit_bayesian, "Gumbel", params_class, max_degree)
@property
def nb_params(self):
return super().nb_params - 1
class StationaryGumbelAltitudinal(AbstractGumbelAltitudinalModel, StationaryAltitudinal):
pass
......
......@@ -23,10 +23,6 @@ class PolynomialMarginModel(AbstractTemporalLinearMarginModel):
params_initial_fit_bayesian, type_for_MLE, params_class, temporal_covariate_for_fit)
self.max_degree = max_degree
@property
def nb_params(self):
return sum([c.nb_params for c in self.margin_function.param_name_to_coef.values()])
@cached_property
def margin_function(self) -> PolynomialMarginFunction:
return super().margin_function
......
......@@ -23,10 +23,6 @@ class SplineMarginModel(AbstractTemporalLinearMarginModel):
params_initial_fit_bayesian, type_for_MLE, params_class, temporal_covariate_for_fit)
self.max_degree = max_degree
@property
def nb_params(self):
return sum([c.nb_params for c in self.margin_function.param_name_to_coef.values()])
@cached_property
def margin_function(self) -> SplineMarginFunction:
return super().margin_function
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment