diff --git a/extreme_fit/estimator/margin_estimator/abstract_margin_estimator.py b/extreme_fit/estimator/margin_estimator/abstract_margin_estimator.py index 47aa7b4f5e4978ea6fe65a1b1445f24ecde46e19..463778f8d86b253bf646d1b2d864c00801090171 100644 --- a/extreme_fit/estimator/margin_estimator/abstract_margin_estimator.py +++ b/extreme_fit/estimator/margin_estimator/abstract_margin_estimator.py @@ -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): diff --git a/extreme_fit/function/margin_function/abstract_margin_function.py b/extreme_fit/function/margin_function/abstract_margin_function.py index 8f3a7b1432b8aec0886971f015a90da6668c5598..e3e70aa1e52efc1b8e2a8330b80bde9d574c9cdf 100644 --- a/extreme_fit/function/margin_function/abstract_margin_function.py +++ b/extreme_fit/function/margin_function/abstract_margin_function.py @@ -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 diff --git a/extreme_fit/function/margin_function/linear_margin_function.py b/extreme_fit/function/margin_function/linear_margin_function.py index d387341f08ebb5ef2aff5d59bb464b427caa11c7..59065da1f82b8f9b590b4101f1a0e10eca84e106 100644 --- a/extreme_fit/function/margin_function/linear_margin_function.py +++ b/extreme_fit/function/margin_function/linear_margin_function.py @@ -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 = {} diff --git a/extreme_fit/function/margin_function/polynomial_margin_function.py b/extreme_fit/function/margin_function/polynomial_margin_function.py index e7814ed7f9625aae20f70c5bbc95f4c64bbe6d37..5863802adb2ffe850ba26d35f2eb9b5ddc4c4a07 100644 --- a/extreme_fit/function/margin_function/polynomial_margin_function.py +++ b/extreme_fit/function/margin_function/polynomial_margin_function.py @@ -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): diff --git a/extreme_fit/function/margin_function/spline_margin_function.py b/extreme_fit/function/margin_function/spline_margin_function.py index 5ac8a21ea7e55b0792a05fdc1f1ed6099d64eca8..7b6755bd010f86f4dc15bbf0574c1d00a9f13570 100644 --- a/extreme_fit/function/margin_function/spline_margin_function.py +++ b/extreme_fit/function/margin_function/spline_margin_function.py @@ -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): diff --git a/extreme_fit/model/margin_model/linear_margin_model/abstract_temporal_linear_margin_model.py b/extreme_fit/model/margin_model/linear_margin_model/abstract_temporal_linear_margin_model.py index 85506f5ba1a3261dc5bde34c0a225ffaf4838701..337073bfc9358ddc5ef924a4b84ced8db2418215 100644 --- a/extreme_fit/model/margin_model/linear_margin_model/abstract_temporal_linear_margin_model.py +++ b/extreme_fit/model/margin_model/linear_margin_model/abstract_temporal_linear_margin_model.py @@ -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 diff --git a/extreme_fit/model/margin_model/linear_margin_model/linear_margin_model.py b/extreme_fit/model/margin_model/linear_margin_model/linear_margin_model.py index a8f5af9974140904a9c0034dbc8a891d966464d0..90fb69633649cf6a39402a9ce67a4565141f640a 100644 --- a/extreme_fit/model/margin_model/linear_margin_model/linear_margin_model.py +++ b/extreme_fit/model/margin_model/linear_margin_model/linear_margin_model.py @@ -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 = {} diff --git a/extreme_fit/model/margin_model/linear_margin_model/temporal_linear_margin_models.py b/extreme_fit/model/margin_model/linear_margin_model/temporal_linear_margin_models.py index fde5b9c6e42f09d3bf1cc66e86daa438fe4d2c95..08e3cdffa851b91c69f9ce001de202954bd38751 100644 --- a/extreme_fit/model/margin_model/linear_margin_model/temporal_linear_margin_models.py +++ b/extreme_fit/model/margin_model/linear_margin_model/temporal_linear_margin_models.py @@ -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 diff --git a/extreme_fit/model/margin_model/polynomial_margin_model/gumbel_altitudinal_models.py b/extreme_fit/model/margin_model/polynomial_margin_model/gumbel_altitudinal_models.py index e95056a3b3cf408eb07f62c1b85fbaec5766741d..0b2753d6f3e41448cdd0264e797d49e1ed121ebf 100644 --- a/extreme_fit/model/margin_model/polynomial_margin_model/gumbel_altitudinal_models.py +++ b/extreme_fit/model/margin_model/polynomial_margin_model/gumbel_altitudinal_models.py @@ -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 diff --git a/extreme_fit/model/margin_model/polynomial_margin_model/polynomial_margin_model.py b/extreme_fit/model/margin_model/polynomial_margin_model/polynomial_margin_model.py index 7357cf84684eefa2d32828fd682e162f2bf3b68f..a456754866a569a2997c0adcfa5b8d62513777f8 100644 --- a/extreme_fit/model/margin_model/polynomial_margin_model/polynomial_margin_model.py +++ b/extreme_fit/model/margin_model/polynomial_margin_model/polynomial_margin_model.py @@ -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 diff --git a/extreme_fit/model/margin_model/spline_margin_model/spline_margin_model.py b/extreme_fit/model/margin_model/spline_margin_model/spline_margin_model.py index d13e746ee788b4f0de31126fc2e80d50532c14e2..15c439b62581f0c7931d5293182337f2f4060d06 100644 --- a/extreme_fit/model/margin_model/spline_margin_model/spline_margin_model.py +++ b/extreme_fit/model/margin_model/spline_margin_model/spline_margin_model.py @@ -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